Форвардное объявление с функцией друга: недопустимое использование неполного типа - PullRequest
5 голосов
/ 06 июля 2010
#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;
}

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

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

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

Ответы [ 3 ]

3 голосов
/ 06 июля 2010

Поместите всю декларацию class B ... перед class 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;
}
2 голосов
/ 06 июля 2010

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

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

2 голосов
/ 06 июля 2010

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

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

В верхней части каждого заголовочного файла ставится #pragma once (или, если вы предпочитаете включать охранников).Тогда внутри вашего B.h вы можете просто включить A.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...