J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.
ma classe I_A est instanciee par:
I_A* myClass = new A();
cependant, j'ai un probleme pour le destructeur. quand je fais:
delete myClass;
je ne passe pas dans le corp de ~A()
Si je passe ~A() en virtuel ca ne change rien.
Si je declare un constructeur absatrait a I_A:
virtual ~I_A() = 0;
je linker me dis qu'il ne trouve pas la definition de ~I_A et ne peut
proceder.
Avez vous une idee de comment resoudre mon problem?
J'ai vaguement entendu parler de classes virtuelles (virtual class???)
ou d'heritage virtuel: est-ce la reponse a mon probleme?????
J'ai un p'tit probleme de destructeur. Je voudrai creer une classe virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont abstraites (virtual = 0) et qui n'a pas d'attributs.
Ce n'est pas la définition d'une classe virtuelle pure. Ca correspond plus à ce que JAVA appèlle une intrface, et qui est souvent AMA une mauvaise idée en C++.
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?
Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça serait une bien mauvaise idée de créer un nouveau catégorie de type, interface, in C++. Comme c'était une mauvaise idée en Java.
S'il parle de l'utilisation, c'est autre chose. J'utilise bien des « interfaces » en C++. Mais la définition n'est pas la même que le mot clé « interface » en Java -- en fait, même en Java, quand je veux écrire une « interface » (sens logique), je suis obligée à utiliser une classe abstraite, et non une interface (mot clé). Et encore, parce qu'en générale, dans une classe d'interface, les fonctions virtuelles sont privées, ce qui n'est même pas possible en Java.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Jean-Marc Bourguet <jm@bourguet.org> wrote in message
news:<pxbptdpqibm.fsf@news.bourguet.org>...
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
Philippe Mesmeur wrote:
J'ai un p'tit probleme de destructeur. Je voudrai creer une
classe virtuelle pure, c'est a dire une classe dont TOUTES les
methodes sont abstraites (virtual = 0) et qui n'a pas d'attributs.
Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?
Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça
serait une bien mauvaise idée de créer un nouveau catégorie de type,
interface, in C++. Comme c'était une mauvaise idée en Java.
S'il parle de l'utilisation, c'est autre chose. J'utilise bien des
« interfaces » en C++. Mais la définition n'est pas la même que le mot
clé « interface » en Java -- en fait, même en Java, quand je veux écrire
une « interface » (sens logique), je suis obligée à utiliser une classe
abstraite, et non une interface (mot clé). Et encore, parce qu'en
générale, dans une classe d'interface, les fonctions virtuelles sont
privées, ce qui n'est même pas possible en Java.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
J'ai un p'tit probleme de destructeur. Je voudrai creer une classe virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont abstraites (virtual = 0) et qui n'a pas d'attributs.
Ce n'est pas la définition d'une classe virtuelle pure. Ca correspond plus à ce que JAVA appèlle une intrface, et qui est souvent AMA une mauvaise idée en C++.
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?
Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça serait une bien mauvaise idée de créer un nouveau catégorie de type, interface, in C++. Comme c'était une mauvaise idée en Java.
S'il parle de l'utilisation, c'est autre chose. J'utilise bien des « interfaces » en C++. Mais la définition n'est pas la même que le mot clé « interface » en Java -- en fait, même en Java, quand je veux écrire une « interface » (sens logique), je suis obligée à utiliser une classe abstraite, et non une interface (mot clé). Et encore, parce qu'en générale, dans une classe d'interface, les fonctions virtuelles sont privées, ce qui n'est même pas possible en Java.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
kanze
Philippe Mesmeur wrote in message news:...
Je suis tout a fait d'accord avec toi quand tu parles d'interface. C'est meme ma signification que je donne au "I" de ma classe "I_A" ;-)
Pour moi, une interface est une definition mais pas une implementation.
C'est une définition de l'interface du type, sans l'implémentation de son comportement.
C'est pour ca que je veux faire en sorte que ma classe I_A ai toutes ces methodes abstraite, i.e. virtual = 0.
Ne confondons pas le concepte et son implémentation. En C++, une interface s'implémente au moyen d'une classe.
Note bien que même en Java, il n'est pas rare d'implémenter le concepte d'interface au moyen d'une classe abstraite (c'est même la seule façon, pour peu qu'on veut être rigueureux), et d'utiliser l'interface du langage pour d'autres choses qui n'ont rien à voir avec le concepte logique d'interface. En général, quelque soit le langage, il ne faut pas s'attendre à ce que le fait qu'un mot clé du langage correspond à un concepte qu'il y a identité entre les utilisations de ce mot clé et le concepte.
En C++, l'idiome classique d'une interface, en ce qui me concerne, est :
class I { public: virtual ~I() {} void f() { // Vérifier les préconditions... doF() ; // Vérifier les postconditions... } int g() { // Vérifier les préconditions... int result = doG() ; // Vérifier les postconditions... return result ; } // ... protected: I() {}
private: I( I const& ) ; I& operator=( I const& ) ;
Le caractèristique principal, c'est que pour chaque fonction publique, il y a une fonction privée virtuelle correspondante. Typiquement, il n'y a pas de membres données, et le destructeur est inline pour qu'on voit immédiatement qu'il n'a pas de sémantique. Les fonctions publiques peuvent aussi être inline, parce que tout ce qu'elles contient est le contrat, qui fait partie de l'interface. C'est aussi plutôt rare qu'une interface supporte la copie et l'affectation, d'où les déclarations privées (et la declaration du constructeur de copie fait qu'il me faut une définition d'au moins un autre constructeur).
Mais c'est ma convention ; il y en a d'autres. Même chez moi, j'ai un autre idiome pour les visiteurs et les callback (où les fonctions virtuelles sont publiques), même si logiquement, il s'agit aussi d'une sorte d'interface.
Ainsi, je voudrai faire en sorte qu'il n'y ai pas de code pour I_A::~I_A(); D'apres ce que je comprend de ta reponse, tu me dis que je suis quand meme oblige de le faire, meme si c'est du code vide, style:
I_A::~I_A() {}
C'est bien ca?
Oui.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Philippe Mesmeur <pmes@ocegr.fr> wrote in message
news:<4002C4A9.4050802@ocegr.fr>...
Je suis tout a fait d'accord avec toi quand tu parles d'interface.
C'est meme ma signification que je donne au "I" de ma classe "I_A" ;-)
Pour moi, une interface est une definition mais pas une
implementation.
C'est une définition de l'interface du type, sans l'implémentation de
son comportement.
C'est pour ca que je veux faire en sorte que ma classe I_A ai toutes
ces methodes abstraite, i.e. virtual = 0.
Ne confondons pas le concepte et son implémentation. En C++, une
interface s'implémente au moyen d'une classe.
Note bien que même en Java, il n'est pas rare d'implémenter le concepte
d'interface au moyen d'une classe abstraite (c'est même la seule façon,
pour peu qu'on veut être rigueureux), et d'utiliser l'interface du
langage pour d'autres choses qui n'ont rien à voir avec le concepte
logique d'interface. En général, quelque soit le langage, il ne faut pas
s'attendre à ce que le fait qu'un mot clé du langage correspond à un
concepte qu'il y a identité entre les utilisations de ce mot clé et le
concepte.
En C++, l'idiome classique d'une interface, en ce qui me concerne, est :
class I
{
public:
virtual ~I() {}
void f()
{
// Vérifier les préconditions...
doF() ;
// Vérifier les postconditions...
}
int g()
{
// Vérifier les préconditions...
int result = doG() ;
// Vérifier les postconditions...
return result ;
}
// ...
protected:
I() {}
private:
I( I const& ) ;
I& operator=( I const& ) ;
Le caractèristique principal, c'est que pour chaque fonction publique,
il y a une fonction privée virtuelle correspondante. Typiquement, il n'y
a pas de membres données, et le destructeur est inline pour qu'on voit
immédiatement qu'il n'a pas de sémantique. Les fonctions publiques
peuvent aussi être inline, parce que tout ce qu'elles contient est le
contrat, qui fait partie de l'interface. C'est aussi plutôt rare qu'une
interface supporte la copie et l'affectation, d'où les déclarations
privées (et la declaration du constructeur de copie fait qu'il me faut
une définition d'au moins un autre constructeur).
Mais c'est ma convention ; il y en a d'autres. Même chez moi, j'ai un
autre idiome pour les visiteurs et les callback (où les fonctions
virtuelles sont publiques), même si logiquement, il s'agit aussi d'une
sorte d'interface.
Ainsi, je voudrai faire en sorte qu'il n'y ai pas de code pour
I_A::~I_A(); D'apres ce que je comprend de ta reponse, tu me dis que
je suis quand meme oblige de le faire, meme si c'est du code vide,
style:
I_A::~I_A()
{}
C'est bien ca?
Oui.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Je suis tout a fait d'accord avec toi quand tu parles d'interface. C'est meme ma signification que je donne au "I" de ma classe "I_A" ;-)
Pour moi, une interface est une definition mais pas une implementation.
C'est une définition de l'interface du type, sans l'implémentation de son comportement.
C'est pour ca que je veux faire en sorte que ma classe I_A ai toutes ces methodes abstraite, i.e. virtual = 0.
Ne confondons pas le concepte et son implémentation. En C++, une interface s'implémente au moyen d'une classe.
Note bien que même en Java, il n'est pas rare d'implémenter le concepte d'interface au moyen d'une classe abstraite (c'est même la seule façon, pour peu qu'on veut être rigueureux), et d'utiliser l'interface du langage pour d'autres choses qui n'ont rien à voir avec le concepte logique d'interface. En général, quelque soit le langage, il ne faut pas s'attendre à ce que le fait qu'un mot clé du langage correspond à un concepte qu'il y a identité entre les utilisations de ce mot clé et le concepte.
En C++, l'idiome classique d'une interface, en ce qui me concerne, est :
class I { public: virtual ~I() {} void f() { // Vérifier les préconditions... doF() ; // Vérifier les postconditions... } int g() { // Vérifier les préconditions... int result = doG() ; // Vérifier les postconditions... return result ; } // ... protected: I() {}
private: I( I const& ) ; I& operator=( I const& ) ;
Le caractèristique principal, c'est que pour chaque fonction publique, il y a une fonction privée virtuelle correspondante. Typiquement, il n'y a pas de membres données, et le destructeur est inline pour qu'on voit immédiatement qu'il n'a pas de sémantique. Les fonctions publiques peuvent aussi être inline, parce que tout ce qu'elles contient est le contrat, qui fait partie de l'interface. C'est aussi plutôt rare qu'une interface supporte la copie et l'affectation, d'où les déclarations privées (et la declaration du constructeur de copie fait qu'il me faut une définition d'au moins un autre constructeur).
Mais c'est ma convention ; il y en a d'autres. Même chez moi, j'ai un autre idiome pour les visiteurs et les callback (où les fonctions virtuelles sont publiques), même si logiquement, il s'agit aussi d'une sorte d'interface.
Ainsi, je voudrai faire en sorte qu'il n'y ai pas de code pour I_A::~I_A(); D'apres ce que je comprend de ta reponse, tu me dis que je suis quand meme oblige de le faire, meme si c'est du code vide, style:
I_A::~I_A() {}
C'est bien ca?
Oui.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Loïc Joly
wrote:
En C++, l'idiome classique d'une interface, en ce qui me concerne, est :
class I { public: virtual ~I() {} void f() { // Vérifier les préconditions... doF() ; // Vérifier les postconditions... } int g() { // Vérifier les préconditions... int result = doG() ; // Vérifier les postconditions... return result ; } // ... protected: I() {}
private: I( I const& ) ; I& operator=( I const& ) ;
private :
// petite typo qui peut nuire à la compréhension :
virtual void f() = 0 ; virtual void doF() = 0;
virtual int g() = 0 ; virtual int doG() = 0;
-- Loïc
kanze@gabi-soft.fr wrote:
En C++, l'idiome classique d'une interface, en ce qui me concerne, est :
class I
{
public:
virtual ~I() {}
void f()
{
// Vérifier les préconditions...
doF() ;
// Vérifier les postconditions...
}
int g()
{
// Vérifier les préconditions...
int result = doG() ;
// Vérifier les postconditions...
return result ;
}
// ...
protected:
I() {}
private:
I( I const& ) ;
I& operator=( I const& ) ;
private :
// petite typo qui peut nuire à la compréhension :
En C++, l'idiome classique d'une interface, en ce qui me concerne, est :
class I { public: virtual ~I() {} void f() { // Vérifier les préconditions... doF() ; // Vérifier les postconditions... } int g() { // Vérifier les préconditions... int result = doG() ; // Vérifier les postconditions... return result ; } // ... protected: I() {}
private: I( I const& ) ; I& operator=( I const& ) ;
private :
// petite typo qui peut nuire à la compréhension :
virtual void f() = 0 ; virtual void doF() = 0;
virtual int g() = 0 ; virtual int doG() = 0;
-- Loïc
Laurent DELEPINE
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe de base. L'une ou l'autre je vois, mais les deux, je seche.
LD
-- Vous avez souscris un forfait ADSL chez Free Votre connexion est inutilisable a certaines heures Free refuse de vous dépanner Contactez :
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les pré/post-conditions,
alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe
de base. L'une ou l'autre je vois, mais les deux, je seche.
LD
--
Vous avez souscris un forfait ADSL chez Free
Votre connexion est inutilisable a certaines heures
Free refuse de vous dépanner
Contactez : problemes.internet@webiologie.org
En C++, on peut dans la classe de base vérifier les pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe de base. L'une ou l'autre je vois, mais les deux, je seche.
LD
-- Vous avez souscris un forfait ADSL chez Free Votre connexion est inutilisable a certaines heures Free refuse de vous dépanner Contactez :
Loïc Joly
wrote:
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?
Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça serait une bien mauvaise idée de créer un nouveau catégorie de type, interface, in C++. Comme c'était une mauvaise idée en Java.
C'est de ça dont je parle. La notion d'interface me va très bien, mais je ne la voit assurément pas comme une classe sans code.
-- Loïc
kanze@gabi-soft.fr wrote:
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?
Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça
serait une bien mauvaise idée de créer un nouveau catégorie de type,
interface, in C++. Comme c'était une mauvaise idée en Java.
C'est de ça dont je parle. La notion d'interface me va très bien, mais
je ne la voit assurément pas comme une classe sans code.
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?
Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça serait une bien mauvaise idée de créer un nouveau catégorie de type, interface, in C++. Comme c'était une mauvaise idée en Java.
C'est de ça dont je parle. La notion d'interface me va très bien, mais je ne la voit assurément pas comme une classe sans code.
-- Loïc
kanze
Laurent DELEPINE wrote in message news:<400fc092$0$22320$...
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe de base. L'une ou l'autre je vois, mais les deux, je seche.
class Interface { public: int f( int x ) { // Vérifier les préconditions... int result = doF( x ) ; // Vérifier les postconditions... return result ; }
private: virtual int doF( int x ) = 0 ; } ;
Où est le problème ?
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Laurent DELEPINE <newsgroup@webiologie.org> wrote in message
news:<400fc092$0$22320$626a54ce@news.free.fr>...
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les
pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe
de base. L'une ou l'autre je vois, mais les deux, je seche.
class Interface
{
public:
int f( int x )
{
// Vérifier les préconditions...
int result = doF( x ) ;
// Vérifier les postconditions...
return result ;
}
private:
virtual int doF( int x ) = 0 ;
} ;
Où est le problème ?
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Laurent DELEPINE wrote in message news:<400fc092$0$22320$...
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe de base. L'une ou l'autre je vois, mais les deux, je seche.
class Interface { public: int f( int x ) { // Vérifier les préconditions... int result = doF( x ) ; // Vérifier les postconditions... return result ; }
private: virtual int doF( int x ) = 0 ; } ;
Où est le problème ?
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Laurent DELEPINE
wrote:
Laurent DELEPINE wrote in message news:<400fc092$0$22320$...
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe de base. L'une ou l'autre je vois, mais les deux, je seche.
class Interface { public: int f( int x ) { // Vérifier les préconditions... int result = doF( x ) ; // Vérifier les postconditions... return result ; }
private: virtual int doF( int x ) = 0 ; } ;
Où est le problème ?
Vu comme ca evidement. Je cherchais avec une seule fonction membre.
Laurent DELEPINE <newsgroup@webiologie.org> wrote in message
news:<400fc092$0$22320$626a54ce@news.free.fr>...
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les
pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe
de base. L'une ou l'autre je vois, mais les deux, je seche.
class Interface
{
public:
int f( int x )
{
// Vérifier les préconditions...
int result = doF( x ) ;
// Vérifier les postconditions...
return result ;
}
private:
virtual int doF( int x ) = 0 ;
} ;
Où est le problème ?
Vu comme ca evidement. Je cherchais avec une seule fonction membre.
Laurent DELEPINE wrote in message news:<400fc092$0$22320$...
Loïc Joly wrote:
En C++, on peut dans la classe de base vérifier les pré/post-conditions, alors pourquoi s'en priver !
Comment fait on pour vérifer les pre et post conditions dans la classe de base. L'une ou l'autre je vois, mais les deux, je seche.
class Interface { public: int f( int x ) { // Vérifier les préconditions... int result = doF( x ) ; // Vérifier les postconditions... return result ; }
private: virtual int doF( int x ) = 0 ; } ;
Où est le problème ?
Vu comme ca evidement. Je cherchais avec une seule fonction membre.