使单独的头文件类彼此了解

时间:2015-12-03 04:19:00

标签: c++ class

现在我有以下文件:

的main.cpp

#include "file1.h"
#include "file2.h"

using namespace std;

int main(){
    mirage a;
    inferno b;
    b.do_something();
    return 0;
}

file1.h

#ifndef FILE1_H_
#define FILE1_H_
class mirage{
    int collect;
    void setup();
}
#endif

file1.cpp

#include "file1.h"

void mirage::setup(){
    collect = 2;
}

file2.h

#ifndef FILE2_H_
#define FILE2_H_
#include <iostream>

using namespace std;

class inferno{
    void print_out();
}
#endif

file2.cpp

#include "file2.h"

void inferno::print_out(){
    cout << a.collect << endl;
}

我的目标是能够从infero类函数中的函数引用mirage类。现在怎么样,我得到一个编译错误,声明&#34; file2.cpp:4:错误&#39; a&#39;未在此范围内宣布&#34;。如何在没有在file2范围内重新声明的情况下让inferno类知道mirage类?

3 个答案:

答案 0 :(得分:1)

从听起来,您只希望能够在mirage课程操作中使用inferno课程。

要执行此操作,只需在mirage中包含包含file1.h类(file2.h)声明的头文件即可。这使您可以访问mirage类中的inferno类声明和操作。

但是,要在print_out类的inferno方法中使用对象,您需要方法的参数来访问mirage类型的对象。只需将inferno类标题中的原型更改为:

即可
void print_out(const mirage &m);

...和.cpp文件中的存根... ...

void inferno::print_out(const mirage &m)
{
    cout << m.collect << endl;
}

总的来说,要做的改变是:

<强> file2.h

#ifndef FILE2_H_
#define FILE2_H_
#include <iostream>
#include "file1.h"

using namespace std;

class inferno{
    void print_out(const mirage &m);
}
#endif

<强> file2.cpp

#include "file2.h"

void inferno::print_out(const mirage &m){
    cout << m.collect << endl;
}

答案 1 :(得分:0)

错误是因为&#39; a&#39;没有在任何地方定义。

我相信你想要的是一个mirage对象,你可以从inferno引用它。您可以使用三种技术来执行此操作。

第一个是HAS-A对象关系。如果在inferno中定义了一个mirage对象的实例变量,则可以在inferno类中操作和引用该对象。在这种情况下,inferno类拥有(或换句话说,拥有)mirage对象。

另一个选项是使用继承,以便inferno对象IS-A mirage对象。这允许子对象(inferno)访问父对象(mirage)的实例变量和方法。这种关系的一个例子是形状和方形物体。形状可能具有名称,位置和颜色等属性。一个正方形的IS-A形状,意味着它将继承名称,位置和颜色属性,但也会定义它自己的类似边长。

有关更多信息,请查找类继承,IS-A和HAS-A类关系以及面向对象编程。

最后一个选项是简单地将mirage对象作为参数传递给inferno方法。

答案 2 :(得分:0)

我认为你可以在没有声明的情况下在file2.cpp中引用海市蜃楼a,因为海市蜃楼a只在主功能中可见。如果你想这样做,你可以把它变成一个全局变量。