【问题标题】:Declaring global enumerated arrays c++声明全局枚举数组 C++
【发布时间】:2015-08-12 17:35:34
【问题描述】:

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

#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

然而,这在较低的语句上引发了一个错误,因为它试图将其声明为自己的数组,或者因为它试图将值初始化为枚举。我可以将它放在一个函数中并像这样解决这个问题:

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 抛出未定义的错误,使函数无用。我不确定我错过了什么,但如果我能克服这个障碍,我终于可以完成这个库存系统。

【问题讨论】:

  • 您在两个不同的地方有以下行defineItemArray(item);我假设它应该是defineItemArray(items);
  • 是的,但是我改变了它,它仍然会为项目抛出一个未定义的错误,这次只是针对参数中的那个。
  • 不能在全局范围内做作业
  • @NathanOliver,我可以解决这个问题,我真的只需要知道为什么它将项目显示为未定义,在我修复之后我认为我可以解决剩下的问题。
  • @SawyerAdlaiVierra-Hatch 第一:不要使用全局变量,而是使用函数参数或类成员变量!

标签: c++ arrays enums header global


【解决方案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() 不需要。

注意:

  • 使用全局变量被认为是“糟糕”的设计
  • 使用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>itemsArray.obj : error LNK2005: "bool * items" (?items@@3PA_NA) already defined in inventoryTest.obj 1>C:\Users \Sawyer\documents\visual studio 2015\Projects\inventoryTest\Debug\inventoryTest.exe : 致命错误 LNK1169: 找到一个或多个多重定义符号,但我没有在代码的其他任何地方定义它。
  • @StillLearning 谢谢,我忘了说。
  • 感谢两位的帮助。顺便说一句,你知道为什么这篇文章被否决了吗?是因为我在询问全局数组还是因为我在帖子中犯了格式错误?我觉得这不会是我最后一次需要寻求帮助,我想确保自己做得正确。
  • 不用担心被否决的票数。该站点上的某些人对他们认为“简单”的所有问题都投了反对票。他们似乎忘记了有些是新手,因此对专家认为简单的事情有问题。所以别担心,我们都被“专家”否决了。但是 - 您应该从一开始就包含确切的错误消息,并且只是将其称为“编译错误”而不是“项目引发未定义的错误”。 “抛出......错误”这个词让我们考虑异常 - 而不是编译错误。但无论如何 - 不要担心否决票。 :-)
  • @SawyerAdlaiVierra-Hatch 你解决了链接错误吗?
【解决方案2】:

这些行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多