因此,对于带有朋友功能的玩具,我决定制作一个Child
课程和一个Mother
课程。 Mother类有一个数据成员,它是一个Child。 Child类生成了Mother类友元函数的两种方法。
当我编译时,似乎无论我如何处理包含,我最终都会出错。如果Child是第一个定义的,那么我在Child.h中的行friend void Mother::setChildName(string name);
得到“Mother不是类或名称空间名称”。如果母亲是第一个被定义的母亲,我会在Mother.h中找到行Child c;
的“缺少类型说明符”。
有解决方法吗?我尝试将class Mother;
放在Child.h的顶部,将class Child;
放在Mother.h的顶部,这似乎没有帮助。
或者这种循环引用总是会失败?
在Mother.h:
#ifndef MOTHER_H_
#define MOTHER_H_
#include <string>
#include "Child.h"
using namespace std;
class Mother {
public:
Mother();
void setChildName(string name);
string getChildName();
private:
Child c;
};
#endif
在Mother.cpp:
#include <string>
#include "Mother.h"
using namespace std;
void Mother::setChildName(string name) {
c.name = name;
}
string Mother::getChildName() {
return c.name;
}
在Child.h中:
#ifndef CHILD_H_
#define CHILD_H_
#include <string>
#include "Mother.h"
using namespace std;
class Child {
public:
private:
string name;
friend void Mother::setChildName(string name);
friend string Mother::getChildName();
};
#endif
答案 0 :(得分:1)
如果不重新设计,这个特殊问题就无法解决。母亲需要在孩子面前定义,孩子需要在母亲面前定义。简单的方法是让整个母亲班成为孩子的朋友。这样就可以先定义Child了。
我认为让个别方法成为另一个班级的朋友几乎没有什么实际好处。这意味着你的班级太大了,责任可以分成更小的班级。
答案 1 :(得分:0)
如果母亲将指向孩子,你将不必包括child.h。向前减速就足够了。