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.

#26 Le 01/11/2007, à 20:08

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

ouhlala ouhlala !!

1) principe objet : seul l'objet peu modifier ses membres, pas de public pour les données-membres pour ubuntero => private ou protected si tu compte la dérivée.

2) Mais qu'est-ce qu'elle fait toute seule cette fonction !! Une fonction toute seule c'est du C, si tu veux faire du C++ cette fonction doit être membre d'une classe. En l'occurence ubuntero puisqu'elle te permet de modifier ses données membres.
D'ailleurs le passage de ton code en objet obliqe a modifier cette fonction. Ce serait je pense son constructeur puisqu'elle te permet d'initialiser les données-membres.

3)  yes_or_no : 2 états, et pourquoi tu utiliserais pas un bool ?? Ca éviterais en plus que la variable prenne des valeurs indésirées.

4) Je pense que ton problème vient de yes_or_no. tu stockes une valeur dans un pointeur. Déclares un char (ou bool) et si cin à besoin d'un char* passe lui &yes_or_no

--edit : Désolé si je parai un peu ...chiant.. mais j'ai bondit en voyant le code big_smile
@telliam : grilled tongue

Dernière modification par $Gaël$ (Le 01/11/2007, à 20:20)


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#27 Le 01/11/2007, à 20:11

telliam

Re : Questions sur la P.O.O. (C++ et JAVA)

Je crois avoir trouver :yes_no doit etre déclarer comme char et non pas comme char*.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#28 Le 01/11/2007, à 20:14

telliam

Re : Questions sur la P.O.O. (C++ et JAVA)

Petit conseil, met le niveau maximum de warning à la compilation et initialises toutes tes variables qd tu les déclares


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#29 Le 01/11/2007, à 20:49

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Oh la la ... Ben j'apprend sur le tas alors forcément c pas top top neutral

Effectivement g déclaré un char au lieu d'un char* et c'est passé. Je vais passer en booléen tant qu'à faire puis transformer la fonction en fonction ami c'est bien ça ?

Hors ligne

#30 Le 01/11/2007, à 22:13

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

Laisse friend tranquille !! tongue on l'utilise rarement et pas ici en tout cas ^^
Bon j'ai modifié ton code rapidement juste pour te montrer a quoi ca devrait ressembler, je ne l'ai pas compilé donc il y a sans doute des erreurs.

// /!\ Attention humour noir (voir peut-être un peu trop) inside
// ubuntero.h  <= la déclaration de la classe ds le .h

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>

using namespace std;


/*=== Classe ubuntero ===*/
class Ubuntero {	//Convention les classes commencent par une majuscule
	//private:	//facultatif, en c++ membre privé par défaut
    String pseudo;	//si tu utilises une API tu pourrais utiliser des string 
    String email;	//ca te permet de bénéficier de fonctionnalités de traitement des chaines
    int  age;

	public :	//on ne donne l'accès que aux méthodes qui permettent de modifier les données
				//pas aux données elles mêmes
	
	ubuntero(String pseudo,char *email,int age); //ton constructeur
	//Getter and Setter pour modifier les caractéristiques d'un membre
	inline void setPseudo(String nom)//encore un avantage du c++
		pseudo=nom;//la puissance de l'objet, pas ce strcpy !
	inline String getPseudo(void)
		return pseudo;
	//etc...
	//Ou fonction pour tout modifier d'un coup
	void modifier(String pseudo,String email,int age);
	//parce qu'il peut être intéressant d'afficher à quoi ressemble un ubuntero
	void afficher(void);
	
	};

/////////////////////////////////////////////////////////////////////////////////////////////
//ubuntero.cpp <= l'implémentation dans le cpp

#include "ubuntero.h"

void Ubuntero::modifier(String pseudo,String email,int age)
{
	this.pseudo=pseudo;//pour utiliser this !
	this.email=email;
	if(age>=0&&age<150)//pour montrer l'avantage des getter et setter
		this.age=age;//tu controles tes données
}

void Ubuntero::afficher()
{
	cout << "Votre pseudo est : " << pseudo << endl;
    cout << "Votre email est : "  << email  << endl;
    cout << "Votre age est : "    << age    << endl;
}

/////////////////////////////////////////////////////////////////////////////////////////////
//Main
#include "ubuntero.h"

#define SIZE 5

int main(int argc, char* argv[]) {
    
    cout << "Je rentre dans le main" << endl;
    
    //creation dynamique
	ubuntero membres[SIZE];//tableau de membres (ubuntero* normalement)
	bool nouveauMembre=false;
	String reponse;
	String pseudoTmp, emailTmp;//en fait les variables sont initialisées par défaut
								//on ne le voit pas mais un constructeur par défaut est appelé ici
	int ageTmp=0;
	
	//Ajout des nouveaux membres
	int i=0;
	do {
		cout << "Tapez votre pseudo : ";
        cin >> pseudoTmp;
        cout << "Tapez votre email : ";
        cin >> emailTmp;
        cout << "Tapez votre âge : ";
        cin >> ageTmp;
        cout << "Créez un nouveau membre ? (y/n)" << endl;
        cin >> reponse;
		//il faudrait rajouter un contrôle de la réponse parce on est pas sur qu'il dise y ou n
		//mais ce n'est pas la question ici
		nouveauMembre=(reponse=="y")?true:false;//juste parce que c'est classe d'utiliser cet opérateur C :D
        i++;
		membres[i]=new ubuntero(pseudoTmp,emailTmp,ageTmp);//Création dynamique de l'objet
	}
	while(nouveauMembre && (i<SIZE) )
    
	//Disons qu'on aime pas la tête du premier membre et  qu'il faille donc le modifier
	membres[0]->modifier("marcel","marcel@ubuntu.com",66);
	//disons que si le deuxième membre est un vieux on veut l'exterminer
	if(membres[1]->getAge()==99)
		delete membres[1];//remarque là on le supprime mais tu peu lui faire ce que tu veux ^^
	
	//Affichage
	//si on voulait faire propre on pourrait créer un template pour faire un itérateur
	//mais c'est un peu plus chaud !!
	for(int j=0;j<SIZE;j++)//grace au c++ on peut déclarer une variable ici
		membres[j]->afficher();
	system("PAUSE");
	
	//parce qu'il faut TOUJOURS libérer les ressources que l'on a alloué
	delete[] membres;
    
	return 0;    
}

Euh, je ne vais pas encore être très agréable, mais je ne sais pas quels langages tu maîtrises mais il semblerait qu'il te manque des notions de programmation objet (classes, héritage, appel des méthodes par message...) donc je te conseilllerai un bon cours de c++

bon courage!


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#31 Le 01/11/2007, à 22:25

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

Tiens, un code corrigé avec des commentaires, un contrôle des réponses, et quelques notions intéressantes en bonus :

// #include <cstdio>
// #include <cstdlib>
// #include <cmath>

#include <string> // Bien mieux que tous ces horribles headers C
#include <iostream>

// À éviter si possible, l'intérêt des namespaces
// c'est justement de séparer les noms
//using namespace std;

/*=== Classe util ===*/

class util
{
public:
	// Un petit exemple de template
	template <typename T>
	static bool entrerValeur(const std::string& prompt, T& valeur)
	{
		T tmp;

		std::cout << prompt << " : ";
		std::cin.clear();

		while (!(std::cin >> tmp))
		{
			if (std::cin.eof())
			{
				return false;
			}
			else if (std::cin.fail())
			{
				std::cout << "Valeur incorrecte, veuillez recommencer : ";
				std::cin.clear();
				std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
			}
		}

		valeur = tmp;

		return true;
	}

	// Class abstraite : non instanciable
	virtual ~util() = 0;
};

// Définition de util::~util() pour calmer le linker
util::~util() {}


/*=== Classe ubuntero ===*/

class ubuntero
{
public:
	// Il vaut mieux utiliser des constantes plutôt que des #defines
	// Ça permet au compilateur de mieux optimiser le code et
	// ça évite certaines erreurs
	static const unsigned int maxUbunteros = 5;

public:
	// Constructeur par défaut : initialisation des variables
	ubuntero()
	{
		// Pas la peine d'initialiser les std::string
		this->age = 0;
	}

	// Constructeur alternatif
	ubuntero(std::string pseudo, std::string email, int age)
	{
		this->pseudo = pseudo;
		this->email = email;
		this->age = age;
	}

	// Méthode statique : peut être appelée sans instance
	// et peut accéder aux membres privés
	static bool remplissage(ubuntero& nouveau_membre)
	{
		return (util::entrerValeur("Tapez votre pseudo", nouveau_membre.pseudo)
			&& util::entrerValeur("Tapez votre email", nouveau_membre.email)
			&& util::entrerValeur("Tapez votre âge", nouveau_membre.age));
	}

	// Astuce utile qui permet de passer une instance de ubuntero
	// directement à un flux sortant (std::cout par exemple)
	friend std::ostream& operator<<(std::ostream& os, const ubuntero& u)
	{
		os << "Votre pseudo est : " << u.pseudo << std::endl;
		os << "Votre email est : "  << u.email  << std::endl;
		os << "Votre age est : "    << u.age    << std::endl;
		return os;
	}

private:
	std::string pseudo;
	std::string email;
	int age;
};

/*=== Fonction main ===*/

int main(int argc, char* argv[])
{
	std::cout << "Je rentre dans le main" << std::endl;

	// INSTANCES de la classe ubuntero (nbre d'instances = ubuntero::maxUbunteros)
 	ubuntero nouveau_membre[ubuntero::maxUbunteros];

	unsigned int i = 0;
	char yes_or_no = 0;

	do
	{
		if (!ubuntero::remplissage(nouveau_membre[i]))
		{
			std::cout << "Erreur" << std::endl;
			break;
		}
	
		if (++i < ubuntero::maxUbunteros)
			util::entrerValeur("Créez un nouveau membre ? (y/n)", yes_or_no);
		else
			break;
	
	} while(yes_or_no == 'y');

	for(unsigned int j = 0 ; j < i ; ++j)
		std::cout << nouveau_membre[j] << std::endl;

	system("read");

	return 0;
}

Dernière modification par Link31 (Le 01/11/2007, à 22:27)

Hors ligne

#32 Le 01/11/2007, à 22:32

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Je connais juste le C. Je ne suis pas un informaticien. Je suis un ancien physicien qui a fait bcp de simulation numérique. Et j'ai bien précisé dans ce topic que je suis en train d'apprendre le C++. Donc c'est normal qu'il me manque des notions... Sinon je serais foutrement doué wink

Hors ligne

#33 Le 01/11/2007, à 22:48

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Que signifie ceci : this->

Hors ligne

#34 Le 01/11/2007, à 22:54

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

this c'est un pointeur vers l'instance courante. Comme les arguments passés au constructeur ont le même nom que les variables membres de la classe, on utilise this-> pour les différencier.
Mais il vaut mieux donner des noms spécifiques aux variables membres, comme rajouter "m" au début de leur nom par exemple.

Hors ligne

#35 Le 01/11/2007, à 23:22

robrob

Re : Questions sur la P.O.O. (C++ et JAVA)

Tu es sur que la condition (*yes_or_no == 'y' && i < SIZE) fait bien ce que tu veux? (j'ai un gros doute sur la priorité de && par rapport à ==)
Par sécurité je te conseille plutôt d'écrire:
((*yes_or_no == 'y')&&(i < SIZE))

Sinon le probleme venait de char *yes_or_no. En effet, ce faisant tu ne reserves pas de mémoire pour stocker de chaine. Donc quand tu fais cin >> yes_or_no, tu écrits un peu n'importe où d'où le segmentation fault.

Oups je suis over grillé, j'avais pas vu qu'il y avait une deuxième page lol

Dernière modification par robrob (Le 01/11/2007, à 23:28)

Hors ligne

#36 Le 01/11/2007, à 23:31

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Wi smile Seulement à force de lire des infos dans tous les sens je ne comprends plus rien là... J'ai ressorti mes anciens cours et franchement ça s'épaissit encore plus.

Hors ligne

#37 Le 01/11/2007, à 23:47

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

@Link31: ca c'est du beau code wink avec quelques petites subtilités ! (++i p.e.)

méthode statique ? je ne connais pas trop ce principe mais on pert le principe de l'envoi de message ?

Le std:: est obligatoire ?

@aganim07 : il faut bien avouer que Link31 ne t'as peut-être pas mis du "code de débutant" !!


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#38 Le 01/11/2007, à 23:53

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Et les constructeurs/destructeurs, ils sont ou dans tout ça ?

Hors ligne

#39 Le 02/11/2007, à 00:19

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

constructeur = méthode du même nom que la classe
destructeur =  méthode du même nom que la classe sans argument et précédé de '~'

Link31, en a implémentés dans son code


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#40 Le 02/11/2007, à 00:52

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

En effet. J'ai vu que Link31 en a placé dans son code mais ça me dépasse totalement par la manière dont il les utilise. Les histoires de virtuel et compagnie je n'y comprends rien du tout.

Bref j'ai repris en profondeur mon code et je vais vous le montrer pour que vous voyez là ou j'en suis.
J'avoue que je commence à perdre un peu espoir là... L'objet ça a l'air bien trop dur pour mon niveau neutral

Attention : La classe s'appele ubuntero et les objets s'appelent membre tout court maintenant.

// main.cpp


/*=== Header ===*/

#include<iostream>
#include<string>

const int SIZE = 5;
using namespace std;


/*=== Classe ubuntero ===*/

class ubuntero {
      
      private:
             char pseudo[24];
             char email [24];
             int  age;
      
      public:
             ubuntero()  {cout << "Construction de ubuntero" << endl;}    // J'ai tapé ceci sans comprendre
             ~ubuntero() {cout << "Destruction de ubuntero"  << endl;}    // J'ai tapé ceci sans comprendre
             void remplit();
             void affiche();
};


/*=== Méthode remplit ===*/

void ubuntero :: remplit(){
     
    int i, j;
    for(i=0 ; i<SIZE ; i++) {
            cout << "Tapez votre pseudo (ou q pour quitter) : ";
            cin >> ubuntero[i].pseudo;
            if (stricmp(ubuntero[i].pseudo,"q") == 0) {break;}
            cout << "Tapez votre email : ";
            cin >> ubuntero[i].email;
            cout << "Tapez votre âge : ";
            cin >> ubuntero[i].age;
    }
}


/*=== Méthode affiche ===*/

void ubuntero :: affiche(){
     
    int i;
    for(i=0 ; i<SIZE ; i++) {
       cout << "Votre pseudo est : " << ubuntero[i].pseudo << endl;
       cout << "Votre email est : "  << ubuntero[i].email  << endl;
       cout << "Votre age est : "    << ubuntero[i].age    << endl << endl;
    }
}


/*=== Fonction main ===*/

int main(int argc, char* argv[]) {
    
    ubuntero membre[SIZE];   // INSTANCES de la classe ubuntero      
    membre.remplit();
    membre.affiche();
    
    system("PAUSE");
    return 0;    
}

Mon gros problème est que le compilateur refuse de compiler une ligne comme cela :
cin >> ubuntero[i].pseudo;
Ce type de lignes, il y en a dans la méthode remplit par exemple.

Autre pb, comment dire à la méthode affiche d'arrêter d'afficher le contenu du tableau de taille SIZE si je ne l'ai pas rempli entièrement en tapant "q" pour quitter avant la fin.

Après quelques heures de repos, je me rends compte que je commence quand même à comprendre pas mal de trucs... Mais y a tellement de données que j'oublie tout au fur et à mesure ^^'

Dernière modification par aganim07 (Le 02/11/2007, à 03:18)

Hors ligne

#41 Le 02/11/2007, à 10:50

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

1) Enlève-moi ces horribles tableaux de char et remplace-les par des std::string. Déjà que le C++ n'est pas un langage facile, alors si en plus tu y ajoutes les faiblesses du C tu ne t'en sortiras pas. std::string n'a pas été inventé pour compliquer la vie du programmeur, bien au contraire.

2) system("PAUSE") => system("read")
Je ne comprends toujours pas comment cette commande peut passer chez toi.

aganim07 a écrit :

Les histoires de virtuel et compagnie je n'y comprends rien du tout.

J'ai mis un destructeur virtuel comme exemple, tu pourrais tout aussi bien l'enlever ça ne changerait quasiment rien (on pourrait créer une instance de util, mais pour quoi faire ?). En plus il n'y a aucune forme d'héritage dans mon code, donc pas besoin de fonctions virtuelles.

Quoi qu'il en soit, il y a du progrès dans ton dernier code. Presque plus rien dans l'espace de nom global, juste une constante globale qui serait bien mieux dans la classe ubuntero ou dans main()... Avec ça et en remplaçant ces (horribles) tableaux de char par des std::string, ça pourrait devenir du pur C++.

$Gaël$ a écrit :

méthode statique ? je ne connais pas trop ce principe mais on pert le principe de l'envoi de message ?

Une méthode statique n'a pas besoin d'être appelée à partir d'une instance. Comme à l'origine le code de aganim07 remplissait les instances d'ubuntero "de l'extérieur", j'ai voulu rester dans le même esprit.

$Gaël$ a écrit :

Le std:: est obligatoire ?

C'est recommandé. Avec un simple programme qui n'utilise que la STL, ce n'est pas très important. Mais quand tu commences à utiliser plusieurs bibliothèques, c'est important de ne pas tout mélanger. Et en particulier quand on débute, c'est bien de différencier ce qui provient de la STL, ce qui est fourni par le compilateur et ce qu'on crée soi-même dans son code.

Je reconnais que je n'ai pas mis que du code "pour débutant" comme tu dis, mais j'en ai surtout profité pour donner des exemples de plusieurs notions, après aganim07 peut en faire ce qu'il veut.

Dernière modification par Link31 (Le 02/11/2007, à 10:51)

Hors ligne

#42 Le 02/11/2007, à 12:29

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Ahhhhhhhh !! Donc c'est mieux smile

Vous qui zêtes des pros du C++, pensez-vous que ma méthode chargée de remplir le tableau membre[SIZE] devrait être le constructeur ou c'est bien si ça reste une méthode tout court ? Dans ce cas, que dois-je faire de mon constructeur ?

Là je vais partir pour Paris mais j'espère pouvoir continuer à coder en fin d'après-midi. Même si le résultat n'est pas là, j'y mets quand même de l'énergie smile

Hors ligne

#43 Le 02/11/2007, à 12:46

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Vous qui zêtes des pros du C++, pensez-vous que ma méthode chargée de remplir le tableau membre[SIZE] devrait être le constructeur ou c'est bien si ça reste une méthode tout court ?

Si le remplissage du tableau doit être interactif, je pense qu'il vaut mieux ne pas le mettre dans le constructeur. Comme ça le constructeur te permet d'initialiser les variables avec des valeurs sûres, et la méthode se charge de les modifier au besoin. Si l'utilisateur remplissait les champs directement depuis le constructeur, et qu'il se produisait une erreur irrécupérable, tu serais obligé de lancer une exception.

aganim07 a écrit :

Dans ce cas, que dois-je faire de mon constructeur ?

Initialiser les variables (si besoin).

Dernière modification par Link31 (Le 02/11/2007, à 12:47)

Hors ligne

#44 Le 02/11/2007, à 13:59

Le Farfadet Spatial

Re : Questions sur la P.O.O. (C++ et JAVA)

Salut à tous !

   Je trouve les interventions de Link31 très bonne, je n'ai pas grand-chose à ajouter. Toutefois, je ramène quand même un peu ma fraise (je suis trop égocentrique pour m'en empêcher).

   Tout d'abord, je signale que le calcul scientifique en C++, c'est mon métier --- en tout cas, c'est ce que je fais en thèse, voir cette page : http://www.legos.obs-mip.fr/~lebars/, --- raison pour laquelle je me permets cette intervention.

   Pour répondre à des questions de Aganim07 laissée en suspens : oui, tu as encore beaucoup à apprendre en C++. Des langages, j'en connais beaucoup. Le C++ est le seul langage qui, à ma connaissance, soit vraiment difficile. Mais lui, il est vraiment difficile et il faut du temps pour s'y former. Plusieurs années... Et réaliser du code, ce que tu es en train de faire, donc c'est bien. Cela dit, c'est un excellent choix pour les simulations numériques, à mon sens le meilleur à l'heure actuelle dans ce cadre.

   D'autre part, les templates, c'est super méga giga cool, j'en utilise tous les jours et c'est un moyen de faire des codes extrêmement efficaces. Cela dit, ça devient très vite tordu et difficile à lire, surtout si tu te lances dans la méta-programmation et les modèles d'expressions (ce que tu ne manqueras pas de faire si tu fais de la simulation numérique en C++). L'exemple de Link31 est simple, mais je pense que tu devrais attendre un peu avant de te lancer là-dedans.

   Ensuite, il y a des choses qui m'ont fait bondir. Premièrement, je vais être dogmatique, mais tant pis : malloc, calloc et autre en C++, c'est mal. Non, vraiment, il faut utiliser new et free. Cela dit, pour gérer les tableaux de manière simple, performante et efficace en C++, qui plus est de telle sorte qu'ils soient redimensionnables, la bonne approche est d'utiliser les vectors de la bibliothèque standard. D'ailleurs, tu peux faire de la simulation numérique a haute performance en C++ sans utiliser de pointeurs --- pour être plus précis, en laissant la gestion des pointeurs à d'autres bibliothèque, typiquement la bibliothèque standard et Boost. D'ailleurs, je t'y encourage, c'est la solution la plus sûre pour faire du code performant, compatible et robuste.

   Donc, mon conseil : à moins de faire de la programmation système, mieux vaut se passer de pointeur. De plus, vu que tu as fait du C, les pointeurs, tu sais ce que c'est, pas la peine de t'embêter avec ça pour l'instant.

   Sinon, le problème du C++ c'est qu'il est trop souvent mal enseigné --- en gros, on apprend à faire de C compilé par un compilateur C++, avec une dose d'orienté objet et en négligeant la bibliothèque standard --- et donc trop souvent mal utilisé. Cependant, il y a une référence à laquelle tu peux et dois te fier :

Bjarne Stroustrup. Le langage C++, Pearson Education, 2003.

   Bjarne Stroustrup est le créateur du C++ et son ouvrage est complet à ce sujet. Personnellement, je le trouve également très didactique, à la condition que tu saches déjà programmer --- ce qui est le cas, vu que tu as fait du C.

   Je te souhaite un bon courage pour ta découverte du C++.

   À bientôt.

                                                                                       Le Farfadet Spatial

Hors ligne

#45 Le 02/11/2007, à 14:05

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

Le Farfadet Spatial a écrit :

Non, vraiment, il faut utiliser new et free.

new et delete wink

La STL est-elle vraiment assez rapide pour du calcul scientifique ? Parce que lorsqu'on doit écrire du code très optimisé, on est en droit de se demander ce que vont donner quelques centaines de lignes inlinées (insérées) au milieu d'une boucle.

Hors ligne

#46 Le 02/11/2007, à 14:21

Le Farfadet Spatial

Re : Questions sur la P.O.O. (C++ et JAVA)

Salut à tous !

Link31 a écrit :
Le Farfadet Spatial a écrit :

Non, vraiment, il faut utiliser new et free.

new et delete wink

Argh ! Désolé, mes doigts ont fourchés ! Je voulais en effet écrire new et delete.

La STL est-elle vraiment assez rapide pour du calcul scientifique ? Parce que lorsqu'on doit écrire du code très optimisé, on est en droit de se demander ce que vont donner quelques centaines de lignes inlinées (insérées) au milieu d'une boucle.

Pour les parties de pur calculs, j'utilise Boost (http://www.boost.org/), qui en gros reprend Blitz++, avec une nomenclature totalement compatible avec celle de la bibliothèque standard. C'est vraiment très efficace. Pour le reste, j'utilise la bibliothèque standard et gtkmm. Les comparaisons avec des codes en Fortran montre qu'on obtient le même genre de performances. Avec la souplesse du C++.

   La bibliothèque Boost utilise elle le développement en ligne des instructions (inline) et les modèles (template) de manière intense.

   À bientôt.

                                                                                                                     Le Farfadet Spatial

Hors ligne

#47 Le 02/11/2007, à 18:35

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Je suis de retour ! Bon je vais essayer d'améliorer mon code selon vos conseils alors... Pour info, je viens de terminer mes études. Formation en physique (avec toutes les options de simulation numérique en langage C) et master 2 de modélisation financière.

Donc je vise un job de développement de modèles en finance. Alors je veux avoir un min de bagage en C++ pour ne pas être trop perdu au début wink Mais je ne suis pas du tout informaticien.

Je suis plutôt débrouillard en C mais le passage en C++ fait que je suis totalement perdu. Même les pointeurs je n'y comprenais plus rien... Mais la difficulté des programmes que j'ai fait vient plutôt des erreurs de troncature, des tailles de tableaux, de situations avec 4 ou 5 boucles for imbriquées, de générateurs pseudo-aléatoires etc...

Dernière modification par aganim07 (Le 02/11/2007, à 18:47)

Hors ligne

