Вот абстрактный класс, который я написал:
class Month
{
public:
//factory method
static Month* choose_month(int choice); //static function
virtual void birthstone() = 0; //virtual function
virtual void month() = 0; //virtual function
virtual ~Month()
{
std::cout << "Deleting the virtual destructor" << std::endl;
};
};
Month* Month::choose_month(int choice)
{
switch (choice)
{
case '1':
return new January;
break;
case '2':
return new February;
break;
//these cases go all the way to December
default:
break;
}
}
Затем я создаю двенадцать производных классов, по одному на каждый месяц года. Я буду включать только два из указанных классов для простоты:
class January : public Month
{
public:
void birthstone()
{
std::cout << "Garnet" << std::endl;
}
void month()
{
std::cout << "January" << std::endl;
}
//destructor
~January()
{
std::cout << "Deleting the object" << std::endl;
}
};
class February : public Month
{
public:
void birthstone()
{
std::cout << "Amethyst" << std::endl;
}
void month()
{
std::cout << "February" << std::endl;
}
//destructor
~February()
{
std::cout << "Deleting the object" << std::endl;
}
};
В моей основной функции я использую генератор случайных чисел для выбора производного класса, чтобы я мог получить доступ к данным в его функциях-членах:
std::vector<Month*> stone;
std::srand(static_cast<unsigned>(time(0))); // Seed the random generator
//for-loop
for (int i = 0; i < 6; i++)
{
stone.push_back(Month::choose_month(random(12)));
}
Проблема возникает, когда я пытаюсь получить доступ к функции-члену любого класса, хранящегося в моем векторе. Я получаю сообщение об ошибке нарушения прав доступа:
//displaying the elements inside the container
for (std::vector<Month*>::iterator iter = stone.begin(); iter != stone.end(); iter++)
{
(*iter)->birthstone();
}
Я действительно не вижу, где ошибка, и задаюсь вопросом, может ли кто-нибудь указать, что происходит не так? Спасибо.
case '1'
не делает то, что вы ожидаете. '1'
не является 1
, это голец с целочисленным значением 49
(Код ASCII). Но random(12)
вернет ИНТ между 0
а также 11
, Это значит для switch
заявление в Month::choose_month()
, default
дело всегда будет выполнено.
Изменить case
заявления к case 1:
а также case 2:
и так далее. (Мог бы из case 0:
в case 11:
?) Если вы ожидаете, что это будет char
, измените тип параметра и измените код, вызывающий его тоже.
И default
заявление ничего не возвращает. Вы должны подтвердить возвращение некоторого действительного значения для этого случая, или пересмотреть проект о нем (добавив утверждения или выбрасывая исключение для этого случая, или исключив случай).
КСТАТИ: random
это не стандартные средства C ++. Вы могли бы использовать std::rand
или же Средства генерации случайных чисел в C ++ 11.
Других решений пока нет …