smart pointers i VC++
3 отговора
186 прегледа
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);
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);
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;
}
-------------------------------
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;
}
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
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
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;
}
т.е. - създавай обект от 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;
}