继承期间受保护成员的皮条
pimpl for protected member during inheritance
我有大量受保护的成员函数,这些函数在`基类hpp文件中声明,该文件由派生的类使用。我的想法是将它们从头文件中删除,以减少编译依赖性。我也想过对受保护的成员使用皮条客方法。
我在Base类cpp文件中定义了一个Impl类,并将所有受保护的函数移动到Impl类中。此外,我将Base类头文件中的Impl类正向声明为受保护成员。
protected:
class Impl;
Impl* impl_;
但在这样做的过程中,当我从派生的类中使用impl_调用受保护函数时,在派生类编译中发生了以下错误::
error: invalid use of incomplete type ‘class Base::Impl’
if (false == impl_->EncodeMMMsgHeader(mm_msg_header_)) {
error: forward declaration of ‘class Base::Impl’
我认为出现这个错误是因为在编译器需要有关类的上下文信息的任何情况下都不能使用正向声明,编译器只告诉它一点点关于类的信息也没有任何用处。
有什么办法可以克服上述问题吗?如果没有,那么有人能给我一个更好的方法来实现我的目标吗。
您可以添加一个层来减少依赖关系:
来自
#include "lot_of_dependencies"
#include <memory>
class MyClass
{
public:
~MyClass();
/*...*/
protected:
/* Protected stuff */
private:
struct Pimpl;
std::unique_ptr<Pimpl> impl;
};
添加
MyClassProtectedStuff.h
#include "lot_of_dependencies"
class MyClassProtectedStuff
{
public:
/* Protected stuff of MyClass */
private:
// MyClass* owner; // Possibly back pointer
};
然后
MyClass.h
#include <memory>
class MyClassProtectedStuff;
class MyClass
{
public:
~MyClass();
/*...*/
protected:
const MyClassProtectedStuff& GetProtected() const;
MyClassProtectedStuff& GetProtected();
private:
struct Pimpl;
std::unique_ptr<Pimpl> impl;
std::unique_ptr<MyClassProtectedStuff> protectedData; // Might be in Piml.
};
然后派生类应该包括这两个头,而常规类只包括MyClass.h
相关文章:
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 将派生类构造函数参数传递给受保护的成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 无法访问派生类函数内的基类的受保护数据成员
- 派生类如何使用基类的受保护成员