请看下面的代码(一代码胜一千字):
形状.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();
}
我知道错误从何而来,但我更关心良好的做法。我的问题:
在上面的代码中,将 Pimpl 与 ABC 混合是不是一个坏主意?
如果不是,避免错误的最佳方法是什么(保持封装等)?
如果是,我必须做什么才能在对用户隐藏实现的同时获得多态性(在我的
Shape
场景中)?
Obs:假设性能不是问题。
谢谢。
最佳答案
这是个好主意。作为引用,这里是 Coplien 的 letter/envelope 习语。 [ 您可以使用
enum
代替;显然需要处理错误等。 并行的是基本类型是公共(public)的,而实现是隐藏的。见下文。我只是将初始的
ShapeImpl
声明公开;这会导致什么问题?
关于c++ pimpl 和抽象类在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962457/