Здравствуйте, hal, Вы писали:
hal>Здравствуйте, Bell, Вы писали:
B>>Покажи, что ты собираешься возвращать из функции при удачном раскладе. Плюс было бы неплохо узнать, что ты хочешь получить в конечном итоге.
hal>Вот:
hal>hal>string& CGIRequest::operator[](string& key) {
hal> CGIRequestMap::iterator iter;
hal> iter = m_variables.find(key);
hal> return iter->second;
hal>}
hal>
hal>Т.е. у меня есть map со списком ключей и значений... Мне надо вернуть значение по ключу... А в случае, если ключ не найден, сообщить об этом...
Т.е. получается, что ситуация, когда запрашиваемый ключ отсутствует, вполне естественна. В этом случае, ИМХО, указатели подходят больше. В конкретной ситуации можно посткпить так:
const char* CGIRequest::operator[](const string& key) {
CGIRequestMap::iterator iter;
iter = m_variables.find(key);
if(variables.end() != iter)
return iter->second.c_str();
else
return 0;
}
Таким образом и управление памятью возложено на std::string, и результат поиска просто интерпретируется. Но это конечно, если потом не трудно будет с указателем работать...
hal>Прошу сильно не пинать, я давно не юзал ни Си, не плюсы... Почему-то решил уж если юзаю плюсы, то буду использовать string и ссылки... Видать мне нужно RTFM про ссылки и указатели и отличия между ними...
ИМХО подход "или только это, или только вот это" — не есть хорошо
hal>Тогда еще вопрос... Будет-ли "красиво" и по стилю делать так:
hal>hal>char* method() {
hal> char* value;
hal> ............
hal> if (...) {
hal> return value;
hal> } else {
hal> return NULL;
hal> }
hal>}
hal>
hal>или все же лучше стринги, ссылки и исключения?
Однозначно тебе на этот вопрос никто не ответит. Конкретное решение всегда должно приниматься на основании конкретных требований. Просто старайся делать так, чтобы эту твою функцию удобно было использовать. Если, к примеру, каждый ее вызов придется оборачивать в try/catch, то заранее готовся к "комплиментам" со стороны пользователей этой функции