Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат this из метода структуры 
V
    Опции темы
flagist0
Дата 15.7.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Есть структура (по определенным причинам полноценный класс делать нельзя) с множеством полей и набор методов к ней, заполняющих ее поля. 
Решил для большей компактности из заполняющих методов возвращать this, чтобы можно было соединять вызовы в цепочку - obj->set_prop1(1)->set_prop2(2)->set_prop3(3) etc. 
Однако возникает вопрос, как же отслеживать ошибки. Если возвратить NULL, попытка вызова метода по такому указателю вызовет краш. А устанавливать переменную  типа errno и проверять ее после каждого вызова метода -  значит забыть о компактности.
PM MAIL GTalk   Вверх
Daevaorn
Дата 15.7.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Исключания?
PM MAIL WWW   Вверх
flagist0
Дата 15.7.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Спасибо, об этом не подумал (раздел-то для новичков). Все еще думаю в терминах чистых сей smile
PM MAIL GTalk   Вверх
Lazin
Дата 15.7.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Конструкторы?

Добавлено через 2 минуты и 55 секунд
Код

struct obj_t 
{
int a;
int b;
  obj_t(int a, int b) : a(a), b(b) {
    if ( check(a) || check(b) )
      throw std::runtime_error(__FUNCTION__" invalid argument");
  }
};

PM MAIL Skype GTalk   Вверх
flagist0
Дата 15.7.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Для каждого поля? Исключениями наверное проще.
PM MAIL GTalk   Вверх
Lazin
Дата 15.7.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(flagist0 @  15.7.2008,  13:04 Найти цитируемый пост)
Для каждого поля? Исключениями наверное проще. 

один конструктор для всех полей
PM MAIL Skype GTalk   Вверх
flagist0
Дата 15.7.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Спасибо большое!
Один очень глупый вопрос: 
Цитата(Lazin @  15.7.2008,  13:00 Найти цитируемый пост)
 : a(a), b(b) {
 Это что? Инициализация? Или какое-то дополнение к списку параметров?

Добавлено через 3 минуты и 7 секунд
Цитата(Lazin @  15.7.2008,  13:06 Найти цитируемый пост)
один конструктор для всех полей

Вообще я бы так и сделал, но сначала надо минимально инициализировать эту структуру, потом (основываясь на этих данных) другие, а потом уже записать адреса других в поля первой, проверив на пересекаемость и выход за границы.
PM MAIL GTalk   Вверх
bsa
Дата 15.7.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



flagist0, : a(x), b(y) - это инициализация полей класса (или базовых классов).
Вообще-то, если тебе нужно постепенно что-то инициализировать, то логично объединить часть полей в классы, создать им конструкторы... Тогда все будет красиво.
PM   Вверх
Rififi
Дата 15.7.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



flagist0, 
для компактости делаешь функцию set_props и передаешь туда что-то вроде Boost.PropertyTree или свой велоипед
PM MAIL   Вверх
xvr
Дата 17.7.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Daevaorn @ 15.7.2008,  12:55)
Исключания?

У него Embedded система, исключения не поддерживаются  smile 
Boost тоже не желателен, по той же причине  smile 
PM MAIL   Вверх
mes
Дата 17.7.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(flagist0 @  15.7.2008,  12:53 Найти цитируемый пост)
Решил для большей компактности из заполняющих методов возвращать this, чтобы можно было соединять вызовы в цепочку - obj->set_prop1(1)->set_prop2(2)->set_prop3(3) etc. 
Однако возникает вопрос, как же отслеживать ошибки. Если возвратить NULL, попытка вызова метода по такому указателю вызовет краш. 

возврашай не указатель, а ссылку - тогда не будет желания вернуть ноль 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0935 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.