我正在尝试编写一个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对象时强制创建全局上下文?
答案 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;