类,数字/数组或对象中的对象

时间:2014-08-15 17:51:00

标签: c++ class

也许我离开了,但我正在尝试自我教授c ++对象和类的想法,并构建非常小的游戏。 在那个游戏中,我将拥有一个拥有该棋盘的大对象(类) 我希望这个对象创建NUMBER或PlayerClass对象,每个对象都是该棋盘对象中的对象,我不知道会有多少(玩家) 我想知道我可以拥有一系列物体吗? 我写了这段代码来展示我在寻找的东西:

class PlayerClass{
public:
...
private:
    int myLocation[2];
    bool isPlayer=false;
};


class game{
public:
    void MakePlayers(int numberOfPlayers){
        PlayerClass players[numberOfPlayers];
        playerObject=players;
        Number=numberOfPlayers;
    }
private:
    PlayerClass *playerObject
    int Number;
}

3 个答案:

答案 0 :(得分:4)

我赞扬你主动尝试自学C ++。它不是最容易学习的语言,但一旦理解它就会非常强大。

第一条评论:您希望拥有多个PlayerClass对象。实现这一目标的一种方法是拥有一个PlayerClass*成员变量,指向一个动态分配的玩家阵列,这似乎是你想要的。但这需要大量的手动内存管理,即使您对该语言有经验,也很难做到。我建议改用std::vector(确保#include <vector>):

class game
{
   // ...
private:
   std::vector<PlayerClass> m_players; // instead of PlayerClass*
   // no more need for int Number
};

然后你的构造函数可以像这样初始化它:

void MakePlayers(int numberOfPlayers)
    : m_players(numberOfPlayers)
{
}
// if you're being rigorous, you'll want to either change numberOfPlayers to
// an unsigned type or ensure it is nonnegative before using it

vector支持[]运算符,其语义与常规数组相同,因此您仍然可以访问各个播放器(例如)m_players[3]。此外,vector知道它包含多少元素(size()成员函数),因此不再需要分别跟踪玩家数量。

祝你好运!

更新:你的一条评论说你从C来到C ++,所以也许手动内存管理对你来说并不是那么陌生;)。尽管如此,正如Stephane Rolland所指出的那样,由于标准库中的有用类,它在现代C ++中几乎从来没有必要。如果您发现自己想要习惯这样做,请务必先考虑是否真的有必要。

答案 1 :(得分:2)

您应该使用std::vector

class game {
    std::vector<PlayerClass> players_;

  public:
    game (std::size_t NumPlayers) : players_ (NumPlayers) {}
}

答案 2 :(得分:1)

是的,你可以,但你的MakePlayers函数有误,应该是

void MakePlayers(int numberOfPlayers){

        playerObject= new (PlayerClass*)[numberOfPlayers];
        Number = numberOfPlayers;

        for (int i = 0; i++; i < numberOfPlayers)
        {
            playerObject[i] = new PlayerClass();
        }
    }

此外,您需要在类析构函数中使用自由的playerObject来避免内存泄漏。另一个建议,请先了解指针是什么。