C++ Fout ‘Undefined Reference to Class :: Function ()’ [Duplicate]

Ik vroeg me af of iemand me hiermee kan helpen – ik ben alleen nieuw voor C++ en het veroorzaakt me een behoorlijk aantal problemen.

Ik probeer relatief eenvoudige dek- en kaartklasse-objecten te maken.

De fout verschijnt in “Deck.cpp”, verklaring van een reeks kaarten, en wanneer ik de array met kaartobjecten vult. Er staat dat er een ongedefinieerde verwijzing is naar Card::Card(), Card::Card(Card::Rank, Card::Suit)en Card::~Card().

Ik heb alles wat ik schijnbaar goed heb, dus ik weet niet wat er mis gaat.

De code is als volgt:

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

kaart.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;
}

Antwoord 1, autoriteit 100%

Wat gebruik je om dit te compileren? Als er een niet-gedefinieerde referentiefout is, komt dit meestal omdat het .o-bestand (dat wordt gemaakt op basis van het .cpp-bestand) niet bestaat en uw compiler-/buildsysteem het niet kan koppelen.

Ook in uw card.cpp moet de functie Card::Card()zijn in plaats van void Card. De Card::is scoping; het betekent dat uw functie Card()lid is van de klasse Card (wat duidelijk het geval is, aangezien het de constructor van die klasse is). Zonder dit is void Card slechts een gratis functie. Evenzo,

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

zou moeten zijn

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

Ook in deck.cpp zegt u #include "Deck.h"ook al noemde u het deck.h. De omvat zijn hoofdlettergevoelig.


Antwoord 2, autoriteit 16%

In de definitie van uw klasse Cardverschijnt een declaratievoor een standaardconstructie:

class Card
{
    // ...
    Card(); // <== Declaration of default constructor!
    // ...
};

Maar er wordt geen corresponderende definitiegegeven. In feite is deze functiedefinitie (van card.cpp):

void Card() {
//nothing
}

Definieert geeneen constructor, maar eerder een globale functie genaamd Carddie voidretourneert. Waarschijnlijk bedoelde je dit in plaats daarvan te schrijven:

Card::Card() {
//nothing
}

Tenzij u dat doet, zal de linker, aangezien de standaardconstructor is gedeclareerd maar niet gedefinieerd, fouten produceren over ongedefinieerde verwijzingen wanneer een aanroep van de standaardconstructor wordt gevonden.


Hetzelfde geldt voor uw constructor die twee argumenten accepteert. Dit:

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

Moet hierin worden herschreven:

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

En hetzelfde geldt ook voor andere lidfuncties: het lijkt erop dat u de kwalificatie Card::niet hebt toegevoegd vóór de namen van de lidfuncties in hun definities. Zonder dit zijn deze functies globale functies in plaats van definities van lidfuncties.


Uw destructor daarentegen wordt aangegeven maar nooit gedefinieerd. Geef er gewoon een definitie voor in card.cpp:

Card::~Card() { }

Antwoord 3, Autoriteit 4%

Dit deel heeft problemen:

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. cardArrayis een dynamische array, maar geen lid van Cardklasse. Het is vreemd als u een dynamische array wilt initialiseren die geen lid is van de klas
  2. void Deck()is geen constructeur van de klassendek sinds u de
    Operator van de reikwijdte. U kunt in de war zijn met het definiëren van de constructor en de functie met naam Decken retourtype void.
  3. In uw lussen moet u <niet >anders, anders, nooit
    worden uitgevoerd.

Antwoord 4

Geef de klassenkaart op voor de constructor -:

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

En definieer ook de standaardconstructeur en destructor.

Other episodes