2011-07-25 4 views
12

J'essaie de créer un tableau de structures. Le code ci-dessous est-il valide? Je continue d'obtenir une erreur de jeton expected primary-expression before '{'.créer un tableau de structures en C++

int main() { 
    int pause; 
    struct Customer { 
    int uid; 
    string name; 
    }; 

    Customer customerRecords[2]; 
    customerRecords[0] = {25, "Bob Jones"}; 
    customerRecords[1] = {26, "Jim Smith"}; 
    cin >> pause; 
    return 0; 
} 
+1

Votre exemple compile sans erreur sur ideone (gcc-4.5.1) http://www.ideone.com/c9kMr – Praetorian

+4

Ceci est dû à de nouvelles fonctionnalités propres à l'initialisation listes et C++ 0x ... son code ne compile pas sous C++ 03. – Jason

Répondre

34

Essayez ceci:

Customer customerRecords[2] = {{25, "Bob Jones"}, 
           {26, "Jim Smith"}}; 
12

Vous ne pouvez pas utiliser une initialisation liste pour un struct après qu'il a été initialisé. Vous avez déjà initialisé par défaut les deux structures Customer lorsque vous avez déclaré le tableau customerRecords. Vous allez donc utiliser la syntaxe d'accès aux membres pour définir la valeur des membres de données non statiques, initialiser les structures à l'aide d'une liste de listes d'initialisation lorsque vous déclarez le tableau lui-même ou créer un constructeur pour votre structure et utilisez la fonction membre operator= par défaut pour initialiser les membres du groupe.

Donc, soit des éléments suivants pourrait fonctionner:

Customer customerRecords[2]; 
customerRecords[0].uid = 25; 
customerRecords[0].name = "Bob Jones"; 
customerRecords[1].uid = 25; 
customerRecords[1].namem = "Jim Smith"; 

Ou si vous avez défini un constructeur pour votre struct comme:

Customer::Customer(int id, string input_name): uid(id), name(input_name) {} 

Vous pouvez ensuite faire:

Customer customerRecords[2]; 
customerRecords[0] = Customer(25, "Bob Jones"); 
customerRecords[1] = Customer(26, "Jim Smith"); 

Ou vous pourriez faire la séquence de listes d'initialisation que Tuomas a utilisé dans sa réponse. La raison pour laquelle sa syntaxe de la liste d'initialisation fonctionne est parce que vous initialisez les structures Customer au moment de la déclaration du tableau, plutôt que d'autoriser l'initialisation par défaut des structures à chaque fois que vous déclarez une structure de données agrégée comme un tableau.

+1

IMO ceci devrait être la réponse acceptée +1 – CapturedTree

7

Certains compilateurs soutiennent littéraux composés comme extention, permettant cette construction:

Customer customerRecords[2]; 
customerRecords[0] = (Customer){25, "Bob Jones"}; 
customerRecords[1] = (Customer){26, "Jim Smith"}; 

Mais il est vraiment portable.

+0

C'est en C99, donc à peine "nonportable" (selon que vous voulez ou non soutenir les compilateurs antiques). Je préfère en C à 'MakeCustomer (25," Foo ")' qui génère en quelque sorte un code pire avec GCC 4.2. Je ne me souviens pas si c'est en C++; Je suis assez sûr que '(Client) {. Uid = 25}' n'est pas (bien que ce soit en C++ 0x). –

+0

@tc .: MSVC [traditionnellement néglige C99] (http://stackoverflow.com/q/146419); MSVC 2008 est-il une antiquité? (2010 est un peu mieux.) –

+0

Si après plus d'une décennie, ils ne peuvent pas être dérangés, je dirais. Là encore, je considère que la plupart des codes de Windows C "hérités" en termes de style, si rien d'autre. –

4

Cela fonctionne parfaitement. J'ai compilateur gcc C++ 11 prêt. Essayez et vous verrez:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int pause; 

    struct Customer 
    { 
      int uid; 
      string name; 
    }; 

    Customer customerRecords[2]; 
    customerRecords[0] = {25, "Bob Jones"}; 
    customerRecords[1] = {26, "Jim Smith"}; 
    cout << customerRecords[0].uid << " " << customerRecords[0].name << endl; 
    cout << customerRecords[1].uid << " " << customerRecords[1].name << endl; 
    cin >> pause; 
return 0; 
} 
Questions connexes