对班级卡的不确定引用

undefined reference to class Card

本文关键字:不确定 引用      更新时间:2023-10-16

我正在尝试编译我的项目,但是每次都有呼叫卡figurecard类时,编译器会显示以下错误:

 bin/FigureCard.o: In function `FigureCard::FigureCard()':
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:5: undefined reference to `Card::Card()'
bin/FigureCard.o: In function `FigureCard::FigureCard(Figure, Shape)':
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:6: undefined reference to `Card::Card(Shape)'
bin/FigureCard.o: In function `FigureCard::~FigureCard()':
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:10: undefined reference to `Card::~Card()'
bin/FigureCard.o: In function `FigureCard::toString[abi:cxx11]()':
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:26: undefined reference to `Card::getCapitalShape[abi:cxx11]()'
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:28: undefined reference to `Card::getCapitalShape[abi:cxx11]()'
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:30: undefined reference to `Card::getCapitalShape[abi:cxx11]()'
/users/studs/bsc/2016/dalitroz/workspace/ass1/src/FigureCard.cpp:31: undefined reference to `Card::getCapitalShape[abi:cxx11]()'
bin/FigureCard.o:(.rodata._ZTV10FigureCard[_ZTV10FigureCard]+0x28): undefined reference to `Card::getShape()'
bin/FigureCard.o:(.rodata._ZTI10FigureCard[_ZTI10FigureCard]+0x10): undefined reference to `typeinfo for Card'

这是我的makefile:

CC = g++
CFLAGS  = -g -Wall -Weffc++ -std=c++11
LFLAGS  = -L/usr/lib
# All Targets
all:  reviiyot
# Tool invocations
# Executable "reviiyot" depends on the files reviiyot.o and run.o.
reviiyot: bin/reviiyot.o bin/Card.o  bin/Hand.o bin/Deck.o bin/Player.o  bin/NumericCard.o bin/FigureCard.o
    @echo 'Building target: reviiyot'
    @echo 'Invoking: C++ Linker'
    $(CC) -o bin/Card.o  bin/Hand.o bin/Deck.o bin/Player.o bin/reviiyot.o bin/NumericCard.o bin/FigureCard.o $(LFLAGS)
    @echo 'Finished building target: reviiyot'
    @echo ' '
# Depends on the source and header files
bin/reviiyot.o: src/reviiyot.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/reviiyot.o src/reviiyot.cpp
bin/Card.o: src/Card.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/Card.o src/Card.cpp
bin/NumericCard.o: src/NumericCard.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/NumericCard.o src/NumericCard.cpp
bin/FigureCard.o: src/FigureCard.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/FigureCard.o src/FigureCard.cpp
bin/Hand.o: src/Hand.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/Hand.o src/Hand.cpp
bin/Deck.o: src/Deck.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/Deck.o src/Deck.cpp
bin/Player.o: src/Player.cpp
    $(CC) $(CFLAGS) -c -Iinclude -o bin/Player.o src/Player.cpp

#Clean the build directory
clean: 
    rm -f bin/*

这是H文件(card.h):

#ifndef CARD_H_
#define CARD_H_
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
enum Shape {
    Club,
    Diamond,
    Heart,
    Spade
};
enum Figure {
    Jack,
    Queen,
    King,
    Ace
};
class Card {
private:
  Shape shape;
public:
   Card();
  Card(Shape myShape);
  virtual string toString() = 0; //Returns the string representation of the card "<value><shape>" exp: "12S" or "QD"
  virtual ~Card();
  virtual Shape getShape();
  virtual int getType(int n) const =0;
  string getCapitalShape();
};
class FigureCard : public Card {
private:
    Figure figure;
public:
    FigureCard();
    FigureCard(Figure myFigure, Shape myShape);
    virtual ~FigureCard();
     string toString() override;
    Figure getFigure() const ;
    int getType(int n)const override;
};

#endif

class.cpp:

#include "../include/Card.h"

using namespace std;
Card::Card(): shape(Club){
}
Card::Card(Shape myShape) : shape(myShape){
}
//////check
Card:: ~Card(){}
Shape Card::getShape()
{
    return shape;
}
//////check
string Card:: getCapitalShape(){
    if(shape== Club)
            return "C";
        else if (shape == Diamond)
            return "D";
            else if (shape == Heart)
                return "H";
                else return "S";
}
string Card::toString() {
    return getCapitalShape();
}

和figurecard:

#include "../include/Card.h"

FigureCard::FigureCard (): Card(), figure(Jack){}
FigureCard::FigureCard(Figure myFigure, Shape myShape) : Card(myShape), figure(myFigure) {
}
FigureCard:: ~FigureCard()
{}
Figure FigureCard::getFigure() const
{
    return figure;
}
int FigureCard::getType(int n) const
{
    return figure+1+n;
}

string FigureCard ::toString() {
        if(figure== Jack)
            return "J"+Card::getCapitalShape();
        else if (figure == Queen)
            return "Q"+Card::getCapitalShape();
            else if (figure == King)
                return "K"+Card::getCapitalShape();
                else return "A"+Card::getCapitalShape();
    }

希望帮助,谢谢:)

您将bin/Hand.o bin/Deck.o bin/Player.o bin/reviiyot.o bin/NumericCard.o bin/FigureCard.o链接到bin/Card.o

更改:

$(CC) -o bin/Card.o  bin/Hand.o bin/Deck.o bin/Player.o bin/reviiyot.o bin/NumericCard.o bin/FigureCard.o $(LFLAGS)

to

$(CC) -o reviiyot bin/Card.o  bin/Hand.o bin/Deck.o bin/Player.o bin/reviiyot.o bin/NumericCard.o bin/FigureCard.o $(LFLAGS)