Как я могу хранить инвентарный список номеров? - PullRequest
2 голосов
/ 30 апреля 2010

У меня есть список номеров, которые мне нужно отслеживать. Числа слабо связаны, но представляют отчетливо разные предметы. Я хотел бы сохранить список номеров, но иметь возможность ссылаться на них по имени, чтобы я мог позвонить им и использовать их в случае необходимости легко. Вроде как инвентарный список, где все номера относятся к идентификатору детали, и я хотел бы назвать их idPart1, idPart2, idPart3, чтобы их назначение было легко идентифицируемым, когда они используются.

Каков наилучший способ сделать это?
1) Определить структуру. Скажи, инвентарь. Будет включено несколько членов типа int, part1, part2 и т. Д. Для использования будет создан экземпляр структуры, значения, назначенные членам, и числа будут использоваться при необходимости, говоря struct.member.
2) Определить перечисление. Используйте part1, part2 в качестве литералов enum. Сохраните фактические значения в векторе или списке, каждое из которых имеет индекс, соответствующий значению имени числа в перечислении. Используйте литералы enum для извлечения значений, список [enumLit].
3) Что-то совершенно другое

Мне больше ничего не нужно делать с числами - просто просматривайте их время от времени. Поскольку обработки не существует, я думаю, что новый класс для них является излишним, но я хочу быть убежденным в обратном.

Есть предложения?

Ответы [ 5 ]

2 голосов
/ 30 апреля 2010

Позвольте мне попытаться перефразировать то, что вы пытаетесь сделать здесь. Вы хотите, чтобы разработчики, использующие ваш код, могли ссылаться на предварительно определенный набор числовых значений:

  • используя интуитивно понятные имена
  • , который будет проверен во время компиляции
  • и что IDE распознает для завершения кода.

Если значения не изменятся во время выполнения и являются целочисленными значениями, вы можете использовать перечисление, как показал Марк Рэнсом.

Если значения не изменятся во время выполнения и не являются целочисленными значениями, вы можете использовать переменные #define или const:

#define PART1 1.3
#define PART2 "1233-456"

или

namespace PartNumbers
{
  const double Part1 = 1.3;
  const char* Part2 = "123-456"
}

Если значения могут изменяться во время выполнения, вы можете использовать любой из двух указанных вами вариантов. Обе эти опции имеют тот недостаток, что требуют создания экземпляра объекта, который содержит текущие значения номера детали. Другие параметры проще реализовать и не требуют поиска во время выполнения. Все решается во время компиляции.

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

1 голос
/ 30 апреля 2010

Вы можете использовать:

std::map<string, int> someMapName;

с ключом в качестве строки и фактическим числом в качестве int. Таким образом, вы могли бы использовать

someMapName["idPart1"]

чтобы получить номер. '

EDIT: Если вы согласны с Enumerations, тогда опция 2 будет отлично работать с std :: map вместо строки, ключ будет, очевидно, вашим типом enum

1 голос
/ 30 апреля 2010

Вы можете использовать карту со строкой в ​​качестве ключа.

std::map<string,int> mymap;
mymap["part1"] = value1;
cout << mymap["part1"];
0 голосов
/ 30 апреля 2010

Использовать базу данных.
В частности, таблица, подобная следующей:

+------------------+-------------------+
| Item Name        | Item Number       |
+------------------+-------------------+

Внутренне это может быть представлено как:

std::map<std::string, // The item name
        unsigned int> // The number.

Если вам нужен номер, получите его, используя имя:

std::map<std::string, unsigned int> index_by_name;
//...
std::string part_name = "Part0123";
unsigned int part_number = 0;
part_number = index_by_name[name];

Серьезно, используйте базу данных. Проверьте SQLite и MySQL.

0 голосов
/ 30 апреля 2010

Исходя из ваших комментариев к другим ответам, я бы сказал, что перечисления - это путь, но я бы структурировал их немного иначе.

namespace id {
    enum {
        part1 = 123,
        part2 = 456,
        part3 = 987,
        ...
    };
}

cout << id::part1;
...