我正在处理具有全局静态变量(它是一个对象)的代码,我需要从另一个类访问它。我总是避免使用全局变量/函数,因此在这种情况下我不确定如何正确地进行操作。
为了清楚我对事物的理解,在一个全局静态变量中有内部链接,这意味着包含这个特定头的任何源文件都会得到它自己的变量副本?
编辑:到目前为止,我所做的是创建一个返回变量地址的函数。不幸的是,这似乎不起作用。
// names were changed but the code is as follows.
// There is of course other code in the header
namespace SomeNameSpace
{
static anArray<someObject> variable;
}
注意:我无法更改声明全局静态变量的标头中的代码。我可以添加功能,但如果可以,我应尽量避免使用。
答案 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
...
}