Je bloque un peu sur mon problème la; je souhaite interdire l'opérateur new sur un objet pour forcer a utiliser une fonction "create" :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <cstdlib>
#include <cstdio>
class refcountable
{
public:
template< typename T >
static T* create()
{
return new T;
}
template< typename T, typename P1 >
static T* create(P1 p1)
{
return new T(p1);
}
private:
void* operator new(const size_t size) { return ::operator new(size); }
void operator delete(void* memory) { return ::operator delete(memory); }
};
struct A : public refcountable
{
A() { };
A(int& i) { };
}; |
ainsi ici, on ne peut plus ecrirel'objectif au final c'est que la méthode create renvoie au final un smart pointer au lieu du raw pointeur, du coup on a plus moyen d'avoir un pointeur sur A
(en ajoutant que l'opérateur & sera interdit... niark niark)
interdiant donc totalement le raw pointeur. c'est du moins l'objectif.
Mais ici je suis face a un petit problème :
avant il etait impossible d'appeler
1 2 3 4 5
| A a(1);
main.cc:32: error: no matching function for call to 'A::A(int)'
main.cc:26: note: candidates are: A::A(int&)
main.cc:25: note: A::A()
main.cc:24: note: A::A(const A&) |
mais la, il est parfaitement possible d'appeler
A* a = refcountable::create<A>(1);
PIRE (et dangereux)
1 2
| A a;
A a2(a); //copie de a |
se transforme en :
1 2
| A* a = refcountable::create<A>();
A* a2 = refcountable::create<A>(*a); // la fonction create va recevoir un temporaire qui va etre créé, puis détruit, on a plus la référence directe sur a |
comment puis-je résoudre ces problèmes ? vous voyez ou je veux en venir ?
Partager