сфера функции друга

У меня есть два класса, один а также два, у каждого есть друг функция-член с указателем на другой. Первый файл заголовка, как показано ниже:

#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 ++, и я не уверен, что я делаю что-то не так в первом случае. Пожалуйста, просветите меня.

0

Решение

То, что вы объявляете, — это автономные функции друзей вашего класса.
Они не являются членами какого-либо класса.

friend void first_data (one *);

объявляет автономную функцию first_data как друг вашего класса, это не значит, first_data является функцией-членом вашего класса. Следовательно, когда вы определяете функцию в файле cpp, компилятор жалуется, что функция никогда не была объявлена.

Также,

void two::first_data (one * class1){}

Returntype ClassName ScopeResolution FunctionSignature

two:: сообщает компилятору, что функции принадлежат этому конкретному классу, это не спецификация пространства имен, это квалификация класса.

5

Другие решения

Это не 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 *);
2

По вопросам рекламы ammmcru@yandex.ru