it-swarm.com.de

C ++ Fehler 'Undefinierter Verweis auf Class :: Function ()'

Ich habe mich gefragt, ob mir jemand dabei helfen könnte - ich bin erst neu in C++ und es verursacht mir eine ganze Menge Probleme.

Ich versuche, relativ einfache Deck- und Kartenklassenobjekte zu erstellen.

Der Fehler wird in "Deck.cpp" angezeigt, Deklaration eines Arrays von Karten, und dann, wenn ich versuche, das Array mit Kartenobjekten zu füllen. Es heißt, es gibt einen undefinierten Verweis auf Card::Card(), Card::Card(Card::Rank, Card::Suit) und Card::~Card().

Ich habe anscheinend alle meine Einschlüsse in Ordnung, also weiß ich nicht, was falsch läuft.

Der Code lautet wie folgt:

deck.h

#ifndef DECK_H
#define DECK_H
#include "card.h"

class Deck
{
 public:
    Deck();
    ~Deck();
    Card DealNextCard();
    void Shuffle();
    void DisplayDeck();
protected:
private:

};

#endif // DECK_H

deck.cpp

#include "Deck.h"
#include "card.h"

using namespace std;

const int NUM_TOTAL_CARDS = 52;
const int NUM_SUITS = 4;
const int NUM_RANKS = 13;
Card* cardArray;
void Deck() {
    cardArray = new Card[NUM_TOTAL_CARDS];
    int cardCount = 0;
    for (int i = 0; i > NUM_SUITS; i++) {
        for (int j = 0; j > NUM_RANKS; j++) {
            cardArray[cardCount] = Card(Card::Rank(i), Card::Suit(j) );
            cardCount++;
        }
    }
}


Card DealNextCard();
void Shuffle();
void DisplayDeck();

card.h

class Card
{

    public:
        enum Suit {D=0, H, C, S};
        enum Rank {ONE=0, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, J, Q, K, A};
        Card(Card::Rank, Card::Suit);
        Card();
        virtual ~Card();
        Card::Suit suit;
        Card::Rank rank;
        Card::Rank GetRank();
        Card::Suit GetSuit();
        std::string CardName();

    protected:

    private:

};

#endif // CARD_H

card.cpp

#include "card.h"
using namespace std;


Card::Suit cardSuit;
Card::Rank cardRank;

void Card() {
    //nothing
     }


void Card(Card::Rank rank, Card::Suit suit) {
cardRank = rank;
cardSuit = suit;
}

Card::Rank GetRank() {
return cardRank;
}
Card::Suit GetSuit() {
return cardSuit;
}
std::string CardName() {
    string test;
    test = "testing string";
    return test;
}
52
Ben Harris

Womit kompilieren Sie das? Wenn ein undefinierter Referenzfehler vorliegt, liegt dies normalerweise daran, dass die .o-Datei (die aus der .cpp-Datei erstellt wird) nicht vorhanden ist und Ihr Compiler/Build-System sie nicht verknüpfen kann.

Außerdem sollte in Ihrer card.cpp die Funktion Card::Card() anstelle von void Card Sein. Der Card:: Ist Gültigkeitsbereich; Das bedeutet, dass Ihre Card() -Funktion ein Mitglied der Card-Klasse ist (was es offensichtlich ist, da es der Konstruktor für diese Klasse ist). Ohne dies ist void Card nur eine kostenlose Funktion. Ähnlich,

void Card(Card::Rank rank, Card::Suit suit)

sollte sein

Card::Card(Card::Rank rank, Card::Suit suit)

Außerdem sagen Sie in deck.cpp #include "Deck.h", Obwohl Sie es als deck.h bezeichnet haben. Bei den Includes wird zwischen Groß- und Kleinschreibung unterschieden.

46
maditya

In der Definition Ihrer Card -Klasse wird eine -Deklaration für eine Standardkonstruktion angezeigt:

class Card
{
    // ...

    Card(); // <== Declaration of default constructor!

    // ...
};

Es wird jedoch keine entsprechende Definition angegeben. In der Tat ist diese Funktionsdefinition (von card.cpp):

void Card() {
//nothing
}

Definiert nicht einen Konstruktor, sondern eine globale Funktion mit dem Namen Card, die void zurückgibt. Wahrscheinlich wollten Sie dies stattdessen schreiben:

Card::Card() {
//nothing
}

Wenn Sie dies nicht tun, erzeugt der Linker einen Fehler bei undefinierten Referenzen, wenn ein Aufruf des Standardkonstruktors gefunden wird, da der Standardkonstruktor deklariert, aber nicht definiert ist.


Dasselbe gilt für Ihren Konstruktor, der zwei Argumente akzeptiert. Diese:

void Card(Card::Rank rank, Card::Suit suit) {
    cardRank = rank;
    cardSuit = suit;
}

Sollte folgendermaßen umgeschrieben werden:

Card::Card(Card::Rank rank, Card::Suit suit) {
    cardRank = rank;
    cardSuit = suit;
}

Das Gleiche gilt auch für andere Member-Funktionen: Sie haben anscheinend das Qualifikationsmerkmal Card:: Nicht vor den Member-Funktionsnamen in ihren Definitionen hinzugefügt. Ohne sie sind diese Funktionen eher globale Funktionen als Definitionen von Mitgliedsfunktionen.


Ihr Destruktor hingegen ist deklariert, aber niemals definiert. Geben Sie dazu einfach eine Definition in card.cpp An:

Card::~Card() { }
10
Andy Prowl

Dieser Teil hat Probleme:

Card* cardArray;
void Deck() {
    cardArray = new Card[NUM_TOTAL_CARDS];
    int cardCount = 0;
    for (int i = 0; i > NUM_SUITS; i++) {  //Error
        for (int j = 0; j > NUM_RANKS; j++) { //Error
            cardArray[cardCount] = Card(Card::Rank(i), Card::Suit(j) );
            cardCount++;
         }
    }
 }
  1. cardArray ist ein dynamisches Array, aber kein Mitglied der Klasse Card. Es ist seltsam, wenn Sie ein dynamisches Array initialisieren möchten, das nicht Mitglied der Klasse ist
  2. void Deck() ist kein Konstruktor von Class Deck, da Sie den Scope Resolution Operator verpasst haben. Sie könnten mit der Definition des Konstruktors und der Funktion mit dem Namen Deck und dem Rückgabetyp void verwechselt werden.
  3. verwenden Sie in Ihren Schleifen < und nicht >, da sonst die Schleife niemals ausgeführt wird.
3
taocp

Geben Sie die Klassenkarte für den Konstruktor an:

void Card::Card(Card::Rank rank, Card::Suit suit) {

Definieren Sie außerdem den Standardkonstruktor und -destruktor.

1
suspectus