c++ pimpl 和抽象类在一起

标签 c++ abstract-class pimpl-idiom

请看下面的代码(一代码胜一千字):

形状.hpp

class Shape {
public:
    double area() const;
private:
    class ShapeImpl;
    ShapeImpl* pimpl;
};

形状.cc

// ABS
class Shape::ShapeImpl {
public:
    double area() const = 0;
};


class Circle : public Shape::ShapeImpl { // error: Shape::ShapeImpl is private
public:
    double area() const {return pi*r*r;}
};


double Shape::area() const {
    return pimpl->area();
}

我知道错误从何而来,但我更关心良好的做法。我的问题:

  1. 在上面的代码中,将 Pimpl 与 ABC 混合是不是一个坏主意?

  2. 如果不是,避免错误的最佳方法是什么(保持封装等)?

  3. 如果是,我必须做什么才能在对用户隐藏实现的同时获得多态性(在我的 Shape 场景中)?

Obs:假设性能不是问题。

谢谢。

最佳答案

  1. 这是个好主意。作为引用,这里是 Coplien 的 letter/envelope 习语。 [ 您可以使用 enum 代替;显然需要处理错误等。 并行的是基本类型是公共(public)的,而实现是隐藏的。见下文。

  2. 我只是将初始的 ShapeImpl 声明公开;这会导致什么问题?

参见:example with a Shape

关于c++ pimpl 和抽象类在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962457/

相关文章:

c++ - 如何避免在 C++ 中自动释放?

java:抽象类及其变量

c++ - 奇怪的 "type class::method() : stuff "语法 C++

c++ - 内部类取决于模板参数

c++ - 将对象插入 std::map 时构造函数中变量的地址

c++ - 在 C++ 中使用自定义比较函数初始化多重集

c++ - 何时在抽象类 cpp 中声明 protected 字段

c++ - 为 Pimpl 使用不透明指针的更好方法

C++ 指针与数组表示法

reflection - 如何在 .NET Core 中检查类型是否是抽象的?