试图让C ++类看到对方

时间:2013-04-28 09:18:30

标签: c++

我有两个类类型和每个类型的一个对象。一个类类型是Player,我在Player.h中创建了一个名为Charles的类型为Player的类。另一类是Karatoise类型的Karatoise1,Karatoise1是在Karatoise.h中创建的。我需要能够看到存储在Karatoise1和Charles中的一些整数,它们都将所有变量都公开,并且Karatoise.cpp包括Player.h而Player.cpp包含Karatoise.h。两个头文件也有一个头文件保护我认为它被调用,头文件的内部被#ifndef,#define和#endif语句包围。然而,使用这个设置visual studio告诉我,Charles.obj和Karatoise1.obj都有多次出现。如果我移动类的创建,以便在主要定义Charles和Karatoise1,Karatoise.cpp和Player.cpp不接受它们存在。你能否告诉我如何设置文件以便Karatoise1和Charles能够看到对方?

4 个答案:

答案 0 :(得分:5)

不要在头文件上创建对象或定义全局变量。使用extern声明变量,并在cpp文件中定义它们。

答案 1 :(得分: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
};

答案 2 :(得分:0)

你的短语中有错误: Karatoise.cpp包含Player.h而Player.cpp包含Karatoise.h

您不得进行循环包含。 如果你进入Player.h

#include Karatoise.h

所以,你不能反过来包容。只有一种方式。

答案 3 :(得分:-1)

看看c ++中的友谊,只看谷歌;-) 干杯。