Итак, чтобы поиграть с дружественными функциями, я решил создать класс Child
и класс Mother
. Класс Mother имеет элемент данных, который является дочерним. Класс Child создает два метода дружественных функций класса Mother.
Однако когда я компилирую, кажется, что независимо от того, как я обрабатываю включения, я получаю ошибку. Если Child определяется первым, я получаю "Mother is not a class or namespace name" для строки friend void Mother::setChildName(string name);
в Child.h. Если Мать определена первой, я получаю «Отсутствует спецификатор типа» для строки Child c;
в Mother.h.
Есть ли способ обойти это? Я попытался поставить 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
using namespace std;
обычно подходит для файлов .cpp, но в основном никогда не используйте его в файлах заголовков, потому что он загрязняет пространство имен для всех, кто хочет использовать ваш класс (который может включать вас в какой-то момент). - person RichardPlunkett   schedule 06.12.2013