2010-10-31 41 views
2

J'ai regardé partout, mais je n'ai pas trouvé de réponse à cela.Basic C++: comment initialiser un membre struct d'une classe?

J'ai une classe C++ avec ces membres protégés:

struct tm _creationDate; 
struct tm _expirationDate; 
struct tm _lockDate; 

Je veux les initialiser au moment de l'instanciation. Si je mets cela dans le constructeur:

_creationDate = {0}; 
_expirationDate = {0}; 
_lockDate = {0}; 

le compilateur se plaint: « attendu l'expression primaire avant « { » jeton »

Je ne peux pas trouver un moyen de le faire dans un membre-initialiseur liste en haut du constructeur. Comment est-que quelqu'un peut faire ça? Merci!

SUIVI: Merci pour les réponses, les gars. Vous ne pouvez pas le faire à la déclaration; ce n'est pas autorisé. Donc, la seule façon semble être memset ou de définir les membres individuellement. J'ai fini par écrire une fonction utilitaire pour le faire.

Répondre

2

Vous pouvez les faire à telle déclaration

_creationDate = {0}; // set everything to 0's 

ou comme celui-ci

_creationDate = { StructElement1, StructElement2, ..., StructElement n); 

tels que

_creationDate = { 0, false, 44.2); 

Ou dans votre constructeur il suffit d'appeler à chaque élément de la structure et initialize tels que ...

_creationData.thing1 = 0; 
_creationData.thing2 = false; 
_creationData.thing3 = 66.3; 
+2

Merci. Seule la dernière option fonctionne dans un objet C++; les initialiseurs avec des accolades ne sont pas autorisés pour les membres. – Oscar

1

Je pense que vous ne pouvez initialiser structure telle que lorsque vous définissez:

struct tm a = {0}; // works ok 
struct tm b; 
b = {0};   // error 

une option est soit d'utiliser des valeurs "par défaut"

class a 
{ 
    a() : t() {} 
    struct tm t; 
}; 

Ou memset dans le constructeur:

struct tm creationDate; 
memset((void*)&creationDate, 0, sizeof(struct tm)); 
0

seule voie possible en C++ 03:

class foo 
{ 
    tm _creationDate; 
    public: 
    foo() 
    { 
     tm tmp_tm = {0}; 
     _creationDate = tmp_tm; 
    } 
}; 

Notez que ce initialise _creationDate une copie de tmp_tm, invoquant ainsi le (très probablement autogénérés) constructeur de copie. Donc, pour de grandes structures, vous devriez plutôt coller avec votre fonction d'utilité, puisque cela n'exigera pas de copier la structure entière. Et btw, le nom commençant par underscores ne doit pas être utilisé, car ils sont réservés à l'implémentation de la bibliothèque standard (pour un usage interne), ce qui peut entraîner des conflits de noms ou d'autres comportements indésirables.