2013-05-31 64 views
3

的我有我的一个类变量:最好的实现全局变量

Object * myObject; 

我现在需要我的其他类可以在其他类访问。

什么是最好的方式能够访问它?

以下实施是否正确?

#ifndef GLOBALS_H 
#define GLOBALS_H 

#include "Object.h" 

Object * myObject[5][5]; 

#endif 

编辑:

多一点信息,基本上我有A类和B类

类A有变量myObject的其中B类需要访问。类A也有类B的对象,这意味着我不能在类B的头中包含类A的头,因为类A具有包含类B的头。

+0

如果它已经在一个类中,那么只需传递该类的一个对象即可。在main()中实例化它。 –

回答

3

将对该对象的引用传递给其他感兴趣的类将是更可取的。假设你不能做到这一点,确实需要一个全球性的,你会更好地与

extern Object * myObject; 

在globals.h和

Object * myObject; 

在globals.cpp

否则每个源文件其中包括globals.h将会选取一个重复的定义myObject

2

如果你所有的类都共享同一个对象,你可以将它作为一个属性添加到基类中ic变量。

class base 
{ 
    static Object* myObject; 
}; 

class inherit : base 
{ 
    void foo() 
    { 
     // can access myObject 
    } 
}; 

class inherit2 : base 
{ 
    void bar() 
    { 
     // can access myObject 
    } 
}; 
0

存储全局变量的最社会可接受的解决方案绝对是singleton。在C++中典型的实现将是这样的:

#include <iostream> 
using namespace std; 

class Singleton 
{ 
public: 
     static Singleton& Get() { 
       static Singleton singleton; 
       return singleton; 
     } 

     void DoSomething() { cout << "Something!\n"; } 

private: 
     Singleton() {} 
}; 

int main() 
{ 
     Singleton::Get().DoSomething(); 
} 

该上一个典型的全局变量的主要优点是,你必须在对象是如何构造的更多控制。

只是不要忘记,它仍然是一个全局变量,所以你应该只有在它是最不可取的选择时才使用它。

+0

快速提示:在C++ 11之前(vs 2012和g ++ 4.7,我认为)这在多线程环境中是不安全的;为了说明,添加'​​睡眠(3000); cout <<“完成构造”<< endl;'在Singleton的构造函数中,并启动3个调用'Get()。DoSomething()'的线程。你会看到'东西!'在看到构建完成的消息之前两次。也就是说,你将一直在使用一个没有构造的对象!这在新标准中已得到解决 – Rollie

+0

-1单身人士不是制造全局变量的一种方式,他们是确保班级只有一个实例的一种方法。最好使用静态成员或简单地使用全局变量。 –

+0

是的,他们确保你只有一个全局变量的实例,但它仍然只是一种全局变量。问题是要求实现全局变量,如果你不相信单身人士属于这个保护伞,那么你就是在愚弄自己。 –