2015-08-12 3 views
-1

Я работаю над системой массивов для работы в качестве инвентаря, мне нужен массив, чтобы иметь глобальную область видимости, чтобы ее можно было модифицировать по всей программе. Я его объявили ж/его переписчиков в файле заголовка, как так:Объявление глобальных перечисляемых массивов 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; 
} 

позиция вызывает неопределенную ошибку, что делает функцию бесполезной. Я не уверен, что мне не хватает, но если я смогу пройти мимо этого roadblock, я наконец смогу закончить эту систему инвентаризации.

+0

У вас есть следующая строка в двух разных местах: 'defineItemArray (item);' Я предполагаю, что это должно быть 'defineItemArray (items);' – CoryKramer

+0

Это, но я изменил его, и он по-прежнему выдает неопределенную ошибку для элементов , на этот раз только для аргумента. –

+0

Вы не можете выполнять задания в глобальной области. – NathanOliver

ответ

1

Вариант 1:

Вы можете глобально определить items массив в itemsArray.c так:

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

Чтобы сделать массив доступной из других файлов добавить следующее itemsArray.h:

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

Включите itemsArray.h в файл, где у вас есть доступ к массиву элементов.

Функция defineItemArray() не требуется.

Примечание:

  • с использованием глобальных переменных считается "плохой" дизайн
  • с использованием extern считается "плохо" дизайн

Вариант 2:

Refactor функцию 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) 
    ... 
+0

Я пробовал метод 1 и получил эту ошибку: 1> itemsArray.obj: ошибка LNK2005: «bool * items» (? Items @@ 3PA_NA), уже определенные в inventoryTest.obj 1> C: \ Users \ Sawyer \ documents \ visual studio 2015 \ Projects \ inventoryTest \ Debug \ inventoryTest.exe: фатальная ошибка LNK1169: найден один или несколько символов с множественным определением , но я не определяю его нигде в коде. –

+0

@StillLearning Спасибо, я забыл упомянуть об этом. – sergej

+0

Спасибо вам за помощь. С другой стороны, знаете ли вы, почему этот пост получил вниз. Это потому, что я спрашивал о глобальных массивах или о том, что я сделал ошибку форматирования в сообщении? У меня такое чувство, что это не будет последний раз, когда мне нужно обратиться за помощью, и я хочу убедиться, что я делаю это правильно. –

1

Эти линии:

items[LASER_RIFLE] = true; 
items[LASER_SWORD] = false; 
items[LASER_PISTOL] = false; 
items[PLASMA_LAUNCHER] = true; 

являются недействительными в файле заголовка, который включен в глобальную область.

Вместо Поместите этот код в с-файл:

bool items[MAX_ITEMS] = {true, false, false, true}; 

В заголовочном файле вы должны иметь только эту строку:

extern bool items[MAX_ITEMS]; 

Затем вы можете использовать переменные по всем c- файлы, которые включают файл заголовка. И вам не нужно передавать переменные в любые функции, поскольку это глобальная переменная. BTW - глобальные переменные вообще плохо, но если вы действительно хотите глобальную переменную, это можно сделать так.

Смежные вопросы