声明全局枚举数组 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文件中使用变量项了。而且您不需要将变量项传递给任何函数,因为它是一个全局变量。顺便说一句——全局变量通常不好,但如果你真的想要一个全局变量,它可以这样做。