1>Deck.obj : error LNK2005: "class Card card" (?card@@3VCard@@A) already defined in Card.obj
1>PokerTester.obj : error LNK2005: "class Card card" (?card@@3VCard@@A) already defined in Card.obj
1>PokerTester.obj : error LNK2005: "class Deck deck" (?deck@@3VDeck@@A) already defined in Deck.obj
1>C:\Dev\Poker\Debug\Poker.exe : fatal error LNK1169: one or more multiply defined symbols found
我已经通过谷歌搜索了解了为什么会出现这些错误,但我不知道为什么当我尝试过#pragma和#ifndef保护之后它们仍然会发生。
这是我的Card.h
#pragma once
#ifndef CARD_H
#define CARD_H
#include <iostream>
#include <string>
using namespace std;
class Card
{
public:
Card(int cardSuit = 0, int cardValue = 2); //constructor will create a two of hearts by default
~Card(void);
int getSuit(); //returns the suit of the Card
int getValue(); //returns the value of the Card
int getColor(); //returns the color of the Card
friend ostream& operator<< (ostream &out, Card &cCard);
private:
int suit; //card suit
int value; //card value
int color; //card color
} card;
#endif
和我的Deck.h
#pragma once
#ifndef DECK_H
#define DECK_H
#include "Card.h"
#include <vector>
using namespace std;
class Deck
{
public:
Deck(void);
~Deck(void);
void newDeck(); //regenerates the full 52 card deck (e.g. cards are missing)
void shuffle(); //shuffles the deck
int cardsInDeck(); //returns the number of cards remaining in the deck
Card takeTopCard(); //returns the top card and removes it from the deck
private:
vector<Card> myDeck; //vector of 52 Card objects that make up the deck
} deck;
#endif
这可能很明显,但我无法弄清楚......
根据要求,这是Card.cpp:
#include "Card.h"
Card::Card(int cardSuit, int cardValue)
{
card.suit = cardSuit;
card.value = cardValue;
if(cardSuit == 0 || cardSuit == 1) card.color = 0;
if(cardSuit == 2 || cardSuit == 3) card.color = 1;
}
//returns the card's color
int Card::getColor()
{
return card.color;
}
//returns the card's suit
int Card::getSuit()
{
return card.suit;
}
//returns the card's value
int Card::getValue()
{
return card.value;
}
这是我为测试它们所写的东西:
#include "Deck.h"
int main()
{
Deck testDeck = *new Deck();
Card testCardCreation = *new Card();
Card testCard = testDeck.takeTopCard();
testDeck.shuffle();
Card testShuf = testDeck.takeTopCard();
cout << testCard << endl << testShuf << endl;
return 0;
}
答案 0 :(得分:4)
标题中定义了对象card
和deck
。将标题包含到翻译单元中时,它将创建此对象的另一个定义。您应该只是从类定义中删除card
和deck
。如果您确实需要定义这些对象,则使用
extern Card card;
答案 1 :(得分:2)
它们是链接器错误,它们本身与C ++代码无关。
问题出在卡和甲板定义的最后。为什么你有:
} card;
和
} deck;
答案 2 :(得分:0)
1)如果多次定义“类卡”,则会出现编译错误,而不是链接错误。
2)在大多数情况下,您的头文件看起来很好。事实上,你真的不需要两者:#pragma once或#ifndef中的一个或另一个就足够了。
3)问题:从你的班级定义中取消最后的“卡片”和“套牌”!