C++错误"对类::函数()的未定义引用"
C++ error 'Undefined reference to Class::Function()'
我想知道是否有人可以帮助我解决这个问题-我只是c++的新手,它给我带来了相当多的麻烦。
我试图使相对简单的Deck和Card类对象。
错误出现在"Deck.cpp",卡数组的声明,然后当我尝试用卡对象填充数组时。它说对Card::Card()
, Card::Card(Card::Rank, Card::Suit)
和Card::~Card()
有未定义的引用
我所有的include看起来都是正确的,所以我不知道哪里出错了。
代码如下:
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;
}
你用什么来编译这个?如果有一个未定义的引用错误,通常是因为。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"
,尽管您将其称为deck.h。include是区分大小写的
在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() { }
这部分有问题:
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++;
}
}
}
-
cardArray
是动态数组,但不是Card
类的成员。如果你想初始化一个不属于 类的动态数组,这是很奇怪的 -
void Deck()
不是类Deck的构造函数,因为您错过了作用域解析操作符。您可能会对定义名称为Deck
、返回类型为void
的构造函数和函数感到困惑。 - 在你的循环中,你应该使用
<
而不是>
,否则,循环永远不会被执行。
为构造函数指定class Card -:
void Card::Card(Card::Rank rank, Card::Suit suit) {
还要定义默认构造函数和析构函数。
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中