Ожидаемое имя класса до токена ‘{’ - PullRequest
1 голос
/ 23 марта 2012

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

In file included from proprietario.h:5,
                 from veiculo.h:4:
motocicleta.h:8: error: expected class-name before ‘{’ token

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.Я видел, что проблема, как правило, заключается в предварительной декларации.Но я не могу найти проблему, я посмотрел на многих форумах, но я не могу найти проблему ..

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

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

1 Ответ

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

Настоящей проблемой здесь является либеральное использование директив препроцессора #include. В общем, вы должны включать заголовочный файл только в той самой нижней области, в которой он необходим, и заранее объявлять все, что можете. Вы просто не должны (не должны) обычно требовать полных объявлений классов для заголовочных файлов. Заголовочные файлы обычно не должны знать о деталях реализации. Вы определенно не должны объявлять форвард и , включая заголовок.

Поскольку код стоит в вопросе на момент написания этого ответа, у вас есть круговая зависимость от veiculo.h (а также от proprietario.h). Поскольку veiculo.h действительно необходим для заголовка его подкласса Motocicleta, вы должны удалить директивы #include для классов, которые вы уже объявили в каждом заголовке. Затем вы можете при необходимости включить заголовки в исходные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...