我正在处理的代码有一个全局静态变量(这是一个对象),我需要从另一个类访问它。我通常都避免全局变量/函数,所以在这种情况下,我不知道如何正确地去做。
只是为了清楚我的理解的事情,在一个全局静态变量有内部链接,这意味着任何源文件,包括这个特定的头部将获得自己的副本的变量?
编辑:到目前为止,我所尝试的是创建一个返回变量地址的函数。不幸的是,这似乎不起作用。
// 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条答案
按热度按时间0yg35tkg1#
当你在头文件中声明
并将此头文件包含在多个. cpp文件中,则会得到多个示例,每个包含头文件的. cpp文件对应一个示例。这些示例根本不会相互干扰。您不能使用这些变量在编译单元之间进行通信。每个示例都是编译单元的本地示例。
当你宣布
那么你会得到一个静态成员,它必须在一个. cpp文件中定义为
int Foo::bar;
。在这种情况下,可访问性被定义为public。i86rm4rw2#
您可以在一个.cpp文件中决定容器的主版本,并让一个函数返回一个引用或指针,然后就不必再为其他副本费心了。
Wrapper.h
Wrapper.cpp
或者,如果不打算更改值,则将返回值设为常量引用。
vs91vp4v3#
如果像这样声明:
则以某种方式包括该报头(可能通过其它报头)的每个. cpp文件将获得副本,并且由于它们都具有相同的名称,链接器将抱怨。
但是,如果像这样声明:
那么它就被声明了,它可以很好地在多个文件中包含头文件,但是它需要在一个.cpp文件中定义。
wmomyfyw4#
如果头文件声明变量为
static int a;
,那么是的,每个包含该头文件的翻译单元都将获得变量a
的 * 自己的 * 副本,故障确保。如果声明为
extern int a
,则变量a在包含它的所有翻译单元之间共享,并在某个其他文件中定义。goucqfw65#
谁在示例化这个对象?如果这个对象没有被示例化就被访问会发生什么?
你不应该把它放在一个函数中,这个函数将示例化它吗?
...
编辑:a类.h
a cpp类
b cpp类