Russian Qt Forum
Ноябрь 24, 2024, 03:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Возврат ссылки  (Прочитано 4757 раз)
blood_shadow
Гость
« : Март 11, 2011, 18:41 »

Добрый вечер,
есть ф-ция с такой сигнатурой:
Код
C++ (Qt)
AccountAutorizationData* const& AccountModel::referenceToData(int row) const
{
   try
   {
       if (isIdFromDiapazon(row))
           return modelInternalVector.at(row);
       else
           throw Error_exeption("Row not from diapazon in AccountAutorizationData*"
                   " const& AccountModel::referenceToData()");
   }
   catch(Error_exeption &err)
   {
       qDebug() << err.what();
       return // ????
   }
 
}
то есть ф-ция возвращает ссылку на константный указатель на объект класса AccountAutorizationData,
вопрос состоит в следующем что лучше вернуть если выполнение пойдет по ветке else?
есть идея вернуть
Код
C++ (Qt)
return &AccountAutorizationData()
, но компилер жалуется на то что
я возвращаю указатель на временную переменную, нормально ли это?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Март 11, 2011, 18:48 »

А смысыл в try, catch внутри функции??
Уж тогда так:
Код
C++ (Qt)
AccountAutorizationData* const& AccountModel::referenceToData(int row) const throw(Error_exeption)
{
       if (isIdFromDiapazon(row))
           return modelInternalVector.at(row);
 
       throw Error_exeption("Row not from diapazon in AccountAutorizationData*"
                   " const& AccountModel::referenceToData()");
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Fat-Zer
Гость
« Ответ #2 : Март 11, 2011, 18:51 »

1) на кой понадобилось возвращать ссылку на указатель
2) не вижу здесь смысла в обработке исключений...
3) так нельзя. надо или возвращать 0, как ошибку, или завести "пустой" статический объект и возвращать указатель на него
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Март 11, 2011, 18:53 »

И вообще есть уже стандартный тип исключения при таких ситуациях:
std::out_of_range в
#include <stdexcept>
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
blood_shadow
Гость
« Ответ #4 : Март 11, 2011, 19:15 »

1) на кой понадобилось возвращать ссылку на указатель
у меня массив указателей на созданные объекты, потому и надо возвращать ссылку для ф-ции типа "получить данные" и для ф-ции
типа "изменить данные внутри модели"

3) так нельзя. надо или возвращать 0, как ошибку, или завести "пустой" статический объект и возвращать указатель на него
никогда не создавал статических объектов.. завел в самом определения класса пустой объект
Код
C++ (Qt)
AccountAutorizationData expAUTH;
я так понимаю что если модель только одна и создается в куче, то фактически статический объект эквивалентен обычному?
Записан
Fat-Zer
Гость
« Ответ #5 : Март 11, 2011, 20:03 »

1) всё равно не понял... ну да ладно...
3) если ч правильно понял, то возвращать ссылку на expAUTH можно, однако ИМХО более правильное рещение m_ax
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 12, 2011, 20:07 »

Добрый вечер,
есть ф-ция с такой сигнатурой:
Код
C++ (Qt)
AccountAutorizationData* const& AccountModel::referenceToData(int row) const
..
}
На мой вгляд, эта конструкция "заумно нездорова". По существу (если не обращать внимания на C++ навороты) Вы написали AccountAutorizationData **, а это всегда "напрягает мозги". Плюс Вы берете указатель на элемент вектора - а это работает до (какого-то числа) push_back, erase и.т.п. Незатейливый код здесь ИМО легче и лучше

Код
C++ (Qt)
const AccountAutorizationData * AccountModel::GetRowData(int row) const
{
return isIdFromDiapazon(row) ? modelInternalVector[row] : 0;
}
 
void AccountModel::SetRowData(int row, AccountAutorizationData * data)
{
if (!isIdFromDiapazon(row))
 throw "Invalid Row";
delete modelInternalVector[row];
modelInternalVector[row] = data;
}
А со ссылкой здесь хорошие шансы "влипнуть" т.к. она не имеет той "свободы присваивания" что указатель


Записан
blood_shadow
Гость
« Ответ #7 : Март 12, 2011, 21:08 »

А со ссылкой здесь хорошие шансы "влипнуть" т.к. она не имеет той "свободы присваивания" что указатель
спасибо, все поправил, действительно ссылки на указатели были избыточны..
кстати, а как лучше, создание объекта лучше локализовать в отдельной ф-ции, и не разбрасывать по всему коду?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 12, 2011, 21:32 »

кстати, а как лучше, создание объекта лучше локализовать в отдельной ф-ции, и не разбрасывать по всему коду?
Если это безобидно, напр
Код
C++ (Qt)
AccountAutorizationData * aa_data = new AccountAutorizationData();
 
То почему бы и не разбросать?  Улыбающийся Др. дело если надо чтобы только какой-то конкретный класс может/должен создавать (а не всякий). Если ясно "чей" (какого класса) это должен быть метод - создавайте метод, иначе нет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.164 секунд. Запросов: 22.