Это базовая программа, чтобы понять, как использовать friend class
в C ++.
Учебный класс xxx
имеет класс yyy
использование объекта friend
, С классом yyy
определяется после урока xxx
Я объявил класс yyy
используя вперед
декларация.
#include<iostream>
using std::cout;
using std::endl;
class yyy; //Forward Declaration of class yyy
class xxx{
private:
int a;
public:
xxx(){a=20;yyy y2;y2.show();} //Error//
void show(){cout<<"a="<<a<<endl;}
friend class yyy; //Making class yyy as freind of class xxx
};
class yyy{
private:
int b;
public:
yyy(){b=10;}
void show(){cout<<"b="<<b<<endl;}
};
int main(int argc, char *argv[])
{
xxx x1; //creating xxx object and calling constructor
x1.show();
return 0;
}
Когда я компилирую программу, я получаю эту ошибку:
ошибка: агрегат yyy y2 имеет неполный тип и не может быть определен
Я ссылался на эту ссылку
рекурсивные занятия с друзьями
и кто-то ответил так
https://stackoverflow.com/a/6158833/2168706
Я придерживаюсь этого подхода, но все еще не могу решить
вопрос. Пожалуйста, предоставьте решение, если таковое существует, и, пожалуйста, дайте мне знать
если я ошибаюсь в любой точке кода.
Вы создаете объект y2
неполного типа yyy
Вот:
{ a = 20; yyy y2; y2.show(); }
Переместите реализацию конструктора ниже определения yyy
учебный класс:
class yyy;
class xxx {
private:
int a;
public:
xxx();
void show() { cout << "a=" << a << endl; }
friend class yyy;
};
class yyy {
private:
int b;
public:
yyy() { b = 10; }
void show() { cout << "b=" << b << endl; }
};
xxx::xxx() { a = 20; yyy y2; y2.show(); } // No error
В результате на данный момент yyy
уже определено, и вы можете создать экземпляр y2
,
Чтобы дать вам логическое объяснение, почему ваш вариант не работает: когда вы создаете экземпляр объекта с продолжительность автоматического хранения (в стеке) как yyy y2;
, компилятор должен знать в время компиляции сколько памяти он должен зарезервировать для y2
, Так как yyy
тип является неполным (был объявлен только вперед в момент создания экземпляра), компилятор потерян и сообщит об ошибке.
НОТА: Лучше всего, конечно, отделить определение класса и его реализацию, переместив определение в заголовочный файл (.hpp
) и реализация в исходный файл (.cpp
). Не забудьте правильно включить заголовки. Мне не хочется приводить здесь пример, потому что это очень простой материал, и его следует освещать в любой книге по С ++ или в учебнике.
Других решений пока нет …