2015-08-22 5 views
2

Я делаю простую программу, касающуюся рук и вероятностей покера. Я запускаю тестовые примеры на разных руках, и в моей программе мне нужна колода, из которой можно сделать мою руку постоянной и глобальной. Моя программа имеет три основных объекта: «Карточка», «Рука» и «Палуба». Я пытаюсь создать глобальную колоду, но, похоже, что бы я ни делал, я получаю сообщение об ошибке, указывающее, что globalDeck не определено в файле hand.cpp. Вот соответствующий код:Внешняя ссылка в C++

hand.cpp:

Hand::Hand(int &one, int &two, int &three, int &four, int &five) 
{ 
    cardsinHand.push_back(globalDeck.copy(one)); 
    cardsinHand.push_back(globalDeck.copy(two)); 
    cardsinHand.push_back(globalDeck.copy(three)); 
    cardsinHand.push_back(globalDeck.copy(four)); 
    cardsinHand.push_back(globalDeck.copy(five)); 
} 

и мой cardgames.cpp файл:

#include "stdafx.h" 
#include<iostream> 
#include "hand.h" 
using namespace std; 

Deck globalDeck; 

void printresults(long successes, long trials) 
...... 

Примечание: Я попытался заменить Deck globalDeck с ехЬегп деке globalDeck, ехЬегп Const globalDeck и т. д. Ничто, похоже, не делает так, что globalDeck определяется в hand.cpp. Кроме того, колода останется постоянной во всей программе, поэтому ее можно объявить как глобальную константу или глобальную переменную, в зависимости от того, что проще. Мой выход ошибка:

1>c:\users\\desktop\semesters past\winter 2013\computer programming\projects\cardgames\cardgames\hand.cpp(31): error C2065: 'globalDeck' : undeclared identifier 
1>c:\users\\desktop\semesters past\winter 2013\computer programming\projects\cardgames\cardgames\hand.cpp(31): error C2228: left of '.copy' must have class/struct/union 
1>   type is 'unknown-type' 
+0

Вместо использования глобальной переменной используйте класс, который содержит ваше состояние игры и обрабатывает действия игры в рамках своих методов. –

ответ

3

Объявите вашу глобальную переменную в одном заголовочном файле

extern Deck globalDeck; 

и определить его в cardgames.cpp

Deck globalDeck; 

Объяснение: Компилятор должен видеть что globalDeck есть, прежде чем вы сможете его использовать. И компилятор в основном обрабатывает каждый * .cpp отдельно, не глядя на других. В заголовочных файлах вы можете сказать, что есть в программе, не давая полного и уникального определения.

+0

Добавил «extern deck globalDeck» в stdafx.h, и это сработало!Бонусные баллы, если вы можете объяснить мне, почему это необходимо, и какие именно файлы заголовков и stdafx (я новичок). – jntrcs

+0

Компилятор должен видеть, что такое 'globalDeck', прежде чем вы сможете его использовать. И компилятор в основном обрабатывает каждый * .cpp отдельно, не глядя на других. В заголовочных файлах вы можете сказать, что есть в программе, не давая полного и уникального определения. – aschepler

+0

@aschepler, объяснение должно быть напрямую добавлено к вашему ответу. Upvote в любом случае – LBes

0

class Deck не был определен в hand.cpp, поскольку заголовок отсутствует. Вам нужно добавить что-то вроде #include "hand.h" или #include "deck.h".

+0

Необходимые включает в себя; это всего лишь часть кода, а не весь файл. – jntrcs

1

Глобальная переменная globalDeck должна быть объявлена ​​ в каждом блоке компиляции (файл .cpp), который его использует. Он должен быть определенно точно в одном компиляционном блоке.

Декларация формы

Deck globalDeck; 

является как декларация и определение. Заявление с extern нравится:

extern Deck globalDeck; 

является только декларация и не определение.

Файлы заголовка (файлы .h) - это только текст, который входит в другие файлы с #include. Таким образом, вы можете поместить объявление extern Decl globalDeck; в файл заголовка (любой заголовочный файл) и #include этот заголовочный файл в каждом файле .cpp. Вам также потребуется определение в одном файле .cpp.

Смежные вопросы