View Full Version : Domanda idiota c++... confusione con gli header
Salve,
sto cercando di programmare un gioco in c++ usando OGRE.
Il problema è che come al solito nn riesco ad includere tutti gli header senza che non debba includerne uno 2 volte... allora...cerco di spiegarmi :D :
<object.h>
-Class Object- con le variabili genrali, la fisica ecc.
<weapon.h>
-class Weapon : public Object- che sono le armi.
-class WeaponConfig : protected weapon-, dove sono salvate le impostazioni di un arma.
<player.h>
-class Player : public Object-, che sarebbero i personaggi.
-class PlayerConfig : protected Player-.
Poi per amministrare e creare il tutto ho:
<objectManager.h>
-class ObjectManager -
Tutti gli header contengono solo definizioni delle funzioni in un *.cpp.
Quindi mi vengono fuori 2 problemi:
tutti i parametri di impostazione sia di Object che di Weapon sono protected, quindi visto che ObjectManager deve settarli in WeaponConfig ho pensato di impostarlo come suo friend.
Mi pare brutto sia fare 1 metodo per ogni parametro per ricavarli singolarmente (cosa che mi serve), sia metterli tutti public.
Purtroppo non posso includere objectmanager.h in weapon.h perchè weapon.h è incluso in objectmanager.h.... :muro:
Anche se risolvessi poi c'è il secondo problema:
nn potrei includere sia player.h che weapon.h in objectmanager.h visto che entrambi i primi due includono object.h che quindi sarebbe duplicato... :confused: :confused: ma a quelli la definizione di object serve... come serve quella di weapon e Player a ObjectManager... BOH!
Spero che qualcuno abbia capito cosa ho cercato di comunicarvi visto che sta roba nn è chiara nemmeno a me :rolleyes: ... grazie in anticipo... e nn esitate a chiedere spiegazioni...
Solitamente gli header sono scritti così:
#ifndef __NOMEHEADER__
#define __NOMEHEADER__
//corpo dell'header
#endif
In questo modo l'inclusione doppia di un header non avviene...
PS: non è detto che il formato sia proprio __NOMEHEADER__
giangian2
19-12-2006, 10:54
quoto "cionci", inoltre se hai solo dei puntatori agli degli oggetti puoi utilizzare la "Forward declaration" nell'header ed includere il file direttamente nel cpp. ;)
trallallero
19-12-2006, 12:36
domanda idiota ? :eek:
l'avessero fatta quegli idi.... della soc. Repl... che avevano in mano parte del progetto xxx e ci consegnarono il pacchetto SENZA 1 (UNO) #ifndef ... :muro:
era tutto un incastro perfetto di #include in modo da non includere piú volte lo stesso header :Puke:
Bastó una modifica per far crollare il tutto :rolleyes:
Quindi Tommo, se non sai una cosa e chiedi consiglio non é mai una domanda idiota.
PS: oltre a fopen e malloc senza check ... "bisogna fidarsi del sistema operativo" fu la giustificazione :nono:
Grazie per le risposte, mi fa piacere che nn era una domanda tanto idiota allora...
cmq l'header di object.cpp aveva già la parte con #ifndef:
#ifndef _OBJECT_H_
#define _OBJECT_H_
#if _MSC_VER > 1000
#pragma once
#endif
....
#endif
ma per qualche motivo nn ha funzionato, e allora avevo temporaneamente risolto con una forward declaration e un "incastro" di headers :rolleyes: ...
Cioè ho incluso object.h dentro weapon.h, incluso a sua volta in player.h che ho incluso in objectmanager.h... certo nn era una bella soluzione, specie perchè alle classi del player nn serve a nulla weapon...
Ora proverò con le fw declaration includendo object.h direttamente nel cpp...
P.S. Che cosa fa "#if _MSC_VER > 1000 #pragma once"?
L'ho messo perchè l'ho copiato da un header trovato su internet, ma nn so quanto sia utile...
trallallero
19-12-2006, 15:11
Grazie]
P.S. Che cosa fa "#if _MSC_VER > 1000 #pragma once"?
L'ho messo perchè l'ho copiato da un header trovato su internet, ma nn so quanto sia utile...
é una direttiva per il preprocessore e serve proprio a far includere solo una volta il sorgente.
Ma il #ifndef dovrebbe bastare ... sicuro di averlo scritto giusto ?
EDIT: scusa, poco chiaro:
#pragma once é la direttiva.
#if _MSC_VER > 1000 é una if per il preprocessore ma nel tuo caso secondo me non serve. Se non hai definito _MSC_VER > 1000 non ha senso
era tutto un incastro perfetto di #include in modo da non includere piú volte lo stesso header :Puke:
Bastó una modifica per far crollare il tutto :rolleyes: con un sistema di packaging come quello di Java non avresti avuto il problema :Prrr:
trallallero
19-12-2006, 15:56
con un sistema di packaging come quello di Java non avresti avuto il problema :Prrr:
java ... linguaggio per fighette :ciapet:
java ... linguaggio per fighette :ciapet: le fighette non hanno problemi di inclusione multipla... o si?? :stordita: :stordita: :stordita: :stordita: :stordita: :stordita: :stordita:
boh ora lo include una sola volta come dovrebbe... visto che funziona lo lascio così com'è.
_MSC_VER potrebbe essere definito da qualche parte nel codice di OGRE3D, visto che il codice l'ho preso da un header per quello...
_MSC_VER potrebbe essere definito da qualche parte nel codice di OGRE3D, visto che il codice l'ho preso da un header per quello... ti rovino il finale: è definita implicitamente dal compilatore Microsoft.
E io che uso codeblocks che me ne faccio?
E io che uso codeblocks che me ne faccio?
Niente...viene ignorato, a meno che non usi il compilatore MS con Code::Blocks...
trallallero
20-12-2006, 07:59
le fighette non hanno problemi di inclusione multipla... o si?? :stordita: :stordita: :stordita: :stordita: :stordita: :stordita: :stordita:
che volgare :O
( :rotfl: )
trallallero
20-12-2006, 08:05
ti rovino il finale: è definita implicitamente dal compilatore Microsoft.
addirittura definito dal compilatore :eek:
capisco usarlo durante la progettazione, durante i test ...
:asd: giusto una ciofeca come la MS ha bisogno di un pragma del genere per controllare le proprie porcate :asd:
mai visto nel codice della Borland :O
addirittura definito dal compilatore :eek:
capisco usarlo durante la progettazione, durante i test ...
:asd: giusto una ciofeca come la MS ha bisogno di un pragma del genere per controllare le proprie porcate :asd: macchè, utilissima invece: ti permette di utilizzare o meno una certa feature del compilatore a seconda che questo la supporti o meno. _MSC_VER significa Microsoft Compiler Version. il codice
#if _MSC_VER > 1000
#pragma once
#endif
significa esattamente: "se _MSC_VER è definita (stai compilando col compilatore Microsoft) ed è definita come > 1000 (il compilatore Microsoft con cui stai compilando supporta pragma once) allora usa pragma once", che è una comoda direttiva che serve precisamente a proteggere dall'inclusione multipla. ;)
a proposito :D
addirittura definito dal compilatore :eek:
non è neanche l'unica: lo stesso standard ANSI C stabilisce che il compilatore debba anche definire alcune macro (presenti infatti anche in gcc) come __FILE__, __LINE__, e qualcun'altra molto utile in fase di debug. MFC usa tali macro nei suoi ottimi strumenti di diagnostica (macro ASSERT, VERIFY, TRACE, e compagnia bella) permettendoti così per esempio di sapere precisamente a quale linea di quale file sorgente si è asserito.
trallallero
20-12-2006, 15:06
macchè, utilissima invece: ti permette di utilizzare o meno una certa feature del compilatore a seconda che questo la supporti o meno. _MSC_VER significa Microsoft Compiler Version. il codice
#if _MSC_VER > 1000
#pragma once
#endif
significa esattamente: "se _MSC_VER è definita (stai compilando col compilatore Microsoft) ed è definita come > 1000 (il compilatore Microsoft con cui stai compilando supporta pragma once) allora usa pragma once", che è una comoda direttiva che serve precisamente a proteggere dall'inclusione multipla. ;)
:asd: forse quelli della MS non sanno che i pragma sono come gli HINT di Oracle ovvero "consigli".
Se il precomp non li capisce li ignora.
Quindi basterebbe scrivere #pragma once se lo capisce bene sennó sticazzi :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.