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

tcomlyy6  于 2023-02-06  发布在  其他
关注(0)|答案(5)|浏览(256)

我正在处理的代码有一个全局静态变量(这是一个对象),我需要从另一个类访问它。我通常都避免全局变量/函数,所以在这种情况下,我不知道如何正确地去做。
只是为了清楚我的理解的事情,在一个全局静态变量有内部链接,这意味着任何源文件,包括这个特定的头部将获得自己的副本的变量?
编辑:到目前为止,我所尝试的是创建一个返回变量地址的函数。不幸的是,这似乎不起作用。

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

**注意:**我 * 不能更改声明全局静态变量的标头中的代码。我 * 可以 * 添加函数,但如果可以,我应该尽量避免。

0yg35tkg

0yg35tkg1#

当你在头文件中声明

static int g_foo;

并将此头文件包含在多个. cpp文件中,则会得到多个示例,每个包含头文件的. cpp文件对应一个示例。这些示例根本不会相互干扰。您不能使用这些变量在编译单元之间进行通信。每个示例都是编译单元的本地示例。
当你宣布

class Foo
{
    public:
        static int bar;
};

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

i86rm4rw

i86rm4rw2#

您可以在一个.cpp文件中决定容器的主版本,并让一个函数返回一个引用或指针,然后就不必再为其他副本费心了。
Wrapper.h

anArray<someObject>& Objects();

Wrapper.cpp

#include "someHeader.h"

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

或者,如果不打算更改值,则将返回值设为常量引用。

vs91vp4v

vs91vp4v3#

如果像这样声明:

MyClass myObj;

则以某种方式包括该报头(可能通过其它报头)的每个. cpp文件将获得副本,并且由于它们都具有相同的名称,链接器将抱怨。
但是,如果像这样声明:

extern MyClass myObj;

那么它就被声明了,它可以很好地在多个文件中包含头文件,但是它需要在一个.cpp文件中定义。

wmomyfyw

wmomyfyw4#

如果头文件声明变量为static int a;,那么是的,每个包含该头文件的翻译单元都将获得变量a的 * 自己的 * 副本,故障确保。
如果声明为extern int a,则变量a在包含它的所有翻译单元之间共享,并在某个其他文件中定义。

goucqfw6

goucqfw65#

谁在示例化这个对象?如果这个对象没有被示例化就被访问会发生什么?
你不应该把它放在一个函数中,这个函数将示例化它吗?
...

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

编辑:a类.h

static Object myObj;

a cpp类

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

b cpp类

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

相关问题