我的C ++向量非常奇怪的行为

时间:2014-11-30 00:01:07

标签: c++ c++11 vector

我已经调试了很长时间了 - 但我不知道问题是什么。

我从控制台(通过name)获得std::cin,然后继续使用它创建一个新的Player对象。然后我将新对象传递给Gameboard以添加到std::vector<J>,其中J是模板的一部分。这是代码:

的main.cpp

Gameboard<Tile,Player,5,5> board = Gameboard<Tile,Player,5,5>();
std::string name;

std::cout << "Enter a name: "
std::cin >> name;
board.setPlayer(Player(name));
std::cout << std::endl;

std::cout << "Enter a name: "
std::cin >> name;
board.setPlayer(Player(name));
std::cout << std::endl;

std::cout << "Enter a name: "
std::cin >> name;
board.setPlayer(Player(name));

gameboard.h

template<class T, class J, const int X, const int Y>
class Gameboard {
    std::vector<J> players;
public:
    void setPlayer(J player);
};

template<class T, class J, const int X, const int Y>
void Gameboard<T,J,X,Y>::setPlayer(J p) {        
    ////// DEBUG CODE //////
    std::cout << p.getName() << std::endl;
    players.push_back(p);
    for (int i = 0; i < players.size(); i++) {
        std::cout << players.at(i).getName() << std::endl;
    }
}

player.h / player.cpp

class Player {
    std::string name;
public:
    Player(std::string _name);
    std::string getName();
};

Player::Player(std::string _name) {
    name = _name;
}

std::string Player::getName() {
    return name;
}

我认为我已将问题跟踪到标记为DEBUG CODE的代码。使用上面的代码,输入名称BobJoeTim,我会得到以下输出:

Enter a name: bob
bob

Enter a name: joe
joe


Enter a name: tim
tim



[exit]

所以不知何故,当我将玩家添加到向量时,它会被破坏或类似。该对象在插入之前是有效的,因为我回显了该名称。矢量的大小也在增长,因为它打印的空行等于添加的玩家数量。

发生了什么事?

1 个答案:

答案 0 :(得分:3)

您可能有一个复制构造函数,您没有复制该名称。因此,当你对向量进行push_back时,具有空名称的Player对象将被推送到向量上。
正确实现复制构造函数,它应该工作