声明全局枚举数组 C++
Declaring global enumerated arrays c++
我正在开发一个数组系统来充当库存,我需要数组具有全局范围,以便可以在整个程序中对其进行修改。我在头文件中声明了它的枚举数,如下所示:
#include "stdafx.h"
#include <iostream>
#ifndef ITEMSARRAY_H
#define ITEMSARRAY_H
using namespace std;
enum Weapons
{
LASER_RIFLE,
LASER_SWORD,
LASER_PISTOL,
PLASMA_LAUNCHER,
MAX_ITEMS
};
bool items[MAX_ITEMS];
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
#endif
然而,这会在下面的语句中抛出一个错误,因为它试图将它声明为它自己的数组,或者因为它试图将值初始化为 enum.I 可以将它放在一个函数中并解决这个问题像这样:
void defineItemArray(bool items[MAX_ITEMS])
{
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
}
问题在于,当我尝试使用该函数时,参数项不会像这样提取数组:
#include "stdafx.h"
#include <iostream>
#include "itemsArray.h"
using namespace std;
void playerInventory()
{
defineItemArray(items);
for (int item = 0; item < MAX_ITEMS; ++item)
if (items[item] == true)
{
switch (item)
{
case 0:
cout << "Laser Rifle\n";
break;
case 1:
cout << "Laser Sword\n";
break;
case 2:
cout << "Laser Pistol\n";
break;
case 3:
cout << "Plasma Launcher \n";
break;
default:
cout << "Error";
break;
}
}
else
cout << "Not in Inventory\n";
}
void playerGet()
{
defineItemArray(items);
cout << "You have found a Laser Sword.\n";
cout << "Laser Sword added to inventory.\n";
items[LASER_SWORD] = true;
}
int main()
{
playerInventory();
playerGet();
playerInventory();
return 0;
}
item 抛出一个未定义的错误,使该函数无用。我不确定我错过了什么,但如果我能越过这个障碍,我终于可以完成这个库存系统。
选项 1:
您可以像这样在 itemsArray.c 中全局定义 items
数组:
// itemsArray.c
bool items[MAX_ITEMS] = {true, false, false, true};
要使数组可从其他文件访问,请将以下内容添加到 itemsArray.h:
// itemsArray.h
extern bool items[MAX_ITEMS];
在您必须访问项目数组的文件中包含 itemsArray.h。
不需要函数defineItemArray()
。
注:
- 使用全局变量被认为是"bad"设计
- 使用
extern
被认为是"bad"设计
选项 2:
重构 defineItemArray()
函数,使其初始化先前定义的数组:
void defineItemArray(bool items[])
{
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
}
那么你可以这样使用它:
void playerInventory()
{
bool items[MAX_ITEMS]; // define the items array
defineItemArray(items); // initialize the items array
for (int item = 0; item < MAX_ITEMS; ++item)
...
这些行:
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
在包含在全局范围内的头文件中无效。
改为将此代码放入 c 文件中:
bool items[MAX_ITEMS] = {true, false, false, true};
头文件中只有这一行:
extern bool items[MAX_ITEMS];
然后你就可以在所有包含头文件的c文件中使用变量项了。而且您不需要将变量项传递给任何函数,因为它是一个全局变量。顺便说一句——全局变量通常不好,但如果你真的想要一个全局变量,它可以这样做。
我正在开发一个数组系统来充当库存,我需要数组具有全局范围,以便可以在整个程序中对其进行修改。我在头文件中声明了它的枚举数,如下所示:
#include "stdafx.h"
#include <iostream>
#ifndef ITEMSARRAY_H
#define ITEMSARRAY_H
using namespace std;
enum Weapons
{
LASER_RIFLE,
LASER_SWORD,
LASER_PISTOL,
PLASMA_LAUNCHER,
MAX_ITEMS
};
bool items[MAX_ITEMS];
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
#endif
然而,这会在下面的语句中抛出一个错误,因为它试图将它声明为它自己的数组,或者因为它试图将值初始化为 enum.I 可以将它放在一个函数中并解决这个问题像这样:
void defineItemArray(bool items[MAX_ITEMS])
{
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
}
问题在于,当我尝试使用该函数时,参数项不会像这样提取数组:
#include "stdafx.h"
#include <iostream>
#include "itemsArray.h"
using namespace std;
void playerInventory()
{
defineItemArray(items);
for (int item = 0; item < MAX_ITEMS; ++item)
if (items[item] == true)
{
switch (item)
{
case 0:
cout << "Laser Rifle\n";
break;
case 1:
cout << "Laser Sword\n";
break;
case 2:
cout << "Laser Pistol\n";
break;
case 3:
cout << "Plasma Launcher \n";
break;
default:
cout << "Error";
break;
}
}
else
cout << "Not in Inventory\n";
}
void playerGet()
{
defineItemArray(items);
cout << "You have found a Laser Sword.\n";
cout << "Laser Sword added to inventory.\n";
items[LASER_SWORD] = true;
}
int main()
{
playerInventory();
playerGet();
playerInventory();
return 0;
}
item 抛出一个未定义的错误,使该函数无用。我不确定我错过了什么,但如果我能越过这个障碍,我终于可以完成这个库存系统。
选项 1:
您可以像这样在 itemsArray.c 中全局定义 items
数组:
// itemsArray.c
bool items[MAX_ITEMS] = {true, false, false, true};
要使数组可从其他文件访问,请将以下内容添加到 itemsArray.h:
// itemsArray.h
extern bool items[MAX_ITEMS];
在您必须访问项目数组的文件中包含 itemsArray.h。
不需要函数defineItemArray()
。
注:
- 使用全局变量被认为是"bad"设计
- 使用
extern
被认为是"bad"设计
选项 2:
重构 defineItemArray()
函数,使其初始化先前定义的数组:
void defineItemArray(bool items[])
{
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
}
那么你可以这样使用它:
void playerInventory()
{
bool items[MAX_ITEMS]; // define the items array
defineItemArray(items); // initialize the items array
for (int item = 0; item < MAX_ITEMS; ++item)
...
这些行:
items[LASER_RIFLE] = true;
items[LASER_SWORD] = false;
items[LASER_PISTOL] = false;
items[PLASMA_LAUNCHER] = true;
在包含在全局范围内的头文件中无效。
改为将此代码放入 c 文件中:
bool items[MAX_ITEMS] = {true, false, false, true};
头文件中只有这一行:
extern bool items[MAX_ITEMS];
然后你就可以在所有包含头文件的c文件中使用变量项了。而且您不需要将变量项传递给任何函数,因为它是一个全局变量。顺便说一句——全局变量通常不好,但如果你真的想要一个全局变量,它可以这样做。