LINUX.ORG.RU

C++ Поле типа предопределённого класса.

 , , ,


0

1

Как-то волей судьбы раньше с таким не сталкивался, а тут на тее. В общем, когда у нас перекрёстные ссылки - всё просто. предопределил класс и проблема решена. А как поступить если мне нужно иметь не ссылку а именно полноценный объект? Пример:


class B;
class A {
	B b;
};

class B {
	A* a;
};
	
int main()
{
}

Ну и результат:

akutsan@akutsan:~/development/tests$ g++ main2.cpp 
main2.cpp:4:4: error: field ‘b’ has incomplete type

П.С: Пример искусственный. простое переставление классов местами сделать нельзя в реальной проблеме.



Последнее исправление: vsrmis (всего исправлений: 1)

- class B;
+ class A;

И поменять местами определения классов A и B.

yoghurt ★★★★★
()

Я сейчас не очень соображаю, надо это в одном файле? Раскидать по файлу на класс нельзя?

jeuta ★★★★
()

простое переставление классов местами сделать нельзя в реальной проблеме

Как раз можно.

m0rph ★★★★★
()

простое переставление классов местами сделать нельзя в реальной проблеме.

Здесь придёт на помощь магия инклудов.

E ★★★
()

простое переставление классов местами сделать нельзя в реальной проблеме.

Тут ты неправ. Это либо возможно, либо у тебя бесконечные структуры.

Begemoth ★★★★★
()
Ответ на: комментарий от E

Да не обязательно магия, есть шанс, что просто аккуратное систематическое использование минимально необходимого числа #include'ов (но не меньше минимального :-)). А в запущенном случае pimpl поможет.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Большое спасибо. Действительно грамотное расставление инклудов меня спасло.

vsrmis
() автор топика

тут у тебя есть неполный тип class B. Можно делать указатель на неполный тип, но нельзя делать объект неполного типа, т.к. компилятор не знает его sizeof. Потому надо сделать неполный тип class A, т.к. указатель на A можно использовать, когда A неполный.

emulek
()

Xintrea, залогиньтесь.

anonymous
()
class A;
class B {
        A* a;
};

class A {
        B b;
};

int main()
{
}
mix_mix ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.