2016-11-22 4 views
1

Tout d'abord, désolé pour la question Noob, car je viens de commencer à programmer en C++.C++ Constructeur de copie pour la structure contenant l'énumération

J'ai une structure définie dans un fichier d'en-tête:

typedef struct DataStruct 
{ 
    double foo; 
    double foo1; 

    DataStruct::DataStruct() 
     : foo(0.0), foo1(0.0) 
    { 
    } 

} DataStruct; 

, j'ai une fonction dans un autre fichier qui retourne l'objet de cette structure après le peuplant avec des valeurs:

DataStruct SomeFile::SomeFunction(Foo foo) 
{ 
    DataStruct dataStruct; 

    double foo2 = 5.8; 
    DataStruct.foo = foo2; 

    double foo3 = 6.0; 
    DataStruct.foo1 = foo3; 

    return DataStruct; 
} 

I Je ne suis pas sûr si je dois créer un constructeur de copie pour ceci. Si je dois, je ne suis pas vraiment sûr où je devrais le créer et comment.

+3

Où est l'enum? – juanchopanza

+2

Hors sujet: 'typedef struct DataStruct {...} DataStruct;' est un reste de C. En C++ 'struct DataStruct {...};' est suffisant. – user4581301

Répondre

3

Vous n'avez pas besoin de définir un constructeur de copie personnalisé pour l'exemple que vous avez montré. Le compilateur fournira pour vous un constructeur de copie par défaut, qui effectue une copie membre par membre des valeurs de la structure. Le constructeur de flic par défaut est suffisant lorsque la structure contient uniquement des types de données triviaux et/ou des types qui définissent leurs propres constructeurs de copie.

Ce n'est que lorsque vous devez gérer des ressources externes (telles que des handles de fichiers, de la mémoire allouée dynamiquement, etc.) que vous devez vraiment faire attention aux constructeurs de copie (voir le Rule of Three).

Cela dit, si vous voulez définir un constructeur de copie personnalisée, il ressemblerait à ceci:

struct DataStruct 
{ 
    double foo; 
    double foo1; 

    DataStruct() 
     : foo(0.0), foo1(0.0) 
    { 
    } 

    DataStruct(const DataStruct &src) 
     : foo(src.foo), foo1(src.foo1) 
    { 
    } 

    DataStruct& operator=(const DataStruct &rhs) 
    { 
     if (&rhs != this) 
     { 
      foo = src.foo; 
      foo1 = src.foo1; 
     } 
     return *this; 
    } 
}; 

Cela dit, étant donné l'exemple que vous avez montré, le compilateur peut employer Return Value Optimization si SomeFunction()-t pas besoin de faire une copie de la variable dataStruct retournée en premier lieu (son paramètre Foo est une autre affaire).

+0

Merci beaucoup pour votre clarification. – Jasmine