Мое дело в следующем: в моей более крупной программе я хочу создать интерфейс для захвата кадров из источника изображения. Однако в программе я не знаю заранее, хочу ли я захватить кадры из камеры или из видеофайла. Но я хотел бы иметь один интерфейс, который обрабатывает видеофайлы и рамки камеры как идентичные. Это, в общем, требует много кода для выполнения, поэтому я приведу очень короткий пример.Возможно ли создать экземпляр интерфейса без указателей?
это пример интерфейса:
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
из классов входных получено. Как вы можете видеть, они «производят» различные типы видеокадров.
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 я много раз читал в С ++ отвечает, что никогда не следует использовать указатели, если только один действительно, на самом деле не нужно. Вот откуда мой вопрос: возможно ли и лучше переписать код выше, не используя Input*
, или это один из тех случаев, когда обязательно использовать указатели?
Уважением,
Вы должны хотя бы использовать какой-нибудь умный указатель там – PlasmaHH
Нет, это невозможно. Зачем вам это делать? –
@PlasmaHH согласен, я сделаю это, но это не отвечает на мой вопрос. – hetepeperfan