首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++类中的构造函数

C++类中的构造函数
EN

Stack Overflow用户
提问于 2018-06-08 08:51:28
回答 1查看 69关注 0票数 -2

我有两个类,Player和Game。

代码语言:javascript
复制
class Game
{
        private:
            int maxPlayer;
            Player** playersArray;
        public:
            Game(int maxPlayer);
            ~Game();
}

playersArray中的每个索引都由指向类Player.The的指针组成,因为构造函数不起作用,因为以下消息不断出现:

代码语言:javascript
复制
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();
    }
}

这是类播放器:

代码语言:javascript
复制
class Player {
        private:
            char* player_name;
            int level;
            int life;
            int strength;
            Weapon player_weapon;
            int place; 
}

我的目标是将player_name设置为NULL,而不是设置为内存中的任意位置。这就是Player()应该做的事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 09:04:14

您没有正确填充Game数组。您正在尝试调用Player()构造函数,就好像它是一个常规的类方法(它不是),更糟糕的是,您正在通过一个未初始化的Player*指针调用它。

您需要改用new运算符,例如:

代码语言:javascript
复制
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而不是原始指针:

代码语言:javascript
复制
#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指针数组:

代码语言:javascript
复制
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;
}

或者:

代码语言:javascript
复制
#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来进一步简化:

代码语言:javascript
复制
#include <vector>

class Game
{
private:
    std::vector<Player> playersArray;
public:
    Game(int maxPlayers);
}

Game::Game(int maxPlayers)
    : playersArray(maxPlayers)
{
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50751933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档