1

我正在尝试编写 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 需要一个上下文才能运行,如果vgCreatePath在没有 openVG 上下文的情况下调用它,它将中止。这使我无法在我的代码中创建(出于测试目的)全局 Path 对象对象,因为它是在我创建 openVG 上下文之前构建的(我主要这样做)。有什么办法可以防止这种情况发生吗?

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

4

1 回答 1

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;
于 2012-05-29T23:53:50.800 回答