PDA

View Full Version : [C++]classe chiama classe


wizard_at
20-10-2008, 19:07
ciao a tutti,
non sapevo come chiamare il tread...spero che non sia completamente sbagliato.

Avevo per voi una domanda che mi blocca in uno stupido progetto:D

io ho:

file ALFA.h
#include "BETA.h"
#include "mioogg.h"

class beta;

class alfa{
public:
mioogg* a;

alfa(){
a = new mioogg();
b = new beta(this);
}
}

fiel BETA.h
#include "ALFA.h"
#include "mioogg.h"

class alfa;

class beta{
public:
mioogg* d;
beta(alfa* f){
d=f->a
}
}

corretto?

jappilas
20-10-2008, 19:52
mioogg.h viene incluso due volte, quel codice ti darà errore in compilazione - è meglio in questi casi usare le include guard (http://en.wikipedia.org/wiki/Include_guard) ;)

wizard_at
20-10-2008, 20:16
mioogg.h viene incluso due volte, quel codice ti darà errore in compilazione - è meglio in questi casi usare le include guard (http://en.wikipedia.org/wiki/Include_guard) ;)

non ho scritto tutto il codice...le include guard ci sono:)....

un secondo e posto il problema

wizard_at
20-10-2008, 20:24
file game.h

#ifndef _GAME_H_
#define _GAME_H_
#include <irrlicht.h>
#include "menu.h"

class menu;

using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace gui;
//non uccidetemi x qst cosa
const int MEN=0;
const int GIOC=1;

class Game
{
public:
//stato del gioco
int stato;
menu* M;

Game(){
device = createDevice(EDT_SOFTWARE,dimension2d<s32>(640,480), 32, false, false, false, 0);

stato = MEN;
};


void run(){
while(device->run()){
switch (stato) {
case MEN:
M = new menu(this);
stato=M->run();
delete M;
break;
}
}
device->drop();
};

IrrlichtDevice *device;
};

#endif


file menu.h
#ifndef __MENO_H_INCLUDED__
#define __MENO_H_INCLUDED__

#include <irrlicht.h>
#include "Game.h"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

class Game;

class menu
{
public:
menu(Game* gam){
gioco=gam;
device = gioco->device;
};


int run(){
return 0;
};
private:
IrrlichtDevice *device;
Game* gioco;
};

#endif

questo sono i miei file...
primo errore: forward declaration of 'struct Game'
secondo errore: invalid use of incomplete type 'struct Game'

spero di essere stato sufficientemente chiaro da poter essere soccorso

cionci
20-10-2008, 23:55
Intanto parti dividendo la dichiarazione delle classi dalle implementazioni.
Ricordati che la forward declaration serve solo in uno dei due file.

wizard_at
21-10-2008, 06:21
Intanto parti dividendo la dichiarazione delle classi dalle implementazioni.
Ricordati che la forward declaration serve solo in uno dei due file.

ok grazie...ci provo

DanieleC88
21-10-2008, 06:50
Perché rendi pubbliche variabili interne alle classi che ne descrivono lo stato? Generalmente è preferibile farle private ed accedervi tramite getter. ;)

wizard_at
21-10-2008, 14:09
Perché rendi pubbliche variabili interne alle classi che ne descrivono lo stato? Generalmente è preferibile farle private ed accedervi tramite getter. ;)

questo e' un abbozzo per fare partire il tutto...poi va rifinito


cosa sono i getter?

PS:funziona ma non ho capito come ho fatto....ho smanettato/smadonnato un po sul codice e sui settaggi del progetto e allla fine funziona!

cionci
21-10-2008, 17:33
cosa sono i getter?

PS:funziona ma non ho capito come ho fatto....ho smanettato/smadonnato un po sul codice e sui settaggi del progetto e allla fine funziona!
I getter e i setter sono semplici metodi per accedere rispettivamente in lettura e in scrittura alle variabili membro della classe. E' sempre meglio usarli in quanto sono più resistenti alle modifiche della rappresentazione interna dei dati (basta rinominare una variabile membro per dover rinominare ogni sua chiamata a giro per il codice). Inoltre permettono controlli sui valori impostati dagli utilizzatori della classe in modo da ottenere un utilizzo consistente della stessa.

class pippo
{
int pippo;
public:
pippo();
int getPippo();
void setPippo(int pippo);
};

getPippo e setPippo sono getter e setter per pippo.

Riguardo al codice, come ti dicevo, basta usare la forward declaration solo un volta e separare la dichiarazione dell'implementazione dalla classe:
ClassA.h
#ifndef CLASSA_H_INCLUDED
#define CLASSA_H_INCLUDED

class ClassB;

class ClassA
{
ClassB *pippo;
public:
ClassA(ClassB *pippo);
};

#endif // CLASSA_H_INCLUDED


ClassA.cpp
#include "ClassA.h"
#include "ClassB.h"

ClassA::ClassA(ClassB *pippo)
{
this->pippo = pippo;
pippo->setPluto(this);
}


ClassB.h
#ifndef CLASSB_H_INCLUDED
#define CLASSB_H_INCLUDED

#include "ClassA.h"

class ClassB
{
ClassA *pluto;
public:
ClassB();
void setPluto(ClassA *pluto);
};

#endif // CLASSB_H_INCLUDED

ClassB.cpp
#include "ClassB.h"
#include "ClassA.h"

ClassB::ClassB()
{
}

void ClassB::setPluto(ClassA *pluto)
{
this->pluto = pluto;
}


Come vedi la forward declaration viene fatta solo in un include. Questo perché l'include non contenendo l'implementazione di ClassA non richiede nemmeno l'implementazione di ClassB.

wizard_at
21-10-2008, 17:55
I getter e i setter sono semplici metodi per accedere rispettivamente in lettura e in scrittura alle variabili membro della classe. E' sempre meglio usarli in quanto sono più resistenti alle modifiche della rappresentazione interna dei dati (basta rinominare una variabile membro per dover rinominare ogni sua chiamata a giro per il codice). Inoltre permettono controlli sui valori impostati dagli utilizzatori della classe in modo da ottenere un utilizzo consistente della stessa.

grazie 1000....si imparano sempre cose nuove