хочу сделать нечто аналогичное 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. Такое возможно?
Здравствуйте, SVV, Вы писали:
SVV>Доброго всем времени суток,
SVV>хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)
Здравствуйте, 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);
}
Здравствуйте, 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 — самоубиство, или я не понял что вам надо
Здравствуйте, 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.
SVV>т.е. хочется чтобы CPtr был незаметен (не создавал неудобства доступа к функциям и данным CTest. Такое возможно?
Точку перегрузить незаметно нельзя. -> можно.
то есть можно сделать такой класс, что он будет вести себя в коде так же, как ведёт себя указатель.
Смотри std::auto_ptr, а в новом C++ посмотри на std::shared_ptr и std::unique_ptr ну и вообще заботай содержимое хедера <memory>, там много интересного найдёшь ты, хотя, судя по CComPtr, более актуальное найдёшь тут...
Ещё можно погуглить по словам "умный указатель", "smart pointer"... Всё-таки я думаю, что это таки тролинг, но троллинг зачётный
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, c-smile, Вы писали:
CS>Если сами объекты не содержат счетчика и add_ref()/release() то скорее всего тебе нужен auto_ptr:
Зачем же предлагать auto_ptr? Он error-prone + deprecated.
Лучше прямые аналоги без детских болезней:
— std::unique_ptr (C++11)
— boost::scoped_ptr (C++03)
Здравствуйте, SVV, Вы писали:
SVV>хочу сделать нечто аналогичное CComPtr, только не для интерфейсов, а для простых объектов (чтобы не забывать удалять объекты)
Про shared_ptr и unique_ptr уже сказали, ну а CComPtr — это разновидность указателя с интрузивным подсчётом ссылок, — см. boost::intrusive_ptr.