[英]error C2248: cannot access protected member declared in class
class TClass
{
class EmbeddClass
{
public:
....
protected:
virtual ~EmbeddClass() {}
}
boost::scoped_ptr<EmbeddClass> scpEmbeddClass;
}
vs2010抱怨上面的代码。 我可以通过将~EmbeddClass
定义为公共函数来解决此问题。
问题>此问题的原因是什么? 是因为scoped_ptr的析构函数无法访问受保护的~EmbeddClass
吗? 在我看来,shared_ptr没有这样的问题。
谢谢
问题>此问题的原因是什么? 是因为scoped_ptr的析构函数无法访问受保护的〜EmbeddClass吗?
是的,这就是问题所在。
在我看来,shared_ptr没有这样的问题。
我只能假设您没有存储EmbeddClass
对象,而是在shared_ptr
存储EmbeddClass
派生的类型的对象。 在这种情况下,共享指针的构造函数将创建一个删除程序 ,该删除程序将调用最派生类型的析构函数(如shared_ptr
构造函数/ reset()
/ ..所示)。 因为即使派生类型shared_ptr
了基本类型,但shared_ptr
破坏了派生程度最大的类型,因此它不会调用基本析构函数。
是因为scoped_ptr的析构函数无法访问受保护的〜EmbeddClass吗?
是。
在我看来,shared_ptr没有这样的问题。
需要注意的是,你可以有多个shared_ptr
拥有的资源,如果你不初始化或使用计数大于1,它永远不会需要调用删除器。 然而, scoped_ptr
是更喜欢unique_ptr
,它拥有的独特资源的所有权和确保它可以删除该指针,即使你不进行初始化。
基本上, shared_ptr
不拥有的资源并不需要访问受保护的析构函数,而scoped_ptr
和unique_ptr
确实需要访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.