2010-04-29 4 views
2

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

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

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

Любые предложения?

+0

Я бы избегал метода Enumeration, потому что вам постоянно приходилось добавлять список перечислений при добавлении новых частей. – Robb

+0

Вам нужно будет добавить что-то для новой части, но вы их сохраните. – Rachel

ответ

2

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

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

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

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

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

или

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

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

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

+0

Они устанавливаются во время выполнения. Я свалил свои варианты на два, которые я упомянул, но оба чувствовали себя неловко. Я надеялся получить либо более аккуратный способ сделать это, либо сказать, что не было более простого способа и что один из вариантов был приемлемым. – Rachel

1

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

std::map<string,int> mymap; 
mymap["part1"] = value1; 
cout << mymap["part1"]; 
+0

Мне не нравится идея, когда пользователь должен знать точную строку, которая служит ключом. – Rachel

+0

@Rachel, ваши примеры показывают, что пользователю необходимо знать строку, как имена членов структуры или теги перечисления. Я не понимаю этого возражения. –

+0

Я предполагаю, что личные предпочтения, но перечисляемые литералы и члены структуры появляются с intellisense, оставляя намного меньше места для ошибок, чем ввод имени строки. И компилятор их ловит. – Rachel

1

Вы могли бы использовать:

std::map<string, int> someMapName; 

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

someMapName["idPart1"] 

, чтобы захватить номер. '

EDIT: Если вы нормально с Перечисления то вариант 2 будет работать отлично с станд :: карте только вместо строки, ключ будет ваш тип перечисления очевидно.

+0

Я бы хотел, чтобы пользователь не вводил строку. Как правило, слишком много места для ошибок. – Rachel

+0

@Rachel не имеет права вводить что-либо оставить место для ошибки? И действительно ли что-нибудь может ввести пользователь, который имеет меньше возможностей для ошибки, чем ввод чисел напрямую? –

0

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

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

cout << id::part1; 
0

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

+------------------+-------------------+ 
| 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.

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