аналог CComPtr
От: SVV Беларусь  
Дата: 19.02.13 16:14
Оценка: :)
Доброго всем времени суток,

хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)
class CTest
{
public:
    int square (int x){return x*x;}
};
template<typename T>
class CPtr
{
public:
    CPtr (){p=NULL;}
protected:
    T *p;
};
...
CPtr<CTest> o1, *p1=&o1;
o1.square (2);// чтобы это работало надо что-то добавлять в CPtr, не могу понять что
p1->square (3);// чтобы это работало надо что-то добавлять в CPtr, не могу понять что

т.е. хочется чтобы CPtr был незаметен (не создавал неудобства доступа к функциям и данным CTest. Такое возможно?
Re: аналог CComPtr
От: Losar Россия  
Дата: 19.02.13 16:20
Оценка:
boost::shared_ptr или std::shared_ptr те в помощь.

overquoting, top-posting
Re: аналог CComPtr
От: c-smile Канада http://terrainformatica.com
Дата: 19.02.13 16:27
Оценка:
Здравствуйте, SVV, Вы писали:

SVV>Доброго всем времени суток,


SVV>хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)


Если сами объекты не содержат счетчика и add_ref()/release() то скорее всего тебе нужен auto_ptr:
http://en.wikipedia.org/wiki/Auto_ptr

Обрати внимание там на
X*     operator->() const throw();


это то про что ты спрашиваешь.
Re: аналог CComPtr
От: Evgeny.Panasyuk Россия  
Дата: 19.02.13 16:36
Оценка:
Здравствуйте, SVV, Вы писали:

SVV>хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)


class CTest
{
public:
    int square (int x){return x*x;}
};
 
int main()
{
    CTest o1, *p1=&o1;
    o1.square (2);
    p1->square (3);
}

Re: аналог CComPtr
От: pzhy  
Дата: 19.02.13 16:43
Оценка: :)
Здравствуйте, SVV, Вы писали:

SVV>Доброго всем времени суток,


SVV>хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)

SVV>
SVV>class CTest
SVV>{
SVV>public:
SVV>    int square (int x){return x*x;}
SVV>};
SVV>template<typename T>
SVV>class CPtr
SVV>{
SVV>public:
SVV>    CPtr (){p=NULL;}
SVV>protected:
SVV>    T *p;
SVV>};
SVV>...
SVV>CPtr<CTest> o1, *p1=&o1;
SVV>o1.square (2);// чтобы это работало надо что-то добавлять в CPtr, не могу понять что
p1->>square (3);// чтобы это работало надо что-то добавлять в CPtr, не могу понять что
SVV>

SVV>т.е. хочется чтобы CPtr был незаметен (не создавал неудобства доступа к функциям и данным CTest. Такое возможно?

Перегрузить операции . и -> .Или взять std::shared_ptr или std::unique_ptr. Если нужны подсчеты ссылок с своим действием по завершению boost::weak_ptr.
Но *p1=&o1 — самоубиство, или я не понял что вам надо
Re[2]: аналог CComPtr
От: robin_of_the_wood Россия  
Дата: 19.02.13 16:43
Оценка: 1 (1)
Здравствуйте, c-smile, Вы писали:

CS>Если сами объекты не содержат счетчика и add_ref()/release() то скорее всего тебе нужен auto_ptr:

CS>http://en.wikipedia.org/wiki/Auto_ptr

CS>Обрати внимание там на

CS>
CS>X*     operator->() const throw();
CS>



Там самое главное вот это не упустить:

The auto_ptr has semantics of strict ownership, meaning that the auto_ptr instance is the sole entity responsible for the object's lifetime. If an auto_ptr is copied, the source loses the reference.


Иногда это не совсем то, что хотелось
Проектирование велосипедов для слепых жирафов
Re[2]: аналог CComPtr
От: Evgeny.Panasyuk Россия  
Дата: 19.02.13 16:48
Оценка: 1 (1)
Здравствуйте, pzhy, Вы писали:

P>Перегрузить операции . и ->


научи перегружать точку
максимум что можно с ней сделать — отнаследоваться

class CTest
{
public:
    int square (int x){return x*x;}
};

template<typename T>
struct CPtr: T
{
};

int main()
{
    CPtr<CTest> o1, *p1=&o1;
    o1.square (2);
    p1->square (3);
}
Re: аналог CComPtr называется std::shared_ptr... ;)
От: Erop Россия  
Дата: 19.02.13 16:56
Оценка: 1 (1) +1
Здравствуйте, SVV, Вы писали:


SVV>т.е. хочется чтобы CPtr был незаметен (не создавал неудобства доступа к функциям и данным CTest. Такое возможно?


Точку перегрузить незаметно нельзя.
-> можно.
то есть можно сделать такой класс, что он будет вести себя в коде так же, как ведёт себя указатель.

Смотри std::auto_ptr, а в новом C++ посмотри на std::shared_ptr и std::unique_ptr ну и вообще заботай содержимое хедера <memory>, там много интересного найдёшь ты, хотя, судя по CComPtr, более актуальное найдёшь тут...
Ещё можно погуглить по словам "умный указатель", "smart pointer"...

Всё-таки я думаю, что это таки тролинг, но троллинг зачётный
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: аналог CComPtr
От: о_О
Дата: 19.02.13 16:57
Оценка: 2 (1)
Здравствуйте, SVV, Вы писали:

всё уже написано: std::unique_ptr, std::shared_ptr
Re[2]: аналог CComPtr
От: Константин Россия  
Дата: 19.02.13 17:06
Оценка: 2 (1) +1
Здравствуйте, c-smile, Вы писали:

CS>Если сами объекты не содержат счетчика и add_ref()/release() то скорее всего тебе нужен auto_ptr:


Зачем же предлагать auto_ptr? Он error-prone + deprecated.
Лучше прямые аналоги без детских болезней:
— std::unique_ptr (C++11)
— boost::scoped_ptr (C++03)
Re[3]: аналог CComPtr
От: pzhy  
Дата: 19.02.13 17:19
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, pzhy, Вы писали:


P>>Перегрузить операции . и ->


EP>научи перегружать точку


Ступил... Позор мне.
Re[2]: аналог CComPtr называется std::shared_ptr... ;)
От: SVV Беларусь  
Дата: 19.02.13 17:33
Оценка: 15 (1) :)
E>
Всё-таки я думаю, что это таки тролинг, но троллинг зачётный

не, не троллинг. случайно так получилось
Re: аналог CComPtr
От: Кодт Россия  
Дата: 19.02.13 19:10
Оценка: 2 (1)
Здравствуйте, SVV, Вы писали:

SVV>хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)


Про shared_ptr и unique_ptr уже сказали, ну а CComPtr — это разновидность указателя с интрузивным подсчётом ссылок, — см. boost::intrusive_ptr.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.