2013-01-22 99 views
3

我有幾個簡單的類,我無法讓他們工作。C++ OOP - 丟失數據

TL; DR我有一個「玩家」實例,在將一些數據設置到實例後,我可以將其恢復。如果我將實例推送到std :: vector播放器;如果我有Players.at(0).getName()它返回「」。數據不在那裏!離開了。 (調試我看「_name」在「VPLAYER」和「玩家」我看到的元件設置,用「_name」 =「」應用程序)

下面是代碼:

//Player.h 
#ifndef PLAYER_H 
#define PLAYER_H 

#include <iostream> 

class Player 
{ 
public: 
    Player(); 
    Player(const Player &Player); 
    Player& operator=(const Player &Player); 
    std::string getName(); 
    bool  setName(const std::string &name); 
    bool  nameValid(const std::string &name); 

private: 
    std::string _name; 
}; 



#endif 



//Player.cpp 

#include "Player.h" 
#include <iostream> 
#include <string> 
using namespace std; 

Player::Player() 
{ 

} 
Player::Player(const Player &Player) 
{ 

} 
Player& Player::operator=(const Player &Player) { 
    return *this; 
} 

std::string Player::getName() 
{ 
    return this->_name; 
} 

bool Player::setName(const std::string &name) 
{ 
    if (! this->nameValid(name)) 
    { 
     return false; 
    } 

    this->_name = name; 
    return true; 
} 

bool Player::nameValid(const std::string &name) 
{ 
    return name.empty() == false; 
} 




//Map.h 
#ifndef MAP_H 
#define MAP_H 

#define MAP_X 40 
#define MAP_Y 40 

#include "Player.h" 
#include "Point.h" 
#include <vector> 

class Map 
{ 
public: 
    Map(); 
    bool movePlayer(Player &Player, Point &Point); 
    std::vector<Player> getPlayers(); 
private: 

}; 

#endif //MAP_H 



//Map.cpp 

#include "Map.h" 
#include "Player.h" 
#include "Point.h" 
#include <iostream> 
#include <string> 

using namespace std; 

Map::Map() 
{ 

} 

bool Map::movePlayer(Player &Player, Point &Point) 
{ 
    return true; 
} 
std::vector<Player> Map::getPlayers() 
{ 
    Player vPlayer; 
    vPlayer.setName(std::string("test")); 
    std::vector<Player> Players; 

    Players.push_back(vPlayer); 

    return Players; 
} 
在主

std::vector<Player> Players = vMap.getPlayers(); 
    cout<<"Test:"<<Players.at(0).getName()<<endl; 
+2

查看http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom關於複製,移動和分配的一些信息的最佳答案。 – tecu

+1

當你調用'Players.push_back(vPlayer);'你不是將你當前的vPlayer實例添加到vector中,而是將其添加到vector中。由於你的拷貝構造函數是空的,拷貝中的'_name'字段也是空的。 –

+1

在這段代碼中你可能會丟失一些'this->',因爲它們不是必需的(在C++中實際上並不常見)。是的,顯式通常比隱含更好,但在這種情況下,它使代碼「奇怪」。 – DevSolar

回答

4

您的向量將包含您添加到其中的元素的副本。這些副本將使用Player :: Player(const Player &)構造函數添加。

此構造函數(在您的實現中)沒有爲該名稱設置任何值。

解決方案:

  • 集的名稱在複製的對象:

    Player::Player(const Player &Player) : _name(Player._name) { }

(這同樣適用於你的賦值運算符)

  • 刪除副本和assig nment功能並依賴於默認值。由於名稱是一個std :: string,默認情況下它將獲得源播放器名稱的副本。
+0

非常感謝。 @Angew呢! – ioanb7

10

您定義了類的拷貝構造函數和複製賦值運算符,什麼都不做。您如何期望向量中的副本具有與您放入向量中的實例相同的數據?

你的類可以很好的使用默認的編譯器生成的拷貝構造函數和拷貝賦值操作符,所以只需刪除你的聲明和定義,一切都會工作。