PDA

View Full Version : [C++]Distruttori


Gogeta ss4
26-05-2004, 19:43
Ciao raga, sto studiando i distruttori e non ho capito bene come usarli
I miei punti interrogativi sono:
1)Come li utilizzo??
2)Sono fondamentali??
3)Devo richiamarli in qualche modo??

Grazie in anticipo

Luc@s
26-05-2004, 19:58
1)Come li utilizzo??
class Prova
{
public:
Prova(); // costruttore
~Provs(); // distruttore
}
2)Sono fondamentali??
si se usi variabili dinamiche.
3)Devo richiamarli in qualche modo??
no

Gogeta ss4
26-05-2004, 21:05
ok grazie.
Ma se non specifico il distruttore il compilatore le crea in auto?

cionci
27-05-2004, 01:02
Sì...ma non dealloca la memoria allocata dinamicamente dalla classe ;)

leomagic
27-05-2004, 14:22
eh no,il distruttore viene richiamato solo quando l'oggetto perde la sua visibilità ma non vengono cancellate tutti i suoi successivi accomenti,ma solo i suoi attributi e metodi!

Gogeta ss4
27-05-2004, 15:11
Raga ho finito la prima parte sulle classi e adesso il libro propone un esercizio:
Definire una classe tris che permette di giocare a tris

io per il momento volevo metterla così:

[CODE]

class tris
{
public: tris();
void vincita();
void scambio();
private: tavolo[3][3];
};

Ovviamente aggiugero i parametri da passare e magari qualche altra funzione
L'unica cosa che mi lascia un ? e la matrice, posso scrivere in quel modo oppure darà errore?

leomagic
27-05-2004, 15:38
X farti capire.
Alloco dinamicamente in una funzione la variabile intera A.
Quanto la funzione si richiama la variabile a viene allocata,alla chiusura della funzione lo spazio allocato per la variabile A viene reso libero e riutilizzabile.
spero di aver reso l'idea!

cionci
27-05-2004, 15:42
Gli devi dare un tipo a quella matrice...

Gogeta ss4
27-05-2004, 15:51
a cavolo vero :D

Gogeta ss4
27-05-2004, 22:46
tris::tris()
{
//inizializza la matrice di trattini//
tris::tavolo[3][3]={{'-','-','-'},{'-','-','-'},{'-','-','-'}};
}


E' il costruttore della classe tris.
Quando compilo mi dice che c'è un errore ti sintassi '{'

Non riesco a trovarlo

Gogeta ss4
28-05-2004, 15:07
uppette :D

cionci
28-05-2004, 15:15
Non devi specificare tris:: davanti...ed inoltre il vettore non è inizializzabile in questo modo...ma devi farlo tramite 2 for...

Gogeta ss4
28-05-2004, 15:49
Ho fatto un programma e l'ho inizializzato in questo modo e funziona...
Come mai adesso non si può?

cionci
28-05-2004, 16:00
Perchè quella non è una inizializzazione ;)

Gogeta ss4
28-05-2004, 17:19
Non e che mi potresti aiutare?
Ho qualche problemino
Ti posto la definizione della classe e la definizione dei membri della classe



#ifndef TRIS_H
#define TRIS_H
class tris
{
public: tris();
int vincita();
void scambio_gio1(int,int);
void printTavolo();
void scambio_gio2(int,int);
int controllo(int,int);
private: char tavolo[3][3];
};

#endif





Definizioni funzione membri

#include <iostream.h>
#include "classi.h"
#include <string.h>
#include <iomanip.h>

tris::tris()
{
//inizializza la matrice di trattini
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
tavolo[i][j] = '-';
}
for(i=0;i<3;i++)
{
cout << endl;
for(j=0;j<3;j++)
cout << tavolo[i][j];
}
cout << endl << endl;
}

