2017-10-07 6 views
2

J'ai une classeImpossible d'initialiser un tableau dans le constructeur de copie

class TTable 
{ 
private: 
    std::string tableName; 
public: 
    TRow rows[10]; //this other class TRow 
    TTable(const TTable&); 
    int countRows = 0; 
}; 

Et je mets en œuvre le constructeur de copie

TTable::TTable(const TTable& table) : tableName(table.tableName), countRows(table.countRows), rows(table.rows) 
{ 
    cout << "Copy constructor for: " << table.GetName() << endl; 
    tableName = table.GetName() + "(copy)"; 
    countRows = table.countRows; 
    for (int i = 0; i < 10; i++) 
    { 
     rows[i] = table.rows[i]; 
    } 
} 

Mais le compilateur malédictions sur ce rows(table.rows). Comment initialiser un tableau? Avec les variables tout va, tout va bien. Remercier.

Répondre

2

Comme les tableaux bruts ne sont pas copiables cette façon, utilisez std::aray<TRow,10> rows; à la place:

class TTable 
{ 
private: 
    std::string tableName; 
public: 
    std::array<TRow,10> rows; 
    TTable(const TTable&); 
    int countRows = 0; 
}; 

TTable::TTable(const TTable& table) 
: tableName(table.tableName + "(copy)") 
, countRows(table.countRows) 
, rows(table.rows) { 
    cout << "Copy constructor for: " << table.GetName() << endl; 
} 
+0

Une erreur dans std :: array rows; Incomplet Incomplete Type – Xom9ik

+0

Utilisez '#include ' et assurez-vous que 'TRow' est déclaré en bonne et due forme avant de l'utiliser. – user0042

+0

Merci. C'est ce dont j'avais besoin – Xom9ik

5

Votre code double fonction: en plus de la copie dans le corps du constructeur, il copie également dans la liste d'initialisation .

Vous n'avez pas à faire cela: gardez les éléments qui peuvent être copiés par la liste d'initialisation dans la liste, et retirez-les du corps; supprimer d'autres éléments de la liste initialiseur:

TTable::TTable(const TTable& table) 
: tableName(table.tableName + "(copy)") 
, countRows(table.countRows) 
{ 
    cout << "Copy constructor for: " << table.GetName() << endl; 
    for (int i = 0; i < 10; i++) { 
     rows[i] = table.rows[i]; 
    } 
} 

Au-dessus, tableName et countRows sont initialisés en utilisant la liste, tandis que rows sont initialisés avec une boucle dans le corps.