Non capisco perché il C++ permetta solo i tipi integrali e l'enum (anche enum è un tipo integrale) da definire all'interno di una dichiarazione di classe. Mentre tutti gli altri tipi, compresi i tipi a virgola mobile (vale a dire doppio e float), devono essere definiti al di fuori della dichiarazione della classe. Chiaramente, deve essere una ragione per questo, ma non riesco a capirlo.Perché solo il tipo integrale o enum può essere inizializzato in una classe C++?
Codice esempio:
#include <iostream>
using namespace std;
struct Node {
static const int c = 0; // Legal Definition
static const long l = 0l; // Legal Definition
static const short s = 0; // Legal Definition
static const float f = 0.0f; // Illegal definition
static const string S = "Test"; // Illegal definition
static const string JOB_TYPE; // Legal declaration
static const float f; // Legal declaration
static const double d; // Legal declaration
};
const string Node::JOB_TYPE = "Test"; // correct definition
const float Node::f = 0.0f; // correct definition
const double Node::d = 0.0; // correct definition
int main() {
cout << Node::c << endl;
cout << Node::c << endl;
cout << Node::JOB_TYPE << endl;
cout << Node::f << endl;
}
Avrai solo problemi se metti la struttura 'Node' in un'intestazione e la includi in 2 file. –
Questa è una domanda molto buona - Ho fatto squarciare le mie cellule cerebrali questa domenica. Grazie –
Le regole peculiari per virgola mobile sono solitamente dovute alle preoccupazioni relative ai compilatori incrociati, ovvero ai compilatori che vengono eseguiti su un sistema ma che generano un codice per un altro. È abbastanza facile gestire tipi interi che corrispondono al sistema di destinazione; ottenere i dettagli dei tipi a virgola mobile di un altro sistema è molto più complicato. –