2012-05-29 3 views
1

OpenVG의 C++ 래퍼를 작성하려고합니다. OpenVG는 디자인 상 매우 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는 컨텍스트로 호출 될 경우 중단됩니다 : 여기에 경로 핸들에 대한 간단한 래퍼입니다. 이렇게하면 openVG 컨텍스트를 만들 수 있기 전에 (빌드를 작성하기 때문에) 코드에서 전역 경로 개체 개체를 테스트 목적으로 만들지 못하게됩니다. 이 문제를 방지 할 수있는 해결 방법이 있습니까?

개체 구성에서 핸들을 unitialized로 남겨 두는 것이 좋지 않은 생각입니다 ... 컨텍스트가없는 경우 Path 개체를 만들 때 전역 컨텍스트 만들기를 강제해야합니까?

답변

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; 
} 

... C++ (11) 사용에

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; 
} 

:

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

대신

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

의 @ ChristianRau : D 모든 컴파일러가 std에서 shared_ptr/weak_ptr을 가지고 있지 않기 때문에 Ude, boost dependency가 필요합니다. – SigTerm

+0

글쎄, 필요한 것은 아니지만 대안 (그리고 확실하게 C++ 11이 지원 될 때 2 차적으로). 최신 표준에서 자신의 존재를 언급하지 않고 부스트 기능을 제안하면 좋지 않습니다. 하지만 당신이 내 역량에 대해 행동했을 가능성이 높고, 엄격한 요구 사항을 다른 요구 사항으로 대체해서는 안됩니다. 문제를 분명하게 만들었습니다. –

+0

@ChristianRau : "최신 표준에서 자신의 존재를 언급하지 않고 부스트 기능을 제안하는 것은 나쁜 습관입니다."그건 내가 무시할 당신 개인 의견입니다. 질문은 C++ 11로 태그 화되지 않았습니다. 나중에 다른 사람들이 작성한 답변을 불필요하게 수정하지 마십시오. 모든 것을 편집 할 수 있다면 실제로 그렇게해야한다는 의미는 아닙니다. 이 예제는 간단한 개념을 보여줍니다. 부스트 또는 C++ 11을 사용하여 구현되는지 여부는 부적합합니다. – SigTerm

관련 문제