声明全局枚举数组c ++

时间:2015-08-12 17:35:35

标签: c++ arrays enums header global

我正在开发一个数组系统作为库存,我需要数组具有全局范围,以便可以在整个程序中进行修改。我已经在头文件中声明了它的枚举器,如下所示:

#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可以将它放在一个函数中并像这样解决这个问题: / p>

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;
}

会抛出一个未定义的错误,使该函数无效。我不确定我错过了什么,但如果我能够克服这个障碍,我终于可以完成这个库存系统了。

2 个答案:

答案 0 :(得分:1)

选项1:

您可以在itemsArray.c中全局定义items数组,如下所示:

// itemsArray.c 
bool items[MAX_ITEMS] = {true, false, false, true};

要使数组可以从其他文件访问,请将以下内容添加到itemsArray.h:

// itemsArray.h
extern bool items[MAX_ITEMS];

在您必须访问items数组的文件中包含itemsArray.h。

不需要函数defineItemArray()

注意:

  • 使用全局变量被视为“bad”design
  • 使用extern被视为“糟糕”设计

选项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)
    ...

答案 1 :(得分:1)

这些行:

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文件中使用变量项。而且您不需要将变量项传递给任何函数,因为它是一个全局变量。顺便说一句 - 全局变量一般都很糟糕,但如果你真的想要一个全局变量,就可以这样做。