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" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
A* a = refcountable::create<A>(1);
PIRE (et dangereux)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
A a;
A a2(a); //copie de a
se transforme en :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?