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
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?
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!
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
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ò?
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
#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??
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
Devi scrivere:
tavolo[0][0]==tavolo[0][1] && tavolo[0][1]==tavolo[0][2]
Gogeta ss4
28-05-2004, 22:34
ok grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.