Я реализовал следующий смарт-класс шаблона указатель:Cast полиморфного смарт-объект указатель
#ifndef __ProjectManager__mSharedPtr__
#define __ProjectManager__mSharedPtr__
#include <stdio.h>
#include "RefCount.h"
template <class T>
class mSmartPtr {
T *data;
RefCount *rc;
public:
mSmartPtr(T* srcPtr);
mSmartPtr(const mSmartPtr&);
~mSmartPtr();
T* operator->() const;
T& operator*() const;
mSmartPtr<T>& operator=(mSmartPtr&);
mSmartPtr<T> operator()(mSmartPtr&);
};
template<class T>
mSmartPtr<T> mSmartPtr<T>::operator()(mSmartPtr<T>& src) {
return dynamic_cast<??>(src);
}
template <class T>
mSmartPtr<T>::mSmartPtr(T *srcPtr):
data(srcPtr) {
rc = new RefCount();
rc->add();
}
template<class T>
mSmartPtr<T>::~mSmartPtr() {
if (rc->remove() == 0) {
delete data;
delete rc;
}
}
template<class T>
mSmartPtr<T>::mSmartPtr(const mSmartPtr<T> &src):
data(src.data), rc(src.rc) {
rc->add();
}
template <class T>
T* mSmartPtr<T>::operator->() const {
return data;
}
template<class T>
T& mSmartPtr<T>::operator*() const {
return &data;
}
template <class T>
mSmartPtr<T>& mSmartPtr<T>::operator=(mSmartPtr<T> &src) {
if (this != &src) {
if (rc->remove() == 0) {
delete data;
delete rc;
}
data = src.data;
rc = src.rc;
rc->add();
}
return *this;
}
#endif /* defined(__ProjectManager__mSharedPtr__) */
давайте сказать, что мое приложение содержит следующие классы:
class Base
{
protected:
...
public:
virtual ~Base() =0;
...
};
class Derived1 : public Base
{
protected:
...
public:
virtual ~Derived1() {}
...
};
class Derived2 : public Base
{
protected:
...
public:
virtual ~Derived2() {}
...
};
и мне нужно хранить данные по следующему пути :
int int main(int argc, char const *argv[])
{
std::vector<mSmartPtr<Base>> v;
mSmartPtr<Derived1> d1 = foo();
v.push_back(d1);
return 0;
}
Мне нужно как-то исправить литой оператор, но как? как получить базовый класс в динамическом броске?
Возможный дубликат [SmartPointer: литой между базовыми и производными классами] (http://stackoverflow.com/questions/5633695/smartpointer-cast-between-base-and-derived-classes) – Guvante
Я пробовал это раньше, это не говоря о литовом операторе, который я ищу, чтобы получить исправление – itorra
Не имеет прямого отношения к вопросу, но, поскольку я был [сказал] (http://stackoverflow.com/questions/28866571/c-multi-index- map-implementation # comment45998667_28866571): имена с двумя ведущими символами подчеркивания зарезервированы для использования в компиляторах и стандартных библиотеках: http://stackoverflow.com/questions/228783 – SU3