PDA

Visualizza la versione completa : [C++] Oggetti: Inizializzare matrice nel costruttore


karlo1993a
05-02-2013, 20:26
ho la necessita di dichiarare una matrice all'interno del costruttore, praticamente io ho mia matrice [20][20] che ad inizio programma è sempre la stessa, avevo pensato di inizializzarla in questo modo all'interno del costruttore:

Campo è dichiarate nell'oggetto sotto private;


Campo[20][20] = {{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},//0
{M,D,D,D,D,D,D,D,D,D,M,D,D,D,D,D,D,D,D,M},//1
{M,D,M,M,M,D,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//2
{M,D,M,M,M,D,M,M,M,D,M,D,D,D,D,M,D,M,D,M},//3
{M,V,M,M,D,D,D,D,D,D,D,D,M,M,D,M,D,M,D,M},//4
{M,D,M,M,D,M,D,M,M,M,M,M,M,M,D,M,D,M,D,M},//5
{M,D,M,M,D,M,D,D,D,D,M,D,D,D,D,M,D,M,D,M},//6
{M,D,M,M,D,M,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//7
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,D,D,D,M},//8
{M,D,M,M,D,M,D,M,M,M,'#',M,M,D,M,D,M,M,D,M},//9
{M,D,D,D,D,D,D,M,F,F,F,F,M,D,D,D,M,M,D,M},//10
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,V,M},//11
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,D,M},//12
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,M,M,D,M},//13
{M,D,M,M,D,M,M,M,M,D,M,M,M,M,M,D,M,M,D,M},//14
{M,D,M,M,D,M,D,D,D,D,P,D,D,D,M,D,M,M,D,M},//15
{M,D,D,D,D,D,D,M,M,M,M,M,M,D,D,D,D,D,D,M},//16
{M,D,M,M,M,M,D,M,M,M,M,M,M,D,M,M,M,M,D,M},//17
{M,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,M},//18
{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M} //19
};


purtroppo facendo così mi fa errore, e la professoressa di laboratorio non la vediamo fino a lunedì 19 quindi non posso aspettare di chiedere a lei, è 2 giorni che sbatto la testa qua sopra senza risultato spero che qualcuno di voi possa darmi una mano.
grazie carlo :)

karlo1993a
05-02-2013, 20:58
se può essere utile ecco l'intero codice:

Mondo.h


#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;

class Mondo{
public:
Mondo();
/* void MuoviFantasmi(); //movimento fantasmi */
void MuoviPacman(); //movimento Pacman
/* void VitePacman(bool T);
void TotalePunti(); */
void StampaMondo();
/* void Morte(); */
private:
char M,P,F,V,D,Campo[20][20];
int vita,tm,x,y;


};
Mondo::Mondo()
{
M=219; //Muro, corrisponde ad un quadratino bianco
P=184; //Pacman, cerchio con C interna
F=2; //Fantasmi, faccina
V=3; //Vite, Cuore
D=4; //Monetina, Rombo
Campo[20][20] = {{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},//0
{M,D,D,D,D,D,D,D,D,D,M,D,D,D,D,D,D,D,D,M},//1
{M,D,M,M,M,D,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//2
{M,D,M,M,M,D,M,M,M,D,M,D,D,D,D,M,D,M,D,M},//3
{M,V,M,M,D,D,D,D,D,D,D,D,M,M,D,M,D,M,D,M},//4
{M,D,M,M,D,M,D,M,M,M,M,M,M,M,D,M,D,M,D,M},//5
{M,D,M,M,D,M,D,D,D,D,M,D,D,D,D,M,D,M,D,M},//6
{M,D,M,M,D,M,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//7
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,D,D,D,M},//8
{M,D,M,M,D,M,D,M,M,M,'#',M,M,D,M,D,M,M,D,M},//9
{M,D,D,D,D,D,D,M,F,F,F,F,M,D,D,D,M,M,D,M},//10
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,V,M},//11
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,D,M},//12
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,M,M,D,M},//13
{M,D,M,M,D,M,M,M,M,D,M,M,M,M,M,D,M,M,D,M},//14
{M,D,M,M,D,M,D,D,D,D,P,D,D,D,M,D,M,M,D,M},//15
{M,D,D,D,D,D,D,M,M,M,M,M,M,D,D,D,D,D,D,M},//16
{M,D,M,M,M,M,D,M,M,M,M,M,M,D,M,M,M,M,D,M},//17
{M,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,M},//18
{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M}}; //19
vita=3;
tm=171;
x=11;
y=15;
}
/* */
void Mondo::StampaMondo()
{
for(int i=0;i<20;i++)
{cout<<endl;
for(int j=0;j<20;j++)
cout<<Campo[i][j];
}
}
/*Movimento di Pacman, pacman si può muovere in 4 direzioni:
Sinistra=A;
Destra=D;
Alto=W;
Basso=S;
*/
void Mondo::MuoviPacman()
{char c;
bool T;
do{
c=_getch();
}while(c!='a' || c!='d' || c!='w' || c!='s' || c!='A' || c!='D' || c!='W' || c!='S');
switch(c){
case 'a':
case 'A':
if(Campo[x-1][y]!=9);
if(Campo[x-1][y]!=2)
{
x--;
Campo[x][y]=Campo[x+1][y];
Campo[x+1][y]=' ';
StampaMondo();
}
else
{Campo[x][y]=' ';
T=false;
/*VitePacman(T);
Morte(); */
}
break;
}
}




