如何访问充满派生类的矢量的数据成员

How to access a data member of a vector full of derived classes

本文关键字:数据成员 派生 满派生 何访问 访问      更新时间:2023-10-16

这是我写的抽象类:

 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)将在011之间返回 int 。这意味着对于Month::choose_month()中的switch语句,default案例将始终执行。

case语句更改为case 1:case 2:等。(可能应该从case 0:case 11:?)如果您期望它是char,请更改参数的类型,然后更改调用的代码。

default语句不会返回任何内容。您应该确认为这种情况返回某些有效值,或重新考虑有关它的设计(添加断言或为这种情况提供例外,或消除案例)。

btw:random不是C 标准功能。您可以使用std::rand或C 11的随机数生成设施。