c ++ pimpl和抽象类在一起

时间:2013-04-12 03:15:37

标签: c++ abstract-class pimpl-idiom

请查看以下代码(代码值千言万语):

shape.hpp

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

shape.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场景中)我需要做些什么才能获得多态性?

  4. Obs:假设性能不是问题。

    谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 这是个好主意。作为参考,这是由Coplien提供的字母/信封用语。 [您可以使用enum代替;显然需要处理错误等 并行是基类型是公共的并且实现隐藏。见下文。

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

  3. 请参阅:example with a Shape