У меня есть два класса, один а также два, у каждого есть друг функция-член с указателем на другой. Первый файл заголовка, как показано ниже:
#ifndef FIRSTCLASS_H
#define FIRSTCLASS_H
class two;
class one {
private:
int one_data;
public:
friend void second_data (two *);
};
#endif
Второй заголовочный файл выглядит так:
#ifndef SECONDCLASS_H
#define SECONDCLASS_H
class one;
class two {
private:
int two_data;
public:
friend void first_data (one *);
};
#endif
Фактические функции находятся в третьем файле .cpp. Я написал функции с соответствующим классификатором класса, это дает ошибку компиляции. Я использую G ++. Функции следующие:
#include "firstclass.h"#include "secondclass.h"
void two::first_data (one * class1) {
}
void one::second_data (two * class2) {
}
Ошибки следующие:
error:no ‘void two::first_data (one*)’ member function declared in class ‘two’
error: no ‘void one::second_data(two*)’ member function declared in class ‘one’
Когда я опускаю классификатор класса перед именем функции, код компилируется. Изменены следующие функции:
void first_data(one * class1) {
}
void second_data(two * class2) {
}
Я новичок в C ++, и я не уверен, что я делаю что-то не так в первом случае. Пожалуйста, просветите меня.
То, что вы объявляете, — это автономные функции друзей вашего класса.
Они не являются членами какого-либо класса.
friend void first_data (one *);
объявляет автономную функцию first_data
как друг вашего класса, это не значит, first_data
является функцией-членом вашего класса. Следовательно, когда вы определяете функцию в файле cpp, компилятор жалуется, что функция никогда не была объявлена.
Также,
void two::first_data (one * class1){}
Returntype ClassName ScopeResolution FunctionSignature
two::
сообщает компилятору, что функции принадлежат этому конкретному классу, это не спецификация пространства имен, это квалификация класса.
Это не namespace
, это class
Классификатор.
void two::first_data (one * class1) {
}
определяет метод first_data
из класса two
,
Тем не менее, вы объявили в качестве друга бесплатную функцию first_data
:
friend void first_data (one *);
что не то же самое. Если вы хотите бесплатные функции в качестве друзей, используйте friend
Декларация у вас уже есть. Если нет, вы можете объявить методы как друзей:
friend void two::first_data (one *);