Конвертирувание Enum значения в String
enum Month {jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec};
в string
с названиями, а enum можно передавать как индекс:
string months[12] = {"january","february",...};
month[jan];
типа того, только enum неплохо было бы задать с нуля (jan = 0)
month[jan];
[/LEFT]
[/LEFT]
тогда вообще лучше
чтоб память не занимать:)
В данном случае это нетривиально))))
Тогда уж:
char* months[13] = {"0" , "january", "february", ...}Это же массив указателей на строки, а не на числовой тип :)
[/LEFT]
В данном случае это нетривиально))))
Тогда уж:
char* months[13] = {"0" , "january", "february", ...}Это же массив указателей на строки, а не на числовой тип :)
[/LEFT]
а что, указатель нулевым быть не может?
Что ты подразумеваешь под удобством, если будут все равно использоваться имена типа "jan"
с названиями, а enum можно передавать как индекс:
string months[12] = {"january","february",...};
month[jan];
типа того, только enum неплохо было бы задать с нуля (jan = 0)
если enum задать з нуля конструктор
Date(int dd=0, Month mm=Month(0), int yy=0)
теряет смысл, если будет создаватса обэкт Date по дефолту
А случайное изменение элемента неконстантного массива неизбежно :D
А случайное изменение элемента неконстантного массива неизбежно :D
+1
:) ups забыл
Конечно же может. Но в таком случае он задаётся нулевым для начала отчёта при поиске или нахождении конца (но не обращении). А обычно при обращении по адресу 0х00 в С++ программа аварийно завершается(чтоб такого не произошло я и написал "0" :-)).
В этом случае я подразумеваю то, что обращение будет начинаться в порядке следования месяца 1,2,3,4....12 (а не 0,1,2,...11))))) Удобно же согласись
А случайное изменение элемента неконстантного массива неизбежно :D
Да уж ! :D
Date(int dd=0, Month mm=Month(0), int yy=0)
теряет смысл, если будет создаватса обэкт Date по дефолту
Ну конструктор по дэфолту и инициализирует обэкт при его создании...чё-то я Вас не понимаю.. Автор, объясните пожалуйста поподробнее свою задачу, а то из ваших постов, например мне, практически ничегошеньки не понятно.....
Опишите что имеете, какие соображения, какие наработки ,что нужно зделать конкретнее, плиз)))) А то пока что известно что конструктор почему-то теряет смысл....
Опять не совсем понятно, допустим можно воспользоватттьься конструкцией типа связанных списков :D
[/LEFT]
Вот я и имею в виду, что конвертить будем не произвольное число, а значение типа enum -> с числами вообще работать не будем, только при задании этого enum-а :)
Из этих же соображений я и написал нулевой указатель, т.к. на него мы и не должны попасть, а если попадем -> сразу найдется бага, а не надо будет проверять где-то на "0", но это лирика;)
Ладно, пусть с 0 разобрались, а другие числа < 0 и > 12 учитывать не будем?
Я бы при конвертации вообще вставил проверку на диапазон, думаю так будет правильней чем вставлять всякие "error" или "0" на нулевой идекс в массиве
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==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,
если не по ссылке, объект то все-равно копируется? ;)
[/LEFT]
[/LEFT]
+1,
а то автор уже разрешился :) а мы тут демагогию разводим и цепляемся друг к другу ;)
если функция возвращает не встроенный тип, то обычно по значению должны возвращатся константные объекты. Это обеспечит ошибку при компиляции, в случае попытки изменения временного объекта со стороны вызывающей функцией.
В этом случае я подразумеваю то, что обращение будет начинаться в порядке следования месяца 1,2,3,4....12 (а не 0,1,2,...11))))) Удобно же согласись
Да уж ! :D
Ну конструктор по дэфолту и инициализирует обэкт при его создании...чё-то я Вас не понимаю.. Автор, объясните пожалуйста поподробнее свою задачу, а то из ваших постов, например мне, практически ничегошеньки не понятно.....
Опишите что имеете, какие соображения, какие наработки ,что нужно зделать конкретнее, плиз)))) А то пока что известно что конструктор почему-то теряет смысл....
Опять не совсем понятно, допустим можно воспользоватттьься конструкцией типа связанных списков :D
[/LEFT]
Я читаю книгу "Язык программирования С++ специальное издание" Страуструпа там в главе 10 есть задание зделать клас Date, в етой главе часть класа уже есть но не полностю, некотарие функцыи обявлени но неопределены. Я себе постановил задчу доделать етот клас.
Я думал что взамен перечеслению можно использовать масив строк, но мне стало интересно, а если использовать перечесления.
Я хочу написать функцыю что виводила дату в строковом представлении,
например Date(10, 5, 1996) -> 10 May 1996. Тип int я конвертирувал а на перечеслении застряг.
Вот и вся задача.
В етом класе я хочу зделать кеш, чтоб в ньом хранилось строковое представление даты,хотя впринцепе он здесь не нужен.
Вот через ето у меня проблема.
P.S Клас Date я хочу реализовать без большых изменений.
Чтоб он практически не отличалса от части класа который уже есть в книге.