使用变量作为全局变量

时间:2015-11-06 14:51:32

标签: c++ opencv

我正在使用库来执行图表优化。由于这个库的代码完全超出了我的脑海,我放弃了尝试根据自己的需要进行调整。其功能之一用于计算平滑度惩罚并仅接受四个参数。但是我需要一个额外的参数(一个包含许多值的矩阵)才能正确计算惩罚值。矩阵最初存储为Mat(opencv)对象,然后加载,因此我无法将其声明为全局。有没有办法获取这个变量并使它可以访问所有可能需要它的方法?

2 个答案:

答案 0 :(得分:0)

好的,所以我太仓促了,正如预期的那样,“快速而肮脏”的解决方案变得非常糟糕。正如Miki所说我可以先声明全局变量,然后设置值。虽然这有效,但它看起来并不好看。所以我花了一些时间看到我需要的功能可以接收一个带有必要数据的结构,这样我就可以在没有糟糕设计的情况下做我需要的工作。

答案 1 :(得分:-1)

在不知道代码的情况下,我理解你想要一个可以访问方法的全局变量。一种方法是声明一个包含指向真实Mat struct的指针的单例。

创建Mat struct时,将其指针传递给Singleton。删除Mat struct后,告诉Singleton重置。 E.g。

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

注意:此演示代码不是线程安全的。它应该只是说明这个想法。