现在我有以下文件:
的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类?
答案 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只在主功能中可见。如果你想这样做,你可以把它变成一个全局变量。