2015-08-22 96 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) 
...... 

注:我曾尝试与EXTERN甲板globalDeck更换甲板globalDeck,EXTERN常量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

在stdafx.h中添加了“extern Deck globalDeck”,它工作正常!如果你能向我解释为什么这是必要的,以及头文件和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文件中定义。