У меня есть список ошибок, который выглядит так:
"ERROR CODE" "POSITION" "Error description""000" "1" "No error""001" "2" "DB Connection error""002" "2" "Error in processing"
и еще много ошибок.
Теперь мне действительно нужно как-то реализовать эти ошибки (ошибки никогда не меняются, они всегда одинаковы), чтобы разработчики, использующие библиотеку, могли легко идентифицировать описание ошибки по заданному ERROR_CODE.
например: char * getError (ERROR_CODE); и вернуть строку описания ошибки, связанной с ERROR_CODE.
Я думал об использовании ENUM. Но я не могу заставить его работать должным образом.
Я думаю, что шаблон класса стандартной библиотеки шаблонов unordered_map или же карта подойдет вашей цели.
Неупорядоченные карты — это ассоциативные контейнеры, в которых хранятся элементы, образованные комбинацией значения ключа и сопоставленного значения, значение ключа обычно используется для уникальной идентификации элемента, тогда как сопоставленное значение является объектом с содержимым, связанным с этим ключом. Элементы в неупорядоченной карте не сортируются ни в каком конкретном порядке ни по их ключу, ни по сопоставленным значениям.
Карты — это ассоциативные контейнеры, в которых хранятся элементы, образованные комбинацией значения ключа и сопоставленного значения, значения ключей обычно используются для сортировки и уникальной идентификации элементов, в то время как сопоставленные значения хранят содержимое, связанное с этим ключом. Внутренне элементы на карте всегда сортируются по ключу.
Контейнеры неупорядоченной карты быстрее, чем контейнеры карты, получают доступ к отдельным элементам по их ключу, хотя они, как правило, менее эффективны для итерации диапазона через подмножество их элементов.
Сохраните свой код ошибки в качестве ключа и структуру (как показано ниже), содержащую описание позиции и ошибки в качестве отображенного значения.
struct error_info{
int position;
char * description;
};
Вот код,
#include <iostream>
#include <map>
using namespace std;
struct error_info{
int position;
char * description;
};
struct error_info get_error(map<int, struct error_info> error_map, int error_code){
return error_map[error_code];
}
int main(){
map<int, struct error_info> error_map;
error_map[000] = {1, (char *)"no error"};
error_map[001] = {2, (char *)"DB connection error"};
error_map[003] = {3, (char *)"error in processing"};
struct error_info info = get_error(error_map, 001);
cout << info.position << " " << info.description << endl;
return 0;
}
Надеюсь, что это поможет вам.
Если коды ошибок являются строковыми, то один из способов сделать это — использовать std::map<std::string, std::string>
,
#include <map>
#include <string>
#include <iostream>
std::map<std::string, std::string> ErrCodeMap =
{ {"000", "No error"},
{"001", "DB Connection error"},
{"002", "Error in processing"} };
std::string getError(const std::string& errCode)
{
auto it = ErrCodeMap.find(errCode);
if ( it != ErrCodeMap.end() )
return it->second;
return "";
}
int main()
{
std::cout << getError("002") << "\n";
}
Если тип данных является int
для кодов ошибок, то std::map<int, std::string>
был бы использован.
#include <map>
#include <string>
#include <iostream>
std::map<int, std::string> ErrCodeMap =
{ {0, "No error"},
{1, "DB Connection error"},
{2, "Error in processing"} };
std::string getError(int errCode)
{
auto it = ErrCodeMap.find(errCode);
if ( it != ErrCodeMap.end() )
return it->second;
return "";
}
int main()
{
std::cout << getError(2) << "\n";
}