esattamente mi da questo errore :

28 F:\PACMAN\source code\Mondo.h expected primary-expression before '{' token
a questa riga:

Campo[20][20] = {{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},//0

ps. non fate caso hai pezzi di codice che ho messo come commenti, solo che devo ancora implementarle quelle funzioni ...

karlo1993a
06-02-2013, 21:04
una soluzione l'avrei trovata, ed è quella di inizializzare ogni singolo campo della matrice facendo:


Campo[0][0]=M;
Campo[0][1]=M;
.
.
.
Campo[1][1]=D;
Campo[1][2]=D;
.
.
.
Campo[20][20]=M;

sinceramente però questa soluzione non mi aggrada per niente, scrivere 400 righe cosi, non lo voglio proprio fare, non perchè non ne abbia voglia, ma perchè credo che ci siano soluzioni più veloci.

io penso che l'errore sia dovuto dal fatto che la matrice venga dichiarata nel private quindi
char campo[20][20];

ed quando io vado a scrivere

Campo[20][20] = {{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},//0
{M,D,D,D,D,D,D,D,D,D,M,D,D,D,D,D,D,D,D,M},//1
{M,D,M,M,M,D,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//2
{M,D,M,M,M,D,M,M,M,D,M,D,D,D,D,M,D,M,D,M},//3
{M,V,M,M,D,D,D,D,D,D,D,D,M,M,D,M,D,M,D,M},//4
{M,D,M,M,D,M,D,M,M,M,M,M,M,M,D,M,D,M,D,M},//5
{M,D,M,M,D,M,D,D,D,D,M,D,D,D,D,M,D,M,D,M},//6
{M,D,M,M,D,M,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//7
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,D,D,D,M},//8
{M,D,M,M,D,M,D,M,M,M,'#',M,M,D,M,D,M,M,D,M},//9
{M,D,D,D,D,D,D,M,F,F,F,F,M,D,D,D,M,M,D,M},//10
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,V,M},//11
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,D,M},//12
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,M,M,D,M},//13
{M,D,M,M,D,M,M,M,M,D,M,M,M,M,M,D,M,M,D,M},//14
{M,D,M,M,D,M,D,D,D,D,P,D,D,D,M,D,M,M,D,M},//15
{M,D,D,D,D,D,D,M,M,M,M,M,M,D,D,D,D,D,D,M},//16
{M,D,M,M,M,M,D,M,M,M,M,M,M,D,M,M,M,M,D,M},//17
{M,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,M},//18
{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M}}; //19
il linguaggio(giustamente) pensa che io stia andando a richiamare appunto la matrice negli indici 20,20.

ho pensato anche ad un'altra risoluzioni, definisco ed inizializzo all'interno del costruttore una matrice Campo2[20][20] dove al suo interno vado a inserire tutto il mio campo di gioco, poi con un ciclo vado a ricopiare tutta la mia Campo2 nel Campo cosi da avere la mia matrice come variabile della classe.

