son - Error de C++ ''Referencia indefinida a Class:: Function()''
tipos de error en c++ (4)
Esta pregunta ya tiene una respuesta aquí:
Me preguntaba si alguien podría ayudarme con esto; solo soy nuevo en C ++ y me está causando una gran cantidad de problemas.
Estoy tratando de hacer objetos de clase Deck y Card relativamente simples.
El error se muestra en "Deck.cpp", declaración de una matriz de cartas, y luego cuando intento llenar la matriz con objetos de cartas. Dice que hay una referencia indefinida a Card::Card()
, Card::Card(Card::Rank, Card::Suit)
y Card::~Card()
.
Tengo todas mis recomendaciones aparentemente correctas, así que no sé qué está mal.
El código es el siguiente:
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();
tarjeta.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;
}
¿Qué estás usando para compilar esto? Si hay un error de referencia no definido, generalmente es porque el archivo .o (que se crea a partir del archivo .cpp) no existe y su compilador / sistema de compilación no puede vincularlo.
Además, en su card.cpp, la función debe ser Card::Card()
lugar de void Card
. La Card::
es alcance ; significa que su función Card()
es un miembro de la clase Card (que obviamente lo es, ya que es el constructor de esa clase). Sin esto, la Tarjeta vacía es solo una función gratuita. Similar,
void Card(Card::Rank rank, Card::Suit suit)
debiera ser
Card::Card(Card::Rank rank, Card::Suit suit)
Además, en deck.cpp, estás diciendo #include "Deck.h"
aunque te refieras a él como deck.h. Los incluidos son sensibles a mayúsculas y minúsculas.
En la definición de su clase de Card
, aparece una declaración para una construcción predeterminada:
class Card
{
// ...
Card(); // <== Declaration of default constructor!
// ...
};
Pero no se da una definición correspondiente. De hecho, esta definición de función (de card.cpp
):
void Card() {
//nothing
}
No define un constructor, sino una función global llamada Card
que devuelve void
. Probablemente quisiste escribir esto en su lugar:
Card::Card() {
//nothing
}
A menos que haga eso, ya que el constructor predeterminado se declara pero no se define, el vinculador producirá un error sobre las referencias no definidas cuando se encuentre una llamada al constructor predeterminado.
Lo mismo se aplica a su constructor aceptando dos argumentos. Esta:
void Card(Card::Rank rank, Card::Suit suit) {
cardRank = rank;
cardSuit = suit;
}
Debe reescribirse en esto:
Card::Card(Card::Rank rank, Card::Suit suit) {
cardRank = rank;
cardSuit = suit;
}
Y lo mismo se aplica a otras funciones de miembro: parece que no agregó Card::
qualifier antes de los nombres de función de miembro en sus definiciones. Sin él, esas funciones son funciones globales más que definiciones de funciones miembro.
Su destructor, por otro lado, está declarado pero nunca definido. Simplemente proporcione una definición para ello en card.cpp
:
Card::~Card() { }
Especifique la tarjeta de clase para el constructor:
void Card::Card(Card::Rank rank, Card::Suit suit) {
Y también definir el constructor y destructor por defecto.
Esta parte tiene problemas:
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
es una matriz dinámica, pero no es miembro de la claseCard
. Es extraño si desea inicializar una matriz dinámica que no es miembro de la clase -
void Deck()
no es un constructor de la clase Deck porque perdió el operador de resolución de alcance. Puede confundirse con la definición del constructor y la función con el nombreDeck
y el tipo de retornovoid
. - en sus bucles, debe usar
<
not>
contrario, el bucle nunca se ejecutará.