'{'标记之前的预期类名

时间:2012-03-23 12:43:46

标签: c++ inheritance forward-declaration

我收到错误:

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 个答案:

答案 0 :(得分:2)

这里真正的问题是#include预处理器指令的自由使用。通常,您应该只在最低范围包含头文件,并向前声明您可以做的一切。您根本不应该(通常不需要)头文件的完整类声明。头文件通常不需要了解实现细节。你绝对不应该向前声明,包括标题。

由于代码在撰写本答案时存在于问题中,因此您对veiculo.h(以及proprietario.h)具有循环依赖性。由于veiculo.h确实需要其子类Motocicleta的标头,因此您应该删除已在每个标头中转发的类的#include指令。然后,您可以根据需要在源文件中包含标头。