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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции NULL-pointer'а 
:(
    Опции темы
borisbn
Дата 24.11.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



День добрый.
Есть такая распространённая задача: в конструкторе класса передаётся объект, функции которого вызываются в других функциях класса.
Псевдокод:
Код

class ИмяКласса {
    ИмяКласса( ТипОбъекта * объект ) : m_объект( объект ) {}
    void foo() { if ( объект ) объект->foo(); }
...
    ТипОбъекта * m_объект;

В случае, когда объект ( указатель на него ) ни в каких случаях не может быть нулём есть смысл сделать ссылкой. В случае, когда объект может быть не создан ( NULL ) приходится проверять: if ( объект ).
Так вот, хочу избавиться от if ( объект ). как-то так
Код

#include <УниверсальнаяОбёрткаНадОбъектом.h>
class ИмяКласса {
    ИмяКласса( ТипОбъекта * объект ) : m_универсальнаяОбёрткаНадОбъектом( объект ) {}
    void foo() { m_универсальнаяОбёрткаНадОбъектом.foo(); }
...
    УниверсальнаяОбёрткаНадОбъектом< ТипОбъекта > m_универсальнаяОбёрткаНадОбъектом;

Не могу сообразить как это сделать. И возможно ли это вообще.

P.S. УниверсальнаяОбёрткаНадОбъектом ессно не должна знать о классе ТипОбъекта.
P.P.S. #define SAFE_CALL( объект, ф-ция, парамтеры ) не предлагать, т.к. не люблю макросы и код становится не читаемым.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 24.11.2010, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



тернарное выражение?
PM WWW   Вверх
azesmcar
Дата 24.11.2010, 05:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Код

template <typename T>
class safe_wrapper
{
private:
    T* object;
public:
    safe_wrapper(T* o) : object(o) {}
    T* operator -> ()
    {
        if (!object)
            throw std::runtime_error("null pointer exception");
        return object;
    }
};

?
PM   Вверх
borisbn
Дата 24.11.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



boostcoder, не совсем ( вернее совсем нет smile ). Выражение типа
Код

(объект) ? объект->foo() : void()

ничем не лучше, чем
Код

if ( объект ) объект->foo();

я просто хочу сделать класс-обёртку над любым указателем на объект, который бы транслировал вызовы функций объекту, если он не 0, и НИЧЕГО не делал бы в другом случае.

azesmcar, я рассматриваю случай, когда не созданный объект это НЕ ИСКЛЮЧИТЕЛЬНАЯ, а НОРМАЛЬНАЯ ситуация. Чтобы не дать возможность создавать 0-й объект лучше использовать ссылку.
Т.о. я хочу что-то типа:
Код

template <typename T>
class safe_wrapper
{
private:
    T* object;
public:
    safe_wrapper(T* o) : object(o) {}
    вызов_любой_функции_объекта()
    {
        if ( object )
            вызов_этой_функции();
        else
            do_nothing();
    }
};

...

safe_wrapper< ObjType > o_wrap( obj );
o_wrap.foo( 1, "qwerty" );
o_wrap.bar( x, y, z );


Наверное, это просто невозможно, но чем чёрт не шутит ... Может всемирный разум что-нибудь придумает smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 24.11.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(borisbn @  24.11.2010,  09:43 Найти цитируемый пост)
azesmcar, я рассматриваю случай, когда не созданный объект это НЕ ИСКЛЮЧИТЕЛЬНАЯ, а НОРМАЛЬНАЯ ситуация. Чтобы не дать возможность создавать 0-й объект лучше использовать ссылку.

Не думаю, что это возможно. Из кода вызывается функция и если программа продолжает свое выполнение эта функция  должна что-то выполнить. Можно выкрутиться макросами или совершать вызов через указатель на функцию, но я бы так не делал.

Цитата(borisbn @  24.11.2010,  09:43 Найти цитируемый пост)
Может всемирный разум что-нибудь придумает

Я честно пробовал, не получилось smile  smile 
PM   Вверх
borisbn
Дата 24.11.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(azesmcar @  24.11.2010,  10:06 Найти цитируемый пост)
Можно выкрутиться макросами или совершать вызов через указатель на функцию, но я бы так не делал

Если это будет выглядеть как
Код

obj_wrap.foo( параметры );

то можно, конечно, и макросами, хотя не хочется.
А как сделать через указатель на функцию - что-то не соображу.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 24.11.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(borisbn @  24.11.2010,  10:13 Найти цитируемый пост)
А как сделать через указатель на функцию - что-то не соображу. 

как-то так..и перегрузить для нескольких аргументов, но это извращение.
Код

template <typename T>
void safe_call(T* ptr, void (T::*function)())
{
    if (ptr)
        (ptr->*function)();
}

PM   Вверх
Леопольд
Дата 24.11.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  24.11.2010,  10:21 Найти цитируемый пост)
как-то так..и перегрузить для нескольких аргументов, но это извращение.
Код
template <typename T, typename ... Args>
void safe_call(T* ptr, void (T::&function)(Args...), Args ... args)
{
    if (ptr)
        ptr->function(args ...);
}

Когда ж, уже новый стандарт примут...

Это сообщение отредактировал(а) Леопольд - 24.11.2010, 13:45


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 24.11.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Леопольд

Все равно извращение smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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