gpt4 book ai didi

c++ pimpl 和抽象类在一起

转载 作者:行者123 更新时间:2023-11-28 07:40:18 26 4
gpt4 key购买 nike

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

形状.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com