【发布时间】:2016-02-04 03:22:00
【问题描述】:
请参阅我的 PIMPL 继承实现。在派生类中,DerivedImpl 继承自 BaseImpl。
问题: 指向 Impl 的指针是否应该只在基类中定义,如以下代码?如果是这样,每次我需要使用基指针时,我都必须将其转换为派生类型。但是,根据分析结果,静态转换 shared_ptr 看起来很昂贵,因为这种转换被广泛使用。而且 cast 函数不能内联在 header 中,因为它在那里不完整。
也许我犯了一些错误。或者使用智能指针有更好的实现吗?
// Base.h
class BaseImpl; // pre-declaration
class Base
{
public:
Base();
explicit Base(BaseImpl* ptr);
~Base();
protected:
std::shared_ptr<BaseImpl> d_Ptr;
};
// baseimpl.h
class BaseImpl
{
double mDate;
};
// Derived.h
#include "Base.h"
class DerivedImpl;
class Derived :
public Base
{
public:
Derived();
~Derived();
std::shared_ptr<DerivedImpl> d_func();
const std::shared_ptr<DerivedImpl> d_func() const;
};
// Derived.cpp
#include "Derived.h"
#include "DerivedImpl.h"
Derived::Derived() : Base(new DerivedImpl())
{
}
Derived::~Derived()
{
}
std::shared_ptr<DerivedImpl> Derived::d_func()
{
return std::static_pointer_cast<DerivedImpl>(d_Ptr);
}
const std::shared_ptr<DerivedImpl> Derived::d_func() const
{
return std::static_pointer_cast<DerivedImpl>(d_Ptr);
}
【问题讨论】:
-
你真的需要从
d_func返回一个shared_ptr吗? -
我想不出任何情况下为一组类实例共享动态分配的实现是有意义的。你应该只使用
unique_ptr。 -
@immibis 我不确定。如果 d_func 返回原始指针,是否存在内存泄漏风险? (例如 d_func()->aMemberFunc() 抛出)
-
@YohWang 如果
d_func()->aMemberFunc()抛出,那么这与任何内存泄漏无关。内存泄漏是指您的程序分配了某些东西而忘记释放它。
标签: c++ inheritance pimpl-idiom