这是我写的一个抽象类:
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;
}
}
然后我创建了12个派生类,一年中每个月一个。为简单起见,我将仅包括两个所述类:
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;
}
};
在我的main函数中,我使用随机数生成器来选择派生类,以便我可以访问其成员函数中的数据:
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();
}
我真的看不出错误在哪里,并想知道是否有人可以指出哪里出错了?谢谢。
答案 0 :(得分:1)
case '1'
没有达到您的预期。 '1'
不是1
,它是带有整数值49
(ASCII码)的 char 。但random(12)
会在0
和11
之间返回 int 。这意味着对于switch
中的Month::choose_month()
语句,default
案例将始终执行。
将case
语句更改为case 1:
和case 2:
,依此类推。 (可能会从case 0:
到case 11:
?)如果您希望它是char
,请更改参数的类型并更改调用它的代码。
default
语句不会返回任何内容。您应该确认为此案例返回一些有效值,或重新考虑有关它的设计(为此案例添加断言或抛出异常,或消除案例)。
BTW:random
不是C ++标准设施。您可以使用std::rand
或C++11's random number generation facilities。