2012-05-29 23 views
1

我試圖寫OpenVG的,這是非常開放-GL的C++包裝就像它的設計。 這裏是一個路徑手柄一個簡單的包裝:如何創建需要上下文的對象的全局實例?

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

    }; 

不幸的是,開放式VG需要上下文來運作,並會退出vgCreatePath被稱爲無OpenVG的背景。 這使我在我的代碼生成(用於測試目的),一個全球性的Path對象的對象,因爲它是建立之前,我可以創造一個開放式VG情況下(我的主這樣做)。 有沒有解決方法來防止這種情況?

我想離開的對象未初始化建設手柄是一個非常糟糕的主意......我要強迫一個全球範圍內的創作,當我創建一個路徑對象,如果沒有上下文存在?

回答

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; 
+0

@ ChristianRau:D Ude,boost依賴是必要的,因爲並非所有的編譯器在std中都有shared_ptr/weak_ptr。 – SigTerm

+0

好吧,不是必需的,而是另一種選擇(當然,支持C++ 11的時候也是次要的)。一般的提升功能建議,甚至沒有提到他們在最新的標準存在是不好的做法。但你說得對,因爲我可能已經對我的能力採取了行動,不應該用另一個剛性要求來替代。明白了,DUDE。 –

+0

@ChristianRau:「甚至沒有提到他們在最新標準中的提升特性的建議是不好的做法」這是你的個人意見,我將忽略它。這個問題沒有被標記爲C++ 11。請避免將來不必要地修改答案(由其他人撰寫) - 如果您可以編輯所有內容,這並不意味着您應該實際執行此操作。該例子說明了簡單的概念。無論是使用boost還是C++ 11實現都是無關緊要的。 – SigTerm