Внешняя связь в C++
Я делаю простую программу, касающуюся покерных рук и вероятностей. Я запускаю тестовые случаи на разных руках, и в моей программе мне нужна колода, из которой можно взять свою руку, которая является постоянной и глобальной. В моей программе три основных объекта: карта, рука и колода. Я пытаюсь создать глобальную колоду, но кажется, что независимо от того, что я делаю, я получаю сообщение о том, что globalDeck не определен в hand.cpp. Вот соответствующий код:
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 на extern Deck globalDeck, extern 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'
3 ответа
Объявите вашу глобальную переменную в одном заголовочном файле
extern Deck globalDeck;
и определить его в cardgames.cpp
Deck globalDeck;
Пояснение: компилятор должен видеть, что globalDeck
прежде чем вы сможете использовать его. И компилятор в основном обрабатывает каждый *.cpp индивидуально, не обращая внимания на другие. В заголовочных файлах вы можете сказать, что находится в программе, не давая полного и уникального определения.
Глобальная переменная globalDeck
должен быть объявлен в каждом модуле компиляции (файл.cpp), который его использует. Это должно быть определено ровно в одной единице компиляции.
Декларация формы
Deck globalDeck;
является одновременно декларацией и определением. Декларация с extern
лайк:
extern Deck globalDeck;
это просто декларация, а не определение.
Заголовочные файлы (файлы.h) - это просто текст, который включен в другие файлы с #include
, Таким образом, вы можете поместить декларацию extern Decl globalDeck;
в заголовочном файле (любой заголовочный файл) и #include
этот заголовочный файл в каждом файле.cpp. Вам также понадобится определение только в одном файле.cpp.
class Deck
не был определен в hand.cpp
потому что заголовок отсутствует. Вам нужно добавить что-то вроде #include "hand.h"
или же #include "deck.h"
,