smart pointers i VC++

3 отговора 186 прегледа
#1

smart pointers i VC++

znae li njakoj kak napravja smart pointer,kojto VC-to da se suglasi da go compile-ne, kojto da poddurja koversija ot smart poiter kum child class kum smart pointer na parent
demek ako imame
class Base {};
class Derived : public Base {};

void doIT(sptr<Base> spBase);

sptr<Derived> spTheChild(new Derived());

da moga da izvikam doIT(spTheChild);

Отговор
в отговор на zet #2

Re: smart pointers i VC++

Нещо такова трябва да върши работа:
-------------------------------
template<class T> class auto_ptr
{
public:
typedef T element_type;
explicit auto_ptr(T *p = 0) throw() :
ptr(p)
{
}
auto_ptr(const auto_ptr<T>& rhs);
auto_ptr<T>& operator=(auto_ptr<T>& rhs);
~auto_ptr()
{
delete ptr;
}
T& operator*() const throw()
{
return *ptr;
}
T* operator->() const throw()
{
return ptr;
}
operator T*() const
{
return ptr;
}
private:
T* ptr;
};

class CBase
{
public:
int y;
};

class CDerived : public CBase
{
public:
int y;
};

void f(CBase* p)
{
p->y = 1;
}

int main()
{
auto_ptr<CDerived> p(new CDerived);
f(p);
return 0;
}

Отговор
в отговор на Zelen #3

Re: smart pointers i VC++

a,da,i propusnah da spomena che variant da sus implicitna(ili kakva da e druga konversija) kum primitivnija ukazatel e nepriemliv
takiva konversii pri smart poiterite sa dokazano loshi, a i dori da e explicitna konversijata ako primertno smart pointera mi e reference counting se obezmislja idejata

Отговор
в отговор на zet #4

Re: smart pointers i VC++

Използвай нещо подобно:
т.е. - създавай обект от CDerived тип и го
ползвай през CBase pointer.
=============================
template<class T> class auto_ptr
{
public:
explicit auto_ptr(T *p = 0) throw() :
ptr(p)
{
}
auto_ptr(const auto_ptr<T>& rhs);
auto_ptr<T>& operator=(auto_ptr<T>& rhs);
~auto_ptr()
{
delete ptr;
}
T& operator*() const throw()
{
return *ptr;
}
T* operator->() const throw()
{
return ptr;
}
protected:
T* ptr;
};

class CBase
{
public:
CBase() :
y1(0)
{
}
virtual ~CBase()
{
}
virtual void f()
{
y1 = 1;
}
protected:
int y1;
};

class CDerived : public CBase
{
public:
CDerived() :
y2(0)
{
}
virtual ~CDerived()
{
}
virtual void f()
{
y1 = 2;
}
public:
int y2;
};

void f(auto_ptr<CBase>& p)
{
p->f();
}

int main()
{
CDerived* pd = new CDerived;
auto_ptr<CBase> p_auto(pd);
f(p_auto);
pd->y2 = 4;
return 0;
}

Отговор