我对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类。
答案 0 :(得分:0)
我不确定为什么你需要shared_pointer,一个简单的unique_pointer会做得很好。
在C ++中只有两种方法可以处理运行时多态对象 - 通过指针或通过引用。 参考文献似乎不适合您的设计,因此您会遇到指针。如果您不喜欢指针,请将设计重新设计为不使用运行时多态性。