C ++:两个相互引用的类

时间:2013-12-06 07:48:59

标签: c++ include friend

因此,对于带有朋友功能的玩具,我决定制作一个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

2 个答案:

答案 0 :(得分:1)

如果不重新设计,这个特殊问题就无法解决。母亲需要在孩子面前定义,孩子需要在母亲面前定义。简单的方法是让整个母亲班成为孩子的朋友。这样就可以先定义Child了。

我认为让个别方法成为另一个班级的朋友几乎没有什么实际好处。这意味着你的班级太大了,责任可以分成更小的班级。

答案 1 :(得分:0)

如果母亲将指向孩子,你将不必包括child.h。向前减速就足够了。