我的情况如下:在我较大的程序中,我想创建一个界面来从图像源中抓取帧。但是,在程序中,我事先不知道我是要从相机还是从视频文件中抓取帧。但我希望有一个界面可以处理相同的视频文件和相机帧。这总共需要大量代码来完成,因此我将提供一个非常简短的示例。
这是接口的示例:
class Input {
public :
virtual void
get_frame() = 0;
};
这是一个派生类,应该从相机中抓取帧。
class CameraInput: public Input {
public :
void get_frame();
};
这是应该打开视频文件并从文件中抓取帧的类。
class VideoInput: public Input {
public :
void get_frame();
};
以下是get_frame
Input 派生类的定义。如您所见,它们“产生”了不同类型的视频帧。
void
CameraInput::get_frame(){
std::cout << "camera-frame" << std::endl;
};
void
VideoInput::get_frame() {
std::cout << "video-frame" << std::endl;
};
这是实例化类型为CameraInput
或的对象的代码VideoInput
。
添加了编辑共享指针
typedef enum { VIDEO, CAMERA } input_type ;
std::shared_ptr<Input> framegrabber;
/*Does this have to be a pointer?*/
/*In my program I don't know this in advance.*/
input_type my_input = CAMERA;
switch ( my_input ){
case CAMERA:
framegrabber = std::shared_ptr<Input>(new CameraInput);
break;
case VIDEO:
framegrabber = std::shared_ptr<Input>(new VideoInput);
break;
default:
/*error handling here*/
break;
};
framegrabber->get_frame();
在 stackoverflow 上,我多次阅读 c++ 答案,除非真的非常需要,否则永远不应该使用指针。这就是我的问题的来源,是否可以在不使用 a 的情况下重写上面的代码并且更好,Input*
或者这是强制使用指针的情况之一?
亲切的问候,