Ben*_*ris 53 c++ oop undefined
我想知道是否有人可以帮我解决这个问题 - 我只是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
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
mad*_*tya 46
你用它来编译这个?如果存在未定义的引用错误,通常是因为.o文件(从.cpp文件创建)不存在,并且您的编译器/构建系统无法链接它.
另外,在你的card.cpp中,该函数应该Card::Card()代替void Card.的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 ,你也会说.包含区分大小写.
And*_*owl 12
在Card类的定义中,将显示默认构造的声明:
class Card
{
// ...
Card(); // <== Declaration of default constructor!
// ...
};
Run Code Online (Sandbox Code Playgroud)
但没有给出相应的定义.实际上,这个函数定义(来自card.cpp):
void Card() {
//nothing
}
Run Code Online (Sandbox Code Playgroud)
难道没有定义构造函数,而是一个全局函数调用Card返回void.你可能想写这个:
Card::Card() {
//nothing
}
Run Code Online (Sandbox Code Playgroud)
除非您这样做,否则由于默认构造函数已声明但未定义,因此在找到对默认构造函数的调用时,链接器将产生有关未定义引用的错误.
这同样适用于接受两个参数的构造函数.这个:
void Card(Card::Rank rank, Card::Suit suit) {
cardRank = rank;
cardSuit = suit;
}
Run Code Online (Sandbox Code Playgroud)
应该改写成这个:
Card::Card(Card::Rank rank, Card::Suit suit) {
cardRank = rank;
cardSuit = suit;
}
Run Code Online (Sandbox Code Playgroud)
同样也适用于其他成员函数:似乎您没有Card::在成员函数名称的定义之前添加限定符.没有它,这些功能是全局功能而不是成员功能的定义.
另一方面,您的析构函数已声明但从未定义过.只需提供一个定义card.cpp:
Card::~Card() { }
Run Code Online (Sandbox Code Playgroud)
这部分有问题:
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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
cardArray是一个动态数组,但不是类的成员Card。如果你想初始化一个不是类成员的动态数组,那就很奇怪了void Deck()不是 Deck 类的构造函数,因为您错过了范围解析运算符。Deck您可能会对使用名称和返回类型定义构造函数和函数感到困惑void。<not>否则,循环将永远不会被执行。