>

플레이어와 게임의 두 클래스가 있습니다.

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

playerArray의 각 인덱스는 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_name을 NULL로 설정하고NOT을 메모리의 임의의 위치로 설정하는 것입니다. 이것이 Player ()가해야 할 일입니다.


  • 답변 # 1

    당신은 당신의 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)
    {
    }
    
    

관련 자료

  • 이전 python - 플라스크 요청 변수가 인식되지 않습니다
  • 다음 excel - VBA에서 배열 풀기 및 배열에 항목 추가