我有两个类,Player和Game。
class Game
{
private:
int maxPlayer;
Player** playersArray;
public:
Game(int maxPlayer);
~Game();
}
playersArray中的每个索引都由指向类Player.The的指针组成,因为构造函数不起作用,因为以下消息不断出现:
error: invalid use of 'Player::Player' playersArray[i]->Player();
Game::Game(int maxPlayer)
{ this->maxPlayer=maxPlayer;
this->playersArray = new Player*[maxPlayer];
for(int i=0;i<maxPlayer;i++)
{
playersArray[i]->Player();
}
}
这是类播放器:
class Player {
private:
char* player_name;
int level;
int life;
int strength;
Weapon player_weapon;
int place;
}
我的目标是将player_name设置为NULL,而不是设置为内存中的任意位置。这就是Player()应该做的事情。
发布于 2018-06-08 09:04:14
您没有正确填充Game
数组。您正在尝试调用Player()
构造函数,就好像它是一个常规的类方法(它不是),更糟糕的是,您正在通过一个未初始化的Player*
指针调用它。
您需要改用new
运算符,例如:
class Game
{
private:
int maxPlayers;
Player** playersArray;
public:
Game(int aMaxPlayers);
~Game();
}
Game::Game(int aMaxPlayers)
{
maxPlayers = aMaxPlayers;
playersArray = new Player*[maxPlayers];
for(int i = 0; i < maxPlayers; ++i)
playersArray[i] = new Player; // <-- here
}
Game::~Game()
{
for(int i = 0; i < maxPlayers; ++i)
delete playersArray[i];
delete[] playersArray;
}
更安全的选择是使用std::unique_ptr
而不是原始指针:
#include <memory>
class Game
{
private:
int maxPlayers;
std::unique_ptr<std::unique_ptr<Player>[]> playersArray;
public:
Game(int aMaxPlayers);
}
Game::Game(int aMaxPlayers)
{
maxPlayers = aMaxPlayers;
playersArray = std::make_unique<std::unique_ptr<Player>[]>(maxPlayers);
for(int i = 0; i < maxPlayers; ++i)
playersArray[i] = std::make_unique<Player>();
}
也就是说,当Player*
对象数组就足够时,不需要使用Player
指针数组:
class Game
{
private:
int maxPlayers;
Player* playersArray;
public:
Game(int aMaxPlayers);
~Game();
}
Game::Game(int aMaxPlayers)
{
maxPlayers = aMaxPlayers;
playersArray = new Player[maxPlayers];
}
Game::~Game()
{
delete[] playersArray;
}
或者:
#include <memory>
class Game
{
private:
int maxPlayers;
std::unique_ptr<Player[]> playersArray;
public:
Game(int aMaxPlayers);
}
Game::Game(int aMaxPlayers)
{
maxPlayers = aMaxPlayers;
playersArray = std::make_unique<Player[]>(maxPlayers);
}
然后,您可以使用std::vector
来进一步简化:
#include <vector>
class Game
{
private:
std::vector<Player> playersArray;
public:
Game(int maxPlayers);
}
Game::Game(int maxPlayers)
: playersArray(maxPlayers)
{
}
https://stackoverflow.com/questions/50751933
复制相似问题