我想在所有cpp文件中使用一个globe变量。如果cpp文件的一个类更改了值,我想从另一个类cpp文件访问它,这是由任何其他cpp类文件最少修改的值
str.h - 全局变量文件
#ifndef MY_PROG
#define MY_PROG
extern char * myname;
#endif
class1.cpp
#include "str.h"
char * myname;
class class1
{
class1(){}
~class1(){}
void Setname1(char *name) { myname = name }
};
class2.cpp
#include "str.h"
char * myname;
class class2
{
class2(){}
~class2(){}
void setName(char *name) { myname = name }
};
class3.cpp
#include "str.h"
class class3
{
class3(){}
~class3(){}
char *GetData()
{
return myname;
}
};
的main.cpp
#include "str.h"
int main()
{
class1 c1;
class2 c2;
c1.Setname1("XXXX");
c2.setname("YYYY");
class3 c3;
cout << c3.GetData;
}
当我执行程序时,我需要获得上次修改的值,即&#34; YYYY&#34;我是cpp的新手,请告诉我是否正确使用了extern关键字。如果没有,请提供正确的程序。
答案 0 :(得分:0)
您的问题的关键在于理解变量(以及C / C ++中的类型,函数等对象)的声明和定义之间的区别
extern char * myname;
是声明。它使myname
对同一文件中的其他代码片段可见,以便他们可以引用它。
char * myname;
是定义。它不仅使myname
可见,还指示编译器为其分配空间并使其地址已知。
您可以根据需要在代码中包含同一个变量的声明,只要它们不相互矛盾即可。定义不然。如果你定义一个东西两次,它需要分配两个地址,然后其他目标文件如何“理解”引用它时使用哪个地址?分配的空间也是如此 - 如何处理分配的额外部分?这是你看到的错误。
要使代码正常工作,只需在一个文件中只有一个myname
的定义。它不能是头文件,因为它被复制到多个源文件中,从而创建多个定义。它可以是任何其他C ++文件。
在其余文件中(或在所有文件中包含的单个标头中)如果在特定文件中引用,则具有myname
的多个声明。如果没有,您可以省略特定单位。
所有这些都说,通过全局可变共享变量在编译单元之间传递数据被认为是非常糟糕的实践。他们使代码成为调试和理解的噩梦,并且不可能并行化。没有人想过为他们编写的代码赚钱应该使用它们。相反,最好的方法是将可变对象作为方法/函数参数之一传递。细节实际上取决于您的应用程序的其余部分。