我收到错误:

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

专有权
#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中。
我看到的问题通常是前向声明。
但是我找不到问题,在很多论坛上都没找到问题。

有人可以帮助我吗?

需要代码的其他部分吗?

最佳答案

真正的问题是自由使用#include预处理程序指令。通常,只应在需要的最低范围内包含头文件,并向前声明您可以做的所有事情。您通常根本不需要(应该)头文件的完整类声明。头文件通常不需要了解实现细节。您绝对不应该向前声明和包含 header 。

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

关于c++ - ‘{’ token 之前的预期类名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9839421/

10-11 14:44