Как получить доступ к элементу данных вектора, полного производных классов

Вот абстрактный класс, который я написал:

 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();
}

Я действительно не вижу, где ошибка, и задаюсь вопросом, может ли кто-нибудь указать, что происходит не так? Спасибо.

-4

Решение

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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]