Newsgroup: it.comp.lang.c++
Titolo: Struttura dentro una classe

Salve ho un problema e dovro' passare un paio di righe
--------- 1.h
class Level_data
{
  private:
    short level[20][15];      // array contenente i muri sparsi per il livello
  public:
    Level_data();
  public:
    short src_x;                  // posizione del muro nell'immagine sorgente$
    typedef struct _wall_data;    // struttura con i dati dei muri$
};
----------- 1.cpp
#include "level_data.h"
_wall_data
{
  short x, y;     // posizione su schermo
  short type;     // direzione (verticale | orizzontale)
} wall_data;
// riempimento di 
level[20][15] =
{
// ..
};
Level_data::Level_data()
{
  int id = 0;
  wall_data wall[300];
  for ( int i = 0; i <= 19; i++ )
  {
    for ( int j = 0; j <= 14; id++, j++ )
    {
      switch ( level[i][j] )
      {
        case 0;
          wall[id].x = j * 16;
          wall[id].y = i * 16;
          wall[id].type = 0;
          break;
       case 1:
          wall[id].x = j * 16;
          wall[id].y = i * 16;
          wall[id].type = 1;
          break;
        case 2:
          wall[id].x = j * 16;
          wall[id].y = i * 16;
          wall[id].type = 2;
          break;
      }
    }
  }
}
e fino a qui' dovrebbe essere tutto giusto
adesso ci sono altri due files che devono utilizzare quelli di
prima, e sono
------------------- al.h
#include "level_data.h"
class PacMan
{
  public:
    Level_data   *muri;
};
----------------- al.cpp
///////////// ............
    muri = new Level_data();
    muri->screen = monitor->screen;
    muri->LoadImg("image/level.bmp");
//////////// .............
// funzione che dovrebbe leggere i dati della struttura su 1.h
for ( int i = 0; i <= 299; i++ )
{
  switch ( muri->wall[i].type )
  {
    case 1:
      muri->ShowImg(4, 1, 16, 2, muri->wall[i].x, muri->wall[i].y, 16, 2);
      break;
    case 2:
      muri->ShowImg(4, 1, 16, 2, muri->wall[i].x, muri->wall[i].y, 16, 2);
      break;
  }
}
l'errore che ricevo da g++ e'
`class Level_data' has no member named `wall'
sapete spiegarmi dov'e' l'errore?
grazie

       break;
Nello statement 'switch ( muri->wall[i].type )' stai utilizzando un data
member chiamato 'wall' che non e' stato definito nella classe Level_data.
Un vettore con lo stesso nome lo hai inizializzato nel costruttore, ma tale
vettore ha lo scope del distruttore stesso.
Ciao
Fabio

 }
Il tuo errore è qua. Nel senso che istanzi all'interno del costruttore un
array di tipo wall_data chiamato wall. Lo scope di questo array è limitato
al solo costruttore, nel momento in cui esci dallo stesso wall viene
distrutto, in quanto creato e istanziato all'interno del costruttore.
ciao.

 distruttore stesso.
quindi la soluzione, piu' pulita, quale potrebbe essere?
creare una variabile globale subito dopo l'implementazione della
struttura?

 istanziato all'interno del costruttore.
la soluzione piu' pulita quale sarebbe?
creare una variabile globale wall subito dopo l'implementazione
della struttura?
tnx

 la soluzione piu' pulita quale sarebbe?
adesso, la soluzione più pulita non saprei, dovrei conoscere meglio il
progetto, però per risolvere il tuo problema attuale avresti dovuto
dichiarare il tuo muro come membro della classe:
--------- 1.h
metti qua la dichiarazione della struttura
_wall_data
{
  short x, y;     // posizione su schermo
  short type;     // direzione (verticale | orizzontale)
} wall_data;
// Perché non trasformi la struttura in una classe?
class Level_data
{
  private:
    short level[20][15];      // array contenente i muri sparsi per il
livello
    wall_data wall[300];     // oggetto di tipo _wall_data
  public:
    Level_data();
  public:
    short src_x;                  // posizione del muro nell'immagine
sorgente$
    typedef struct _wall_data;    // struttura con i dati dei muri$
};
----------- 1.cpp
#include "level_data.h"
 e, nel costruttore, lo modifichi togliendo l'istanza di wall
tra l'altro la variabile id rimane sempre a zero.
Level_data::Level_data()
{
  int id = 0;
  for ( int i = 0; i <= 19; i++ )
  {
    for ( int j = 0; j <= 14; id++, j++ )
    {
      switch ( level[i][j] )
      {
        case 0;
          this->wall[id].x = j * 16;
          this->wall[id].y = i * 16;
          this->wall[id].type = 0;
          break;
       case 1:
          this->wall[id].x = j * 16;
          this->wall[id].y = i * 16;
          this->wall[id].type = 1;
          break;
        case 2:
          this->wall[id].x = j * 16;
          this->wall[id].y = i * 16;
          this->wall[id].type = 2;
          break;
      }
    }
  }
}
in questo modo adesso, puoi scrivere:
 ----------------- al.cpp
///////////// ............
    muri = new Level_data();
    muri->screen = monitor->screen;
    muri->LoadImg("image/level.bmp");
//////////// .............
in quanto wall è un membro di Level_data.

     for ( int j = 0; j <= 14; id++, j++ ) {
grazie di tutto ((: