PDA

Visualizza la versione completa : [C++] Modificatore Static


FedeZzZ
04-07-2007, 13:54
Ciao a tutti. Scusate la questione niubba ma il c++ lo sto studiando adesso. Ecco io avrei questo codice:



#include <iostream>

using namespace std;

class CProva {
private:
static float n;
public:
CProva() {
SetN(3.14);
}
static void SetN(const float &num) {
n = num;
}
static float GetN() {
return n;
}
static void ShowAbout() {
cout << "#CProva v1.0" << endl;
}
};

int main() {
int a;
CProva::ShowAbout();
cout << "Pigreco: " << CProva::GetN() << endl;
cin >> a;
return 0;
}


Naturalmente l'ho fatto solo per provare ad usare il modificatore static. Il problema Ŕ che compilando il listato con il devcpp mi esce fuori l'errore seguente: [Linker error] undefined reference to `CProva::n' .

Da quello che ho capito gli attributi static posso essere modificati solo da funzioni membro static, poi anche che se una funzione membro Ŕ dichiarata static Ŕ possibile usarla anche non instanziando nessun oggetto della classe stessa, attraverso il risolutore di scope ::, no?

Allora dove sbaglio? Sapete illuminarmi ? :D

grazie anticipatamente

metal_prog
04-07-2007, 14:22
Con il comando static si dice al compilatore di dichiarare una variabile la prima volta he Ŕ eseguita. Quindi il linker non trova la variabile perchÚ non Ŕ dichiarata!

Aggiungi prima di main CProva::n; :)

FedeZzZ
04-07-2007, 15:05
Non funziona. Ho fatto come dici tu, ho messo
CProva::n; tra la fine della definizione della classe e la funziona main().

Altri suggerimenti?

metal_prog
04-07-2007, 15:23
float CProva::n; :zizi:

FedeZzZ
04-07-2007, 15:40
lol si giusto, ora funziona. grazie, anche se non ho capito molto xkŔ. Il fatto Ŕ che mi sono riferito a questo: http://www.wmlscript.it/cpp/page9b.php e li si limita a fare come avevo fatto inizialmente io, x˛ a me non funziona >_> . Voi che ne dite Ŕ sbagliato nella guida?

FedeZzZ
04-07-2007, 16:00
Sul libro guida al c++ di herbert shildt ho trovato scritto questo nel paragrafo che parla di static:

"Quando si dichiarano i dati membri static all'interno di una classe, non si definiscono tali dati. Questo significa che non si sta allcoando spazio di memoria per tali dati (in C++, una dichiarazione descrive qualcosa e una definizione crea qualcosa), Si dovrÓ pertanto fornire una definizione globale per i dati membri static in un'altro punto, all'esterno della classe......."

in pratica con static all'interno delle classi non si alloca memoria, poi dp l'esempio c'Ŕ un'altro paragrafo che spiega:

"Per comoditÓ, le prime versioni di C++ non richiedevano la seconda dichiarazione di una variabile membro static. Tuttavia questa comoditÓ dava origine a gravi incongruenze e fu eliminata molti anni fa."

Probabilmente quella guide segue un c++ superato...

non vorrei imbattermi ancora in qualcosa del genere lol.

metal_prog
04-07-2007, 16:25
Ho letto la guida e in un passo in mezzo al testo dice "L'inizializzazione di un attributo static va eseguita successivamente alla sua dichiarazione ed al di fuori della dichiarazione di classe". Ma a parer mio Ŕ una guida troppo contorta.
Spero che impari presto il C++. Ciao! :ciauz:

Loading