链接C+中的文件+; 我正在尝试一个基本的纸牌游戏程序,在2年的休息之后,重新整理我的基本C++技能。所以我创建了3个对象:牌组、手牌和牌。在我试图为整个程序定义一个全局常量牌组之前,一切都进行得非常顺利,结果一切都搞砸了(牌组应该是52张有序的牌,并且永远不会改变)。我正在尝试找出如何将以下文件链接在一起: main.cpp deck.h deck.cpp hand.h hand.cpp card.h card.cpp

链接C+中的文件+; 我正在尝试一个基本的纸牌游戏程序,在2年的休息之后,重新整理我的基本C++技能。所以我创建了3个对象:牌组、手牌和牌。在我试图为整个程序定义一个全局常量牌组之前,一切都进行得非常顺利,结果一切都搞砸了(牌组应该是52张有序的牌,并且永远不会改变)。我正在尝试找出如何将以下文件链接在一起: main.cpp deck.h deck.cpp hand.h hand.cpp card.h card.cpp,c++,static-linking,C++,Static Linking,我需要包括哪些内容,以及如何定义要在整个计划中使用的全局组?我把我现有的代码弄得一团糟,试图将所有内容都包含在所有内容中,但现在没有任何内容能够正确编译。谢谢 对于deck,只需在main.cpp中定义它。它可以通过引用传递给其他类中需要操作它的任何函数。至于头文件,#只包括当前源文件所需的头文件。包括头球后卫也是一个好主意,所以你不必担心你引用了多少次头球 编辑 extern在另一个答案中提到。如果您实际上正在定义一个全局对象,那么这是必要的。人们对全球化的看法不一。在纯C++中,我没有经常看

我需要包括哪些内容,以及如何定义要在整个计划中使用的全局组?我把我现有的代码弄得一团糟,试图将所有内容都包含在所有内容中,但现在没有任何内容能够正确编译。谢谢

对于deck,只需在main.cpp中定义它。它可以通过引用传递给其他类中需要操作它的任何函数。至于头文件,
#只包括当前源文件所需的头文件。包括头球后卫也是一个好主意,所以你不必担心你引用了多少次头球

编辑


extern
在另一个答案中提到。如果您实际上正在定义一个全局对象,那么这是必要的。人们对全球化的看法不一。在纯C++中,我没有经常看到它。

< p>回答你关于全局的问题,你会在甲板上声明它为代码> ExtNeX/Cuth.h(我假设在程序中是有意义的),并在甲板上定义它。CPP。< /P> 例如:

甲板

extern Card GLOBAL_DECK[52];
deck.cpp

Card GLOBAL_DECK[52];
现在,对于使用全局,避免使用全局,传递对位于更高范围内的对象的引用,或者在堆上创建对象,并传递指向它的指针或引用,这是一种更好的方法(但必须记住,一旦使用完它,就要删除它)

关于在哪里需要include的问题,您应该像这样在include-guard中包装每个头文件(用头文件名替换头文件名,例如hand.h变为hand\u h:

#ifndef HEADER_NAME
#define HEADER_NAME

header contents

#endif //Some people like to put HEADER_NAME here but it isn't really necessary 
//unless you are using a lot of precompiler directives, which you shouldn't be 
然后将标题包含在需要它们的文件中。Hand和deck需要卡片,其他任何东西都取决于您如何使用它们。由于您没有提到您正在使用的编译器/工具集,我无法给您具体的说明。但我会自己编译它们,并包含每个文件编译所需的内容。您可能会遇到以下情况:lar依赖,这意味着A需要B来编译,而B需要A来编译(或更长的链,但最终它会变成循环的),您需要研究前向声明,可能需要使用引用和指针来解决或更改设计

然后,您需要将对象文件链接在一起以生成一个可执行文件。如果您使用的是Visual Studio或code::blocks之类的集成IDE,它会帮您完成这项工作,但如果您使用的是eclipse之类的通用IDE,您可能需要找出链接器是什么,或者设置一个链接器。

全局变量(或常量)声明在文件顶部、包含项下方但在任何代码上方

所以对于这个例子,我会这样写:

#include <iostream>
#include <deck.h>
#include <hand.h>
#include <card.h>

extern deck ... // If we want to use the deck constant anywhere in our program

int main ()
{
    ...
}
当然,还要创建deckConstant.h文件:

#ifndef DECKCONSTANT_H
#define DECKCONSTANT_H

namespace myGlobalConstant
{
    extern const deck ...
}
#endif
然后在main.cpp文件中添加:

#include <deckConstant.h>
using namespace myGlobalConstant
#包括
使用名称空间myGlobalConstant

我希望我正确理解了这个问题。

一些错误输出对任何有动机解决您的问题的人来说都是非常宝贵的。如果没有任何真正的线索,我预测您在头中声明全局数据组时忘记添加
extern
。在这种情况下,包含该头的每个源文件都会认为它们拥有一个私有数据集甲板的静态实例,而不是意识到以后需要链接到它。
#include <deckConstant.h>
using namespace myGlobalConstant