0

私よりもはるかに賢い人たちへの別の質問:

次のように Player クラスの 3 つのインスタンスを作成しようとしています。

Player *player1 = new Player("Aaron",0.3333333);
Player *player2 = new Player("Bob",0.5);
Player *player3 = new Player("Charlie",1);

それらのコンストラクターを以下に示します。それは本当に簡単です:

Player::Player(string n, double hr)
{
    name = n;
    hitrate = hr;
}

(名前とヒット率が適切に定義されていると仮定してください)

今、私の問題はこれです。個々のプレーヤーの名前を確認しようとすると、それらはすべて player3 の一種のエイリアスになっているようです

//Directly after the player instantiations:
cout << player1->getName() << "\n";
cout << player2->getName() << "\n";
cout << player3->getName() << "\n";

//In the Player.cpp file:
string Player::getName(){
    return name;
}


Outputs: 
Charlie
Charlie
Charlie

さて、この問題を回避するための最善の解決策を知りたいのですが、もっと重要なのは、なぜこのように動作するのかを理解したいということです。それはとても単純なことのようです(私のようにJavaに甘やかされています)。

また、これは学校の課題のためのものであり、動的に割り当てられたオブジェクトを使用する必要があると言われました。

どうもありがとうございました。明確にする必要がある場合はお知らせください。

編集:必要に応じて、ここに完全なファイルがあります:

PlayerTest.cpp

#include <iostream>
#include <player.h>
using namespace std;

int main(){
    Player *player1 = new Player("Aaron",0.3333333);
    Player *player2 = new Player("Bob",0.5);
    Player *player3 = new Player("Charlie",1);
    cout << player1->getName() << "\n";
    cout << player2->getName() << "\n";
    cout << player3->getName() << "\n";
    return 0;
}

Player.h

#ifndef PLAYER_H
#define PLAYER_H
#include <string>
using namespace std;

class Player
{
    public:
        Player(string, double);
        string getName();
};

//Player.cpp
#include "Player.h"

string name;
double hitrate;

Player::Player(string n, double hr)
{
    name = n;
    hr = hitrate;
}


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

#endif // PLAYER_H
4

1 に答える 1

3

name 変数と hitrate 変数は、各オブジェクトが独自の個別のコピーを取得できるように、Player クラス宣言内にある必要があります。

class Player
{
    public:
        Player(string, double);
        string getName();

    private:
        string name;
        double hitrate;
};
于 2012-11-28T23:23:56.833 に答える