Pregunta

Quiero crear un juego de batalla de mar.Tengo dos clases: barco y celular.

#pragma once
#include"stdafx.h"
#include"Globals.h"
#include<vector>
#include"MCell.h"

 class Ship 
 {

 private:
    int lenght;
    int oriantation;
    vector<Cell*> cells;
    vector<Cell*> aroundCells;

...

#pragma once
#include<vector>
#include"MShip.h"

 class Cell
{

private:
    bool haveShip;
    bool selected;
    bool around;
    int x;
    int y;
    Ship* ship; 

y tengo muchos errores como los:

1>projects\seewar\seewar\mship.h(13): error C2065: 'Cell' : undeclared identifier
1>projects\seewar\seewar\mship.h(13): error C2059: syntax error : '>'
1>projects\seewar\seewar\mship.h(14): error C2065: 'Cell' : undeclared identifier

¿Qué pasa con el código?

¿Fue útil?

Solución

Bueno, su problema miente que cuando incluya Mcell.H Incluye MSI, qué referencias se definen en Mcell.h.Sin embargo, MSP, se refiere a Mcell.h que no se incluirá debido a la PRAGMA una vez.Si el pragma una vez no estuvo allí, entonces obtendría un bucle inifinito que apile el desbordamiento de su compilador ...

En su lugar, podría usar una declaración hacia adelante.

, decir, eliminar el # INCLUDE "MCELL.H" de MSHIP.H y reemplazarlo con, simplemente "Clase Cell";Todos sus problemas de referencias circulares se irán :)

Otros consejos

Los archivos de encabezado dependen del uno del otro.Sin embargo, uno de ellos tendrá que ser leído ante el otro.Por lo tanto, debe reescribir a uno de ellos (o ambos) para no depender de la otra.Puede hacerlo al declarar hacia adelante las clases en lugar de incluir el archivo de encabezado que las define.

Así que en MSP, debe poner una declaración class Cell; en lugar de incluir mcell.h y / o viceversa.

Necesitas reenviar Declarar las clases.

Ship.h

class Cell; //forward declaration
class Ship 
{
   //....
};

celular.h

class Ship; //forward declaration
class Cell
{
   //....
};

y retire la inclusión circular.No necesita incluir un encabezado en otro, ya que no está trabajando con tipos completos, sino punteros.La definición de clase completa se requiere cuando usa objetos de concreto del tipo.En el caso de los punteros, no lo haces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top