comunque se ci sono soluzioni più corrette e con meno dispendio di risorse, sarei felice di apprenderle.
grazie,carlo

MItaly
06-02-2013, 21:27
La sintassi con le graffe vale solo per l'inizializzazione di una matrice, non per l'assegnamento, e per inizializzare i campi nel costruttore devi usare la sintassi della "lista di inizializzazione"; dovresti fare una cosa del genere:



Mondo::Mondo()
: M(219), P(184), F(2), V(3), D(4), Campo(
{{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M},//0
{M,D,D,D,D,D,D,D,D,D,M,D,D,D,D,D,D,D,D,M},//1
{M,D,M,M,M,D,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//2
{M,D,M,M,M,D,M,M,M,D,M,D,D,D,D,M,D,M,D,M},//3
{M,V,M,M,D,D,D,D,D,D,D,D,M,M,D,M,D,M,D,M},//4
{M,D,M,M,D,M,D,M,M,M,M,M,M,M,D,M,D,M,D,M},//5
{M,D,M,M,D,M,D,D,D,D,M,D,D,D,D,M,D,M,D,M},//6
{M,D,M,M,D,M,M,M,M,D,M,D,M,M,M,M,D,M,D,M},//7
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,D,D,D,M},//8
{M,D,M,M,D,M,D,M,M,M,'#',M,M,D,M,D,M,M,D,M},//9
{M,D,D,D,D,D,D,M,F,F,F,F,M,D,D,D,M,M,D,M},//10
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,V,M},//11
{M,D,M,M,D,M,D,M,M,M,M,M,M,D,M,D,M,M,D,M},//12
{M,D,M,M,D,M,D,D,D,D,D,D,D,D,M,D,M,M,D,M},//13
{M,D,M,M,D,M,M,M,M,D,M,M,M,M,M,D,M,M,D,M},//14
{M,D,M,M,D,M,D,D,D,D,P,D,D,D,M,D,M,M,D,M},//15
{M,D,D,D,D,D,D,M,M,M,M,M,M,D,D,D,D,D,D,M},//16
{M,D,M,M,M,M,D,M,M,M,M,M,M,D,M,M,M,M,D,M},//17
{M,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,M},//18
{M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M,M}}//19
)
{ }

In alternativa, crea un array locale alla funzione (inizializzandolo in quella maniera) e copialo nell'array membro.

karlo1993a
06-02-2013, 21:40
un'illuminazione scesa dal cielo forse mi ha dato la risposta, ho deciso di non gestire l'intero gioco come un oggetto, ma solo ogni "casella" credo che questa modo di vedere il gioco ora sia molto più corretto del precedente.
ora la mia classe contiene oltre le variabili M,P,F,C,D,G,V; una variabile di stato che va ad indicare in quale stato sia la casella (gli stati sono le variabili precedentemente proposte).
poi nel main ho dichiarato una matrice di tipo casella(la mia classe), cosi facendo il problema si sfoltisce e credo che l'uso delle classi sia più opportuno.

grazie comunque, carlo

ps MItaly, davvero? la nostra professoressa ci ha detto che si inizializzano così, comunque provo a inizializzarle come mi hai detto te voglio vedere cosa cambia.
grazie :)

MItaly
06-02-2013, 22:04
Originariamente inviato da karlo1993a
ps MItaly, davvero? la nostra professoressa ci ha detto che si inizializzano così, comunque provo a inizializzarle come mi hai detto te voglio vedere cosa cambia.

Quello che tu fai nel corpo del costruttore non è un'inizializzazione, è un assegnamento, sono due cose ben diverse (la differenza si nota chiaramente se hai come membri degli oggetti).

karlo1993a
07-02-2013, 16:32
ah e in pratica che differenza c'è tra una assegnazione e un assegnamento?

oregon
07-02-2013, 16:40
Originariamente inviato da karlo1993a
ah e in pratica che differenza c'è tra una assegnazione e un assegnamento?

Rileggi meglio ... inizializzazione e assegnamento ...

karlo1993a
07-02-2013, 19:14
eh si perdon, intendevo tra un assegnazione e un inizializzazione

oregon
07-02-2013, 19:19
int a=5;

e

int a;
...
a=5;

Loading