如何自动将类的新实例添加到数组/向量?

时间:2019-01-20 01:34:52

标签: c++

我正在制作一个基于文本的简单游戏,但是能够跟踪我制作的所有角色会非常方便。我想知道是否有一种方法可以将字符的每个新实例添加到类中保留的静态数组/向量中。我不是一个超级经验的程序员,但是我很确定static关键字意味着它在所有类中都保留,但是只有一个实例。因此,从本质上讲,我希望能够调用Character :: getCharacters()或类似的东西,它将返回所有实例化的字符。另外,我也许可以只用那个函数来制作另一个类,但是我看不出来,听起来也不太好。

我尝试制作一个由字符组成的静态向量,然后在实例化时调用madeCharacters.push_back(this)。不幸的是,这没有用。

它没有给出我可以参考的适当错误,而是存在链接器问题; “ g ++ -o”冷钢Simulator.exe的踪迹“ ./AoE.o ./Armour.o ./Arts.o ./Character.o ./Crafts.o ./Dice.o ./Enemy.o ./ Equipment.o ./Map.o ./MasterQuartz.o ./Quartz.o ./Shoes.o ./Tachi.o ./Weapon.o ./convertPositions.o ./main.o
./main.o:main.cpp:(.rdata$.refptr._ZN9Character14madeCharactersE[.refptr._ZN9Character14madeCharactersE]+0x0):未定义对`Character :: madeCharacters'的引用 collect2:错误:ld返回1退出状态 make:*** [makefile:46:Cold Steel Simulator.exe的踪迹]错误1“

作为参考,字符是具有更具体类型的字符的“超级/父类”(对不起,我在这里不知道这个词)。

虽然使向量不是静态的确实可以工作,但是每个向量本身只能容纳1个字符。

那起作用了吗?

std::vector<Character*> madeCharacters;

Character(Stats const& s, const std::string & n, Position p):baseStats(s), totalStats(s), name(n), currentPosition(p) {madeCharacters.push_back(this);}

什么没用;

static std::vector<Character*> madeCharacters;

Character(Stats const& s, const std::string & n, Position p):baseStats(s), totalStats(s), name(n), currentPosition(p) {madeCharacters.push_back(this);}

当我删除任何新类型的字符new xxx()的创建时,它确实可以与第二个而不起作用的版本一起编译,但这并不十分方便。

我肯定这里还缺少一些东西,其他游戏开发者也必须做类似的事情,这是我使AoE正常工作的唯一方法;通过查看字符列表,检查其位置并与AoE位置进行比较。

很抱歉,如果这还不够,我的意思是我想在创建对象时将对象添加到相同类型对象的向量中,这样我就可以引用所有对象的向量这种类型的对象。

1 个答案:

答案 0 :(得分:1)

您有两个选择:

  1. 在该类的所有构造函数中,将该实例添加到静态存储中的容器中。

  2. 将类的构造函数设为私有,并编写一个工厂函数,该函数使用私有构造函数创建对象,并将该对象添加到容器中。可以使用非静态容器来实现此方法。

您的帖子提到尝试1.失败。该方法是可行的-您犯了一个错误,,但是您的描述不足以使我们能够分辨出该错误是什么。鉴于新信息,您似乎未能定义静态向量。


存在一个有关如何处理对象破坏的问题。据推测,该物体必须从容器中移出。这是链表可能是解决方案的少数情况之一。如果将迭代器存储到对象本身内的list元素,则对象可以在销毁后从列表中删除。