2011-04-04 60 views
7

我工作的代碼具有全局靜態變量(這是一個對象)訪問一個全局靜態變量,我需要從另一個類訪問它。我一直總是避免使用全局變量/函數,所以在這種情況下我不確定如何正確地執行它。從另一個類

只是爲了澄清我理解的東西,在全局靜態變量有內在聯繫,這意味着任何源文件,其中包括這個特殊的頭將獲得自己的變量副本?

編輯:我至今嘗試過正在返回變量的地址的功能。不幸的是,這似乎並沒有奏效。

// names were changed but the code is as follows. 
// There is of course other code in the header 
namespace SomeNameSpace 
{ 
    static anArray<someObject> variable; 
} 

注:不能更改代碼在全局靜態變量聲明的標題。我可以添加的功能,但我應該嘗試,如果我能避免它。

+1

你能說明全局是如何聲明的嗎? – 2011-04-04 14:42:28

+0

它是一個班的成員嗎?公衆成員? – 2011-04-04 14:45:11

+0

它不是任何一類的成員。 @Timo:請參閱最新編輯 – Samaursa 2011-04-04 14:47:42

回答

2

您可以決定在一個.cpp文件母帶版本的容器,並有一個函數返回一個引用或指針指向。然後不要打擾其他副本。

Wrapper.h

anArray<someObject>& Objects(); 

Wrapper.cpp

#include "someHeader.h" 

anArray<someObject>& Objects() 
{ return SomeNameSpace::variable; } 

,或使返回值的const引用,如果你不打算改變值。

0

如果頭文件中有聲明爲static int a;變量,然後是的,這包括報頭的每個翻譯單元會得到它的變量a自己複製和故障保證。

如果它被聲明爲extern int a,那麼變量a將被包含在所有翻譯單元之間共享,並且在其他文件中定義。

0

如果它的聲明如下:

MyClass myObj; 

那麼每個的.cpp文件以某種方式包括頭,可能通過其他標題,會得到一個副本,因爲它們都具有相同的名稱鏈接器會投訴。

但是,如果它的聲明如下:

extern MyClass myObj; 

那麼它只是聲明,它會正常工作,包括在多個文件頭,但它需要一個.cpp文件中定義。

+0

它是這樣聲明的:'static anArray variable;' – Samaursa 2011-04-04 14:48:44

1

當你在你聲明頭文件

static int g_foo; 

,包括在多個.cpp文件這個頭文件,你會得到多個實例之一,其中包括標題中的每個.cpp文件。這些實例根本不會干涉。您不能編制單位,這些變量之間的通信。每個實例對編譯單元都是本地的。

當你聲明

class Foo 
{ 
    public: 
     static int bar; 
}; 

然後你必須在一個.cpp文件中被定義爲int Foo::bar;可訪問性定義爲在這種情況下,公衆一個靜態成員。

+0

我明白了,但是我怎樣才能從多個'.cpp'文件中訪問前者(即'static int g_foo')呢? – Samaursa 2011-04-04 14:51:54

0

誰在實例化此對象?如果對象在未被實例化的情況下被訪問會發生什麼?

你不應該把它放在一個函數中來實例化它嗎?

...

anArray<someObject> aStaticVariable() 
{ 
    static anArray<someObject> myStaticVariable; 
    return myStaticVariable; 
} 

編輯: aClass.h

static Object myObj; 

aClass.cpp

aClass(const &Params params): 
myObj(params.x) 
{ 
    .... 
} 

bClass.cpp

extern Object aClass::myObj; //not necessarily initialised 
bClass{ 
    ... 
    myObj.getSomething(); //problem maybes 
    ... 
} 
+0

那麼,因爲它是一個自動變量,我假設它將在程序啓動時實例化。 – Samaursa 2011-04-04 15:12:14

+0

@Samaursa是的,當你嘗試使用它的時候它會被實例化,但是如果它在編譯單元的外部則不會被實例化。例如,如果你使用'extern static anArray myStaticVariable;'而你沒有實例化包含的類,那麼如果你在一個單獨的類myStaticVariable.push(a)中使用它,並且它沒有被初始化那麼你有麻煩了。 它可能被初始化,但是在不同的翻譯單元中定義的非本地靜態對象的初始化的相對順序是未定義的。 – Dennis 2011-04-04 15:32:05

+0

該代碼沒有'extern'。另外,初始化的相對順序只會在我試圖在程序開始時使用數組時重要,否?如果是的話,那麼這是不是一個問題,因爲我在程序運行時在運行時訪問它。如果不是(即,即使在運行時也不能初始化),請糾正我對靜態變量在這種情況下如何工作的理解。 – Samaursa 2011-04-04 15:39:19