класс — C ++, как использовать ключевое слово «друг» с функциями-членами из двух классов, содержащихся друг с другом

Я новичок в изучении c ++. Как использовать друга с функциями-членами из двух классов, содержащихся друг с другом? Я не смог найти хороший ответ через гугл

Ниже мой код:

#ifndef FriendTest_hpp
#define FriendTest_hpp
class FriendVisitor;
class FriendTest{
friend int FriendVisitor::getTestAdd();
private:
int add=23;
int  getAdd(){
return add;
}
public:
void test(){
printf("hello");
}
FriendTest()=default;
};

#ifndef FriendVisitor_hpp
#define FriendVisitor_hpp
#include <stdio.h>
class FriendTest;
class FriendVisitor{
FriendTest* test;
public:
FriendVisitor(){

}
int getTestAdd();
};

#endif /* FriendVisitor_hpp */

IDE дает мне неправильную ошибку:

неполный тип ‘FriendVisitor, названный в описателе вложенного имени’

Каково решение?

0

Решение

Ваша проблема здесь:

class FriendVisitor;
class FriendTest{
friend int FriendVisitor::getTestAdd();

На этом этапе компиляции FriendTest класс знает о существование из FriendVisitor класс, но не любой из его членов, так как его объявление не является полным. Если вы измените порядок кода, чтобы полностью объявить FriendVisitor во-первых, затем его объявление завершается, как только вы объявляете функцию друга в FriendTest и он компилирует:

#include <stdio.h>
class FriendTest; // Forward declaration
class FriendVisitor{
FriendTest* test; // Only references the class, so only forward declaration needed
public:
FriendVisitor(){

}
int getTestAdd();
};

class FriendTest{
friend int FriendVisitor::getTestAdd();  // FriendVisitor is fully declared, friend function is legal
private:
int add=23;
int  getAdd(){
return add;
}
public:
void test(){
printf("hello");
}
FriendTest()=default;
};
3

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

Других решений пока нет …