par mon précédent question, je souhaite que boost::shared_ptr<A>
était en fait une sous-classe de A
(ou peut-être A*
) afin qu'il puisse être utilisé dans les méthodes qui ont A*
comme leur argument.C++: Création d'un objet partagé <T> basé sur un modèle plutôt qu'un shared_ptr <T> objet
Tenir compte de la classe suivante:
class A
{
public:
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};
Dans la question précédente, j'ai proposé la création d'un objet SharedA pour prendre soin de cela, et on peut supposer qu'il fait.
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;
};
Il serait pensée Grrrrrrrreat, si je pouvais créer une classe de modèle pour prendre soin de tout cela pour moi.
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;
};
Si je devais cela, (ainsi que les constructeurs appropriés dans Shared<T>
), alors que je pouvais faire ce qui suit:
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();
Questions:
Est-ce utile ? Ou est son utilité seulement dans les cas de coin où vous avez affaire à un code particulièrement mauvais. Par exemple:
vide aFunctionYouHaveToUse (A * a) { /certains algorithme utile puis/
supprimer un; }Est-il possible de construire une telle classe de modèles? (Je suppose que vous avez besoin de réflexion, non?) Si vous pouvez le construire, comment?
Si vous voulez passer un shared_ptr à une fonction, ne pouvez-vous pas faire en sorte que la fonction prenne un const A & et déréférencer le pointeur? –
N'est-ce pas vraiment une copie de votre dernière question? Je ne vois pas comment une stratégie de mise en œuvre différente change fondamentalement ce que vous demandez. –
Impossible de penser à une situation où cela serait utile. – ronag