|
|
|
![]() |
|
Strumenti |
![]() |
#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(); }; #endif Codice:
#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(); }; #endif Item.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 }
![]() Ciao e grazie e scusatemi la lunghezza eccessiva! |
![]() |
![]() |
![]() |
#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(); |
![]() |
![]() |
![]() |
#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 ![]() |
|
![]() |
![]() |
![]() |
#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) ![]() |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jul 2005
Messaggi: 156
|
ok mi studio le stringhe
![]() |
![]() |
![]() |
![]() |
#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 ![]() |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jul 2005
Messaggi: 156
|
per bacco non pensavo servisse anche per string!
Grazie come al solito! |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#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; } |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jul 2005
Messaggi: 156
|
Scusatemi ho capito da solo
![]() |
![]() |
![]() |
![]() |
#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: 16:12.