我正在慢慢学习c ++但是在开发我的程序时我很难尝试访问并且我已经创建了对象。我的对象是在名为source.cpp with
的页面上创建的Tilemap background;
我有另一个头文件,在tern中调用需要访问'background'的函数,该文件被称为'player.cpp',但是我无法弄清楚如何定义它。我已经将头文件包含在tilemap类中,但由于该对象是在别处创建的,所以我不知道如何引用它。谷歌今天不是我的朋友,我的搜索没有带来什么。
答案 0 :(得分:4)
该行
Tilemap background;
在文件范围内写入的(即不在功能块内)是全局变量定义。它在全局数据中为名为 background 的变量分配存储空间。
如果要从另一个C ++源文件引用此对象,则需要先声明该变量,以便编译器知道其类型。
// In another .cpp file
extern Tilemap background;
void f()
{
background.something();
}
答案 1 :(得分:1)
Tilemap background;
置于全局范围内(假设在source.cpp
文件的开头某处)声明了一个全局变量,默认情况下只能在同一个编译单元中访问(在这种情况下可能仅在{{1}内) })。在source.cpp
中,编译器不知道变量player.cpp
存在。
一种解决方案可能是:
background
在extern Tilemap background;
中让编译器知道在其他地方定义了player.cpp
类型的全局变量。
但是,我发现 避免使用此类全局变量 并尝试在调用时以参数的形式“传播”(传递)变量/对象更好一些成员函数(“方法”)。毕竟,对象之间的通信就是OO编程的内容......(如果我知道这个类的上下文/如果你共享了一些代码,我会提供一些具体的例子......)
答案 2 :(得分:0)
好的,所以你正在学习C ++,然后从一开始就学习好的做法,避免C ++的陷阱。以这种方式声明和使用C ++全局对象会导致非常讨厌的行为和长调试会话,因为当您在另一个文件中使用它时,无法确定在文件全局范围声明的全局对象背景是否已初始化并正确构造。当你使用这样一个对象时,让我们称之为B,在另一个文件中的另一个全局对象A中,你不能确定B是否在A之前被初始化,这会导致非常讨厌的错误,或者你是否幸运。然后解决方案:使对象背景成为本地静态对象,即如下所示的函数的本地对象:
TileMap& getBackground() {
static TileMap background; //use of "camel case" for the class name
return background; //return a reference to it
}
就是这样。您想要使用背景的任何地方只需调用getBackground()。第一次调用它时,将初始化background local static并使用它。
有些人会说这种技术与单例设计模式有关,但这不是我的意图,如果你绝对需要,它只是使用全局对象的正确方法。 C ++是一种很棒的语言,特别是在发布C ++ 11时,它有一些你需要注意的缺陷。帮自己一个忙:抓一份Effetive C++它会教你几乎所有你需要知道的正确使用语言