PDA

Visualizza la versione completa : [C++] problema con visibilità oggetti


Infernal
09-04-2008, 18:53
Sto facendo un programma che risolve i sudoku... per farlo mi sono scritto un po' di classi:

class casella : sudoku
{
public:
casella();
bool possible(int);
int SetValue(int);
int GetValue();
void SetFalse(int);
private:
bool num[10];
int val;
};

class riga : sudoku
{
public:
void controllo1();
void controllo2();
void update();
int rig;
};

class colonna : sudoku
{
public:
void controllo1();
void controllo2();
void update();
int col;
};

class quadrato : sudoku
{
public:
void controllo1();
void controllo2();
void update();
int quad;
};

class sudoku
{
public:
sudoku();
void SolveSudoku();
casella cas[81];
private:
void controllo1();
void controllo2();
void update();
riga rig[9];
colonna col[9];
quadrato quad[9];
};

Io cercho di avere accesso ad alcuni metodi di casella dalle funzioni controllo1 e update di riga colonna e quadrato. Compilando mi dice:

sudoku.h:17: error: expected class-name before ‘{’ token
sudoku.h:30: error: expected class-name before ‘{’ token
sudoku.h:39: error: expected class-name before ‘{’ token
sudoku.h:48: error: expected class-name before ‘{’ token
sudoku.h: In member function ‘void riga::update()’:
sudoku.h:129: error: ‘cas’ was not declared in this scope
sudoku.h: In member function ‘void colonna::update()’:
sudoku.h:144: error: ‘cas’ was not declared in this scope
sudoku.h: In member function ‘void quadrato::update()’:
sudoku.h:159: error: ‘cas’ was not declared in this scope
sudoku.h: In member function ‘void riga::controllo1()’:
sudoku.h:174: error: ‘cas’ was not declared in this scope
sudoku.h: In member function ‘void colonna::controllo1()’:
sudoku.h:195: error: ‘cas’ was not declared in this scope
sudoku.h: In member function ‘void quadrato::controllo1()’:
sudoku.h:216: error: ‘cas’ was not declared in this scope

non capisco perchè da quadrato\riga\colonna non posso accedere a cas..... se qualcuno mi può aiutare lo ringrazio.....

MItaly
09-04-2008, 19:07
Quando erediti da una classe devi far precedere il suo nome dal qualificatore di accesso (normalmente public).


class casella : public sudoku
//eccetera

Infernal
09-04-2008, 19:27
io avevo letto che il qualificatore non era necessario.... cmq ho provato mettendo public.... ma mi da gli stessi identici errori....

MacApp
09-04-2008, 19:27
Originariamente inviato da MItaly
Quando erediti da una classe devi far precedere il suo nome dal qualificatore di accesso (normalmente public).


class casella : public sudoku
//eccetera

falso, non è obbligatorio, ma ok è buona norma mettere "public".

L'errore vero è:


class sudoku
{
public:
sudoku();
void SolveSudoku();
casella cas[81];


in cui casella è una classe derivata da sudoku di cui chiaramente il compilatore non ne conosce ancora l'esistenza.

Per superare l'impasse potresti fare una roba del genere:



class casella; // forward declaration
class sudoku
{
public:
sudoku();
void SolveSudoku();
casella * cas[81]; // Array of pointers of casella

Infernal
09-04-2008, 19:35
Facendo così mi si moltiplicano gli errori.... ho provato a dichiarare la classe sudoku sotto tutte le altre, ma mi da errore comunque...

mondobimbi
09-04-2008, 19:39
oppure


class sudoku
{
public:
sudoku();
void SolveSudoku();
class casella * cas[81]; // Array of pointers of casella
....


ciao

Infernal
09-04-2008, 19:43
stessa cosa... come se non avessi modificato nulla...

Ps: ho editato il primo post mettendo la classe sudoku in fondo.... (come nel mio codice, ho visto che da meno errori)

MacApp
09-04-2008, 19:48
Originariamente inviato da Infernal
Facendo così mi si moltiplicano gli errori.... ho provato a dichiarare la classe sudoku sotto tutte le altre, ma mi da errore comunque...
Non ti ho consigliato quello che tu hai fatto.
T'ho consigliato di premettere alla class sudoku la seguente:


class casella;

in cui praticamente si informa il compilatore che la classe casella è dichiarata altrove e trasformare il membro "casella cas[81]" in "casella * cas[81]"

;-)

MacApp
09-04-2008, 19:52
Originariamente inviato da Infernal
ho editato il primo post mettendo la classe sudoku in fondo.... (come nel mio codice, ho visto che da meno errori)
ahi ahi.. cambi le carte in tavola? E' buona norma editare solo per correggere errori d'ortografia, NON per modificare il codice postato. Ora eventuali altri lettori, non capiranno i giusti consigli che io e mondobimbi t'abbiamo dato, e che tu hai mal'interpretato (bastava fare un copia incolla del codice che io o mondobimbi t'abbiamo postato..).
;-)

Infernal
09-04-2008, 19:57
io ho fatto ciò che tu e mondobimbi avete detto.... ma mi ha dato una pagina di errori..... (ho riprovato adesso e fa la stessa cosa)

Loading