如何创建需要上下文的对象的全局实例?

时间:2012-05-29 23:10:32

标签: c++ opengl openvg

我正在尝试编写一个OpenVG的C ++包装器,它在设计中非常像Open-GL。 这是一个路径句柄的简单包装器:

class Path {
        VGPath handle;

    public:
        Path() :
        handle(vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F,
            1,0,0,0, VG_PATH_CAPABILITY_ALL)) 
        { 
        std::cout << "Path Handle created : " << (void*)handle << '\n';
        }

        ~Path() {
            std::cout << "Path destroyed  : " << (void*)handle << '\n';
            vgDestroyPath(handle);
        }

    };

不幸的是,openVG需要一个上下文来运行,如果在没有openVG上下文的情况下调用vgCreatePath,它将中止。 这使我无法在我的代码中创建(用于测试目的)全局Path对象,因为它是在我创建openVG上下文之前构建的(我在main中这样做)。 有什么办法可以防止这种情况发生吗?

我认为将句柄保留在对象构造中是一个非常糟糕的主意......如果没有上下文,我是否应该在创建Path对象时强制创建全局上下文?

1 个答案:

答案 0 :(得分:4)

  

是否有任何解决方法可以防止这种情况发生?

是的,使用智能指针,使用某种“工厂”功能按需创建它,只要在任何变量中需要它就存储它。

在C ++ 03中:

typedef boost::weak_ptr<Path> PathWeakPtr;
typedef boost::shared_ptr<Path> PathPtr;

PathPtr createPath(){
    static PathWeakPtr lastPath;
    PathPtr result = lastPath.lock();
    if (!result){
        result.reset(new Path());
        lastPath = result;
    }
    return result;
}

...

void doSomething(){
    PathPtr path = createPath();//points to same path as in main*()
    ...
}

int main(int argc, char** argv){
    PathPtr path = createPath();//initialization
    doSomething();
    return 0;
}

在C ++ 11中使用:

typedef std::weak_ptr<Path> PathWeakPtr;
typedef std::shared_ptr<Path> PathPtr;

而不是

typedef boost::weak_ptr<Path> PathWeakPtr;
typedef boost::shared_ptr<Path> PathPtr;