2009-07-23 9 views
1

Ich lerne gerade C++ aus einem Java-Hintergrund.C++ String Array Ausgabe

Nur mit einfachen Klassen der Umgebung ín, aber aus irgendeinem Grunde die folgenden nicht kompiliert werden, wenn die gleiche Syntax fein an anderer Stelle erstellt:

class CardDealer { 

    private: 
     string suits[4]; 
     string values[13]; 
     bool cardTaken[4][13]; 
     int getRand(int top); 
     void getValidSuit(int *suit); 
     void getValidCard(int suit,int *value); 

    public: 
     CardDealer(); 
     string dealCard(); 
     void resetDeck(); 
}; 

CardDealer::CardDealer(){ 
    suits = {"hearts", "clubs", "spades", "diamonds"}; 
    values = {"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"}; 
    cardTaken = {{false,false,false,false,false,false,false,false,false,false,false,false,false},{false,false,false,false,false,false,false,false,false,false,false,false,false}, 
    {false,false,false,false,false,false,false,false,false,false,false,false,false},{false,false,false,false,false,false,false,false,false,false,false,false,false}}; 
} 

offensichtlich ist dies nur ein Teil der Klasse, so wenden Sie sich bitte don ‚t schreien mich an für fehlende‚}‘s

Compiler Futter ein wackelig, wenn es die instantiations im Konstruktor trifft, spuckt Fehler wie diese:


1>.\CardDealer.cpp(26) : error C2059: syntax error : '{' 
1>.\CardDealer.cpp(26) : error C2143: syntax error : missing ';' before '{' 
1>.\CardDealer.cpp(26) : error C2143: syntax error : missing ';' before '}' 
1>.\CardDealer.cpp(27) : error C2059: syntax error : '{' 
1>.\CardDealer.cpp(27) : error C2143: syntax error : missing ';' before '{' 
1>.\CardDealer.cpp(27) : error C2143: syntax error : missing ';' before '}' 
1>.\CardDealer.cpp(28) : error C2059: syntax error : '{' 