int vincita()
{
//Controlla tutti casi possibili di vincita//
if(tavolo[0][0]==tavolo[0][1]==tavolo[0][2])
return 1;
if(tavolo[1][0]==tavolo[1][1]==tavolo[1][2])
return 1;
if(tavolo[2][0]==tavolo[2][1]==tavolo[2][2])
return 1;
if(tavolo[0][0]==tavolo[1][0]==tavolo[2][0])
return 1;
if(tavolo[0][1]==tavolo[1][1]==tavolo[2][1])
return 1;
if(tavolo[0][2]==tavolo[1][2]==tavolo[2][2])
return 1;
if(tavolo[0][0]==tavolo[1][1]==tavolo[2][2])
return 1;
if(tavolo[0][2]==tavolo[1][1]==tavolo[2][0])
return 1;
}

void printTavolo()
{
int i,j;
cout <<setw(35) <<"0" <<setw(4) <<"1" <<setw(4) <<"2";
cout <<"\n" <<"\n";
for(i=0;i<3;i++)
{
cout <<setw(32) <<i <<' ' <<' ';
for(j=0;j<3;j++)
cout <<tavolo[i][j] <<setw(4);


cout<<endl;
}
}

void scambio_gio1(int i,int j)
{
strcpy(tavolo[i][j],"x");
}

void scambio_gio2(int i,int j)
{
strcpy(tavolo[i][j], "o");
}

int controllo(int i,int j)
{
int c;
if(c=strcmp(tavolo[i][j], 'x')==0 || c=strcmp(tavolo[i][j], 'o')==0)
return 1;
else
return 0;
}



Allora io ho letto dal libro che quando invoco una funzione membro automaticamente usa i membri della classe
Adesso nella funzione vincita mi da questi errori:

