2014-06-20 35 views
0

我有一個處理外部庫的對象APIController。我想從同一個函數的不同調用(C風格)訪問這個(獨特的)控制器。是否允許使用C++對象的全局變量(C風格)?

因此,我想過要創建一個全局變量APIController,以便在我的函數的不同調用中訪問同一個實例,其中給定的context_t *context在每次調用時都不相同。 最後,程序每調用context調用close函數。

APIController *controller = NULL; 

void call(context_t *context) /* called with different contexts */ 
{ 
    if (controller == NULL) controller = new APIController(); 
    controller->instances_counter++; 
    /* use controller */ 
    controller->use_it(); 
} 

void close(context_t *context) 
{ 
    controller->instances_counter--; 
    if (controller->instances_counter == 0) 
     delete controller; 
} 

這樣做是否正確?我覺得它不是,但我看不到另一種簡單的方法。

+0

什麼是_'c全局變量?你的意思是你的班級的靜態實例?!? _'這樣做是否恰當?'當然這不是一個很好的解決方案恕我直言。 –

+0

如果你打算在同一時間在這些函數中有多個線程,你應該使用某種互斥來防止對控制器及其計數器的訪問。 – dlf

+0

我同意「不好」和「互斥」,但只是一個簡單的答案:是的,它是允許的。如果你編譯爲C++,它就是C++,不管你使用哪種線程函數。在C++中,您可以使用C++對象... – deviantfan

回答

1

它依賴。如果您的API控制器是無狀態的(因此您將只需要其中一個),或者它的狀態不存儲在APIController對象中(您無法創建2個不同的API控制器),您應該使APIController類爲單身人士

大約有1000個帖子在那裏,當不是使用單身人士,但這種情況是一個罕見的情況下,當它是有道理的。

在另一方面,如果你可以創建此APIController的2個差異配置,你可能會認爲,在將來某個時候你可能想使用它們的不止一個,你應該,或者把它作爲一個call或更好的參數使得調用某個類的成員函數來存儲這些信息。

​​

最終做是有意義的你,但請記住,你可能需要最終版本之前重寫代碼幾次,沿着「我可能的線,所以思維只需要一個這個對象「有一天可能會回來。

+0

到目前爲止,我已經看到了「這次我們真的只需要一個實例」的觀點,並且總是有一段時間它會咬你(最後一次是關於數據庫訪問器)。 –

+0

那麼當你需要創建一個對象來訪問API中的任何函數時(如果我沒有記錯的話,就像DirectX一樣),就有API。那麼你確實需要一個單例對象。任何其他時間我都不會推薦它。 –

+0

爲什麼你需要一個對象?如果沒有狀態,你不需要一個對象(自由函數/靜態方法就足夠了),如果有狀態,那麼我們又回到了全局狀態。我從Game Devs聽到很多關於圖形API中這個全局狀態問題的抱怨,他們真的更喜歡有一個明確的上下文對象,並因此選擇*哪個*上下文來傳遞。 –

0

這取決於你的意思是什麼「允許」

是的,C++編譯器將讓你做到這一點。

不,你不應該這樣做。

考慮使用類的靜態成員而不是C風格的全局,但更好的是,閱讀Singleton模式,並且您會發現幾種經過驗證的方法來處理這種類型的問題。

你還會發現很多關於Singleton模式爲什麼是邪惡的討論。請放心,C型全局變量更糟糕。試着找到一種重新設計系統的方式,這樣你就不會被鎖定到APIControler的一個實例中(儘管實際上只有一個實例存在。)通常,這樣做會改進整體設計。

+0

thx,我會讀這個Singleton模式。 – Jav