代码之家  ›  专栏  ›  技术社区  ›  gsanta

在c++中,如何隐藏类使用shared_ptr在其私有成员中抽象类

  •  0
  • gsanta  · 技术社区  · 1 年前

    我想使用共享ptr将抽象类(A)存储在另一个类(B)中,但我不想透露它将存储在B中的共享ptr中。 有可能吗?

    我不想透露它的原因,因为我认为如果构造函数期望例如对对象的const引用,而不是shared_ptr,那会更好

    例如:

    class Renderer {
    public:
       void render() = 0;
    };
    
    class GLRenderer : public Renderer {
    public:
       void render() {}
    };
    
    class HeadlessRenderer : public Renderer {
    public:
       void render() {}
    };
    
    class Layer {
    public:
        Layer(const Renderer &renderer) {
            // here is the problem that make_shared needs a concrete class
            m_Renderer = std::make_shared<Renderer>(renderer);
        }
    private:
        std::shared_ptr<Renderer> m_Renderer; 
    };
    
    1 回复  |  直到 1 年前
        1
  •  4
  •   Sam Varshavchik    1 年前

    实现这一点最简单的方法是,如果抽象类定义了一个子类用来克隆自己的方法,比如:

    class Renderer {
    public:
       void render() = 0;
       virtual Renderer *clone() const=0;
    };
    
    class GLRenderer : public Renderer {
    public:
       void render() {}
       Renderer *clone() const { return new GLRenderer{*this}; }
    };
    

    构造函数使用的是:

    Layer(const Renderer &renderer) : m_Renderer{renderer.clone()} {}
    

    注意,现在每个子类都负责覆盖和实现 clone()

    或者, 克隆() 可以返回 std::shared_ptr 一开始 克隆() 使用 std::make_shared