studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c++ design header c-preprocessor include-guards

c++ - para - manual de programacion android pdf



Inclusión múltiple en múltiples archivos (5)

Además de los problemas de protector de inclusión mencionados anteriormente (también tiene un desajuste _CHARACTEr_H _ / _ CHARACTER_H_ que podría causar problemas en la línea 2 de la GUI.h), es posible que desee revisar el diseño de su objeto para que el personaje no ataque a AttackEnemy (), sino que hay una clase Battle () donde se hace referencia a dos personajes y se produce un BattleRecord después de la batalla. Esto evitaría que la clase Character siempre tenga que saber acerca de BattleRecords en primer lugar, permitiría la posibilidad de batallas con múltiples personajes en el futuro, tener batallas de múltiples turnos o tener batallas especiales a través de la herencia de la clase Battle.

Estoy haciendo un pequeño juego.

En BattleRecord.h:

#ifndef _CHARACTER_H_ #define _CHARACTER_H_ #include "Character.h" #endif class BattleRecord { public: Character Attacker; Character Defender; Status status; int DamageDealt; int GoldEarned; int ExpGained; };

En Character.h:

#ifndef _EQUIPMENT_H_ #define _EQUIPMENT_H_ #include "Equipment.h" #endif class BattleRecord; class Character { BattleRecord AttackEnemy(Character &Enemy); }

En BattleRecord.h:

#ifndef _CHARACTER_H_ #define _CHARACTEr_H_ #include "Character.h" #endif #ifndef _BATLE_RECORD_H_ #define _BATLE_RECORD_H_ #include "BattleRecord.h" #endif class GUI { public: //GUI Methods, and two of these: void ViewStats(Character &Player); void Report(BattleRecord Record) }

El problema aquí es que mi Character.h y BattleRecord.h necesitan incluirse entre sí, y esto definitivamente causará un problema de redefinición múltiple. Por lo tanto, utilicé la declaración directa en Character.h agregando:

class BattleRecord;

El problema está sobado. Pero luego, la GUI.h necesita BattleRecord.h nuevamente por informar la batalla, así que tengo que incluir BattleRecord.h en la GUI.h. También tengo que incluir Character.h para pasar a la función ViewStat. Recibí un error y me quedé con esto hasta este punto.


En general, use forward declaration en lugar de includes. Esto minimiza la cantidad de archivos incluidos que incluye el archivo. La única excepción es cuando la clase que está definiendo es una clase derivada, luego debe incluir la clase base.


Estás utilizando guardias de inclusión incorrectos. Deben aparecer en el archivo que intenta evitar inclusiones múltiples solamente, y deben cubrir todo el archivo. (no solo los incluye).

Por ejemplo, en BattleRecord.h

#ifndef _BATTLE_H_ #define _BATTLE_H_ #include "Character.h" class BattleRecord { public: Character Attacker; Character Defender; Status status; int DamageDealt; int GoldEarned; int ExpGained; }; #endif // _BATTLE_H_


OK a todos,

Gracias por ayudarme. He reescrito todas las inclusiones para los archivos de encabezado como se sugirió, y ahora funciona perfectamente. Tómese bastante tiempo ya que lo hice mal en muchas clases.


Ponga su #endif al final del archivo, no el final de sus #pragma once o use #pragma once en la parte superior si su compilador lo admite, aunque es menos portátil.

Editar:

Para explicar mejor lo que hace #ifdef & ifndef es decirle al compilador que incluya o excluya el código completamente de la compilación.

// if _UNQIUEHEADERNAME_H_ is NOT defined include and compile this code up to #endif #ifndef _UNQIUEHEADERNAME_H_ // preprocessor define so next time we include this file it is defined and we skip it #define _UNQIUEHEADERNAME_H_ // put all the code classes and what not that should only be included once here #endif // close the statement

La razón por la que desea hacer esto es porque incluir un archivo de encabezado básicamente dice "poner todo el código en este archivo aquí" si lo hiciera varias veces, entonces los conflictos de nomenclatura no podrían redefinir objetos y retrasar los tiempos de compilación en el mejor escenario .