我有两个类类型和每个类型的一个对象。一个类类型是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能够看到对方?
答案 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 ++中的友谊,只看谷歌;-) 干杯。