2010-08-01 6 views
1

Pourquoi ne peut-on pas initialiser mon tableau de chaînes dans mon constructeur? Je reçois l'erreur suivante: Erreur interne du compilateur: Erreur de segmentation | Sur ces deux lignes du constructeur: suits = {"Clubs", "Diamonds", "Hearts", "Spades"}; dénominations = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Reine" ","Roi"};Erreur de constructeur C++. Impossible d'initialiser le tableau de chaînes

class Card 
    { 
     public: 
     Card(int n); 
     Card(string d, string s); 
     int getNumber(); 
     string getDenomination(); 
     string getSuit(); 
     void setNumber(int n); 
     void setDenomination(string d); 
     void setSuit(string s); 
     void printMe(); 
     void compareMe(Card c); 

     private: 
     int number; 
     string denomiation; 
     string suit; 
     string suits [4]; 
     string denominations [13]; 
    }; 


    Card::Card(int n) 
    { 
     suits = {"Clubs", "Diamonds", "Hearts", "Spades"}; 
     denominations = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"}; 

     int denIndex, suitIndex; 

     denIndex = 51 % 13; 
     suitIndex = 51/13; 

     number = n; 
     denomiation = denominations[denIndex]; 
     suit = suits[suitIndex]; 

    } 
+2

Quel est le nom de votre compilateur buggy? – jweyrich

+0

GCC (4.4.1)? ... – UncleBens

+0

Vous n'essayez pas de l'initialiser, vous essayez de l'assigner, et cette syntaxe composée (un tas de valeur entre accolades) ne fonctionne pas avec l'affectation. –

Répondre

3

utilisation std::vector ou boost::array, un exemple simplifié de votre code est ci-dessous

#include <boost/assign/list_of.hpp> 

#include <boost/array.hpp> 

#include <iostream> 
#include <string> 

class Card 
{ 
public: 
    explicit Card(unsigned n) : 
     _number(n), 
     _suits(boost::assign::list_of("Clubs")("Diamonds")("Hearts")("Spades")), 
     _denominations(boost::assign::list_of("Ace")("2")("3")("4")("5")("6")("7")("8")("9")("10")("Jack")("Queen")("King")) 
    { 

    } 

private: 
    unsigned _number; 
    boost::array<std::string, 4> _suits; 
    boost::array<std::string, 13> _denominations; 
}; 

int 
main() 
{ 
    Card foo(5); 

    return 0; 
} 
+1

C'est un bon conseil, mais cela n'aide pas le problème, c'est-à-dire que vous ne pouvez pas assigner un tableau littéral comme ça. Vous auriez le même problème si vous essayiez de faire ce genre de chose avec un vecteur. – Ferruccio

+0

@Ferruccio: non vrai, la syntaxe est appelée "liste d'initialisation" et sera entièrement supportée par C++ 0x. Utiliser std :: vector est toujours le meilleur choix ici. –

+0

Réponse incomplète –

4

Vous ne pouvez utiliser l'initialisation du tableau littéral à la construction, pas l'affectation.

int good[3] = { 1, 2, 3 }; // OK 
int bad[3]; 
bad = { 1, 2, 3 }; // not so good 

Vous devrez copier le tableau manuellement (ou utiliser un récipient comme vector ou boost::array.

5

A partir du code affiché, je suppose que cela devrait être membre de données statiques les menbres suits et denominations, que est qu'ils auront toujours les mêmes données pour chaque instance Card

Je vous suggère de les rendre statiques et les initialiser à la portée du fichier dans votre fichier cpp (en dehors de votre déclaration de classe).

Déclaration:

class Card 
{ 
    public: 
    Card(int n); 
    Card(string d, string s); 
    int getNumber(); 
    string getDenomination(); 
    string getSuit(); 
    void setNumber(int n); 
    void setDenomination(string d); 
    void setSuit(string s); 
    void printMe(); 
    void compareMe(Card c); 

    private: 
    int number; 
    string denomiation; 
    string suit; 
    static const string suits [4];     // static const 
    static const string denominations [13];  // static const 
}; 

Définition:

const string Card::suits[4] = {"Clubs", "Diamonds", "Hearts", "Spades"}; 
const string Card::denominations[13] = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"}; 

EDIT: Comme Robert S. Barnes a déclaré, ce qui les rend static const est encore mieux.

Espérons que ça aide.

+1

Comment cela fonctionne avec les types complexes? Je sais avec des types simples comme 'char *' le compilateur prend les données, les met dans une section en lecture seule, puis définit le pointeur pour pointer vers lui. Est-ce que cela fait quelque chose de similaire mais appelle l'opérateur '=' à l'exécution? La déclaration ne devrait-elle pas être 'static const'? –

+0

Celui-ci appelle l'initialiseur de tableau (appelle le constructeur à un seul argument pour chaque élément), qui fonctionne avec la syntaxe d'initialisation composée. Il n'y a pas de syntaxe d'affectation composée. –

+0

+1, la liste des combinaisons et des dénominations n'est pas spécifique à chaque carte d'un jeu, elle est spécifique au jeu lui-même. – dreamlax

4

Si vous obtenez un ICE (erreur de compilation interne), alors vous devriez vraiment signaler le code à celui qui a écrit votre compilateur. Les compilateurs sont censés imprimer les avertissements et les erreurs, mais pas les erreurs de segmentation.

Questions connexes