2017-10-22 3 views
-3

Ich habe den folgenden Code, wo ich ein Kartenspiel erzeuge. Zuerst ermittle ich den Anzug mit der Funktion convertIntToSuit, die dann in die nächste Schleife geht, um das Kartenspiel zu füllen. Aber ich halte die folgende Fehlermeldung erhalten:Fehler bei der Verwendung von push_back mit einem struct Datentyp C++

Running /home/ubuntu/workspace/A5/Assignment5/main.cpp 
make: Entering directory `/home/ubuntu/workspace/A5/Assignment5' 
Compiling main.o 
g++ -Wall -g -O3 -std=c++11 -I/usr/include -c -o main.o main.cpp 
main.cpp: In function ‘int main()’: 
main.cpp:39:33: error: no matching function for call to ‘std::vector<Card>::push_back(<brace-enclosed initializer list>)’ 
      deck.push_back({i,s}); 

Hier ist mein Code:

// The include section adds extra definitions from the C++ standard library. 
#include <iostream> // For cin, cout, etc. 
#include <iomanip> // For text formatting (setprecision, setw, etc.) 
#include <cmath> // For math functions (sin, cos, pow, etc.) 
#include <cstdlib> 
#include <vector> 
#include <string> 

#include"convertIntToSuit.h" 
#include"printCard.h" 
//#include"shuffleDeck.h" 

using namespace std; 

struct Card { 
    string suit; 
    int rank; 
}; 

int main() { 
    vector<Card> deck; 
    for(int j = 0; j<4; ++j){ 
     string s = convertIntToSuit(j); 
     for(int i=1; i<=13; ++i){ 
      deck.push_back({i,s}); 
     } 
    } 
    return 0; 
} 
+0

Der erste Wert in der Klammer-Initialisierungsliste ist eine ganze Zahl, die zweite ist eine Zeichenfolge. Jetzt starrst du weiter auf deine "Card" -Klasse, bis du deinen eigenen Bug siehst. –

+0

Danke, ich dachte, ich hätte die gewechselt, aber ich denke nicht –

Antwort

0

Machen Sie es wie dies für jede Iteration: -

Card c1; 
c1.suit=s; 
c1.rank=i 
deck.push_back(c1); 

Oder

was machst du wi ll sein: -

deck.push_back({s,i}); 

string vor int zuerst kommt wegen Ihrer struct declaration.

0

Die push_back Funktion versteht nicht, was Sie an es senden. Es reicht nicht, die beiden Eigenschaften Card in geschweifte Klammern einzuschließen. Sie müssen die Struktur Card erstellen, bevor Sie sie an push_back senden.

0

Es gibt 2 Möglichkeiten:

  1. Entweder-Karte Objekt explizit zu konstruieren: deck.push_back(Card{s,i});

  2. Baukonstruktion Karte Objekt in-place innerhalb Vektor. Dies könnte unnötige Objektkopien beseitigen, obwohl in diesem Fall der Vorteil vernachlässigbar ist. Dafür müssen Sie einen expliziten c'tor definieren, der beide Argumente akzeptiert. C++ 11 erlaubt keine implizite Konstruktion von Objekten mit nur Argumenten. Sobald Sie den c'tor haben - können Sie emplace_back Mitgliedsfunktion verwenden, die genau das tut, was Sie wollen: es nimmt die Argumente zum Konstruktor und konstruiert das Objekt mit diesen Argumenten. In Ihrem Fall:

    struct Card { 
        string suit; 
        int rank; 
        Card(string s = string(), int r = 0) : suit(std::move(s)), rank(r) {} 
    }; 
    
    for (int i=1; i<=13; ++i){ 
        deck.emplace_back(i,s); 
    } 
    

Bitte beachten Sie, dass Sie keine geschweiften Klammern brauchen, wenn emplace_back verwenden.

Verwandte Themen