C++ 试图获得C++;上课时要互相看看

C++ 试图获得C++;上课时要互相看看,c++,C++,我有两种类类型,每种类型都有一个对象。一个类类型是Player,我在Player.h中创建了一个名为Charles的类Player。另一个类是Karatoise类型的Karatoise1,Karatoise1是在Karatoise.h中创建的。我需要能够看到存储在Karatoise1和Charles中的一些整数,它们都公开了内部的所有变量,并且Karatoise.cpp包括Player.h和Player.cpp包括Karatoise.h。这两个头文件都有一个头保护,我认为调用它时头文件的内部被#

我有两种类类型,每种类型都有一个对象。一个类类型是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都有多次出现。如果我在创建类的过程中移动,以便在main中定义Charles和Karatoise1,那么Karatoise.cpp和Player.cpp不会接受它们的存在。您能告诉我如何设置文件,以便Karatoise1和Charles能够看到对方吗?

不要在头文件上创建对象或定义全局变量。使用<代码> ExtNeX/Cuff>声明变量,并在CPP文件中定义它们。

< P>查看C++中的友谊,只需谷歌IT; 干杯

您需要定义类并在标题中声明任何全局变量,以便任何源文件都可以访问它们:

// Player.h

// Define a Player class
class Player {
    // blah blah
};

// Declare a Player object
extern 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
};

您的短语中有一个错误:Karatoise.cpp包括Player.h,Player.cpp包括Karatoise.h

你不可以做循环包含。 如果您在
Player.h
中制作:

#include Karatoise.h

因此,您不能进行反向包含。只有一种方法。

请展示一些代码,您可以创建一个名为DataContainer的第三个类,它可以是一个单例,并让您的Charles和Karatoise1具有各自的getter。我认为这样代码看起来会更干净。“谷歌搜索”可能不是一个好主意,因为谷歌使用算法来为使用该计算机的人定制信息。OP和您执行的搜索可能不同。相反,发布一些相关信息、示例、实际文章/文档,这些内容涉及你希望OP做什么。更好的答案可能会简单地解释什么是友谊以及它是如何有用的。更好的答案是根本不提友谊,因为它与允许两个全局对象访问彼此的公共成员无关。答案应该是独立的,即在没有外部资源的情况下提供信息。有时这是不可能的,但在这里你并没有提供任何信息,这当然是可能的。将此作为评论而不是答案发布。
#include Karatoise.h