我对C ++有点陌生,试图尝试如何解决继承问题。

我有通用的Open Frameworks应用程序,BaseApp,然后是MainApp,它是BaseApp中框架的特定实现。

应用程序可以渲染全屏图层,并缓冲另一个图层以进行过渡。图层还从BaseLayer类扩展,该类与BaseApp一样,直到扩展。

所以

class BaseApp : public ofBaseApp {
    public:
        BaseLayer renderLayer;
        BaseLayer bufferedLayer;
}
// ...
class MainApp : public BaseApp {
    public:
        VideoLayer videoLayer; // Video + Image layers extend BaseLayer
        ImageLayer imageLayer;
}


我想说的是,我的renderLayer是我的imageLayer,我的bufferedLayer是我的videoLayer,即:renderLayer = (some class which extends layer)所以在BaseApp中,我可以将其视为BaseLayer,在MainApp中,我可以将其视为VideoLayer,ImageLayer等

我最终用shared_ptr看起来很脏,但是可以正常工作:

class BaseApp : public ofBaseApp {
    public:
        shared_ptr<BaseLayer> renderLayer;
}

// inside MainApp.setup()
    renderLayer = make_shared<ImageLayer>();
    if (shared_ptr<ImageLayer> imageLayer = dynamic_pointer_cast<ImageLayer>(renderLayer)){
        // ImageLayer specific setup
        imageLayer->setup("assets/tiger.png",0,0,800,600);
    }


有没有更清洁的方法来实现这一目标?我一直在尝试使用oF样式,该样式具有尽可能少的指针,因此Layer是POD类。

最佳答案

我建议添加virtual函数以获取渲染层和缓冲层。

class BaseApp : public ofBaseApp {
    public:
        virtual BaseLayer& getRenderLayer() = 0;
        virtual BaseLayer& getBufferedLayer() = 0;
};

// ...
class MainApp : public BaseApp {
    public:

        virtual BaseLayer& getRenderLayer() { return imageLayer;}
        virtual BaseLayer& getBufferedLayer() { return videoLayer; }

    private:
        VideoLayer videoLayer; // Video + Image layers extend BaseLayer
        ImageLayer imageLayer;
};


在适当的地方添加const

09-06 19:15