ошибка: предварительное объявление структуры - PullRequest
4 голосов
/ 23 марта 2012

Я получаю сообщение об ошибке:

proprietario.cpp:36: error: invalid use of incomplete type ‘struct Motocicleta’
proprietario.h:12: error: forward declaration of ‘struct Motocicleta’

Motocicleta.h:

#ifndef __MOTOCICLETA__
#define __MOTOCICLETA__
#include <iostream>
#include "veiculo.h"
#include "proprietario.h"
using namespace std;
class Proprietario;
class Motocicleta:public Veiculo{

public:
  Motocicleta(int nPassageiros, string modelo, string placa, int aFabricacao, Proprietario* pai, int nRodas, int aro);
  ~Motocicleta();
  Motocicleta (const Motocicleta& source);
  Motocicleta& operator= (const Motocicleta& source);

  string toString();

};                     
#endif

Proprietario.h

#ifndef __PROPRIETARIO__
#define __PROPRIETARIO__

#include <iostream>
#include "motocicleta.h"
#include "caminhao.h"
#include "carreta.h"
#include "carro.h"

using namespace std;

class Carro;
class Carreta;
class Caminhao;
class Motocicleta;

class Proprietario{
protected:
  string nome;
  string cpf;
  Motocicleta* mMoto;
  Caminhao* mCaminhao;
  Carreta* mCarreta;
  Carro* mCarro;
};

Veiculo.h:

#ifndef __VEICULO__
#define __VEICULO__
#include <iostream>
#include "proprietario.h"
#include "roda.h"
#include "motor.h"

using namespace std;
class Motor;
class Proprietario;
class Veiculo{
protected:
  int nPassageiros;
  string modelo;
  string placa;
  int aFabricacao;
  Proprietario* pai;
  Roda* rodas;
  Motor* mMotor;
  int nRodas;
  };

Я удалил методы, потому что, если я добавлю их, вопрос будет длинным, извините, код находится в PT-BR.Я видел, что проблема, как правило, заключается в предварительной декларации.Но я не могу найти проблему, я посмотрел на многих форумах, но я не могу найти проблему ..

Кто-то может мне помочь?

Нужна какая-то другая часть кода?

Ответы [ 3 ]

11 голосов
/ 23 марта 2012

В Proprietario.cpp в строке 36 вы что-то делаете с классом Motocicleta, не включая сначала полное объявление класса (у вас есть только предварительное объявление).

3 голосов
/ 23 марта 2012

Должен быть включен либо заголовок, объявляющий класс (#include "xxx.h") , либо , класс должен быть заранее объявлен (class xxx;). Похоже, вы делаете оба в своих заголовках, что приводит к предварительному объявлению после истинного объявления, что, вероятно, является причиной указанных проблем.

2 голосов
/ 23 марта 2012

У вас больше #include с, чем вам нужно.Если вам нужна только предварительная декларация, нет необходимости также включать заголовочный файл.Например, в Proprietario.h вы используете только указатели на Motocicleta, Caminhao, Carreta и Carro, поэтому все, что вам нужно, это предварительные объявления, вам не нужно #include "motocicleta.h", чтобы вы могли удалитьэто.

Это не совсем объясняет ошибку, хотя.Я думаю, что если вы упростите свои заголовки, будет легче отследить ошибку.Не видя файла proprietario.cpp и того, что вы удалили из заголовков, указанных в вашем вопросе, я не могу быть слишком уверен в причине ошибки.

...