| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  18-12-2007, 01:08 | #1 | 
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | 
				
				[c++] Chiaramenti sugli header (codice allegato)
			 
		Ragazzi sto facendo (ci provo anche) un mio gioco di ruolo testuale e ho qualche difficoltà con gli header. Per ora ho realizzato solo qualche classe e prima di andare avanti vorrei testarle ma non ci riesco per vari errori sulle inclusioni. Preciso che sto seguendo una guida trovata sul Web. Ho fatto anche varie ricerche sul forum ma non ho trovato nessun post abbastanza completo... dato che sto facendo questo lavoro anche per esercitarmi vorrei capire precisamente le cose Ho creato la classe Item da cui derivano due classi Weapon e Armor. Per non allungare troppo posterò solo Weapon che tanto è praticamente uguale a Armor. Item.h Codice: #ifndef ITEM_H
#define ITEM_H
class Item {
private:
	char name[ 32 ];
	int price;
public:
	Item();
	void SetName(char* );
	char* Getname();
	void SetPrice(int newprice);
	int GetPrice();
};
#endifCodice: #ifndef WEAPON_H
#define WEAPON_H
#include "Item.h"
class Weapon : public Item{
private:
	int damage;
public:
	Weapon();
	void CreateWeapon( char*, int, int );
	void SetDamage(int);
	int GetDamage();
	
};
#endifItem.cpp Codice: #include <string>
#include "Item.h"
Item::Item()
{
	SetName("Nome non ancora specidicato");
	SetPrice(0);
}
void Item::SetName(char* newname)
{
	strcpy(name,newname);
}
void Item::SetPrice(int newprice)
{
	price=newprice;
}
char* Item::Getname()
{
	return name;
}
int Item::GetPrice()
{
	return price;
}Weapon.cpp Codice: #include "Weapon.h"
Weapon::Weapon()
:Item()
{SetDamage(0);}
void Weapon::CreateWeapon(char* newname, int p, int dmg)
{
	SetName(newname);   
	SetPrice(p);		
	SetDamage(dmg);
}
void Weapon::SetDamage(int dmg)
{
	damage=dmg;
}
int Weapon::GetDamage()
{
	return damage;
}main.cpp Codice: #include <iostream>
#include "Item.h"
#include "Weapon.h"
using namespace std;
// PROTOTYPES
bool Start();
void main(){
	
       //variabili globali
       bool RFCComplete=false;
	cout<<"Welcome to my first (and last) text based game!\n";
	cout<<"coded by JJ\n\n";
	cout<<"Press Enter to continue...\n";
	cin.get();
	Start();
}Start.cpp Codice: bool Start()
{
       return true; //test
}
  Spero qualcuno di buon cuore lo legga. Ha senso inoltre fare un header file (i.e. Library.h) che includa tutti i .h e includere Library.h in ogni file? Ciao e grazie e scusatemi la lunghezza eccessiva! | 
|   |   | 
|  18-12-2007, 11:12 | #2 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Per l'ultima domanda: non ha senso perché non è detto che tu li debba usare tutti allo stesso momento. Devi includere solo gli header che ti servono. Se la tua applicazione è strutturata bene saranno pochi in ogni .cpp o .h. Va bene la struttura che hai dato. Usa le liste di inizializzazione. Usa la classe string al posto delle stringhe alla C. strcpy è dichiarata in string.h, ma in C++ l'header diventa <cstring>. Start dichiarala in un .h e definiscila in un .cpp ed aggiungi il .h al main. In alternativa, che fa molto più OOP, crea una classe Game che ha un metodo chiamato start. Così nel main il tutto diventa: Game game; gam.start(); | 
|   |   | 
|  18-12-2007, 11:23 | #3 | |
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | Quote: 
 Avevo pensato di usare la classe string ma tieni presente che tutto ciò è per esercitazione quindi credo che più cose faccio "a mano" meglio è quindi per ora mi va bene come ho gestito le stringhe. Comunque alla fine ho incluso <string> in Item.cpp che è dove uso strcopy e non ho avuto problemi. Per ora ho fatto un test con questo main.cpp e tutto pare funzionare. La funzione Start() l' ho messa appena dopo il main per non dover fare altre inclusione ma credo sia impensabile mettere tutte le funzioni dopo il main uno volta che ne avrò molte. Codice: #include <iostream>
