Внешняя связь в 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",

Другие вопросы по тегам