引用对象的良好实践

时间:2011-02-09 17:23:26

标签: c++ reference

我正在开发一个项目,其中几个不同的对象在语义上链接在一起,我现在正在寻找让对象相互引用的好方法。通常我会在每个对象中放置指针并将它们链接在一起。在这种特殊情况下,没有堆对象(至少我在编写代码时不会创建任何对象,内部可能在另一个页面上执行的操作)。我们想出了一个存储唯一ID列表的类,并将这个id与需要知道它们的对象共享。

这是好习惯吗?还有其他更好的方法吗?

背景:该项目以学术背景为基础。我们并不一定知道学生或其他人对此有何贡献。技能水平也不清楚,但可能不是很高。通过不使用指针,我们至少可以确保不会意外删除对象或者不会删除愚蠢。

修改

让我想到一个唯一id的想法是我们使用向量来存储数据。 STL容器做了很多事情就是复制他们的容器。这就是为什么我不太确定指针会运行良好的原因。与向量元素的简单索引相同,内容和/或顺序可能会发生变化。

4 个答案:

答案 0 :(得分:1)

这是一个很好的实践吗?

根据我的经验,没有。任何类型的独特ID废话只是需要管理和管理的一件事,或者你会得到各种各样的怪异废话。我曾经使用过这种想法的产品和很多我们的错误,甚至更多的维护问题,都是由于必须记住愚蠢的ID跟踪变量引起的。当然,实现非常复杂(边缘疯狂),并且很容易做得比完成更好,但是当你已经有一个系统生成的唯一ID时,还有一件事要处理:变量的地址

还有其他更好的方法吗?

是的,使用指针。

不幸的是,没有智能指针(我知道无论如何)可以用来简单地引用其他地方拥有的对象,所以现在,你必须确保通过策略和文档强制执行问题。这是一个弱点,是的,但仍然是一个更好的替代跟踪和ID,这可以很容易地遇到相同的问题和更多。

如果您对可用于此类目的的智能指针感兴趣,您可能会对我最新的博客条目感兴趣。

答案 1 :(得分:1)

对向量的修改可能会使向量中任何指向对象的指针无效。你应该避免创建长期指向向量内容的指针。

将智能指针存储在矢量中可能更好。

答案 2 :(得分:0)

只需使用指针 - 这就是它们的用途。如果由于某种原因需要序列化对它们的引用,则应该只使用类似唯一ID的内容。如果您只编写不需要跨进程发送引用的代码,请使用指针。特别是如果没有堆对象而您不必考虑所有权。

答案 3 :(得分:0)

你确实可以使用指针。

为防止有人删除该实例,请将析构函数设为私有。 这样,实例就无法被破坏。

然而,正如詹姆斯麦克尼利斯指出的那样,永远不要低估愚蠢的力量。您不能阻止某人在您的实例中调用free(ptr)或覆盖内存。