Linie 26 derjenige ist, wo ich instanziiert haben Anzüge (suits = { ...)

Dank für einen Blick Jungs nehmen, viel

geschätzt

Antwort

6

Bis C++ 0x können Sie beim Deklarieren eines Arrays nur die Aggregat-Initialisierungssyntax (dh geschweifte Klammern) verwenden.

Beachten Sie, dass dieses Programm einen ähnlichen Fehler gibt:

int thing[4]; 
int main() 
{ 
    thing = { 0, 1, 2, 3 }; 
} 

Sie werden Ihre Array mit der etwas langweiligen Klammer Syntax initialisieren müssen, ein Element zu einem Zeitpunkt.

+0

ugh, das ist böse. Ich konnte es nicht bei der Initialisierung arbeiten, also musste ich die eine-nach-einer-Zeit-Route gehen. Ihr Recht, extrem langwierig. danke! –

+0

Dies ist jedoch nicht die einzige Lösung. Sie können die festen Initialisierer in einem separaten Array speichern (vielleicht ein Array von const char *) und sie einfach in die Klasseninstanzvariablen mit einem einzigen std :: copy-Aufruf im Konstruktor kopieren. –

0

Da wir Ihre gesamte Quelldatei nicht kennen, wissen wir nicht, was ist in den Zeilen 26,27,28. Ich vermute, den Code:

cardTaken = {{false,..... 

diese Fehler wirft. Anstatt dieser sehr langen Initialisierung könnten Sie verwenden:

for(int i = 0; i<4; i++) 
{ 
    for(int j = 0; j<13; j++) 
    { 
     cardTaken[i][j] = false; 
    } 
} 

Auf diese Weise ist Ihr Code klarer und verständlicher.

+0

Entschuldigung dafür, dass ich nicht klarer bin, Zeile 26 ist die Stelle, an der ich "Anzüge" instanziiert habe. editierter Beitrag zur besseren Übersicht –

4

Ich habe die frühere Post korrigiert:

Sie sie so außerhalb der Klasse initialisiert werden können:

namespace CardDealer 
{ 
    static const string suits[] = {"hearts", "clubs", "spades", "diamonds"}; 
    static const string values[]={"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"}; 

    class CardDealer 
    {  
    private: 
     bool cardTaken[4][13]; 
     ... 
    }; 

    ... 
} 

Im Konstruktor Sie cardTaken in einer Schleife initialisieren konnten.

+0

Ich habe gerade das obige versucht, aber der Compiler gibt die gleichen Fehler. danke trotzdem –

+3

Nur integrale Mitglieder können innerhalb einer Klassendefinition initialisiert werden. – CiscoIPPhone

+0

was meinst du mit einem integralen Mitglied? wie in einer ganzen Zahl? oder etwas ganz anderes ... –

0

Sie könnten etwas von der Langeweile mit etwas wie diesem in Ihrem Konstruktor entfernen.

const char* tempSuits[] = {"hearts", "clubs", "spades", "diamonds"}; 
for(int i=0; i<4; ++i) suits[i] = tempSuits[i]; 

Sie können die geschweifte Klammer Syntax verwenden C-Strings zu initialisieren, die Sie dann zuweisen können std :: strings.

Sie könnten auch die C-style Zeichenfolgen in Ihrer Klasse verwenden, um damit zu beginnen (dann würden Sie die Schleife nicht benötigen).

0

Einfache Lösung:

class CardDealer { 

    private: 
     const string suits[4]; 
     const string values[13]; 
     bool cardTaken[4][13]; 
     int getRand(int top); 
     void getValidSuit(int *suit); 
     void getValidCard(int suit,int *value); 

    public: 
     CardDealer(); 
     string dealCard(); 
     void resetDeck(); 

    private: 
     static string suits_initializer[4]; 
     static string values_initializer[13]; 
}; 


CardDealer::CardDealer(){ 
    memcpy(suits, suits_initializer, sizeof(suits)); 
    memcpy(values, values_initializer, sizeof(values)); 
    memset(cardTaken, 0, sizeof(cardTaken)); 
} 

string CardDealer::suits_initializer[4] = {"a","b","c","d"}; 

dies funktioniert, so lange Anzüge und Werte konstant sind .. aber in der Tat, müssen Sie diese als Instanzvariablen? statische Anzüge und statische Werte sind in diesem Beispiel ausreichend.

+0

Die Verwendung von memcpy in Klassen wie std :: string ist sehr gefährlich! –

1

Die erste Frage, die sich ergibt, ist, benötigen Sie suits und values pro Objekt-Arrays oder können sie zwischen allen Instanzen von CardDealer geteilt werden?

Wenn nicht, würde ich sie statisch machen und dann können Sie die statische Initialisierungssyntax bereitstellen, die Sie an ihrem Definitionspunkt verwenden möchten.

z.

class CardDealer { 

    private: 
     static const std::string suits[4]; 
     static const std::string values[13]; 

    // ... 
}; 

und in einer .cc/CPP-Datei an anderer Stelle:

const std::string CardDealer suits[4] = { "hearts", " ... ", ... }; 
const std::string CardDealer values[13] = { "ace", " ... ", ... }; 

Wenn sie pro-Klasse sein müssen und dies sind nur einige Anfangswerte, dann würde ich es vorziehen, sie ein Vektor zu machen von Strings und initialisieren sie von einigen statisch zugewiesenen C-Strings. z.B .:

class CardDealer { 

    private: 
     static const char* init_suits[4]; 
     static const char* init_values[13]; 

     std::vector<std::string> suits; 
     std::vector<std::string> values; 

    // ... 
}; 

CardDealer::CardDealer() 
    : suits(init_suits, init_suits + sizeof init_suits/sizeof init_suits[0]) 
    , values(init_values, init_values + sizeof init_values/sizeof init_values[0]) 
{ 
} 

const char* CardDealer::init_suits[4] = { ... }; 
const char* CardDealer::init_values[13] = { ... }; 

Wie für Ihre cardTaken Array, wie 0-false konvertiert können Sie nur default-initialisieren das Mitglied in initalizer Liste Ihres Konstruktor.

CardDealer::CardDealer() 
    : suits(init_suits, init_suits + sizeof init_suits/sizeof init_suits[0]) 
    , values(init_values, init_values + sizeof init_values/sizeof init_values[0]) 
    , cardTaken() 
{ 
} 
0

können Sie verwenden boost :: assign:

#include <string> 
#include <vector> 
#include <boost/assign.hpp> 
#include <boost/assign/list_of.hpp> 
#include <boost/assign/std/vector.hpp> 

const std::vector<std::string> my_vector_of_strings = 
boost::assign::list_of("cat")("dog")("banana")("apple")(orange)("tuna")("salmon")("dinosaur")("blablabla")("...")("etc")("etc")("etc"); 

Der Spaß daran ist, können Sie stl Container als consts erklären diese hilfreiche Bibliothek verwenden, da Ihre Arrays Karten und Werte, die sich nicht ändern Ich würde sie wahrscheinlich sowieso als Constants deklarieren - und ich würde Vektoren verwenden, da sie sicherer sind als klassische Arrays.