C++ 设计 : Pool and pointers VS client-server

标签 c++ oop design-patterns smart-pointers unique-ptr

我正在设计一个软件工具,其中有一个内存模型,API 用户可以获取模型的对象,查询它们并设置值。

由于模型的所有对象都属于一个模型,而且大部分操作都必须进行记录和测试等,所以每个创建的对象都必须注册到模型对象中。 Model 将所有对象存储为 std::unique_ptr,因为它是它们的唯一所有者。在需要时,它将原始指针传递给用户。

让我担心的是用户可能会在这些指针上调用delete。但是如果我使用 std::shared_ptr,用户仍然可以使用 get() 并调用 delete。所以它并没有更安全。

我想到的另一个选择是通过名称字符串引用对象,或者传递 ObjectReference 对象而不是真实对象,然后可以销毁这些 ObjectReferences 而不会影响实际存储的对象。

这些引用有点像客户端:您告诉它们要做什么,然后它们将请求转发给实际对象。这对开发人员来说是很多额外的工作,但它保护了指针。

我应该担心指针吗?直到现在我一直在使用智能指针,但现在我需要以某种方式允许用户访问由中央模型管理的对象,而不允许用户删除它们。

[嗯...也许将析构函数设为私有(private),并让只有 unique_ptr 可以通过 Deleter 访问它?]

最佳答案

您不必担心用户对您的对象调用 delete。作为记录在案的约束,这是非常好的事情之一,任何违反该约束的程序员都应该得到他遇到的任何问题。

如果您仍然真的想明确禁止这样做,您可以编写一个轻量级外观对象,您的用户将按值传递(但根据您必须包装的类的数量,这可能需要大量工作),或者,你说过,将他们的析构函数设为私有(private)并让 unique_ptr 使用 friend 删除器。

我个人不喜欢只使用标识符,因为查找时间会很快导致性能问题(即使您在下面使用 map )。


编辑:现在我想到了,在标识符和原始指针/引用之间有一种方法:不透明引用

从用户的角度来看,它就像一个标识符,他们所能做的就是复制/移动/分配它或将它传递给您的模型。

在内部,它只是一个带有指向您的对象的私有(private)指针的类。您的模型是此类的友元,它可以从原始指针创建不透明引用的新实例(用户不能这样做),并使用原始指针访问对象而不会造成任何性能损失。

类似的东西:

class OpaqueRef
{
    // default copy/move/assignment/destructor
private:
    friend class Model;
    Object* m_obj;
    OpaqueRef(Object& obj) : m_obj(&obj) {}
};

仍然不确定是否值得麻烦(我坚持我的第一段),但至少你还有一个选择。

关于C++ 设计 : Pool and pointers VS client-server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17879032/

相关文章:

c# - 可扩展工厂设计模式

Java、FTP 和多个消费者

c++ - 为什么以及何时需要提供我自己的删除器?

c++ - 双链表复制构造函数(不能尾对头复制)

c++ - lower_bound 执行二进制搜索

java - 使用 While 与 If 防止数组中出现重复的整数 ID 号

java - 如何实现Guava缓存来存储和获取不同类型的对象?

c++ - C 和 C++ 关于++ 运算符的区别

java - 所有不可变对象(immutable对象)都可以重用吗?

c++ - 我应该转向面向对象编程(黑匣子)吗?如何转向?