-1

我有两种类类型和每种类型的一个对象。一个类类型是 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 能够看到对方?

4

4 回答 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 回答