Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX à chaque
niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX à chaque
niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX à chaque
niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX à chaque
niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Déjà, on peut simplifier en passant par un objet intermédiaire pour
créer des objets de type A :
class createurObjet
{
public:
template <class TYPE>
static TYPE* nouveau()
{
A* obj = new TYPE;
obj->Polish();
return static_cast<TYPE*>(obj);
}
};
et pour l'appel :
A* a = createurObjet::nouveau <A>();
B* b = createurObjet::nouveau <B>();
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX à chaque
niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Déjà, on peut simplifier en passant par un objet intermédiaire pour
créer des objets de type A :
class createurObjet
{
public:
template <class TYPE>
static TYPE* nouveau()
{
A* obj = new TYPE;
obj->Polish();
return static_cast<TYPE*>(obj);
}
};
et pour l'appel :
A* a = createurObjet::nouveau <A>();
B* b = createurObjet::nouveau <B>();
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX à chaque
niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Déjà, on peut simplifier en passant par un objet intermédiaire pour
créer des objets de type A :
class createurObjet
{
public:
template <class TYPE>
static TYPE* nouveau()
{
A* obj = new TYPE;
obj->Polish();
return static_cast<TYPE*>(obj);
}
};
et pour l'appel :
A* a = createurObjet::nouveau <A>();
B* b = createurObjet::nouveau <B>();
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX
à chaque niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Ça peut poser de problèmes si on utilise A ou B comme des
temporaires, mais dans la passée, je me suis servi des objets
spéciaux comme paramètres du constructeur, par exemple :
class FinishA ;
class A
{
public:
A( FinishA const& = FinishA() ) {}
// ...
} ;
class FinishA
{
public:
friend class A ;
FinishA() : owner( NULL ) {}
~FinishA<) { if ( owner != NULL ) owner->Polish() ; }
private:
A* owner ;
} ;
A::A( FinishA const& helper )
{
const_cast< FinishA& >( helper ).owner = this ;
}
Le problème, évidemment, c'est dans des expressions du genre :
« A().uneFonction() », où A::uneFonction serait appelée
avant Polish.
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX
à chaque niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Ça peut poser de problèmes si on utilise A ou B comme des
temporaires, mais dans la passée, je me suis servi des objets
spéciaux comme paramètres du constructeur, par exemple :
class FinishA ;
class A
{
public:
A( FinishA const& = FinishA() ) {}
// ...
} ;
class FinishA
{
public:
friend class A ;
FinishA() : owner( NULL ) {}
~FinishA<) { if ( owner != NULL ) owner->Polish() ; }
private:
A* owner ;
} ;
A::A( FinishA const& helper )
{
const_cast< FinishA& >( helper ).owner = this ;
}
Le problème, évidemment, c'est dans des expressions du genre :
« A().uneFonction() », où A::uneFonction serait appelée
avant Polish.
Pour l'instant, je suis obligé de faire ainsi :
Je déclare mes constructeurs protected, j'ajoute une fonction :
dans A :
static A* NewA() {A* pA=new A; pA->Polish(); return A;}
dans B :
static B* NewB() {B* pB=new B; pB->Polish(); return B;}
Et je construit mes objets via NewA ou NewB
En faisant ainsi, je suis obligé de rajouter une méthode NewX
à chaque niveau d'héritage, ce qui est lourd.
Et comme bien sûr "virtual static" n'existe pas...
Avez vous une meilleure idée ?
Ça peut poser de problèmes si on utilise A ou B comme des
temporaires, mais dans la passée, je me suis servi des objets
spéciaux comme paramètres du constructeur, par exemple :
class FinishA ;
class A
{
public:
A( FinishA const& = FinishA() ) {}
// ...
} ;
class FinishA
{
public:
friend class A ;
FinishA() : owner( NULL ) {}
~FinishA<) { if ( owner != NULL ) owner->Polish() ; }
private:
A* owner ;
} ;
A::A( FinishA const& helper )
{
const_cast< FinishA& >( helper ).owner = this ;
}
Le problème, évidemment, c'est dans des expressions du genre :
« A().uneFonction() », où A::uneFonction serait appelée
avant Polish.
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
On Sat, 27 Sep 2003 17:37:09 GMT, "amerio" wrote:Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Mais là, la fabrique est un template, donc nul besoin de la refaire à
chaque nouvelle classe.
On Sat, 27 Sep 2003 17:37:09 GMT, "amerio" <amerio@hotmail.com> wrote:
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Mais là, la fabrique est un template, donc nul besoin de la refaire à
chaque nouvelle classe.
On Sat, 27 Sep 2003 17:37:09 GMT, "amerio" wrote:Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Mais là, la fabrique est un template, donc nul besoin de la refaire à
chaque nouvelle classe.
"amerio" writes:
|> Je voudrais *garantir* l'appel à une fonction virtuelle juste
|> après la construction d'un objet dérivé.
[...]
|> Et je voudrais :
|> int main()
|> {
|> A a; // je voudrais appeller A::Polish
|> B b; // je voudrais appeller B::Polish (et pas A::Polish)
|> }
[ J.Kanze ] :
class FinishA ;
class A
{
public:
A( FinishA const& = FinishA() ) {}
// ...
} ;
class FinishA
{
public:
friend class A ;
FinishA() : owner( NULL ) {}
~FinishA<) { if ( owner != NULL ) owner->Polish() ; }
private:
A* owner ;
} ;
A::A( FinishA const& helper )
{
const_cast< FinishA& >( helper ).owner = this ;
}
"amerio" <amerio@hotmail.com> writes:
|> Je voudrais *garantir* l'appel à une fonction virtuelle juste
|> après la construction d'un objet dérivé.
[...]
|> Et je voudrais :
|> int main()
|> {
|> A a; // je voudrais appeller A::Polish
|> B b; // je voudrais appeller B::Polish (et pas A::Polish)
|> }
[ J.Kanze ] :
class FinishA ;
class A
{
public:
A( FinishA const& = FinishA() ) {}
// ...
} ;
class FinishA
{
public:
friend class A ;
FinishA() : owner( NULL ) {}
~FinishA<) { if ( owner != NULL ) owner->Polish() ; }
private:
A* owner ;
} ;
A::A( FinishA const& helper )
{
const_cast< FinishA& >( helper ).owner = this ;
}
"amerio" writes:
|> Je voudrais *garantir* l'appel à une fonction virtuelle juste
|> après la construction d'un objet dérivé.
[...]
|> Et je voudrais :
|> int main()
|> {
|> A a; // je voudrais appeller A::Polish
|> B b; // je voudrais appeller B::Polish (et pas A::Polish)
|> }
[ J.Kanze ] :
class FinishA ;
class A
{
public:
A( FinishA const& = FinishA() ) {}
// ...
} ;
class FinishA
{
public:
friend class A ;
FinishA() : owner( NULL ) {}
~FinishA<) { if ( owner != NULL ) owner->Polish() ; }
private:
A* owner ;
} ;
A::A( FinishA const& helper )
{
const_cast< FinishA& >( helper ).owner = this ;
}
En première analyse, je proposerai quelque chose du style, inspiré du Petit
Patron Têtu de Coplien (Curiously Recurring Template Pattern) :
class A
{
public :
virtual void Polish() { cout << "A::Polish" << endl; }
protected :
A() {}
};
class B : public A
{
public :
virtual void Polish() { cout << "B::Polish" << endl; }
protected :
B() {}
};
template< typename T >
class newA : public T
{
public :
newA()
{ getObj().Polish(); }
T& getObj() // pour revenir à des objets de type A, B, etc... en dehors
de leur construction
{ return static_cast< T& >( *this ); }
const T& getObj() const // id...
{ return static_cast< const T& >( *this ); }
};
int main()
{
newA< A > a;
newA< B > b;
return 0;
}
Evidement, cette approche oblige à modifier le code existant...
En première analyse, je proposerai quelque chose du style, inspiré du Petit
Patron Têtu de Coplien (Curiously Recurring Template Pattern) :
class A
{
public :
virtual void Polish() { cout << "A::Polish" << endl; }
protected :
A() {}
};
class B : public A
{
public :
virtual void Polish() { cout << "B::Polish" << endl; }
protected :
B() {}
};
template< typename T >
class newA : public T
{
public :
newA()
{ getObj().Polish(); }
T& getObj() // pour revenir à des objets de type A, B, etc... en dehors
de leur construction
{ return static_cast< T& >( *this ); }
const T& getObj() const // id...
{ return static_cast< const T& >( *this ); }
};
int main()
{
newA< A > a;
newA< B > b;
return 0;
}
Evidement, cette approche oblige à modifier le code existant...
En première analyse, je proposerai quelque chose du style, inspiré du Petit
Patron Têtu de Coplien (Curiously Recurring Template Pattern) :
class A
{
public :
virtual void Polish() { cout << "A::Polish" << endl; }
protected :
A() {}
};
class B : public A
{
public :
virtual void Polish() { cout << "B::Polish" << endl; }
protected :
B() {}
};
template< typename T >
class newA : public T
{
public :
newA()
{ getObj().Polish(); }
T& getObj() // pour revenir à des objets de type A, B, etc... en dehors
de leur construction
{ return static_cast< T& >( *this ); }
const T& getObj() const // id...
{ return static_cast< const T& >( *this ); }
};
int main()
{
newA< A > a;
newA< B > b;
return 0;
}
Evidement, cette approche oblige à modifier le code existant...
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Mais là, la fabrique est un template, donc nul besoin de la refaire à
chaque nouvelle classe.
Oops ! Exact, j'avais lu trop vite, reconnaisant une fabrique !
Effectivement, alors, une Fabrique Template resout mon pb.
Du coup, j'ai deux solutions : soit un Helper parametrisant le constructeur,
soit une Fabrique Template.
(mais les ecritures ne sont pas du tout les mêmes).
Je vais voir ce qui me convient le mieux !
Merci !
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Mais là, la fabrique est un template, donc nul besoin de la refaire à
chaque nouvelle classe.
Oops ! Exact, j'avais lu trop vite, reconnaisant une fabrique !
Effectivement, alors, une Fabrique Template resout mon pb.
Du coup, j'ai deux solutions : soit un Helper parametrisant le constructeur,
soit une Fabrique Template.
(mais les ecritures ne sont pas du tout les mêmes).
Je vais voir ce qui me convient le mieux !
Merci !
Oui, en fait, c'est déjà ce que je fait : j'utilise une "Fabrique".
Mais là, la fabrique est un template, donc nul besoin de la refaire à
chaque nouvelle classe.
Oops ! Exact, j'avais lu trop vite, reconnaisant une fabrique !
Effectivement, alors, une Fabrique Template resout mon pb.
Du coup, j'ai deux solutions : soit un Helper parametrisant le constructeur,
soit une Fabrique Template.
(mais les ecritures ne sont pas du tout les mêmes).
Je vais voir ce qui me convient le mieux !
Merci !
Apres essais, je n'arrive pas à reproduire mon schéma actuel.
Ma fabrique actuelle est un "virtual constructor".
class Kit
{
public :
virtual Entity* NewEntity() const { Entity* pE = new Entity;
pE->Polish(); return
pE;}
}
class KitA : public Kit // A dérive publiquement de Entity
{
public :
virtual Entity* NewEntity() const { Entity* pE = new A;
pE->Polish(); return pE;}
}
idem pour KitB, avec B dérivant publiquement de A
Et je stocke tous ces Kit dans un map<string, Kit*>, de sorte que je fais
A* pA = mykits["A"]->NewEntity(); // A(); A::Polish()
A* pB = mykits["B"]->NewEntity(); // B(); B::Polish()
Apres essais, je n'arrive pas à reproduire mon schéma actuel.
Ma fabrique actuelle est un "virtual constructor".
class Kit
{
public :
virtual Entity* NewEntity() const { Entity* pE = new Entity;
pE->Polish(); return
pE;}
}
class KitA : public Kit // A dérive publiquement de Entity
{
public :
virtual Entity* NewEntity() const { Entity* pE = new A;
pE->Polish(); return pE;}
}
idem pour KitB, avec B dérivant publiquement de A
Et je stocke tous ces Kit dans un map<string, Kit*>, de sorte que je fais
A* pA = mykits["A"]->NewEntity(); // A(); A::Polish()
A* pB = mykits["B"]->NewEntity(); // B(); B::Polish()
Apres essais, je n'arrive pas à reproduire mon schéma actuel.
Ma fabrique actuelle est un "virtual constructor".
class Kit
{
public :
virtual Entity* NewEntity() const { Entity* pE = new Entity;
pE->Polish(); return
pE;}
}
class KitA : public Kit // A dérive publiquement de Entity
{
public :
virtual Entity* NewEntity() const { Entity* pE = new A;
pE->Polish(); return pE;}
}
idem pour KitB, avec B dérivant publiquement de A
Et je stocke tous ces Kit dans un map<string, Kit*>, de sorte que je fais
A* pA = mykits["A"]->NewEntity(); // A(); A::Polish()
A* pB = mykits["B"]->NewEntity(); // B(); B::Polish()