PDA

View Full Version : [c++] Chiaramenti sugli header (codice allegato)


Broadband
18-12-2007, 00:08
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

#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


Weapon.h

#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


Ecco i cpp:

Item.cpp

#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

#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;
}


Ora vi posto il main. Questo probabilmente è piendo di errori che io non vedo.... l' idea è di fare un main che chiami una funzione bool Start() che dovrebbe in futuro contenere il loop principale del gioco ma che adesso è solo di test.

main.cpp

#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();

}


E cosa che non so se è lecita ho messo la funzione start() in un file Start.cpp

Start.cpp

bool Start()
{
return true; //test
}


Quando compilo ottengo: "item.cpp(13) : error C3861: 'strcpy': identificatore non trovato". Su c++ reference ho visto che per usare questa funzione devo icludere string:


Dove lo includo, in che file?

Ci ho messo 1 ora a fare 'sto post :D 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!

cionci
18-12-2007, 10:12
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();

Broadband
18-12-2007, 10:23
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();

Caro Cionci grazie per avermi risposto.
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.


#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;
}



Comunque ora faccio come dici tu e mi creo la classe Game.

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 :D

cionci
18-12-2007, 10:31
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 :eek: :asd:

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) ;)

Broadband
18-12-2007, 10:41
ok mi studio le stringhe :D Tanto ormai char* l'ho capito.

Broadband
18-12-2007, 16:17
Sto facendo qualcosa di scemo con le stringhe per provare....


#include <string>
#include <iostream>


void main()
{
string str1("ciao");
cout<<str1;

}


Mi sapete dire perchè non compila?
error C2065: 'string': identificatore non dichiarato
Come se non avessi incluso string
Grazie :D

cionci
18-12-2007, 16:22
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.

Broadband
18-12-2007, 16:26
per bacco non pensavo servisse anche per string!
Grazie come al solito!

cionci
18-12-2007, 16:30
per bacco non pensavo servisse anche per string!
Grazie come al solito!
Serve per tutta la libreria standard.

Broadband
18-12-2007, 16:36
Hmmm perchè non compila anche se ho incluso tutto lo spazio dei nomi?

#include <string.h>
#include <iostream>
using namespace std;

void main()
{
string str1="ciao";
cout << str1;

}


---->main.cpp(8) : error C2679: '<<' binario: non è stato trovato alcun operatore che accetti un operando destro di tipo 'std::string'. È anche possibile che non vi siano conversioni accettabili.

Broadband
18-12-2007, 16:36
Scusatemi ho capito da solo :D

cionci
18-12-2007, 16:39
Già ;)