создание экземпляров — создание нескольких динамически размещаемых объектов в переполнении стека

Еще один вопрос для тех, кто намного мудрее меня:

Я пытаюсь создать 3 экземпляра класса Player следующим образом:

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

0

Решение

Переменные name и hitrate должны быть внутри объявления класса Player, чтобы каждый объект получал свои собственные отдельные копии.

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

private:
string name;
double hitrate;
};
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector