Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/10/2006, à 22:56

gene69

[résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Bonjour,

C'est pas vrai je ne rentre pas de la plage, mais comme ma question est simple et que je n'ai fait que du JAVA dans la vie me me pose la question suivante: quels sont les équivalent de super() et le this() dans les constructeurs de JAVA, en C++?

J'ai une proposition de code qui se compile bien (g++ -Wall) , mais qui s'execute pas trop mal mais qui fait n'importe quoi à cause de la durée de vie dans les constructeurs par défaut et par copie.

Dernière chose, je sais tres bien que mettre des valeurs par défaut est une pratique courante dans les constructeurs, mais ce n'est pas ce que je cherche.

#include <iostream>

using namespace std;

class Complexe{

	protected:
		double x;
		double y;
	public:
		Complexe();
		Complexe(const Complexe &c);
		Complexe(double a,double b);
		~Complexe(){ cout <<endl<<"\tdestructeur"<<endl;};
		
		static void afficher(const Complexe &c);
};

// *****************************************************************************
//version 1 version standart
/*
Complexe::Complexe(){
	cout <<"\tconstructeur par defaut"<<endl;
	this->x=0.0;
	this->y=0.0;
}
*/

// version 2, embriqué
Complexe::Complexe(){
	cout <<"\tconstructeur par defaut"<<endl;
	Complexe(0,0);
}

// *****************************************************************************
// version 1
/* 
Complexe::Complexe(const Complexe &c){
	cout <<"\tconstructeur par copie"<<endl;
	this->x = c.x;
	this->y = c.y;
}
*/

// version 2
Complexe::Complexe(const Complexe &c){
	cout <<"\tconstructeur par copie"<<endl;
	Complexe(c.x,c.y);
}

// *****************************************************************************
//version 1 version standart
Complexe::Complexe(double a, double b){
	cout <<"\tconstructeur d'arrité 2"<<endl;
	x=a;
	y=b;
}


// *****************************************************************************
void Complexe::afficher(const Complexe &c){
	cout <<"\taffiche complexe: [ "<<c.x<<" , "<<c.y<<" ]"<<endl;
}

int main(void){
	cout <<endl<<"creation de l'objet a avec le Construteur par defaut"<<endl;
	Complexe a;
	Complexe::afficher(a);
	
	cout <<endl<<"creation de l'objet b avec le constructeur d'arrité 2 "<<endl;
	Complexe b(2.0,3.0);
	Complexe::afficher(b);
	
	cout <<endl<<"creation de l'objet c avec le constructeur par copie "<<endl;
	Complexe c(b);
	Complexe::afficher(b);
	
	cout <<endl<<"fin du programme"<<endl;

	return 0;
}

Merci smile je continue à chercher.

Dernière modification par gene69 (Le 22/10/2006, à 00:36)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#2 Le 18/10/2006, à 23:07

g0up1l

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

gene69 a écrit :

Bonjour,

C'est pas vrai je ne rentre pas de la plage, mais comme ma question est simple et que je n'ai fait que du JAVA dans la vie me me pose la question suivante: quels sont les équivalent de super() et le this() dans les constructeurs de JAVA, en C++?

J'ai une proposition de code qui se compile bien (g++ -Wall) , mais qui s'execute pas trop mal mais qui fait n'importe quoi à cause de la durée de vie dans les constructeurs par défaut et par copie.

Dernière chose, je sais tres bien que mettre des valeurs par défaut est une pratique courante dans les constructeurs, mais ce n'est pas ce que je cherche.

#include <iostream>

using namespace std;

class Complexe{

	protected:
		double x;
		double y;
	public:
		Complexe();
		Complexe(const Complexe &c);
		Complexe(double a,double b);
		~Complexe(){ cout <<endl<<"\tdestructeur"<<endl;};
		
		static void afficher(const Complexe &c);
};

// *****************************************************************************
//version 1 version standart
/*
Complexe::Complexe(){
	cout <<"\tconstructeur par defaut"<<endl;
	this->x=0.0;
	this->y=0.0;
}
*/

// version 2, embriqué
Complexe::Complexe(){
	cout <<"\tconstructeur par defaut"<<endl;
	Complexe(0,0);
}

// *****************************************************************************
// version 1
/* 
Complexe::Complexe(const Complexe &c){
	cout <<"\tconstructeur par copie"<<endl;
	this->x = c.x;
	this->y = c.y;
}
*/

// version 2
Complexe::Complexe(const Complexe &c){
	cout <<"\tconstructeur par copie"<<endl;
	Complexe(c.x,c.y);
}

// *****************************************************************************
//version 1 version standart
Complexe::Complexe(double a, double b){
	cout <<"\tconstructeur d'arrité 2"<<endl;
	x=a;
	y=b;
}


// *****************************************************************************
void Complexe::afficher(const Complexe &c){
	cout <<"\taffiche complexe: [ "<<c.x<<" , "<<c.y<<" ]"<<endl;
}

int main(void){
	cout <<endl<<"creation de l'objet a avec le Construteur par defaut"<<endl;
	Complexe a;
	Complexe::afficher(a);
	
	cout <<endl<<"creation de l'objet b avec le constructeur d'arrité 2 "<<endl;
	Complexe b(2.0,3.0);
	Complexe::afficher(b);
	
	cout <<endl<<"creation de l'objet c avec le constructeur par copie "<<endl;
	Complexe c(b);
	Complexe::afficher(b);
	
	cout <<endl<<"fin du programme"<<endl;

	return 0;
}

Merci smile je continue à chercher.

le this désigne l'objet courant, donc il n'est pratiquement pas employé.
le super() n'a pas lieu en C++, utilise l'opérateur de résolution de domaine


Frères humains qui après nous vivez,
N'ayez contre nous les coeurs endurcis

Hors ligne

#3 Le 18/10/2006, à 23:14

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Comme je l'ai dit plus haut... je viens de java. J'ai vraiment l'air bête mais je ne comprend rien à ce qu'est "l'opérateur de résolution de domaine".

tu n'as pas compris ce que je veux faire.
j'ai 2 constructeurs (A1 et A2) pour ma classe A. Je veux que le constructeur A2 appelle A1 pour me simplifier la vie.

Dernière modification par gene69 (Le 18/10/2006, à 23:16)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#4 Le 18/10/2006, à 23:26

g0up1l

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

voici comment écrire ton constructeur de B, si B hérite de A, avec passage de paramètre p1 :

B::B( int p1):A(p1)
{
//...
}

A part ça, utilises-tu KDevelop pour le java ? Car j'ai un petit pb...


Frères humains qui après nous vivez,
N'ayez contre nous les coeurs endurcis

Hors ligne

#5 Le 18/10/2006, à 23:28

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Hors sujet. M'en fout de l'héritage.
Je veux qu'un constructeur de la class A appelle un autre constructeur de A. Je le fesais en Java et je serai bien triste de ne pas y arriver en C++.

Peut être que je peux faire ce que je veux en appelant une fonction membre?  (je suis pas sur d'employer le bon vocabulaire.)

Dernière modification par gene69 (Le 18/10/2006, à 23:30)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#6 Le 18/10/2006, à 23:33

g0up1l

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

AAAAAAAAAAAAAAAAAAh bon, ok wink

B::B( int p1 , int p2 )
{
B( p2);
//...
}


Frères humains qui après nous vivez,
N'ayez contre nous les coeurs endurcis

Hors ligne

#7 Le 18/10/2006, à 23:41

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Ben non. ça marche en java mais pas en C++.

Si tu avais executé le ptit bout de code que j'ai donné alors tu aurais vu que le destructeur est appelé immédiatement apres l'appel du constructeur imbriqué.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#8 Le 18/10/2006, à 23:52

g0up1l

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

J'ai pas la possibilité de compiler pour l'instant.

Le code que je t'ai passé DEVRAIT fonctionner.

ton pb se situe-t-il à la compilation, à l'édition de lien ou à l'exécution ?


Frères humains qui après nous vivez,
N'ayez contre nous les coeurs endurcis

Hors ligne

#9 Le 19/10/2006, à 00:14

lunique

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Apparement, c'est à l'execution que sa pose probleme

Hors ligne

#10 Le 19/10/2006, à 00:35

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

ça répond à ta question. Je viens d'avoir un  avis disant que c'est impossible. Je n'y crois pas.

$ ./prog

creation de l'objet a avec le Construteur par defaut
        constructeur par defaut
        constructeur d'arrité 2

        destructeur
        affiche complexe: [ -1.36513e-39 , -1.36513e-39 ]

creation de l'objet b avec le constructeur d'arrité 2
        constructeur d'arrité 2
        affiche complexe: [ 2 , 3 ]

creation de l'objet c avec le constructeur par copie
        constructeur par copie
        constructeur d'arrité 2

        destructeur
        affiche complexe: [ 2 , 3 ]

fin du programme

        destructeur

        destructeur

        destructeur

Dernière modification par gene69 (Le 19/10/2006, à 00:37)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#11 Le 19/10/2006, à 10:25

g0up1l

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Donc si j'ai bien compris ce que tu veux faire :  tu veux intialiser les variables membres x et y d'un complexe quand tu appelles le constructeur par défaut ?

dans ce cas la méthode est celle-ci :

Complexe::Complexe():x(0.0),y(0.0){
    cout <<"\tconstructeur par defaut"<<endl;
}

Frères humains qui après nous vivez,
N'ayez contre nous les coeurs endurcis

Hors ligne

#12 Le 19/10/2006, à 17:19

Luc Hermitte

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

gene69 a écrit :

tu n'as pas compris ce que je veux faire.
j'ai 2 constructeurs (A1 et A2) pour ma classe A. Je veux que le constructeur A2 appelle A1 pour me simplifier la vie.

Ce n'est pas possible aujourd'hui, il faut attendre le C++0x (x==9 vraissemblablement, bien que des mauvaises langues disent que x est une notation hexa...)
Dans ce cas particulier, l'utilisation de paramètres par défaut fera très bien l'affaire.

PS: complexe est une classe de données mathématique: des nombres. Donc à sémantique de valeur, donc incompatible avec un quelconque héritage orienté substitution (héritage public). Donc laisse tomber les protected et utilise private.

PPS: Il est inutile de définir destructeur et opérations de recopie (constructeur de recopie + opérateur d'affectation) ici. A part pour s'amuser à logguer.

PPPS: pour l'affichage préfère définir l'opérateur d'insertion dans les flux standard -> operator<<. Pas besoin de la faire amie si tu définis les deux accesseurs re() et im() qui vont bien.

PPPPS: la correction de ton exo est std::complex.

#13 Le 19/10/2006, à 18:32

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

J'ai utilisé Complexe parce que j'avais besoin d'implementer un exemple. Pas pour le plaisir de faire des calculs complexes.

Bon ci dessous ne serait-ce pas une liste d'initialisation? sad humm. Et puis ça n'execute pas le constructeur Complexe(float, float)

Complexe::Complexe():x(0.0),y(0.0){
    cout <<"\tconstructeur par defaut"<<endl;
}

Merci de vos réponces. Je pense que je vais marquer le truc [sans solution]

Dernière modification par gene69 (Le 19/10/2006, à 18:37)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#14 Le 19/10/2006, à 19:34

Luc Hermitte

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Quand tu peux te permettre de payer une initialisation en plus d'une construction par défaut pour les membres -> fonction interne d'initialisation.
Sinon, ici dans ce cas particulier, je l'ai déjà dit:

struct Complex {
    Complex(double re=0.0, double im=0.0) : re_(re), im_(im) {}
private:
    double re_;
    double im_;
};

#15 Le 19/10/2006, à 19:45

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Je ne comprend pas votre exemple .

c'est chez vous http://hermitte.free.fr/vim/idx-all.php?

Dernière modification par gene69 (Le 19/10/2006, à 19:49)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#16 Le 19/10/2006, à 21:12

Luc Hermitte

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

J'utilise des arguments par défaut qui permettent d'utiliser le constructeur de trois façons : avec 0, 1, ou 2 arguments réels. Cela élimine le problème (dans ce cas particulier) d'avoir recours à plusieurs définitions de constructeurs d'initialisation et de factoriser en même temps le code.

Sinon, il s'agit effectivement bien de mon site -- qu'il va falloir que je mette à jour. (Je ne me connais pas d'homonynes sur la toile).

Arf! Je me disais bien que quelqu'un avait posé la question sur developpez aujourd'hui et que j'aurais mieux fait de dire d'aller y jeter un coup d'oeil :-/

#17 Le 22/10/2006, à 00:35

gene69

Re : [résolu][C++] Constructeurs. niveau expert, apres 3 mois de plage.

Ouaip, je sais c'est moi qui ait posé la question sur développez.com. avec le même pseudo. Je sais que ça ne se fait pas trop wink j'ai passé le fil en résolu labas... je le passe ici aussi.

Merci de vos réponces, et toutes mes excuses, j'avais mal cherché.

http://c.developpez.com/faq/cpp/?page=c … pel_chaine

Dernière modification par gene69 (Le 22/10/2006, à 00:37)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne