2016-06-21 67 views
-4

這裏的矢量數據成員是一個抽象類,我寫道:如何訪問一個完整的派生類

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

以我主要功能我使用隨機數發生器來選擇一個派生類,這樣我可以在其成員函數訪問數據:

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

您的'choose_month'函數具有未定義的行爲,因爲它具有非void返回類型,並且在每個路徑上都沒有'return'語句。 –

+3

如果你提高了警告級別,那麼你有微不足道的錯誤會被編譯器捕獲。 – juanchopanza

+1

您正在切換字符,而不是整數。 – tkausl

回答

1

case '1'不符合您的期望。 '1'不是1,它是char,帶有整數值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::randC++11's random number generation facilities