2016-01-09 196 views
0

在我的頭文件我有:C++初始化非指針對象再

class Game 
{ 
private: 
    string _name; 
    Level _currentLevel; 
public: 
    Game(); 
    ~Game(); 
    void setName(); 
    void run(); 
}; 

在我的cpp文件,我有我的運行功能:

void Game::run() 
{ 

    bool finished = false; 
    string input; 
    while (!finished) 
    { 
     // get input 
     std::cout << "Enter a command: \n"; 
     std::getline(std::cin, input); 
     if (input == "quit") 
     { 
      finished = true; 
     } 
     else if (input == "new") 
     { 
      Level _currentLevel; 
     } 
     else if (input == "print") 
     { 
      _currentLevel.printMap(); 
     } 
     else 
     { 
      std::cout << "Unknown command! \n"; 
     } 


    } 
} 

構造和水​​平printmap方法

Level::Level() 
{ 
    _width = RandomGenerator::Instance()->getRandom(6, 10); 
    _height = RandomGenerator::Instance()->getRandom(6, 10); 
    for (int y = 0; y < _height; y++) 
    { 
     for (int x = 0; x < _width; x++) 
     { 
      addRoom(x, y); 
     } 
    } 
} 

void Level::printMap() 
{ 
    for (int y = 0; y < _height; y++) 
    { 
     for (int x = 0; x < _width; x++) 
     { 
      if (x != 0) 
       cout << " - "; 
      cout << _map[coordinate(x, y)].getSize(); 
     } 
     cout << "\n"; 
    } 
} 

但是,當我輸入new時,運行Level _currentLevel; (創建一個新的非指針對象),對象dosnt改變。我可以看到它在運行printmap(它打印一個包含在Level構造函數中創建的30個隨機值的地圖)時不會改變關卡的值。在Level構造函數中調試_height值的變化。我的Game類應該如何更新_currentLevel的值?

+0

我想你在你的問題中換了'cpp'和'header',不是嗎? – martijnn2008

+0

@martijn nope http://www.cplusplus.com/forum/articles/10627/ –

+0

如果你真的有這樣安排你的cpp和頭文件,你誤會了你鏈接的文章。 – Donnie

回答

3

您的新建模塊會創建一個與您的實例變量碰巧名稱相同的本地堆棧變量(_currentLevel)。它不覆蓋實例變量,這就是爲什麼沒有改變。

你有幾個簡單的選擇:

  • 使用指針。我建議使用shared_ptr,所以你不必擔心自己釋放內存。

  • Level擴展爲具有Initialize函數。構造函數可以調用它,或者如果你想重新初始化一個現有的變量,你可以稍後從其他代碼中調用它。

  • 將新的局部變量複製到實例變量中。

就個人而言,我會建議指針,但或者工作。

+0

謝謝你指出我做錯了什麼,創建兩個同名的值。我現在通過「Level newLevel; \t \t \t \t _currentLevel = newLevel;」我應該嘗試避免在這裏建議的指針是正確的? http://stackoverflow.com/a/22146244/1667868 –

+1

一個'shard_ptr'處理碎片內存嗎? (抱歉,無法抵擋;錯誤的錯字!) –

+0

如果'_currentLevel'住在這個對象中,並且永遠不會被存儲在它之外,那麼你正在做的事情可能是好的。請注意,您當前的修補程序將本地複製到對象中(然後在超出範圍時銷燬本地)。如果在將來的某個時刻你需要傳遞'_currentLevel',在你目前的實現中,你只能夠安全地傳出一個副本。 – Donnie

0

對於初學者來說,原型應該在源文件的頭部和實現中。除此之外,在遊戲::運行你聲明第二個本地_currentlevel遮蔽類變量。在構造函數之外,您從不修改類字段。

用這個替換陰影線 - > _ currentlevel = Level();