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

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

Страниц: [1] 2 3 ... 6   Вниз
  Печать  
Автор Тема: Scoped  (Прочитано 37963 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 14, 2013, 14:36 »

Добрый день

Код
C++ (Qt)
MyOpaqueRef * ref = CreateOpaqueRef(name);
....
// return; ???
...
DestroyOpaqueRef(ref);
 
К сожалению, в теле я не могу удобно выскакивать return'ом, т.к. обязан сделать DestroyOpaqueRef. Возвращаемый ref по существу handle, он не имеет delete. Я могу его "обернуть" во что-то зовущеее Destroy в деструкторе, но выходит накладно/длинновато. А есть ли способ короче/выразительнее?

Спасибо  
« Последнее редактирование: Июль 14, 2013, 14:41 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 14, 2013, 14:45 »

можно попробовать через макрос:
Код
C++ (Qt)
#define RETURN_AND_DELETE_REF(ref) DestroyOpaqueRef(ref); return
 
MyOpaqueRef * ref = CreateOpaqueRef(name);
...
RETURN_AND_DELETE_REF(ref);
...
RETURN_AND_DELETE_REF(ref) 0;

или покрасивее, чтобы нормально возвращаемое значение передать (точно не помню только как правильно __VA_ARGS пишется):
Код
C++ (Qt)
#define RETURN_AND_DELETE_REF(ref) DestroyOpaqueRef(ref, ...) DestroyOpaqueRef(ref); return __VA_ARGS
 
MyOpaqueRef * ref = CreateOpaqueRef(name);
...
RETURN_AND_DELETE_REF(ref);
...
RETURN_AND_DELETE_REF(ref, 0);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Июль 14, 2013, 14:50 »

Я могу его "обернуть" во что-то зовущеее Destroy в деструкторе, но выходит накладно/длинновато.
Покажите пожалуйста свой код. Не представляю, что там может быть длинно и накладно.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июль 14, 2013, 14:51 »

можно попробовать через макрос:
А что это даст?
Разрушаться объект все равно не будет при выходе из области видимости.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #4 : Июль 14, 2013, 14:56 »

Использовать, например std::unique_ptr. Ему можно задать пользовательский делитер..
http://en.cppreference.com/w/cpp/memory/unique_ptr

 
Записан

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

Arch Linux Plasma 5
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июль 14, 2013, 15:08 »

можно попробовать через макрос:
А что это даст?
Разрушаться объект все равно не будет при выходе из области видимости.
просто при выходе из области видимости — не будет, придется руками вызывать DestroyOpaqueRef(), а при выходе из функции — будет. если функция возвращает void, то придется в конце дописывать либо DestroyOpaqueRef() либо макрос.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 14, 2013, 15:27 »

Покажите пожалуйста свой код. Не представляю, что там может быть длинно и накладно.
Код
C++ (Qt)
struct CScoped_OpaqueRef {
CScoped_OpaqueRef( OpaqueRef * ref ) : mRef(ref) {}
      ~CScoped_OpaqueRef( void ) { if (mRef) DestroyOpaqueRef(mRef); }
operator OpaqueRef * ( void ) { return mRef; }
 
void operator = ( OpaqueRef * ref )
{
if (mRef != ref) {
if (mRef) DestroyOpaqueRef(mRef);
mRef = ref;
}
}
 
private:
OpaqueRef * mRef;
CScoped_OpaqueRef( const CScoped_OpaqueRef & ref ) {}
void operator = ( const CScoped_OpaqueRef & ref ) {}
};
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Июль 14, 2013, 15:31 »

...
Так а в чем "длинность и накладность"? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июль 14, 2013, 15:37 »

...
Так а в чем "длинность и накладность"? Улыбающийся
Ну напр есть десяток таких opaque с разными дестроями...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #9 : Июль 14, 2013, 15:38 »

Покажите пожалуйста свой код. Не представляю, что там может быть длинно и накладно.
Код
C++ (Qt)
struct CScoped_OpaqueRef {
CScoped_OpaqueRef( OpaqueRef * ref ) : mRef(ref) {}
      ~CScoped_OpaqueRef( void ) { if (mRef) DestroyOpaqueRef(mRef); }
operator OpaqueRef * ( void ) { return mRef; }
 
void operator = ( OpaqueRef * ref )
{
if (mRef != ref) {
if (mRef) DestroyOpaqueRef(mRef);
mRef = ref;
}
}
 
private:
OpaqueRef * mRef;
CScoped_OpaqueRef( const CScoped_OpaqueRef & ref ) {}
void operator = ( const CScoped_OpaqueRef & ref ) {}
};
 

И к чему было этот велосипед городить?

Код
C++ (Qt)
std::unique_ptr<OpaqueRef, DestroyOpaqueRef> ref = CreateOpaqueRef(name);
 
Записан

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

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Июль 14, 2013, 15:39 »

Ну напр есть десяток таких opaque с разными дестроями...
Да хоть сто питсот. Улыбающийся
Есть же шаблоны.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #11 : Июль 14, 2013, 15:43 »

Ну напр есть десяток таких opaque с разными дестроями...
Да хоть сто питсот. Улыбающийся
Есть же шаблоны.


шаблоны - это  не тру) Не для творческих личностей)
Записан

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

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Июль 14, 2013, 15:51 »

шаблоны - это  не тру) Не для творческих личностей)
Ну я думаю, что времена, когда тру программист должен страдать уже прошли. За замученный вид заказчики уже не доплачивают. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Июль 14, 2013, 15:56 »

Код
C++ (Qt)
std::unique_ptr<OpaqueRef, DestroyOpaqueRef> ref = CreateOpaqueRef(name);
 
Вроде "подходит", но только с С++ 11?

Есть же шаблоны.
Видимо придется  Плачущий

И к чему было этот велосипед городить?
..
шаблоны - это  не тру) Не для творческих личностей)
Не умничайте, задача будет - быстро слетит весь глянец   Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #14 : Июль 14, 2013, 15:58 »

Вроде "подходит", но только с С++ 11?
В boost'е тоже есть умные указатели)
Записан

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

Arch Linux Plasma 5
Страниц: [1] 2 3 ... 6   Вверх
  Печать  
 
Перейти в:  


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