PDA

View Full Version : static in C++


Oberon80
30-12-2005, 10:18
Salve,

il mio problema è il seguente:

Devo dichiarare una variabile static in una classe che estende una classe virtuale ed ovviamente devo associare un metodo (anch'esso static) per modificare la suddetta classe.

nella classe virtuale dichiaro:

virtual void set_optimization_level(int l)=0;

nella sottoclasse dichiaro:

void set_optimization_level(int l); // con la stessa visibilità

static void set_opt_level( int l );
e
static int optimization_level;

ecco le implementazioni:

void NomeSottoclasse::set_optimization_level(int l){
set_opt_level(l);
}

void NomeSottoclasse::set_opt_level(int l){
optimization_level=l;
}

il risultato della compilazione è il seguente errore:
myfile.o(.text+0x275): In function `NomeSottoclasse::set_opt_level(int)':
myfile.cc: undefined reference to `NomeSottoclasse::optimization_level'
collect2: ld returned 1 exit status
make: *** [MyProject] Error 1

Da cosa può dipendere???

Ho letto il manuale di C++ e mi sembra sia corretto.

ilsensine
30-12-2005, 10:33
Credo sia necessaria una implementazione, oltre la dichiarazione. Ad es. esternamente alla dichiarazione della classe, scrivi:
int NomeSottoClasse::optimization_level;
(puoi anche dare una inizializzazione di default se vuoi)

Oberon80
30-12-2005, 10:48
Credo sia necessaria una implementazione, oltre la dichiarazione. Ad es. esternamente alla dichiarazione della classe, scrivi:
int NomeSottoClasse::optimization_level;
(puoi anche dare una inizializzazione di default se vuoi)

OK,

subito dopo la definizione della mia sottoclasse ho aggiunto:

int NomeSottoclasse::optimization_level;

il problema ora è che per ogni file che include l'header dove è definita la mia sottoclasse il compilatore mi da:

NomeFileCheInclude.o(.bss+0x0): multiple definition of `NomeSottoclasse::optimization_level'
/tmp/cc9Rwzno.o(.bss+0x0): first defined here

Dove sbaglio?

ilsensine
30-12-2005, 10:59
Metti l'implementazione in un unico file .cc.
In alternativa, puoi implementare la variabile nell'header così:

int __attribute__((__section__(".gnu.linkonce"))) NomeSottoClasse::optimization_level = 0;

ma non è una soluzione portabile, quindi non te la consiglio.

Oberon80
30-12-2005, 11:29
Credo di aver risolto.

Gentilissimo