1)error C2065: 'tavolo' : undeclared identifier
2)Subscript requires array or pointer type( me lo ripete una ventina di volte.

Dove sbaglio??

Gogeta ss4
28-05-2004, 17:25
Ho risolto!
Avevo dimenticato i risolutori di scope
Adesso mi da errori nella strcoy e nella strcmp
Non so se le ho usate correttamente
Mi da questi erori:

error C2664: 'strcpy' : cannot convert parameter 1 from 'char' to 'char *'
error C2664: 'strcmp' : cannot convert parameter 1 from 'char' to 'const char *'

Sinceramente non ho mai usato in una strmcp e in una strcpy un vettore o matrice

cionci
28-05-2004, 17:28
#ifndef TRIS_H
#define TRIS_H
class tris
{
public:
tris();
int vincita();
void scambio_gio1(int,int);
void printTavolo();
void scambio_gio2(int,int);
int controllo(int,int);
private:
char tavolo[3][3];
};

#endif





Definizioni funzione membri

#include <iostream.h>
#include "classi.h"
#include <string.h>
#include <iomanip.h>

tris::tris()
{
//inizializza la matrice di trattini
int i,j;
for(i=0;i<3;i++)
{
cout << endl;
for(j=0;j<3;j++)
{
tavolo[i][j] = '-';
cout << tavolo[i][j];
}
}
cout << endl << endl;
}

int tris::vincita()
{

....
....
....

void tris::scambio_gio1(int i,int j)
{
tavolo[i][j] = 'x';
}

void tris::scambio_gio2(int i,int j)
{
tavolo[i][j] = 'o';
}

int tris::controllo(int i,int j)
{
if(tavolo[i][j] == 'x' || tavolo[i][j] == 'o')
return 1;
else
return 0;
}

Gogeta ss4
28-05-2004, 17:34
Se ho capito bene, noon hai usato strcpy e strcmp perchè devo controllare un solo carattere e non una stringa intera giusto??

cionci
28-05-2004, 17:53
Sì...giusto...

Gogeta ss4
28-05-2004, 18:12
ok grazie mille:D

Gogeta ss4
28-05-2004, 22:18
Non riesco a capire una cosa
Ho completato il programma però non riesco a capire perchè quando vinco non me lo segnala

Ecco il main



#include <iostream.h>
#include "classi.h"
#include <iomanip.h>
#include <stdlib.h>

int main()
{
char giocatore1[10],giocatore2[10];
int i,j,control,control1,win,scelta;
tris tr; //Definisco oggeto tr alla classe tris
cout <<"\n" <<setw(45) <<"GIOCO DEL TRIS" <<endl;
cout <<"\nInserisci il nome del giocatore 1: ";
cin >>giocatore1;
cout <<"\nInserisci il nome del giocatore 2: ";
cin >>giocatore2;
system("cls");
cout <<"\n" <<setw(45) <<"GIOCO DEL TRIS";
tr.printTavolo();
do
{
cout <<"\n" <<giocatore1 <<' ' <<"tocca a te!";
cout <<"\nInserisci le coordinate dove vuoi inserire la X: ";
cin >>i >>j;
control=tr.controllo(i,j);
while(control==1)
{
cout <<"\nNon puoi mettere la X in quella zona, e' già occupata";
cout <<"\n" <<giocatore1 <<' ' <<"tocca a te!";
cout <<"\nInserisci le coordinate dove vuoi inserire la X: ";
cin >>i >>j;
control=tr.controllo(i,j);
}
//Controllo se ha vinto
win=tr.vincita();
if(win==0) //Giocatore 1 non ha vinto
{
tr.scambio_gio1(i,j);
//Dopo lo scambio rivisualizzo il tavolo di gioco
system("cls");
tr.printTavolo();
//Ricontrollo se ha vinto giocatore 1
win=tr.vincita();
if(win==0) //Non ha vinto
{
cout <<"\n" <<giocatore2 <<' ' <<"tocca a te!";
cout <<"\nInserisci le coordinate dove vuoi inserire la O: ";
cin >>i >>j;
control1=tr.controllo(i,j);
while(control1==1)
{
cout <<"\nNon puoi mettere la O in quella zona, e' già occupata";
cout <<"\n" <<giocatore2 <<' ' <<"tocca a te!";
cout <<"\nInserisci le coordinate dove vuoi inserire la O: ";
cin >>i >>j;
control1=tr.controllo(i,j);
}
//Controllo se ha vinto
win=tr.vincita();
if(win==0) //Giocatore 2 non ha vinto
{
tr.scambio_gio2(i,j);
//Dopo lo scambio rivisualizzo il tavolo di gioco
system("cls");
tr.printTavolo();
//Ricontrollo se ha vinto
win=tr.vincita();
if(win==1) //Giocatore 2 non ha vinto
{
cout <<giocatore2 <<' ' <<"ha vinto!";
cout <<"Vuoi rigiocare?: ";
cin >>scelta;
}
else;
}
else
{
cout <<giocatore2 <<' ' <<"ha vinto!";
cout <<"Vuoi rigiocare?: ";
cin >>scelta;
}
}
else
{
cout <<giocatore1 <<' ' <<"ha vinto!";
cout <<"Vuoi rigiocare?: ";
cin >>scelta;
}
}
else
{
cout <<giocatore1 <<' ' <<"ha vinto!";
cout <<"Vuoi rigiocare?: ";
cin >>scelta;
}
} while((scelta=='s' || scelta=='S') || (win==0));
cout <<"Premi un tasto per uscire dal gioco";
cin.get();
cout <<endl;
return 0;
}


Ecco la funzione membro che controlla i casi possibili di vincita


int tris::vincita()
{
//Controlla tutti casi possibili di vincita//
if(tavolo[0][0]==tavolo[0][1]==tavolo[0][2])
return 1;
if(tavolo[1][0]==tavolo[1][1]==tavolo[1][2])
return 1;
if(tavolo[2][0]==tavolo[2][1]==tavolo[2][2])
return 1;
if(tavolo[0][0]==tavolo[1][0]==tavolo[2][0])
return 1;
if(tavolo[0][1]==tavolo[1][1]==tavolo[2][1])
return 1;
if(tavolo[0][2]==tavolo[1][2]==tavolo[2][2])
return 1;
if(tavolo[0][0]==tavolo[1][1]==tavolo[2][2])
return 1;
if(tavolo[0][2]==tavolo[1][1]==tavolo[2][0])
return 1;
return 0;
}


Dove sbaglio?
Ho fatto il debug e quando guarda la vincita mi salta sempre tutte le if! anche se una è rispettata

cionci
28-05-2004, 22:30
Devi scrivere:

tavolo[0][0]==tavolo[0][1] && tavolo[0][1]==tavolo[0][2]

Gogeta ss4
28-05-2004, 22:34
ok grazie