3
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 once と #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;
}
4

3 に答える 3

5

オブジェクトcarddeckは、ヘッダーで定義されています。ヘッダーを翻訳単位に含めると、このオブジェクトの別の定義が作成されます。おそらく、クラス定義からcardandを削除する必要があります。deckこれらのオブジェクトを実際に定義する必要がある場合は、

extern Card card;
于 2012-12-31T03:19:05.497 に答える
2

これらはリンカー エラーであり、C++ コード自体とは関係ありません。

問題は Card と Deck の定義の最後にあります。なぜあなたは持っているのですか:

} card;

と:

} deck;

?

于 2012-12-31T03:18:10.373 に答える
0

1) "class Card" を複数回定義すると、リンク エラーではなく、コンパイルエラーが発生します。

2) ほとんどの場合、ヘッダー ファイルは正常に見えます。実際には、実際には両方が必要というわけではありません。#pragma once または #ifndef のいずれかで十分です。

3) 問題: クラス定義から最後の「カード」と「デッキ」を除外してください!

于 2012-12-31T03:18:21.780 に答える