代码之家  ›  专栏  ›  技术社区  ›  Sam12

C++类中的构造函数

c++
  •  -2
  • Sam12  · 技术社区  · 6 年前

    我有两个班,玩家和游戏。

    class Game
    {
            private:
                int maxPlayer;
                Player** playersArray;
            public:
                Game(int maxPlayer);
                ~Game();
    }
    

    playersarray中的每个索引都由指向类player的指针组成。以下构造函数不起作用,因为此消息一直出现:

    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()应该做的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Remy Lebeau    6 年前

    你没有填充 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 对象就足够了:

    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)
    {
    }