Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Конвертирувание Enum значения в String

26K
03 апреля 2007 года
oyuskiv
5 / / 31.03.2007
Помогите конвертирувать такое перечесление
enum Month {jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec};
в string
12K
03 апреля 2007 года
__AleXX__
133 / / 02.04.2007
если имеется в виду в названия месяцев -> заведи массив string
с названиями, а enum можно передавать как индекс:

string months[12] = {"january","february",...};

month[jan];

типа того, только enum неплохо было бы задать с нуля (jan = 0)
502
04 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
string months[12] = {"january","february",...};

month[jan];

 
Код:
char* months[13] = {"error", "january", "february", ...}
Тогда можно инициализиовать с 1, для удобства.
[/LEFT]
12K
04 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Цитата: Jail
[LEFT]
 
Код:
char* months[13] = {"error", "january", "february", ...}
Тогда можно инициализиовать с 1, для удобства.
[/LEFT]





тогда вообще лучше

 
Код:
char* months[13] = {0, "january", "february", ...}

чтоб память не занимать:)
502
04 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
чтоб память не занимать:)


В данном случае это нетривиально))))
Тогда уж:
char* months[13] = {"0" , "january", "february", ...}Это же массив указателей на строки, а не на числовой тип :)
[/LEFT]

12K
04 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Цитата: Jail
[LEFT]
В данном случае это нетривиально))))
Тогда уж:
char* months[13] = {"0" , "january", "february", ...}Это же массив указателей на строки, а не на числовой тип :)
[/LEFT]



а что, указатель нулевым быть не может?

Цитата:
Тогда можно инициализиовать с 1, для удобства.


Что ты подразумеваешь под удобством, если будут все равно использоваться имена типа "jan"

26K
04 апреля 2007 года
oyuskiv
5 / / 31.03.2007
Цитата: __AleXX__
если имеется в виду в названия месяцев -> заведи массив string
с названиями, а enum можно передавать как индекс:

string months[12] = {"january","february",...};

month[jan];

типа того, только enum неплохо было бы задать с нуля (jan = 0)


если enum задать з нуля конструктор
Date(int dd=0, Month mm=Month(0), int yy=0)
теряет смысл, если будет создаватса обэкт Date по дефолту

26K
04 апреля 2007 года
oyuskiv
5 / / 31.03.2007
мне нужно имено перечесление а не масив:(
12K
04 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Если класс Date твой, то внем для конвертации можно определить статический массив строк, как я описал
309
04 апреля 2007 года
el scorpio
1.1K / / 19.09.2006
А ещё лучше - константный массив строк. Точнее, нужно использовать константы, или долго будете искать, почему вместо названий месяцев программа вдруг начнёт выдавать лабуду всякую :)
А случайное изменение элемента неконстантного массива неизбежно :D
12K
04 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Цитата: el scorpio
А ещё лучше - константный массив строк. Точнее, нужно использовать константы, или долго будете искать, почему вместо названий месяцев программа вдруг начнёт выдавать лабуду всякую :)
А случайное изменение элемента неконстантного массива неизбежно :D



+1

:) ups забыл

502
04 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]
Цитата:
а что, указатель нулевым быть не может?

Конечно же может. Но в таком случае он задаётся нулевым для начала отчёта при поиске или нахождении конца (но не обращении). А обычно при обращении по адресу 0х00 в С++ программа аварийно завершается(чтоб такого не произошло я и написал "0" :-)).

Цитата:
Что ты подразумеваешь под удобством, если будут все равно использоваться имена типа "jan"

В этом случае я подразумеваю то, что обращение будет начинаться в порядке следования месяца 1,2,3,4....12 (а не 0,1,2,...11))))) Удобно же согласись

Цитата:
А ещё лучше - константный массив строк. Точнее, нужно использовать константы, или долго будете искать, почему вместо названий месяцев программа вдруг начнёт выдавать лабуду всякую :)
А случайное изменение элемента неконстантного массива неизбежно :D

Да уж ! :D

Цитата:
если enum задать з нуля конструктор
Date(int dd=0, Month mm=Month(0), int yy=0)
теряет смысл, если будет создаватса обэкт Date по дефолту

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

Цитата:
мне нужно имено перечесление а не масив

Опять не совсем понятно, допустим можно воспользоватттьься конструкцией типа связанных списков :D




[/LEFT]

12K
05 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Цитата:
В этом случае я подразумеваю то, что обращение будет начинаться в порядке следования месяца 1,2,3,4....12 (а не 0,1,2,...11))))) Удобно же согласись



Вот я и имею в виду, что конвертить будем не произвольное число, а значение типа enum -> с числами вообще работать не будем, только при задании этого enum-а :)
Из этих же соображений я и написал нулевой указатель, т.к. на него мы и не должны попасть, а если попадем -> сразу найдется бага, а не надо будет проверять где-то на "0", но это лирика;)