#48 Le 02/11/2007, à 19:32

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Bon je crois que je touche au but. Dans mon prochain code, vous verrez que je suis passé au string (c'est une bénédiction cette bibliothèqe) et vous verrez aussi que j'ai ajouté un constructeur.

J'aurai une question au niveau du destructeur aussi...
Par contre j'ai un pépin TRES grave qui fout tout mon code à terre là. En gros depuis que j'utilise des méthodes et nn pas des fonctions pour affiche() et remplit() bah mon code compile plus.

Car chaque occurence de ubuntero[i] dans ces méthodes ne passe pas le compilateur.
Il faut que je me contente de ubuntero tout court...

Et à moins de faire un truc un peu crade genre ceci dans le main :

for(i...) {membre[i].remplit();}

En plus faire tout ça dans le main bah ça rend ma classe et mes méthodes totalement inutiles. Autant faire du C ou des structures... C'est très con comme situation ^^'

Là mon programme est KO ! Alors comment dire aux méthodes que je veux travailler sur un tableau d'objets et non pas sur un seul objet. Merci smile

Dernière modification par aganim07 (Le 02/11/2007, à 19:37)

Hors ligne

#49 Le 02/11/2007, à 19:45

telliam

Re : Questions sur la P.O.O. (C++ et JAVA)

peux tu fournir le code qui compile pas?


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#50 Le 02/11/2007, à 19:54

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Walou smile
Je comprends pourquoi la façon dont j'appele remplit() et appele() sur membre dans le main ne va pas. membre est un tableau et moi je fais comme si c'était une seule instance de ubuntero.

Mais comment-qu'on-fait pour contourner ce pb ?? Mine de rien ça m'a l'air bien tordu...

// main.cpp


/*=== Header ===*/

#include<iostream>
#include<string>
using namespace std;


/*=== Classe ubuntero ===*/

class ubuntero {
      
      private:
             string pseudo;
             string email;
             int age;
      
      public:
             ubuntero();
             ~ubuntero();
             void remplit(int SIZE);
             void affiche(int SIZE);
};


/*=== Constructeur ubuntero ===*/

ubuntero :: ubuntero() {
            cout << "Construction de ubuntero" << endl;
            pseudo = "empty";
            email  = "empty";
            age = 0;
}


/*=== Destructeur ~ubuntero ===*/

ubuntero :: ~ubuntero() {
            cout << "Destruction de ubuntero" << endl;
            /*ICI IL FAUDRAIT FAIRE LE TRUC AVEC DELETE MAIS Y A PAS DE NEW ALORS...*/
}


/*=== Méthode remplit ===*/

void ubuntero :: remplit(int SIZE){
     
     int i;
     for(i=0 ; i<SIZE ; i++) {
            cout << "Tapez le pseudo (ou q pour quitter) : ";
            cin >> ubuntero[i].pseudo;      // LE PB EST ICI
            if (ubuntero[i].pseudo == "q") {break;}
            cout << "Tapez l'email : ";
            cin >> ubuntero[i].email;       // LE PB EST ICI
            cout << "Tapez l'âge : ";
            cin >> ubuntero[i].age;         // LE PB EST ICI
     }
}


/*=== Méthode affiche ===*/

void ubuntero :: affiche(int SIZE){
     
     int i;
     for(i=0 ; i<SIZE ; i++) {
            cout << "Le pseudo est : " << ubuntero[i].pseudo << endl;           // LE PB EST ICI
            cout << "L'email est : "   << ubuntero[i].email  << endl;           // LE PB EST ICI
            cout << "L'âge est : "     << ubuntero[i].age    << endl << endl;   // LE PB EST ICI
     }
}


/*=== Fonction main ===*/

int main(int argc, char* argv[]) {   //IL FAUT ECRIRE STRING ARGV[] MAINTENANT ??
    
    int i, SIZE;
    string question;
    
    cout << "Combien de membres souhaitez-vous inscrire ?" << endl;
    cin >> SIZE;
    
    ubuntero membre[SIZE];   // INSTANCES de la classe ubuntero      
    
    membre.remplit(SIZE);        // ICI évidemment ça ne va plus...
    membre.affiche(SIZE);        // ICI non plus du coup...
    
    system("PAUSE");
    return 0;    
}

PS : En gros comment dire à une méthode de travailler sur les membres de l'objet membre (j'ai mal choisi mes libellés moi ^^) si l'objet est en fait un tableau d'objets. Ici il y a SIZE instances de la classe ubuntero.

PPS : Dans le constructeur, j'ai écrit ubuntero et pas ubuntero[i] car je pense que le constructeur s'applique au fur et à mesure à chaque fois que je crée une instance de classe. Donc le constructeur doit s'exécuter automatiquement SIZE fois quand je tape ceci dans le main : ubuntero membre[SIZE]; Me trompe-je ?

Dernière modification par aganim07 (Le 02/11/2007, à 20:01)

Hors ligne