#include <iostream>
class B;
class A{
int a;
public:
friend void B::frndA();
};
class B{
int b;
public:
void frndA();
};
void B::frndA(){
A obj;
std::cout << "A.a = " << obj.a << std::endl;
}
int main() {
return 0;
}
При попытке скомпилировать этот код, произошли некоторые ошибки. Например.
недопустимое использование неполного типа
Каковы проблемы в этом коде?
Поместите всю class B ...
объявление перед классом A
. Вы еще не объявили B::frndA();
.
#include <iostream>
using namespace std;
class B{
int b;
public:
void frndA();
};
class A{
int a;
public:
friend void B::frndA();
};
void B::frndA(){
A obj;
//cout<<"A.a = "<<obj.a<<endl;
}
int main() {
return 0;
}
Проблема в том, что вы не можете объединить функцию-член до того, как компилятор увидит объявление.
Чтобы решить проблему, вам потребуется изменить код (т.е. переместить определение класса B
до класса A
).
Вы должны поместить объявление B
перед A
. Компилятор об этом не знает: B :: frndA ()
. Предварительного объявления недостаточно, чтобы сделать вывод, какие члены имеет тип.
Я бы рекомендовал поместить объявление вашего класса A
в файл A.h
, а его определение внутри файла A.cpp
. То же самое для типа B
внутри Bh
и B.cpp
В верхней части каждого файла заголовка поместите #pragma once
( или, если хотите, включите охранников).
Затем в свой B.h
вы можете просто включить A.h
.