我有幾個簡單的類,我無法讓他們工作。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;
查看http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom關於複製,移動和分配的一些信息的最佳答案。 – tecu
當你調用'Players.push_back(vPlayer);'你不是將你當前的vPlayer實例添加到vector中,而是將其添加到vector中。由於你的拷貝構造函數是空的,拷貝中的'_name'字段也是空的。 –
在這段代碼中你可能會丟失一些'this->',因爲它們不是必需的(在C++中實際上並不常見)。是的,顯式通常比隱含更好,但在這種情況下,它使代碼「奇怪」。 – DevSolar