Как решить поле 'classname' имеет ошибку неполного типа

0

Я получаю эту ошибку, выполняя следующие действия:

класс А; класс B;

класс A {
B b_obj; // Здесь возникает ошибка
...
}

класс B {
...
A a_объект;
...
}

Одна вещь, которую я наблюдал, это то, что если я сдвигаю класс B вверх, тогда он удаляется, но поскольку я использую двухстороннюю ссылку, которая также имеет объект класса A в B, поэтому я не могу избавиться от обеих ошибок.

Теги:
class
field

2 ответа

1

Он называл проблему круговой зависимости. См. Этот отличный ответ, чтобы узнать, как его решить.

  • 0
    Нет, я пытался сохранить в разных файлах, но это еще больше приводит к ситуации (ошибка: вложенные включает), что я должен добавить Ah к C.cpp и B.cpp, далее Bh к A.cpp и C.cpp и так далее. не работал
  • 0
    @notsogeek, ты читал этот ответ? Опять же, есть реальное рабочее решение. Прочитайте это внимательно.
0

Круговая зависимость

struct A { B b; }; 
struct B { A a; }; 

никогда не будет компилироваться. Либо A не знает размер B, либо наоборот (один объявлен перед другим).

Теперь у вас может возникнуть соблазн написать (с передовыми объявлениями)

struct A { std::shared_ptr<B> b; }; 
struct B { std::shared_ptr<A> a; }; 

который будет компилировать и (может/должен) вводить утечку памяти (a относится к b и наоборот).

Следовательно, возникает вопрос: имеет ли собственный B или B собственный A - или даже другой класс C.

(Имея определенное право собственности, вы можете просто использовать new/delete вместо shared_ptr)

  • 0
    Пожалуйста, используйте std :: weak_ptr для циклической ссылки. Или еще лучше - избегайте всего этого вместе.
  • 0
    @segfault Конечно, правда, перечитайте еще раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню