0

我的情况如下:在我较大的程序中,我想创建一个界面来从图像源中抓取帧。但是,在程序中,我事先不知道我是要从相机还是从视频文件中抓取帧。但我希望有一个界面可以处理相同的视频文件和相机帧。这总共需要大量代码来完成,因此我将提供一个非常简短的示例。

这是接口的示例:

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_frameInput 派生类的定义。如您所见,它们“产生”了不同类型的视频帧。

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*或者这是强制使用指针的情况之一?

亲切的问候,

4

2 回答 2

3

在 stackoverflow 上,我多次阅读 c++ 答案,除非真的非常需要,否则永远不应该使用指针。

当你阅读任何建议时,你应该试着理解为什么给出这个建议。如果建议背后没有充分的理由,则无需遵循该建议。

仅仅因为有人告诉您“指针不好”而试图从程序中消除所有指针并不是一个好主意。

有经验的程序员告诉你要避免使用原始指针,因为指针意味着手动内存管理,这很容易出错(忘记删除某些东西 == 内存泄漏),另外你必须知道规则三
我也觉得没有经验的程序员经常给出相同的建议,因为他们根本不完全理解指针(或者害怕指针?)。

您可以使用引用,但因为您不能复制/重新分配将不太有用的引用。例子:

#include <iostream>

class A{
public:
    virtual int getVal() const = 0;
    virtual ~A(){}
};

class B: public A{
public:
    virtual int getVal() const { return 2; };
};

class C: public A{
public:
    virtual int getVal() const { return 3; };
};

class D{
public:
    const A& getInterface(bool which) const{
        if (which)
            return c;
        return b;
    }
protected:
    B b;
    C c;
};

int main(int argc, char** argv){
    D d;
    std::cout << d.getInterface(true).getVal() << std::endl;
    std::cout << d.getInterface(false).getVal() << std::endl;
    return 0;
}

如您所见,要通过引用返回对象,您需要在某处创建并存储它。如果要“杀死所有指针”,则需要将此对象创建为更大类的成员变量(或全局变量)。

使用指针,您可以简单地返回shared_ptr<A>.

在您的代码中,更好的主意是使用smart pointer类而不是原始指针。这将消除手动删除/内存管理的需要。

在不使用 Input* 的情况下重写上面的代码可能更好

是的,这是可能的,但没有理由这样做,这(IMO)不是更好。我的示例说明了如何做到这一点。如果没有指针(任何类型的 - 智能或原始),您还必须将 CameraInput 和 VideoInput 都存储在某处,而使用指针,您可以按需创建它们。

于 2013-07-19T13:46:13.490 回答
0

您可以使用智能指针(例如 std::unique_ptr 或 std::shared_ptr)而不是原始指针。
如果你想要多态,你必须使用指针或引用。这里有比你真正想要的更多的细节

于 2013-07-19T13:07:01.233 回答