引用对象的良好做法

Posted

技术标签:

【中文标题】引用对象的良好做法【英文标题】:Good practice for referencing objects 【发布时间】:2011-02-09 17:23:25 【问题描述】:

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

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

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

编辑:

让我想到唯一 id 的原因是我们使用向量来存储数据。 STL 容器经常做的一件事是复制它们的容器。这就是为什么我不太确定指针是否能正常工作的原因。与向量元素的简单索引相同,内容和/或其顺序可能会发生变化。

【问题讨论】:

“我们至少可以确保对象不会被意外或愚蠢地删除”永远不要低估愚蠢的力量。 【参考方案1】:

这是好的做法吗?

根据我的经验,不会。任何类型的唯一 ID 废话只是必须管理和正确管理的另一件事,否则你会得到各种奇怪的废话。我曾经做过一个产品,它使用了这个想法,我们的大部分错误,甚至更多的维护问题,都是由于必须记住愚蠢的 ID 跟踪变量造成的。诚然,实现非常复杂(近乎疯狂),而且做得比现在做得更好很容易,但是当您已经拥有系统生成的唯一 ID 时,它仍然只是要处理的另一件事:变量的地址.

还有其他更好的方法吗?

是的,使用指针。

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

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

【讨论】:

【参考方案2】:

对向量的修改可能会使向量中任何指向对象的指针失效。您应该避免创建指向向量内容的长寿命指针。

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

你确实可以使用指针。

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

但是,正如 James McNellis 所指出的,永远不要低估愚蠢的力量。您不能阻止某人调用 free(ptr) 或覆盖您实例中的内存。

【讨论】:

根据我的经验,我的同事和学生往往对 C++ 有基本的了解,但对软件设计或底层机制的了解有限。这意味着他们知道“删除”,但不知道“免费”。

以上是关于引用对象的良好做法的主要内容,如果未能解决你的问题,请参考以下文章

将对象保存到数据库的良好做法 [关闭]

保存游戏中心数据的良好做法(GKTurnBasedMatch)?

如何使用PHP / MySQL实现良好的MVC模式而不会丢失SQL请求时间/服务器内存? (良好做法)

拥有一个包含指向大多数对象的指针并通过它引用对象的类是不好的做法吗?

在 Blazor 中将值从子组件传递到父页面的良好做法?

在 MongoDB 中,为经常查询的对象提供自己的引用模式是更好的做法,还是将它们留在父级中?