using namespace std;
#include "Weapon.h"
	//Prototypes
	bool Start(Weapon*);
	bool RFCComplete=false;
void main(){
	
    //variabili globali
    
	
	cout<<"Welcome to my first text based game!\n";
	cout<<"coded by JJ\n\n";
	cout<<"Press Enter to continue...\n";
	cin.get();
	
	Weapon weap;
	Weapon* wptr=&weap;
	Start(&weap);
}
bool Start(Weapon* w){
	
	cout<<w->GetName()<<endl;
	cout<<w->GetPrice()<<endl;
	cout<<(*w).GetDamage()<<endl;
	cout<<RFCComplete;
	return true;
}Però una cosa... se avessi messo la mia funzione in Start.cpp e non dopo il main come ho fatto, le variabili globali e i prototipi le avrei dovute dichiarare in Start.cpp o vanno bene dove sono adesso? Sei gentilissimo   | |
|   |   | 
|  18-12-2007, 11:31 | #4 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Quelle nel main non sono variabili globali...quelle le devi mettere al di fuori del main e devono essere dichiarate come extern (sempre al di fuori di qualsiasi funzione) negli altri .cpp. In ogni caso in C++ non si usano le variabili globali...sono il male    Io ti consiglio di utilizzare la classe string, dopo tutto stai programmando in C++ e non in C, quindi è bene che tu impari ad usare le stringhe del C++ e non quelle del C. Poi è davvero da masochisti fare un gioco testuale usando le stringhe del C quando hai a disposizione quelle del C++. Se io dovessi fare un gioco testuale in C, la prima cosa che mi farei sarebbe una nuova struttura per gestire le stringhe dinamiche in maniera del tutto simile alla class string del C++ (oggetti a parte chiaramente)   | 
|   |   | 
|  18-12-2007, 11:41 | #5 | 
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | 
		ok mi studio le stringhe   Tanto ormai char* l'ho capito. | 
|   |   | 
|  18-12-2007, 17:17 | #6 | 
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | 
		Sto facendo qualcosa di scemo con le stringhe per provare.... Codice: #include <string>
#include <iostream>
void main()
{
	string str1("ciao");
	cout<<str1;
}error C2065: 'string': identificatore non dichiarato Come se non avessi incluso string Grazie   | 
|   |   | 
|  18-12-2007, 17:22 | #7 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		O metti: std::string str1("ciao"); o metti dopo gli include: using std::string; o using namespace std; per importare tutto il namespace. In teoria l'errore avrebbe dovuto dartelo anche su cout. | 
|   |   | 
|  18-12-2007, 17:26 | #8 | 
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | 
		per bacco non pensavo servisse anche per string! Grazie come al solito! | 
|   |   | 
|  18-12-2007, 17:30 | #9 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | |
|   |   | 
|  18-12-2007, 17:36 | #10 | 
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | 
		Hmmm perchè non compila anche se ho incluso tutto lo spazio dei nomi? Codice: #include <string.h>
#include <iostream>
using namespace std;
void main()
{
	string str1="ciao";
	cout << str1;
	
} | 
|   |   | 
|  18-12-2007, 17:36 | #11 | 
| Member Iscritto dal: Jul 2005 
					Messaggi: 156
				 | 
		Scusatemi ho capito da solo    | 
|   |   | 
|  18-12-2007, 17:39 | #12 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Già    | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 08:24.









 
		 
		 
		 
		







 
  
 



 
                        
                        










