2015-11-06 86 views
-1

我正在使用庫來執行圖優化。由於這個庫的代碼完全覆蓋了我的頭,我放棄了試圖使其適應我自己的需求。其功能之一是用來計算平滑懲罰並僅接受四個參數。不過,我需要一個額外的參數(一個包含許多值的矩陣),以正確計算懲罰值。該矩陣最初存儲爲Mat(opencv)對象,然後加載,所以我不能只聲明它是全局的。有什麼辦法可以接受這個變量,並讓所有可能需要它的方法都可以訪問它?使用變量作爲全局

+1

請解釋「矩陣最初是作爲Mat(opencv)對象存儲的,然後加載,所以我不能只聲明它是全局的」。 – YSC

+0

我需要的數據作爲yml文件存在。這個在加載opencv庫時會輸出一個Mat對象。在我對C++的(簡短的)經驗中,我只使用了全局變量,例如數字或字符串。所以我不知道如何加載並公開它後才能使用這個對象。我希望這可以澄清一些事情。 – RCountZero

+0

您應該發佈一些代碼示例來展示您的問題。是的,你可以定義一個全局並稍後分配給它(雖然這不是一個很好的設計)。 – Miki

回答

-1

不知道代碼,我知道你想要一個全局變量,可以訪問方法。一種方法是聲明一個將指針保存爲真實的單個元素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); 

注意:此演示代碼不是線程安全的。它應該只是說明這個想法。

+1

你不需要一個單例來做到這一點,更不用說指向cv :: Mat對象的指針了。你應該真的避免這種情況,因爲你很可能會打破內部引用計數器一致性 – Miki

+0

@Miki:謝謝你的觀點。如果cv :: Mat已經是引用計數對象,那麼我完全同意在這種情況下不需要幫助單例。 –

0

好吧,所以我太匆忙,並且如預期的那樣,「快速和骯髒」的解決方案變得非常可怕。正如三木說,我可以首先聲明全局變量,然後設置值。雖然這工作,它不是看起來不錯。所以我花了一些時間,看到我需要的函數可以獲得一個必要數據的結構,使我能夠在沒有錯誤設計的情況下做我所需要的。