класс друга с объявлением класса forward не компилируется

Это базовая программа, чтобы понять, как использовать 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

Я придерживаюсь этого подхода, но все еще не могу решить
вопрос. Пожалуйста, предоставьте решение, если таковое существует, и, пожалуйста, дайте мне знать
если я ошибаюсь в любой точке кода.

2

Решение

Вы создаете объект 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). Не забудьте правильно включить заголовки. Мне не хочется приводить здесь пример, потому что это очень простой материал, и его следует освещать в любой книге по С ++ или в учебнике.

6

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

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

По вопросам рекламы [email protected]