也许我离开了,但我正在尝试自我教授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;
}
答案 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来避免内存泄漏。另一个建议,请先了解指针是什么。