За мой предыдущий question, я хочу, чтобы boost::shared_ptr<A>
был на самом деле подкласс A
(или, возможно, A*
), так что она может быть использована в методах, которые имели A*
, как их аргумент.C++: Создание шаблонного Shared <T> объекта, а не shared_ptr <T> объект
Рассмотрим следующий класс:
class A
{
public:
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};
В предыдущем вопросе, я предложил создать объект SharedA, чтобы заботиться об этом, и, предположительно, он делает.
class SharedA : public A
{
public:
SharedA(A* a) : mImpl(a){}
virtual void setX(int x) {mImpl->setX(x);}
virtual int getX() const {return mImpl->getX();}
private:
boost::shared_ptr<A> mImpl;
};
Было бы Grrrrrrrreat мысль, если бы я мог создать шаблонный класс, чтобы заботиться о все это для меня.
template <class T>
class Shared : public T
{
public:
SharedT(T* t) : mImpl(t)
{
//What kind of crazy voodoo goes here?
}
private:
boost::shared_ptr<T> mImpl;
};
Если бы я это (вместе с соответствующими конструкторами в Shared<T>
), то я мог бы сделать следующее:
A* indestructo_A = new Shared<A>(new A(100));
A* indestructo_A_clone = new Shared<A>(indestructo_A);
delete indestructo_A
cout << "Indestructo-A back with a vengence!" << indestructo_A_clone.getX();
Вопросы:
Является ли это полезным ? Или это его утилита только в угловых случаях, когда вы имеете дело с особенно плохим кодом. Например:
недействительным aFunctionYouHaveToUse (А * а) { /некоторые полезные алгоритма, а затем/
удалить; }Возможно ли построить такой шаблонный класс? (Думаю, вам нужно размышление, верно?) Если вы можете его построить, как?
Если вы хотите передать shared_ptr функции, не можете ли вы просто заставить функцию взять const A & и разыменовать указатель? –
Разве это не просто дубликат вашего последнего вопроса? Я не вижу, как другая стратегия реализации существенно изменяет то, что вы просите. –
Невозможно представить себе ситуацию, когда это было бы полезно. – ronag