我有两种类类型和每种类型的一个对象。一个类类型是 Player,我在 Player.h 中创建了一个 Player 类型的名为 Charles 的类。另一个类是 Karatoise 类型的 Karatoise1,Karatoise1 是在 Karatoise.h 中创建的。我需要能够看到存储在 Karatoise1 和 Charles 中的一些整数,两者都公开了内部的所有变量,并且 Karatoise.cpp 都包含 Player.h,Player.cpp 包含 Karatoise.h。两个头文件也有一个头保护,我认为它是在头文件的内部被#ifndef、#define 和#endif 语句包围的情况下调用的。但是,使用此设置 Visual Studio 告诉我,Charles.obj 和 Karatoise1.obj 中的每一个都出现了多次。如果我围绕类的创建移动,以便在主要的 Karatoise 中定义 Charles 和 Karatoise1。cpp 和 Player.cpp 不接受它们的存在。您能否告诉我如何设置文件以便 Karatoise1 和 Charles 能够看到对方?
问问题
215 次
4 回答
5
不要在头文件上创建对象或定义全局变量。用于extern
声明变量,并在 cpp 文件中定义它们。
于 2013-04-28T09:22:33.943 回答
1
您需要定义类并在标头中声明任何全局变量,以便任何源文件都可以访问它们:
// Player.h
// Define a Player class
class Player {
// blah blah
};
// Declare a Player object
extern Player Charles;
然后你需要在一个源文件中定义对象,这样它就只有一个定义。这被称为“一个定义规则”:
// Player.cpp
#include "Player.h"
// Define the Player object declared in the header
Player Charles;
正如您所发现的,对于源文件中的所有内容,您根本无法从其他源文件中访问它;并且在标头中包含所有内容,该对象由包含标头的每个源文件多次定义。
您的下一个问题将是每个标题都试图包含另一个标题,这是不可能的。这里有三种可能的情况:
- 如果类定义不需要提及其他类,并且只需要在源文件中,那么一切都很好。只需包含源文件中的其他类头。
- 如果类定义需要包含其他类型的对象,那么您确实需要包含此标头中的其他标头。当然,两个类不可能包含另一个,因此您不需要两个标题相互包含。
- 如果类定义需要提及另一个类(因为它有一个成员是对其的引用或指针,或者具有将一个作为参数或返回类型的成员函数),那么您需要声明另一个类:
这是第三种情况的示例
// Player.h
class Karatoise; // Just a declaration, not the full class definition
class Player {
Karatoise & k_ref; // OK
Karatoise * k_ptr; // OK
Karatoise do_something(); // OK
do_something(Karatoise); // OK
Karatoise k_obj; // Not OK: needs full class definition
};
于 2013-04-28T10:30:11.057 回答
0
您的短语中有错误:Karatoise.cpp 包括 Player.h 和 Player.cpp 包括 Karatoise.h。
您不得进行循环包含。如果你在Player.h
:
#include Karatoise.h
因此,您不得进行反向包含。只有一种方式。
于 2013-04-28T10:37:58.647 回答
-1
看看 c++ 中的友谊,谷歌一下 ;-) 干杯。
于 2013-04-28T09:26:23.320 回答