Ладно, пусть с 0 разобрались, а другие числа < 0 и > 12 учитывать не будем?

Я бы при конвертации вообще вставил проверку на диапазон, думаю так будет правильней чем вставлять всякие "error" или "0" на нулевой идекс в массиве

361
05 апреля 2007 года
Odissey_
661 / / 19.09.2006
enum mon{ jan=1,feb,mart }

const string operator~ (mon m)
{
if (m==jan)
return string("jan");
... //можно и switch вместо if
return string("error");
}
используем:
mon tm=jan;
cout << (~tm);
12K
05 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Цитата: Odissey_
enum mon{ jan=1,feb,mart }

const string operator~ (mon m)
{
if (m==jan)
return string("jan");
... //можно и switch вместо if
return string("error");
}
используем:
mon tm=jan;
cout << (~tm);




Функция громоздковата,
я бы предложил:
тот же оператор, только:
const string operator~ (mon m)
{
if (m<1 && m>12)
{
return "error";
// или throw exception(); кому как приятнее
}
else
{
return month[m];
}
}

где month - массив константных статич. стрингов, имен месяцев в общем

и не только из-за громоздкости, а что если набор месяцев поменяется (я имею в виду если бы мы не месяцы использовали, а что-то чаще меняющееся) то пришлось бы функцию переписывать?


ЗЫ: такой вопросик: зачем возвращать const string,
если не по ссылке, объект то все-равно копируется? ;)

502
05 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]__AleXX__, Odissey_....Аффтор же сказал, что ему не нужен массив...и чё-то с конструктором ему не нравится там....ему нужна реализация с помощью класса. Короче, предлагаю дождаться аффтора, пускай всё подробно описывает, а то мы тут сами с собой разговариваем :D :D :D
[/LEFT]
12K
05 апреля 2007 года
__AleXX__
133 / / 02.04.2007
Цитата: Jail
[LEFT]__AleXX__, Odissey_....Аффтор же сказал, что ему не нужен массив...и чё-то с конструктором ему не нравится там....ему нужна реализация с помощью класса. Короче, предлагаю дождаться аффтора, пускай всё подробно описывает, а то мы тут сами с собой разговариваем
[/LEFT]



+1,
а то автор уже разрешился :) а мы тут демагогию разводим и цепляемся друг к другу ;)

361
05 апреля 2007 года
Odissey_
661 / / 19.09.2006
Про const, Саттер:
если функция возвращает не встроенный тип, то обычно по значению должны возвращатся константные объекты. Это обеспечит ошибку при компиляции, в случае попытки изменения временного объекта со стороны вызывающей функцией.
26K
05 апреля 2007 года
oyuskiv
5 / / 31.03.2007
Цитата: Jail
[LEFT]Конечно же может. Но в таком случае он задаётся нулевым для начала отчёта при поиске или нахождении конца (но не обращении). А обычно при обращении по адресу 0х00 в С++ программа аварийно завершается(чтоб такого не произошло я и написал "0" :-)).
В этом случае я подразумеваю то, что обращение будет начинаться в порядке следования месяца 1,2,3,4....12 (а не 0,1,2,...11))))) Удобно же согласись
Да уж ! :D
Ну конструктор по дэфолту и инициализирует обэкт при его создании...чё-то я Вас не понимаю.. Автор, объясните пожалуйста поподробнее свою задачу, а то из ваших постов, например мне, практически ничегошеньки не понятно.....
Опишите что имеете, какие соображения, какие наработки ,что нужно зделать конкретнее, плиз)))) А то пока что известно что конструктор почему-то теряет смысл....
Опять не совсем понятно, допустим можно воспользоватттьься конструкцией типа связанных списков :D




[/LEFT]



Я читаю книгу "Язык программирования С++ специальное издание" Страуструпа там в главе 10 есть задание зделать клас Date, в етой главе часть класа уже есть но не полностю, некотарие функцыи обявлени но неопределены. Я себе постановил задчу доделать етот клас.
Я думал что взамен перечеслению можно использовать масив строк, но мне стало интересно, а если использовать перечесления.
Я хочу написать функцыю что виводила дату в строковом представлении,
например Date(10, 5, 1996) -> 10 May 1996. Тип int я конвертирувал а на перечеслении застряг.
Вот и вся задача.

26K
05 апреля 2007 года
oyuskiv
5 / / 31.03.2007
Вот ашник класа Date который я себе набросил.
В етом класе я хочу зделать кеш, чтоб в ньом хранилось строковое представление даты,хотя впринцепе он здесь не нужен.
Вот через ето у меня проблема.



P.S Клас Date я хочу реализовать без большых изменений.
Чтоб он практически не отличалса от части класа который уже есть в книге.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог