如何访问充满派生类的矢量的数据成员
How to access a data member of a vector full of derived classes
这是我写的抽象类:
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
,它是 char ,具有Integal值49
(ASCII代码)。但是random(12)
将在0
和11
之间返回 int 。这意味着对于Month::choose_month()
中的switch
语句,default
案例将始终执行。
将case
语句更改为case 1:
和case 2:
等。(可能应该从case 0:
到case 11:
?)如果您期望它是char
,请更改参数的类型,然后更改调用的代码。
和default
语句不会返回任何内容。您应该确认为这种情况返回某些有效值,或重新考虑有关它的设计(添加断言或为这种情况提供例外,或消除案例)。
btw:random
不是C 标准功能。您可以使用std::rand
或C 11的随机数生成设施。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- C++ 使用派生类方法更改基类数据成员
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 以基类作为数据成员的派生类?
- 无法访问派生类函数内的基类的受保护数据成员
- 派生类不从基类继承数据成员
- 基类数据成员类型取决于派生类
- 使用来自基类方法的派生类数据成员
- 我们可以从派生类更改基类的数据成员吗?
- 如何在C 中的派生类中分配数据成员数组
- 如何使用基类的数据成员作为派生类的构造函数?(C++)
- 派生类没有额外的数据成员;将基对象静态向下转换为派生对象是否安全
- 如何访问充满派生类的矢量的数据成员
- C++是否可以从同级第二个派生对象访问第一个派生对象的受保护基础数据成员?
- 基础和派生类C 之间的继承数据成员
- VC++ 警告 C4356:无法通过派生类初始化静态数据成员
- 在派生类中使用提取运算符(>>)的方法以及在C++中处理静态数据成员的方法
- c++设计:从基类强制转换为派生类,没有额外的数据成员
- C++-填充派生类数据成员,同时设置基类属性值
- 仅授予派生类对基类数据成员/函数的 const 访问权限