2013-03-29 12 views
31

誰かがこのことで私を助けてくれるのかどうか疑問に思っていました。私はC++を初めて使っていて、C++エラー 'Class :: Function()への未定義の参照'

私は比較的シンプルなDeck and 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 

card.cpp

次のよう

コードでありますあなたのCardクラスの定義では

#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; 
} 

答えて

26

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

また、card.cppでは、関数はvoid Cardの代わりにCard::Card()である必要があります。 Card::スコープです。それはあなたのCard()関数がCardクラスのメンバであることを意味します(それは明らかに、そのクラスのコンストラクタであるためです)。これがなければ、空カードは単なる自由な関数です。同様に、

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

はまた

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

する必要があり、deck.cppに、あなたはdeck.h.として呼ばにもかかわらず#include "Deck.h"を言っていますインクルードは大文字と小文字が区別さ

8

、デフォルトの建設のための宣言が表示されます。

class Card 
{ 
    // ... 

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

    // ... 
}; 
しかし、該当する 定義が与えられていません。実際には、( card.cppから)この関数の定義:

void Card() { 
//nothing 
} 

はないはコンストラクタを定義するのではなく、voidを返しCardと呼ばれるグローバル関数ありません。

Card::Card() { 
//nothing 
} 

を使用すると、デフォルトコンストラクタが宣言されていますが定義されていないので、デフォルトのコンストラクタへの呼び出しが発見された場合、リンカは未定義の参照に関するエラーが生成されます、それを行う場合を除き:あなたはおそらく代わりにこれを書くことを意味しました。


2つの引数を受け入れるコンストラクタにも同じことが適用されます。これは:

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

これに書き換えるべき:

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

そして、同じことがまた、他のメンバ関数に適用されます。あなたがそれらの定義のメンバ関数名の前にCard::修飾子を追加しませんでしたようです。それがなければ、それらの関数はメンバ関数の定義ではなくグローバル関数です。


デストラクタは宣言されていますが、定義されていません。ただ、card.cppでの定義を提供します。

Card::~Card() { } 
+0

すべての関数定義は、CPPファイルでこれと同じでなければなりませんか? カード::ランクカード:: GetRank(){ return cardRank; } カード::スーツカード:: GetSuit(){ return cardSuit; } –

+1

@BenHarris:はい、メンバー関数を定義する方法です –

0

をconstructor-ため、クラスカードを指定します。

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

もデフォルトコンストラクタとデストラクタを定義します。

3

この部分は問題がある:

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動的配列ではなく、Cardクラスのメンバーです。
  2. void Deck()は、 スコープ解決演算子が見つからなかったので、クラスDeckのコンストラクタではありません。クラスのメンバーではないダイナミック配列を初期化するのは奇妙です。名前がDeckで戻り値の型がvoidのコンストラクタと関数を定義することと混同することがあります。
  3. をループに使用する場合、<ではなく>を使用する必要があります。そうでない場合、ループは決して 実行されません。
関連する問題