C ++错误“未定义参照类::功能()” [重复](C++ error 'Undefined

2019-08-18 07:13发布

这个问题已经在这里有一个答案:

  • 什么是未定义参考/解析的外部符号错误,我该如何解决? 33个回答

我在想,如果有人可以帮助我这个 - 我只是新的C ++和它引起了我的麻烦了相当数量。

我试图让相对简单的甲板和卡类对象。

该错误是没有显示在“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

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

Answer 1:

你在使用编译这个? 如果有一个未定义的引用错误,通常是因为的.o文件(该文件会从.cpp文件创建)不存在,你的编译器/生成系统无法链接。

此外,在您的card.cpp,功能应该是Card::Card()而不是void Card 。 该Card::作用域 ; 这意味着你的Card()函数是卡类的成员(这明明是,因为它是为类的构造函数)。 没有这一点,无效卡仅仅是一个免费的功能。 同样的,

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

应该

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

此外,在deck.cpp,你说#include "Deck.h"即使你把它称为deck.h. 所述包括区分大小写。



Answer 2:

在你的定义Card类,出现一个默认的构造声明

class Card
{
    // ...

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

    // ...
};

但没有相应的定义给出。 事实上,这个函数的定义(自card.cpp ):

void Card() {
//nothing
}

没有定义构造函数,而是一个全局函数叫做Card返回void 。 你大概意思不是这样写:

Card::Card() {
//nothing
}

除非你这样做,因为默认构造函数声明,但没有定义,链接器将时被发现的默认构造函数的调用产生约未定义的引用错误。


这同样适用于你的构造函数接受两个参数。 这个:

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() { }


Answer 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和返回类型void
  3. 在你的循环,你应该使用<>否则,循环将永远不会被执行。


Answer 4:

指定constructor-类卡:

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

,还可以定义默认构造函数和析构函数。



文章来源: C++ error 'Undefined reference to Class::Function()' [duplicate]