C++ 是否将任何类引用与继承一起计数?

C++ 是否将任何类引用与继承一起计数?,c++,inheritance,smart-pointers,C++,Inheritance,Smart Pointers,在我的新项目中,我希望(主要是为了看看它将如何工作)完全禁止代码中的原始指针 我的第一种方法是让所有类都从这个简单类继承: 模板 阶级基础 { 公众: typedef std::共享\u ptr ptr; }; 只要我需要指针,就可以简单地使用class::ptr 这种方法似乎很合适,直到我意识到有时我的对象希望将“This”指针传递给其他对象。让我的对象只是将它包装在共享的\u ptr中是不行的,因为从那时起,同一个指针可能有两个所有者。我想这很糟糕 我的下一个想法是更改“Base”类以实现引

在我的新项目中,我希望(主要是为了看看它将如何工作)完全禁止代码中的原始指针

我的第一种方法是让所有类都从这个简单类继承: 模板 阶级基础 { 公众: typedef std::共享\u ptr ptr; };

只要我需要指针,就可以简单地使用class::ptr

这种方法似乎很合适,直到我意识到有时我的对象希望将“This”指针传递给其他对象。让我的对象只是将它包装在共享的\u ptr中是不行的,因为从那时起,同一个指针可能有两个所有者。我想这很糟糕

我的下一个想法是更改“Base”类以实现引用计数本身,因此从“Base”继承的类的每个实例只能有一个计数


这是一个很好的解决方案吗?是否有更好的解决方案,可以为我解决boost和/或stl问题?

您可能想看看


另一方面,在使用
共享\u ptr
时,您需要注意循环引用的可能性。要避免这种情况,可以使用。这意味着您需要某种方法来区分这两个指针,因此简单地使用typedef
class::ptr
可能不够。

为什么要“完全禁止原始指针”?你是在试图避免做出关于对象所有权的设计决策吗?在某些情况下,是的,我的项目是一个对象可能没有明确所有者的游戏(也就是说,一个敌人产生了另一个敌人,然后死亡。但这也是一个实验,你能把这个概念带到什么程度。还有一个就是永远不必考虑内存管理的懒惰!)@Charles我实际上认为,如果我们用稍微不同的方式重新表述它,这是一个非常好的主意,因为它具有非常严格的RAII遵从性。然而,我会将其重新表述为“完全禁止用于内存管理的原始指针”要避免完全传递“原始”指针是非常困难的,但如果有一个坚定的策略并启动一个新的代码库,就可以只使用作用域ptr和作用域数组来构建所有东西。这些已经形成了与RAII兼容的原语来存储运算符new/new[]的结果超过“原始”指针。@Charles…或者更确切地说,“完全禁止任何需要显式调用delete/delete[]的情况”,即使是在类的实现中。我们仍然可以有效地使用作用域_ptr和作用域_数组作为内存管理原语而不是指针来做任何事情。唯一无法避免显式内存释放的情况是,如果希望实现内存分配器或实现使用内存分配器的数据结构。@Study472:我认为这是一个错误避免手动使用
delete
delete[]
但这不是问题所在。选择何时何地共享所有权肯定是设计过程中必不可少的一部分;禁止所有原始指针的使用既不能替代这一点,在许多项目中也不实用。这正是我想要的!我有一种感觉,boost已经找到了答案。我想另一种typedef可以削弱ptr我来解决这个问题。