Ошибки VS 2010 C ++ LNK2005 при однократном использовании #pragma и #ifndef

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

Я узнал, почему эти ошибки возникают из-за поиска в Google, но я не знаю, почему они все еще происходят, когда я однажды попробовал #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;
}

2

Решение

Объекты card а также deck определены в заголовке. Когда вы включаете заголовок в модуль перевода, он создает другое определение этого объекта. Вы, вероятно, должны просто удалить card а также deck из определения класса. Если вам действительно нужны эти объекты, вы должны использовать

extern Card card;
4

Другие решения

Это ошибки компоновщика, они не связаны с кодом C ++ как таковым.

Проблема в конце определения карт и колоды. Почему вы должны:

} card;

А также:

} deck;

?

2

1) Если вы определили «класс карты» несколько раз, вы получите компилировать ошибка, а не ошибка ссылки.

2) По большей части ваши заголовочные файлы выглядят нормально. На самом деле вам не нужны оба: один или другой из #pragma один раз или достаточно #ifndef.

3) ПРОБЛЕМА: уберите окончательную «карту» и «колоду» из определения вашего класса!

0
По вопросам рекламы [email protected]