我创建了两个相互依赖的类:ClassA和ClassB。我对ClassB进行了原型化,这样编译器就会知道有可用的ClassB。先编译了ClassA,然后编译了ClassB。所以我假设下面的代码可以工作,但编译器说ClassB是未定义的,尽管我对它进行了原型化。现在的问题是……为什么它会给出这个错误?
#include <iostream>
using namespace std;
class ClassB;
class ClassA{
public:
ClassA():x(50){}
void printClassB(ClassB input){
cout << input.y << endl;
}
friend class ClassB;
private:
int x;
};
class ClassB{
public:
ClassB(): y(100){}
void printClassA(ClassA input){
cout << input.x << endl;
}
friend class ClassA;
private:
int y;
};
int main()
{
ClassA a;
ClassB b;
b.printClassA(a);
a.printClassB(b);
cin.ignore();
}
若要使ClassA
使用ClassB
,则必须完全定义ClassB
。既然情况正好相反,你就不能真的那样做。
可以使用指针或引用到ClassA
中的ClassB
,然后在定义数据后使用ClassB
中的数据。
像
class ClassB;
class ClassA{
public:
void printClassB(ClassB& input);
...
};
class ClassB { ... };
void ClassA::printClassB(ClassB& input)
cout << input.y << endl;
}
ClassB
在编译ClassA
时是未声明的,而不是定义的,因此在printClassB
函数中,编译器不知道ClassB
成员y
。将函数从类中移出,以便在两个类都完全定义的地方进行编译:
class ClassA{
public:
ClassA():x(50){}
void printClassB(ClassB input);
friend class ClassB;
private:
int x;
};
class ClassB{
public:
ClassB(): y(100){}
void printClassA(ClassA input);
friend class ClassA;
private:
int y;
};
inline void ClassA::printClassB(ClassB input){
cout << input.y << endl;
}
inline void ClassB::printClassA(ClassA input){
cout << input.x << endl;
}