从另一个类访问全局静态变量

时间:2011-04-04 14:38:43

标签: c++

我正在处理具有全局静态变量(它是一个对象)的代码,我需要从另一个类访问它。我总是避免使用全局变量/函数,因此在这种情况下我不确定如何正确地进行操作。

为了清楚我对事物的理解,在一个全局静态变量中有内部链接,这意味着包含这个特定头的任何源文件都会得到它自己的变量副本?

编辑:到目前为止,我所做的是创建一个返回变量地址的函数。不幸的是,这似乎不起作用。

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

注意:无法更改声明全局静态变量的标头中的代码。我可以添加功能,但如果可以,我应尽量避免使用。

5 个答案:

答案 0 :(得分:2)

当您在头文件中声明

static int g_foo;

并将此头文件包含在多个.cpp文件中,每个包含头文件的.cpp文件都会获得多个实例。这些实例根本不会干扰。 不能使用这些变量在编译单元之间进行通信。每个实例都是编译单元的本地实例。

宣布

class Foo
{
    public:
        static int bar;
};

然后你得到一个静态成员,必须在一个.cpp文件中定义为int Foo::bar;在这种情况下,可访问性被定义为public。

答案 1 :(得分:2)

您可以在一个.cpp文件中决定容器的主版本,并让函数返回一个引用或指针。然后不要打扰其他副本。

Wrapper.h

 anArray<someObject>& Objects();

Wrapper.cpp

#include "someHeader.h"

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

如果您不打算更改值,请将返回值设为const引用。

答案 2 :(得分:1)

如果声明如下:

MyClass myObj;

然后每个.cpp文件以某种方式包含标题,可能通过其他标题,将获得一个副本,因为它们都将具有相同的名称链接器将抱怨。

但是,如果声明如下:

extern MyClass myObj;

然后它刚刚声明,它将在多个文件中包含标题,但是它需要在.cpp文件中定义。

答案 3 :(得分:0)

如果头文件的变量声明为static int a;,则是,包含该标头的每个翻译单元都会获得变量a自己的副本,并且确保故障

如果它被声明为extern int a,那么变量a将在包含它的所有翻译单元中共享,并在其他文件中定义。

答案 4 :(得分: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
    ...
}