Использует неопределенный класс / имеет неполный тип

0
class a;
class b;

class a {
    b c;
};

class b {
};

Почему это не компилируется? У меня создалось впечатление, что если вы объявили прототипы классов, неважно, в каком порядке они были объявлены. Однако это не работает. В визуальной студии это дает мне:

error C2079: 'a::c' uses undefined class 'b'

В g++ он дает мне:

error: field 'c' has incomplete type

Что я делаю не так?

  • 1
    Это имеет значение , в каком порядке классы определены в. Определения должны быть доступны перед использованием по значению.
  • 1
    Это, вероятно, будет работать так, как вы ожидаете, если бы c был b* (указатель)
Показать ещё 4 комментария
Теги:

2 ответа

2
Лучший ответ

Когда компилятор видит

class a {
  b c;
};

он знает, что существует b, но он не знает, что это (следовательно, он не знает, сколько места он потребует, следовательно, он не знает, как построить a)

Однако то, что вы можете сделать, это использовать указатель на b:

class a {
  b* c;
};

Редактировать:

Это означает, что вы не сможете манипулировать буквой b до ее определения. Например: вы не можете:

class a {
  b* c;
  void f(){
    c->doSomething(); // <- Won't compile
  }

};

Что вы можете сделать, это разделение a определение в .hh и .cc:

в a.hh

class b; //Say it exists. Don't say what it looks like

class a {
  b* c;
  void f();
};

в acc

#include "b.hh" //now it ok to use b.hh: it won't yield a circular reference because b.hh may include a.hh but it doesn't include a.cc

void a::f(){
  c->doSomething();
}
  • 0
    Хорошо, это хороший ответ. Это имеет смысл. То есть это означает, что нет способа получить экземпляр чего-либо до того, как он будет определен?
  • 0
    У вас может быть экземпляр, если вам позвонили с ним, но вы не сможете с ним многое сделать ... Я просто отредактировал свой ответ, чтобы найти решение.
Показать ещё 1 комментарий
0

В то время, когда a использует b он был объявлен (потому что вы написали class b; над ним), но не определен (определение ниже a). "Неполный тип" означает, что тип был объявлен, но не определен.

Ещё вопросы

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