2013-05-31 57 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

是的,他們確保你只有一個全局變量的實例,但它仍然只是一種全局變量。問題是要求實現全局變量,如果你不相信單身人士屬於這個保護傘,那麼你就是在愚弄自己。 –