LINUX.ORG.RU

Зацикливание классов.


0

0

Заранее извиняюсь, если вопрос покажется слишком ламерским. Есть два класса, зацикленных друг на друге и объявленных в разных файлах: <<<x.h>>> #include "y.h" class y; class x { public:   x(): yobj(*this) {} private:   y yobj; }; <<<y.h>>> #include "x.h" class x; class y { public:   y(x& xx): xobj(&xx) {} private:   x* xobj; }; На это дело компилер выдаёт такую ругань: In file included from y.h:5, from y.cpp:2: x.h:18: field 'yobj' has incomplete type. Объясните, пожалуйста, что ему, собственно, надо. Я предполагаю, что, скорее всего от этого можно избавиться, если впихнуть объявления классов в один файл, но дело в том, что реально классов гораздо больше и они гораздо сложнее, чем в этом примере, и этого очень желательно избежать. Заранее спасибо. Только не сильно ругайтесь :).


Ну, ситуация, на мой взгляд, сделдующая.
Чтобы осуществить подобное "зацикливание", один из классов должен
хранить указатели либо ссылки на другой класс (но не переменную типа класса!), а код методов, реализующих работу с этим классом, на который он ссылается, надобно размещать в отдельном .cc файле реализации, включая туда объявления обоих классов. Так надо работать с тем из классов, который объявляется первым, т.е. тот, которому предшествует неполное определение второго класса, ну, как ты писал,

class y;
class x {...};

А в одном ли .h - файле все это писать, в двух ли - не важно...
PS: 2 David: твоя мессага переформатировалась, что очень неудобно.
Когда постишь код, ставь внизу опцию "Preformatted text" вместо
"TeX paragraphs", plz.

JekLove
()

Спасибо, всё заработало.

Всё заработало, когда я заменил объект yobj на ссылку. И инициализировал его в конструкторе с помощью new. Видать для ссылки достаточно и непольного определения. 2 JekLove: спасибо за совет насчёт форматирования. Меня самого этого раздражало. Я просто не знал, как это сделать. Теперь обязательно буду делать, как ты посоветовал.

David
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.