0

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

形状.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:假设性能不是问题。

谢谢你。

4

1 回答 1

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

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

请参阅: 带有形状的示例

于 2013-04-12T03:34:35.193 回答