Newsgroup: it.comp.lang.c++
Titolo: Inizializzazione elementi static

Ciao a tutti,
il mio problema è il seguente. Ho definito una struttura gerarchica di
classi in cui nella classe di base (superclasse) sono presenti due
static int. Questi valori vengono richiamati più volte nei vari metodi
propri e delle classi derivate, e il compilatore non segnala errori.
Tuttavia il linker mi dice i due static sono indefiniti, in tutte le
operazioni che li riguadano. Perchè?!?
(per la cronaca sto usando CodeWarrior su Mac)
Grazie a chi mi sapra illuminare,
Mattia
-- 
  ----------------
tes...@inwind.it
ICQ# 31984974
----------------

Ciao,
avresti fatto meglio a includere il tuo header file; comunque sospetto
che tu abbia una situazione del genere:
// file.h
class A {
  static int i;
};
// file.cpp - vuoto
Se e' cosi' hai solo dichiarato il tuo membro statico, ma non l'hai
definito. Per farlo devi includere in uno ed un solo file .cpp
un'istruzione tipo
int A::i;
Volendo puoi anche inizializzarlo.
Ciao,
Nicola

 wrote:

Provvedo subito a fornire l'header:
class Coda {
  public:
        static int dimHeap;
        static int dimArray;
 
        struct Cella {
                int chiave;
                int pun;
        }* heap;
        void Insert (int);
        int Extract ();
        void Heapify (int);
        void Scambia (int, int);
        virtual int Test (int, int) = 0;
        virtual int TestChiavi (int, int) = 0;
        Coda (int);
        ~Coda ();
};
class CodaMax: public Coda {
  public:
        int Test (int, int);
        int TestChiavi (int, int);
        CodaMax (int);
};
class CodaMin: public Coda {
  public:
        int Test (int, int);
        int TestChiavi (int, int);
        CodaMin (int);
};
class MinMaxQueue {
  public:
        CodaMax MaxQueue;
        CodaMin MinQueue;
 
        void Insert (int);
        int HeapSize ();
        int ArraySize ();
        int ExtractMax ();
        int ExtractMin ();
        MinMaxQueue (int);
};
Perchè non posso inizializzare l'header nel costruttore di Coda??
Ciao e grazie,


 Perchè non posso inizializzare l'header nel costruttore di Coda??
Chiedo venia per la domanda inutile, non avevo letto bene la tua
risposta. In effetti è necessario dichiarare gli static int diciamo
all'esterno della classe. Puoi spiegarmi perchè devono essere utilizzati
così?
Voglio dire: se in pratica funzionano come variabile globale, qual'è il
vantaggio di includerli in una classe? La visibilità nei metodi della
classe?
E se io li dichiaravo come private?
Ciao e grazie per l'attenzione,


 E se io li dichiaravo come private?
In effetti i membri dati static sono delle variabili globali "a
visibilita' limitata" ed il loro vantaggio sta proprio in questa
limitata visibilita'. Di solito vengono utilizzati per codificare
funzionalita' trasversali agli oggetti di una classe (ad es. potresti
voler tenere il conto di quanti oggetti di una classe sono stati
creati).
Direi che e' buona norma dichiararli sempre private, in modo da
riservarci la possibilita' di modificare l'implementazione della classe
in seguito e di controllare chi, quando e in che modo puo' modificarne
il valore.
Ciao,
Nicola

 operazioni che li riguadano. Perchè?!?
Perché devi appunto definirli (una sola volta) da qualche parte. Poniamo
che la classe si chiami A e l'intero i, in uno solo dei sorgenti dovrai
scrivere, fuori da ogni funzione:
int A::i;
EMG

 E se io li dichiaravo come private?
Allora sarebbero stati visibili *solo* ai metodi della classe.
EMG