3

いくつかの単純なクラスがあり、それらを機能させることができません。

TL;DR 「プレーヤー」インスタンスがあります。インスタンスにデータを設定した後、元に戻すことができます。インスタンスをstd::vector Players;にプッシュすると、Players.at(0).getName() がある場合、"" が返されます。データがありません!なくなっている。(アプリケーションをデバッグすると、「_name」が「vPlayer」に設定され、「Players」に「_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;
4

2 に答える 2

10

クラスのコピーコンストラクターとコピー代入演算子を定義して、何もしないようにします。ベクター内のコピーには、ベクター内に配置したインスタンスと同じデータがどのように含まれると思いますか?

クラスは、デフォルトのコンパイラー生成のコピーコンストラクターとコピー代入演算子で完全に問題ない可能性があるため、それらの宣言と定義を削除するだけで、すべてが機能します。

于 2013-01-22T15:20:31.787 に答える
4

ベクターには、追加した要素のコピーが含まれます。これらのコピーは、Player::Player(const Player&) コンストラクターを使用して追加されます。

このコンストラクター (実装内) は、名前に値を設定しません。

ソリューション:

  • コピーしたオブジェクトに名前を設定します。

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

(代入演算子についても同様です)

  • コピーおよび割り当て機能を削除し、デフォルトに依存します。名前は std::string であるため、デフォルトでソース プレーヤー名のコピーが取得されます。
于 2013-01-22T15:23:21.473 に答える