2014-05-10 77 views
0

对于我的比赛,我已经建立了一个小型的框架,除其他外有:的“this”指针和容器

  • 实体是自己的组件。
  • 系统持有指向实体的指针。
  • 拥有系统的引擎。
  • 拥有实体的EntityManager。

每次我添加一个组件时,实体都会通过它所持有的引擎指针将它的“this”指针传递给系统,并决定是否注册或忽略它。

现在,由于实体是EntityManager容器的元素,我是否正确地假设如果对它的插入操作导致移位或重新分配,系统将不再保存有效的指针?

如果是这样,什么是可以用来防止这种情况发生的好容器?如果我理解正确,这与迭代器发生的情况类似,并且在插入时要求非失效时应用相同的规则。

+1

如果你把它们放在一个向量中并使用迭代器来存储引用,那么是的。如果你有一个指针nope向量。 –

回答

2

如果存储实体的向量,然后存储它们的迭代器以访问它们:是的,重新分配可能会使所有数据无效。

建议的方法是存储指针向量(如果您需要内存收集功能,您可能需要使用智能指针向量)。通过这种方式,无论重新分配容器空间如何,在每次插入/删除操作时,都将确保指针是有效的(假设没有任何其他内容触及对象)。

从这个问题还不清楚,但一个忠告,如果你只是存储您的容器代替指针对象:与

std::vector<T>::push_back() 

插入元素时,放入容器像你存储对象的副本。这通常是不理想的,因为如果事情没有正确设置,会带来额外的复制开销并可能产生问题。请参阅“浅拷贝”和“深度拷贝”以了解有关此问题的更多信息。

+0

我认为使容器存储unique_ptrs到实体是一个好主意。无论如何,这是实体如何处理组件的方式。我想这一开始并没有出现,因为在这种情况下我不需要多态。顺便说一句我使用emplace_back所以复制不应该是一个问题,因为实体构造函数不接受但感谢警告。 – Veritas

+0

@Veritas直接存储对象,即使您使用emplace_back不应该让你担心副本开销,但还是应该创建有关重新分配的担忧(如果你的指针/引用/迭代器对它们进行存储) –

+0

,登记不会发生,直到后,我添加一个组件到被分配的实体,所以这并不重要。无论如何,我会用unique_ptr的方法,感谢您的帮助! – Veritas

0

只有实际值的重定位发生时,指针值才会改变。 这是你操纵对象数组而不是指向这些对象的指针数组的情况。你绝对不应该做前者。

我会建议使用像std :: array或std :: vector这样的标准集合来管理对象。有了这些,并且提供了对堆中的对象的实例化(阅读:用新的),你不必担心这个值。