我正在使用庫來執行圖優化。由於這個庫的代碼完全覆蓋了我的頭,我放棄了試圖使其適應我自己的需求。其功能之一是用來計算平滑懲罰並僅接受四個參數。不過,我需要一個額外的參數(一個包含許多值的矩陣),以正確計算懲罰值。該矩陣最初存儲爲Mat(opencv)對象,然後加載,所以我不能只聲明它是全局的。有什麼辦法可以接受這個變量,並讓所有可能需要它的方法都可以訪問它?使用變量作爲全局
使用變量作爲全局
回答
不知道代碼,我知道你想要一個全局變量,可以訪問方法。一種方法是聲明一個將指針保存爲真實的單個元素Mat struct
。
當創建了Mat struct
時,您將它的指針傳遞給Singleton。在刪除Mat struct
時,您告訴單例重置。例如。
class MatSingleton
{
public:
MatSingleton() : pMatInstance(nullptr) {}
~MatSingleton() {}
static MatSingleton& GetInstance()
{
static MatSingleton instance;
return instance;
}
bool IsMatAvailable()
{
return pMatInstance != nullptr;
}
void SetMat(Mat *pMat) { pMatInstance = pMat; }
Mat* GetMat() const { return pMatInstance; }
private:
Mat *pMatInstance;
};
[...]
// Load and fill LoadedMatStruct and inform the Singleton
MatSingleton::GetInstance().SetMat(&LoadedMatStruct);
// check if the Mat structure can be accessed
if (MatSingleton::GetInstance().IsMatAvailable())
{
// do smth. with Mat
Mat *pMatInstance = MatSingleton::GetInstance().GetMat();
}
// Somewhere else in the code where the Mat structe is destroyed, it is necessary to inform the Singleton
MatSingleton::GetInstance().SetMat(nullptr);
注意:此演示代碼不是線程安全的。它應該只是說明這個想法。
你不需要一個單例來做到這一點,更不用說指向cv :: Mat對象的指針了。你應該真的避免這種情況,因爲你很可能會打破內部引用計數器一致性 – Miki
@Miki:謝謝你的觀點。如果cv :: Mat已經是引用計數對象,那麼我完全同意在這種情況下不需要幫助單例。 –
好吧,所以我太匆忙,並且如預期的那樣,「快速和骯髒」的解決方案變得非常可怕。正如三木說,我可以首先聲明全局變量,然後設置值。雖然這工作,它不是看起來不錯。所以我花了一些時間,看到我需要的函數可以獲得一個必要數據的結構,使我能夠在沒有錯誤設計的情況下做我所需要的。
- 1. 使用JavaScript Cookie作爲全局變量
- 2. python:multithreading:self作爲全局變量
- 3. 全局變量作用域
- 4. 變量作用域和全局變量
- 5. 應用爲全局變量
- 6. 使用全局變量的不工作
- 7. 使用PHPUnit時全局變量爲空
- 8. java全局全局變量和用戶全局變量
- 9. 當使用全局變量
- 10. 使用全局變量
- 11. 使用全局變量
- 12. PHP使用全局變量
- 13. 全局變量的使用
- 14. 使用了全局變量
- 15. PHP - 使用全局變量
- 16. 使用全局變量
- 17. JavaScript使用全局變量
- 18. 使用全局變量
- 19. 使用PHP全局變量
- 20. codeigniter,使用全局變量
- 21. 使用全局變量將全局變量遞歸到迭代
- 22. ArrayList的作爲全局變量
- 23. GWT:SuggestionBox作爲一個全局變量
- 24. 精靈作爲全局變量?
- 25. python全局變量作爲參數
- 26. 堅持launchOptions NSURL作爲全局變量
- 27. 製作全局變量js
- 28. 該變量不作爲jQuery中的全局變量工作
- 29. 如何使局部變量的一類爲全局變量
- 30. 爲什麼我的全局變量不是全局變量?
請解釋「矩陣最初是作爲Mat(opencv)對象存儲的,然後加載,所以我不能只聲明它是全局的」。 – YSC
我需要的數據作爲yml文件存在。這個在加載opencv庫時會輸出一個Mat對象。在我對C++的(簡短的)經驗中,我只使用了全局變量,例如數字或字符串。所以我不知道如何加載並公開它後才能使用這個對象。我希望這可以澄清一些事情。 – RCountZero
您應該發佈一些代碼示例來展示您的問題。是的,你可以定義一個全局並稍後分配給它(雖然這不是一個很好的設計)。 – Miki