В мою тяпничную бошку приходит только кривая идея сделать в классе пустую переменную типа string и передавать ее (типа NULL)... Можно еще свой exception написать, но мне не очень нравится идея прокидывать и ловить их, этот механизм не отличается большой скоростью, имхо...
А, еще можно передавать переменную, а не ссылку на нее, но это тоже не самый быстрый вариант...
hal>В мою тяпничную бошку приходит только кривая идея сделать в классе пустую переменную типа string и передавать ее (типа NULL)... Можно еще свой exception написать, но мне не очень нравится идея прокидывать и ловить их, этот механизм не отличается большой скоростью, имхо...
Не понятна суть вопроса??? что надо сделать??? Пока могу предложить это
hal>В мою тяпничную бошку приходит только кривая идея сделать в классе пустую переменную типа string и передавать ее (типа NULL)... Можно еще свой exception написать, но мне не очень нравится идея прокидывать и ловить их, этот механизм не отличается большой скоростью, имхо...
hal>А, еще можно передавать переменную, а не ссылку на нее, но это тоже не самый быстрый вариант...
Покажи, что ты собираешься возвращать из функции при удачном раскладе. Плюс было бы неплохо узнать, что ты хочешь получить в конечном итоге.
Может я не прав, но локальные переменные создаются в стеке, поэтому они будут уничтожены при завершении процедуры, а возвращаешь ты именно локальную переменную... Другое дело, если, например, член класса вернуть таким образом, или глобальную переменную.
В любой книге, когда рассматривается вопрос "что лучше, указатели или ссылки?" обычно
упоминается, что если, грубо говоря, указатель не может быть нулевым по своей семантике,
то используйте вместо указателя ссылку.
В твоём же случае, похоже, некоторая переменная может либо существовать, либо нет,
так что возможно тебя устроит что-то в стиле
Здравствуйте, Bell, Вы писали:
B>Покажи, что ты собираешься возвращать из функции при удачном раскладе. Плюс было бы неплохо узнать, что ты хочешь получить в конечном итоге.
Т.е. у меня есть map со списком ключей и значений... Мне надо вернуть значение по ключу... А в случае, если ключ не найден, сообщить об этом...
Прошу сильно не пинать, я давно не юзал ни Си, не плюсы... Почему-то решил уж если юзаю плюсы, то буду использовать string и ссылки... Видать мне нужно RTFM про ссылки и указатели и отличия между ними...
Тогда еще вопрос... Будет-ли "красиво" и по стилю делать так:
Здравствуйте, hal, Вы писали:
hal>Здравствуйте, Bell, Вы писали:
B>>Покажи, что ты собираешься возвращать из функции при удачном раскладе. Плюс было бы неплохо узнать, что ты хочешь получить в конечном итоге.
hal>Вот:
hal>
hal>Т.е. у меня есть map со списком ключей и значений... Мне надо вернуть значение по ключу... А в случае, если ключ не найден, сообщить об этом...
Т.е. получается, что ситуация, когда запрашиваемый ключ отсутствует, вполне естественна. В этом случае, ИМХО, указатели подходят больше. В конкретной ситуации можно посткпить так:
Таким образом и управление памятью возложено на std::string, и результат поиска просто интерпретируется. Но это конечно, если потом не трудно будет с указателем работать...
hal>Прошу сильно не пинать, я давно не юзал ни Си, не плюсы... Почему-то решил уж если юзаю плюсы, то буду использовать string и ссылки... Видать мне нужно RTFM про ссылки и указатели и отличия между ними...
ИМХО подход "или только это, или только вот это" — не есть хорошо
hal>Тогда еще вопрос... Будет-ли "красиво" и по стилю делать так: hal>
hal>или все же лучше стринги, ссылки и исключения?
Однозначно тебе на этот вопрос никто не ответит. Конкретное решение всегда должно приниматься на основании конкретных требований. Просто старайся делать так, чтобы эту твою функцию удобно было использовать. Если, к примеру, каждый ее вызов придется оборачивать в try/catch, то заранее готовся к "комплиментам" со стороны пользователей этой функции
Здравствуйте, Bell, Вы писали:
B>ИМХО подход "или только это, или только вот это" — не есть хорошо
Тогда я лучше все переделаю под char... Выделять и удалять память под строки не сложно, а "бардака" в стиле не люблю
hal>>или все же лучше стринги, ссылки и исключения?
B>Однозначно тебе на этот вопрос никто не ответит. Конкретное решение всегда должно приниматься на основании конкретных требований. Просто старайся делать так, чтобы эту твою функцию удобно было использовать. Если, к примеру, каждый ее вызов придется оборачивать в try/catch, то заранее готовся к "комплиментам" со стороны пользователей этой функции
Ок, понял... Правда имея большой опыт программирования на Java, меня не напрягало использование исключений... Может оттого что там все красиво реализовано?
Вот не надо такой стиль подсказывать. А что будет, если этой функцией попытаются воспользоваться два клиента? Когда первый предполагает, что по ссылке ещё то, что вернули ему, а второй уже получил ссылку туда же с новым результатом?
Понятно, что в контексте исходной задачи это неактуально, но всё же.
можн еще юзать std::auto_ptr
выделять в функции память под переменную динамически и засовывать объект в auto_ptr. его же и возвращать через констр. копир.
тогда во внешней ф-ии, когда auto_ptr закончит свою жизнь, он автоматом удалит объект и очистит память.
Здравствуйте, hal, Вы писали:
hal>Тогда я лучше все переделаю под char... Выделять и удалять память под строки не сложно, а "бардака" в стиле не люблю
на самом деле я бу рекомендовал кругом придерживаться одного. и ежели это С++, то использовать только string. так и путаницы меньше и придерживатся одного стиля есть хорошо. поэтому я бы рекомендовал:
bool func(string& result)
а что до твоего варианта, можно возвращать пустую строку или итератор.
хотя-бы как-то так:
Здравствуйте, hal, Вы писали:
hal>Т.е. у меня есть map со списком ключей и значений... Мне надо вернуть значение по ключу... А в случае, если ключ не найден, сообщить об этом... hal>Прошу сильно не пинать, я давно не юзал ни Си, не плюсы... Почему-то решил уж если юзаю плюсы, то буду использовать string и ссылки... Видать мне нужно RTFM про ссылки и указатели и отличия между ними...
Ссылки можно отдавать только на объекты, чья жизнь длиннее, чем жизнь ссылки. Но это так, к вопросу об RTFM...
Предлагаю несколько вариантов решения; выбери наиболее симпатичный.
// возвращать дефолтное значение
string func(const string& key, // обрати внимание: ключ - по смыслу должен быть rvalue или const lvalue,const string& defvalue = string() // дефолтное значение дефолтного значения - пустая строка
)
{
the_map_type::const_iterator it = the_map.find(key);
if(it != the_map.end())
return it->second;
else
return defvalue;
}
int main()
{
..... cout<<func("hello","failure"); .....
}
// возвращать ссылку на дефолтconst string& defvalue() // возвращает ссылку на один и тот же объект
{
static string dv;
return dv;
}
const string& func(const string& key)
{
.....
if(.....) return it->second; else return defvalue();
}
int main()
{
..... if(&func("hello") == &defvalue()) cout<<"failed"; .....
}
// возвращать пару ссылка+флаг
pair<const string&, bool> func(const string& key)
{
static const string dv; // внутренняя константа, служит для создания валидной ссылки
....
if(.....)
return pair<const string&,bool>(it->second, true);
else
return pair<const string&,bool>(dv, false);
// нельзя пользоваться make_pair, т.к. будут потеряны ссылки
}
// пара значение+флаг
pair<string, bool> func(const string& key)
{
.....
if(.....)
return make_pair(it->second,true);
else
return make_pair(string(),false);
}