Предописание с другом функция: недопустимое использование неполного типа

#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;
}

При попытке скомпилировать этот код, произошли некоторые ошибки. Например.

недопустимое использование неполного типа

Каковы проблемы в этом коде?

5
задан Disillusioned 19 March 2018 в 08:58
поделиться

3 ответа

Поместите всю 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;
}
3
ответ дан 14 December 2019 в 08:40
поделиться

Проблема в том, что вы не можете объединить функцию-член до того, как компилятор увидит объявление.

Чтобы решить проблему, вам потребуется изменить код (т.е. переместить определение класса B до класса A ).

2
ответ дан 14 December 2019 в 08:40
поделиться

Вы должны поместить объявление B перед A . Компилятор об этом не знает: B :: frndA () . Предварительного объявления недостаточно, чтобы сделать вывод, какие члены имеет тип.

Я бы рекомендовал поместить объявление вашего класса A в файл A.h , а его определение внутри файла A.cpp . То же самое для типа B внутри Bh и B.cpp

В верхней части каждого файла заголовка поместите #pragma once ( или, если хотите, включите охранников).

Затем в свой B.h вы можете просто включить A.h .

2
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: