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

时间:2016-06-21 09:17:45

标签: c++ factory-method

这是我写的一个抽象类:

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

我真的看不出错误在哪里,并想知道是否有人可以指出哪里出错了?谢谢。

1 个答案:

答案 0 :(得分:1)

case '1'没有达到您的预期。 '1'不是1,它是带有整数值49(ASCII码)的 char 。但random(12)会在011之间返回 int 。这意味着对于switch中的Month::choose_month()语句,default案例将始终执行。

case语句更改为case 1:case 2:,依此类推。 (可能会从case 0:case 11:?)如果您希望它是char,请更改参数的类型并更改调用它的代码。

default语句不会返回任何内容。您应该确认为此案例返回一些有效值,或重新考虑有关它的设计(为此案例添加断言或抛出异常,或消除案例)。

BTW:random不是C ++标准设施。您可以使用std::randC++11's random number generation facilities