HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > [C++] Виртуальный умный указатель?!
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Ph03n1x
4упакабра

Группа: Неопытный
Дата регистрации: Jan 2014
Проживает: (void)
Сообщений: 24

Рейтинг



[C++] Виртуальный умный указатель?!

Сабж
Насколько (не)оправданно предоставлять из dll виртуальный интерфейс умного указателя?
Допустим, есть интерфейс A (реализация которого владеет массивом объектов B), через который можно получать указатели на объекты B по их именам. Объекта может и не быть в массиве и тогда A вернёт пустой указатель. Имеет ли смысл возвращать вместо него указатель на другой объект с семантикой умного указателя для типов массива B или же разумнее возвращать указатель на сам объект из B и передавать его внутрь уже реализации нашего умного указателя в клиентском коде?

Сообщить модератору | | IP: Записан
Сообщение: 160957

Старое сообщение 12-11-2016 17:30
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Ничего не понял в описанном, но могу сказать наверняка: возвращение любых указателей, хоть умных, хоть глупых, это признак плохого дизайна.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 160960

Старое сообщение 12-11-2016 17:45
-
Ph03n1x
4упакабра

Группа: Неопытный
Дата регистрации: Jan 2014
Проживает: (void)
Сообщений: 24

Рейтинг



Ну, тогда предположим, что умный указатель возвращается по ссылке, т.к. гарантированно должен быть валиден. Но вопрос не в этом, а в том, есть ли смысл возвращать именно умный указатель вместо сырого?

Сообщить модератору | | IP: Записан
Сообщение: 160961

Старое сообщение 12-11-2016 17:53
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Да нормальные указатели, если чётко всё обговорить. Возвращать - не плохо. Плохо когда, как в халфе, когда аргумент на строку в движке считается чем-то константным (ну я статью писал). Вот за такое реально ушы отрывать следовало.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 160969

Старое сообщение 12-11-2016 19:01
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Ph03n1x писал:
Но вопрос не в этом, а в том, есть ли смысл возвращать именно умный указатель вместо сырого?

Возвращать умный указатель из другого модуля в общем случае нельзя. Хотя бы потому, что в дебаге и релизе они могут быть разными, и ты ставишь пользователя библиотеки в зависимость от типа сборки. То же касается STL-контейнеров, хэндлов и т.п. Всё это, имхо, плохой дизайн.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 160970

Старое сообщение 12-11-2016 19:10
-
Ph03n1x
4упакабра

Группа: Неопытный
Дата регистрации: Jan 2014
Проживает: (void)
Сообщений: 24

Рейтинг



Он в виде указателя на виртуальный интерфейс передаётся, в том и фишка
Но проблема может возникнуть в другом - либо на каждый IFoo* свой ISmartFoo*, либо один общий, через который, как через бутылочное горлышко, происходит взаимодействие со всеми IFoo*. Ну и есть вариант завести пул умных указателей, что, как по мне, ненужное усложнение. Думаю, что лучше всего - оставить как есть и выдавать указатель на IFoo*, а на другой стороне заворачивать в смарт

Сообщить модератору | | IP: Записан
Сообщение: 160973

Старое сообщение 12-11-2016 19:28
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



Цитата:
XaeroX писал:
Всё это, имхо, плохой дизайн.

А хороший какой? Передача указателя аргументом функции на in-place обработку?

Сообщить модератору | | IP: Записан
Сообщение: 160974

Старое сообщение 12-11-2016 19:31
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
nemyax писал:
А хороший какой? Передача указателя аргументом функции на in-place обработку?

Полагаю, что да.
Цитата:
Ph03n1x писал:
на другой стороне заворачивать в смарт

Зачем?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 160975

Старое сообщение 12-11-2016 19:33
-
Ph03n1x
4упакабра

Группа: Неопытный
Дата регистрации: Jan 2014
Проживает: (void)
Сообщений: 24

Рейтинг



Цитата:
XaeroX писал:
nemyax писал:
Передача указателя аргументом функции на in-place обработку?


А зачем, если у нас указатель не на структуру, а на вирт.интерфейс?

C++ Source Code:
1
// Вы предлагаете так?
2
struct barrel
3
{
4
  int rolls;
5
};
6
 
7
void DoABarrelRoll(struct barrel *pbarrel)
8
{
9
  pbarrel->rolls++;
10
};
11
 
12
// Я предоставляю указатель на ООП-интерфейс
13
struct IBarrel
14
{
15
  virtual void DoARoll() = 0;
16
};
17
 
18
class CBarrel : public IBarrel
19
{
20
public:
21
  void DoARoll(){rolls++;}
22
private:
23
  int rolls;
24
};
25
 
26
struct IBarrelProvider
27
{
28
  virtual IBarrel *GetBarrel() = 0;
29
};
30
 
31
IBarrelProvider *gpBarrelProvider = GetBarrelProvider();
32
gpBarrelProvider->GetBarrel()->DoARoll(); // если бочку получать в виде смарта, то можно обращаться прямо так

Отредактировано Ph03n1x 12-11-2016 в 20:04

Сообщить модератору | | IP: Записан
Сообщение: 160979

Старое сообщение 12-11-2016 19:56
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34515
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Ph03n1x
Ещё раз - зачем тут смарты?
Когда спрашивают про возвращение смарта из библиотеки, я представляю что-то вроде такого:

C++ Source Code:
shared_ptr<Foo> get_data( int my_arg )
{
  return shared_ptr<Foo>( new Foo( my_arg ) );
}

А это превращает код в implementation-specific, потому что нет никакой гарантии, что вызывающий код использует точно такой же shared_ptr, что и библиотека. Например, библиотека использовала std::shared_ptr, а пользовательский код использует boost::shared_ptr.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 160980

Старое сообщение 12-11-2016 20:46
-
Ph03n1x
4упакабра

Группа: Неопытный
Дата регистрации: Jan 2014
Проживает: (void)
Сообщений: 24

Рейтинг



XaeroX
Как раз таки этого я и избегаю, т.к. причину ты сам указал

А я про кастомный смарт, оформленный в виде виртуального интерфейса и не затрагивающий ничего импл-зависимого
Чтобы не нужно было каждый раз проверять на валидность + возвращать дефолтные значения (хардкодные или указанные в арг-ах к функции)

C++ Source Code:
1
IFoo *pFoo = pFooProvider->GetFoo("abc");
2
if(!pFoo)
3
  NULL_PTR_ALARM();
4
 
5
IFooRef *pFooRef = pFooProvider->GetFooRef("abc");
6
int nBar = pFooRef->GetBar();
7
 
8
class CFooRef : public IFooRef
9
{
10
public:
11
  void Set(IFoo *apFoo){mpFoo = apFoo;}
12
  IFoo *Get(){return mpFoo;}
13
 
14
  int GetBar(/*int nDefBar*/)
15
  {
16
    if(mpFoo)
17
      return mpFoo->GetBar();
18
 
19
    return 0; // nDefBar
20
  };
21
private:
22
  IFoo *mpFoo;
23
};

Отредактировано Ph03n1x 12-11-2016 в 21:06

Сообщить модератору | | IP: Записан
Сообщение: 160981

Старое сообщение 12-11-2016 21:00
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 06:29. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > [C++] Виртуальный умный указатель?!
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024