2

私はplayersと呼ばれるベクトルとPlayerと呼ばれるクラスを持っています。そして、私がやろうとしていることは、次のように書くことです:

players.push_back(Player(name, Weapon(bullets)));

だから私はループでプレイヤーを作成できるようにしたい. しかし、「Player::Player の呼び出しに一致する関数がありません...」というエラー メッセージが表示されます。

次に、次のように変更しました。

Weapon w(bullets);
Player p(name, w);
players.push_back(p);

これが私のプレーヤーの定義です:

class Player {
public:
   Player(string &name, Weapon &weapon);
private
   string name;
   Weapon weapon;
}

これらの定義の違いは何かを学ぼうとしています。そして、これはオブジェクトコンストラクターにオブジェクトを渡す正しい方法ですか?

注: これらは私の実際のクラス定義ではありません。私は、C++ でのオブジェクト指向プログラミングについて、コーディングして何かを学ぼうとしています。つまり、プレイヤーで武器を初期化できることを知っています:)

4

2 に答える 2

4

コンストラクターを次のように変更します。

Player(const string &name, const Weapon &weapon);

また:

Player(const string &name, Weapon weapon);

一時オブジェクトで参照を初期化することは有効な C++ ではありません。

Player(name, Weapon(bullets));

constただし、参照を使用することは合法です。

編集:const名前を参照として、または値で渡す必要もあります。

于 2010-04-03T12:30:00.690 に答える
1

Weapon(bullets)一時的な ( ) をPlayerコンストラクターに渡しています。コンストラクターはWeapon &. ただし、一時的な参照を作成することは許可されていないため、これは失敗します。

ただし、一時変数へのconst参照を作成することは許可されています。したがって、コンストラクターを次のように再宣言します。

   Player(string const &name, Weapon const &weapon);
于 2010-04-03T12:33:18.313 に答える