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 に答える