1. ホーム
  2. c++

[解決済み] C++エラー「Class::Function()への未定義参照」[重複]。

2022-02-08 01:56:56

質問

私はC++の初心者なのですが、この問題でかなり苦労しています。

比較的単純なDeckとCardクラスのオブジェクトを作ろうとしています。

エラーは "Deck.cpp"、カードの配列の宣言、およびカードオブジェクトで配列を埋めようとしたときに表示されます。への未定義の参照があると言っています。 Card::Card() , Card::Card(Card::Rank, Card::Suit)Card::~Card() .

インクルードは全部合っているように見えるので、何が間違っているのかわからないのです。

コードは以下の通りです。

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

カード.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;
}

解決方法は?

何を使ってコンパイルしているのですか?未定義参照エラーが発生した場合、通常は.oファイル(.cppファイルから作成される)が存在せず、コンパイラやビルドシステムがそれをリンクすることができないためです。

また、card.cppの中で、関数が Card::Card() ではなく void Card . その Card:: スコープ つまり、あなたの Card() 関数は、Card クラスのメンバです (これは明らかにそのクラスのコンストラクタなので)。これがなければ、void Cardはただのフリー関数です。同様に

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

であるべきです。

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

また、deck.cppでは、次のように記述しています。 #include "Deck.h" 大文字と小文字が区別されます。