如何解决智能指针高级实现[帮助、建议、反馈]
我想更深入地了解 C++。我想了解在 STL 中做出的一些决定,但仅从代码中就很难理解。
我的想法是自己实现一些 STL 以了解陷阱,从而提高我对 C++ 的理解并改进我的代码。而且我想在 STL 容器中有一些功能,STD 没有像资源处理类的销毁通知。我创建了 SharedPointer 的扩展版本,以包含 std::function 作为删除通知程序。
我发现了一些麻烦。
以这个代码为例:SmartPointer.hpp
这是我想出的一些代码,但有一些问题。
简短:
- 已知问题
- 派生类不起作用
- 抱怨类型不完整
- 未知问题
长:
1.1.派生类不起作用
类型转换后,仅将 T 作为类型将不起作用。这个想法是将 OrigT 作为第二个参数传递,所以我总是知道 ptr 指向什么类型。我可以将它转换回来并调用正确的析构函数。
考虑
SharedPointer<Derived> member = base.Cast<Derived>();
将创建 T = OrigT 并且在我假设的断言转换后类型将不匹配。我无法想象如何解决这个问题。
if (!shared->HasReferences())
{
delete shared;
OriginalValuePointer origPtr = dynamic_cast<OriginalValuePointer>(ptr);
delete origPtr;
}
1.2.投诉类型不全
在我的例子中,我收到了关于不完整类型的抱怨。但我想不通为什么。目前我正在考虑制作 operator* 和 operator-> 模板,这也将是在黑暗中的一个镜头。我不知道它为什么会抱怨,我想问你是否可以在这里指出问题。
Same code as above in compiler complaint
2.2.我认为 stackoverflow 不是寻求反馈的理想场所,但考虑到我无论如何都想问的两个问题。
-
有没有人有任何可读和理想解释的智能指针的来源?我发现的那些并不完全符合我的期望。它们要么太简单,要么在关键点没有解释。
-
如果您对代码有一些直接的反馈,我将不胜感激。当然远离编码风格;-)。你有没有直接看到我犯错的地方我会后悔?有什么可以做得更好的吗? (例如, .Cast as member 恕我直言是一个糟糕的选择。有一次它不是指针的直接属性,我认为它可能会导致我尚未意识到的缺陷。)
非常感谢您的帮助和意见。
保持健康。
解决方法
- 普通的 C++ 类使用 snake_case,而不是 CamelCase。
- 这个类不是线程安全的(你可能知道这一点,但值得一提)
- NumReferences 通过引用返回计数,这没有用,而且比通过
int
返回略慢。 - 在类中定义的所有方法都会自动
inline
,因此您在任何地方都不需要它。 -
operator ValueType()
是隐式的,非常危险。你可以说清楚,但我会完全消除它。 -
operator ValueType()
需要知道ValueType
的详细信息才能创建。因此,如果ValueType
尚未完全定义,您将收到有关不完整类型的编译器错误。同样,删除该方法可以消除此问题。 -
operator SharedPointer<U>()
和operator bool()
也是隐式的。首选explicit
。 - 强烈考虑将
assert
添加到所有使用shared
或ptr
的方法中,而不先检查它是否为null
。 -
Raw()
通常被命名为get()
现在,转到 OrigT
和 Release
:std::shared_ptr
做了一个有趣的技巧,其中 SharedData
具有继承性:
struct SharedData {
std::atomic_uint count;
virtual ~SharedData() {}
};
template<class OrigT>
struct SharedDataImpl {
OrigT* data;
~SharedData() {delete data;}
};
由于指向相同数据的所有 shared_ptrs 都将指向同一个 SharedDataImpl,因此它们不必知道最派生的类。他们所要做的就是删除 SharedData 成员,它会自动正确地清理数据。这确实需要有第二个数据指针:一个在 SharedPointer
本身中,一个在 SharedData
中,但通常这不是问题。 (或 virtual T* get()
方法)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。