抽象的 C++ 继承 类
C++ inheritance for abstract classes
我对 C++ 有点陌生,正在尝试找出如何用继承解决问题。
我有通用的 Open Frameworks 应用、BaseApp,然后是 MainApp,它是 BaseApp 中框架的特定实现。
应用程序可以呈现全屏图层并缓冲另一个图层以进行过渡。层也从 BaseLayer class 扩展,就像 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 class.
我不确定你为什么需要 shared_pointer,一个简单的 unique_pointer 就可以了。
在 C++ 中只有两种处理 运行 时间多态对象的方法 - 通过指针或通过引用。
参考文献似乎不适合您的设计,因此您只能使用指针。如果您不喜欢指针,请重新设计以不使用 运行 时间多态性。
我建议添加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
。
我对 C++ 有点陌生,正在尝试找出如何用继承解决问题。
我有通用的 Open Frameworks 应用、BaseApp,然后是 MainApp,它是 BaseApp 中框架的特定实现。
应用程序可以呈现全屏图层并缓冲另一个图层以进行过渡。层也从 BaseLayer class 扩展,就像 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 class.
我不确定你为什么需要 shared_pointer,一个简单的 unique_pointer 就可以了。
在 C++ 中只有两种处理 运行 时间多态对象的方法 - 通过指针或通过引用。 参考文献似乎不适合您的设计,因此您只能使用指针。如果您不喜欢指针,请重新设计以不使用 运行 时间多态性。
我建议添加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
。