IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

création et utilisation de classes


Sujet :

C++

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut création et utilisation de classes
    Bonjour,

    je ne suis pas très doué dans la création de classes.
    j'essaye de créer une petite classe avec une methode :
    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
    27
    28
    #include <iostream>
    using namespace std;
     
    class MeasuringTemperature{
    	public :
    		//MeasuringTemperature();
    		double averageTemperature(int measuredValues[]);
    	private :
    		int measuredValues[];
    }
     
    double MeasuringTemperature::averageTemperature(int measuredValues[], int size_mesuredValues)
    {
    // une instruction quelconque
     
    return -300;
    }
     
    int main()
    {
    	int T[]={-273,-274,-273,-273},size_mesuredValues;
    	MeasuringTemperature MT;
    	double averageTemp;
    	size_mesuredValues=sizeof(T)/sizeof(int);
    	averageTemp=MT.averageTemperature(T[],size_mesuredValues);
    	cout<<"averageTemp = "<<averageTemp<<endl;
    	return 0;
    }
    a la compilation j'ai une foule d'erreur sur la ligne 12 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double MeasuringTemperature::averageTemperature(int measuredValues[], int size_mesuredValues)
    voila ce que dit le compilateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ubuntu@ubuntu:~/exercice1$ g++ -o MeasuringTemperature MeasuringTemperature.cpp
    MeasuringTemperature.cpp:12: error: new types may not be defined in a return type
    MeasuringTemperature.cpp:12: note: (perhaps a semicolon is missing after the definition of ‘MeasuringTemperature’)
    MeasuringTemperature.cpp:12: error: two or more data types in declaration of ‘averageTemperature’
    MeasuringTemperature.cpp:12: error: prototype for ‘MeasuringTemperature MeasuringTemperature::averageTemperature(int*, int)’ does not match any in class ‘MeasuringTemperature’
    MeasuringTemperature.cpp:7: error: candidate is: double MeasuringTemperature::averageTemperature(int*)
    MeasuringTemperature.cpp: In member function ‘MeasuringTemperature MeasuringTemperature::averageTemperature(int*, int)’:
    Est ce que quelqu'un a une solution, j'ai vraiment du mal avec les classes

    merci

  2. #2
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut désolé !!
    j'avais oublié le ";" a la fin de ma classe, désolé !!

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Ceci dit, il faudrait tout doucement commencer à penser "orienté objet"...

    En effet, la méthode averageTemperature correspond à deux comportements particuliers, qu'il serait fortement conseillé de séparer:

    D'un coté, on trouve le comportement qui consiste à rajouter une température, et, de l'autre, on trouve le comportement qui consiste à calculer (ou à renvoyer) la moyenne de ces températures.

    Or, ici, ta méthode averageTemperature, elle a deux responsabilités, ce qui en est une de trop

    En plus, l'un de premiers commandement du C++, c'est
    Citation Envoyé par le troisième commandement du C++
    ne jamais utiliser une particularité du C si une classe C++ permet de faire pareil, en évitant les problèmes
    A ton niveau, cela signifie qu'il serait opportun de préférer la classe vector, disponible dans l'espace de nommage std en incluant le fichier d'en-tête <vector> en lieu et place d'un tableau "C style", qui présente d'énormes inconvénients pour tout ce qui a trait à la gestion dynamique de la mémoire (voir la classe list, disponible également dans l'espace de nommage std, mais en incluant cette fois le fichier d'en-tête <list>, si tu es sur d'avoir principalement des accès itératifs aux températures fournies).

    Enfin, on peut se poser la question de savoir pourquoi tu veux fournir les températures sous forme d'entiers, et non sous forme de réels...

    Les conversions entiers <==>réels posent d'elles mêmes déjà énormément de problème du fait de la perte de précision que cela occasionne, et, tout compte fait, même pour les températures importantes (qu'elles soient positives ou négatives), il ne semble pas exclu que tu veuille pouvoir fournir une température avec une certaine précision après la virgule

    Au final, tu obtiendrais donc une classe pouvant fort ressembler à
    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
    #include <vector> // pour pouvoir utiliser la classe "vector" ;)
    class MeasuringTemperature
    {
        public:
            MeasuringTemperature(){}//de prime abord, aucune température n'est
                                    // insérée lors de la construction ;)
            ~MeasuringTemperature(){}//rien de particulier à faire non plus dans le 
                                     // destructeur
            void addTemperature(double temp);// ajouter une température
            const double operator[](size_t ind) const;/* juste pour te permettre de
                                              * travailler comme si c'était carrément
                                              * un tableau de températures ;)
                                              */
            double average() const;// permet de récupérer la température moyenne
        private:
            std::vector<double> alltemps;//le tableau des températures
            double aver;//(I)
    };
    (I)Il faut bien se rendre compte que, calculer la moyenne prendra d'autant plus de temps que le nombre de températures déjà introduites sera important...

    Dés lors, il s'agit de se poser la question de savoir le comportement que l'on préfère privilégier:
    Soit, on prévoit de faire, principalement, des ajouts de températures, et, de temps en temps, de demander la moyenne, soit on prévoit de demander régulièrement la moyenne, sans forcément faire des ajouts de températures entre deux demandes.

    Dans le premier cas, on préférera calculer la moyenne "à la demande", de manière à ne pas perdre trop de temps lors de l'insertion.

    Dans le deuxième, on peut préférer calculer la moyenne à chaque insertion de température, et stocker cette valeur pour qu'elle soit plus rapidement accessible.

    Si cette deuxième optique est suivie, il faudra, bien évidemment, disposer d'une variable qui permette de garder cette moyenne en mémoire le temps nécessaire

    L'implémentation prendrait la forme de
    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
    27
    28
    29
    30
    31
     
    void MeasuringTemperature::addTemperature(double temp)
    {
        alltemps.push_back(temp);
        /* si on décide de calculer la moyenne à chaque insertion, décommenter le 
         * code qui suit
         */
        /* aver=0.0; 
         * for(size_t i=0;i<alltemps.size();i++)
         *    aver+=alltemps[i];
         * aver/=alltemps.size();
         */
    }
    double MeasuringTemperature::average() const
    {
        /* si on décide de ne calculer la moyenne que quand on la demande,
         * aver n'est pas membre de la classe, et on le déclare donc comme 
         * variable temporaire.
         * Il faut alors décommenter le code qui suit
         */
        /* double aver=0.0;
         * for(size_t i=0;i<alltemps.size();i++)
         *    aver+=alltemps[i];
         * aver/=alltemps.size();
         */
        return aver;
    }
    const double MeasuringTemperature::operator[](size_t ind) const
    {
        return alltemps[ind];
    }
    Nota: j'ai considéré que l'on ne faisait jamais que rajouter des températures...

    Si le besoin s'en fait sentir, il reste possible de rajouter des comportements visant à en supprimer, voire, à carrément supprimer toutes les températures introduites...

    Cependant, il y a alors lieu de réfléchir à la manière dont la moyenne réagit à cette/ces suppression(s)

    On pourrait aussi envisager de rajouter un comportement qui indique le nombre de températures déjà introduites

    L'utilisation de cette classe deviendrait, typiquement, quelque chose prenant la forme de
    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
    27
    28
    29
    30
    31
    32
    33
    #include <iostream> //pour gérer les entrées/sorties standards
    #include <string> //pour disposer des chaines de caractères
    int main()
    {
        MeasuringTemperature obj;
        std::string encore="";
        do
        {
            float temp;
            std::cout<<"introduisez la température :";
            while(!(std::cin>>temp))
            {
                std::cout<<"veuillez introduire une valeur correcte s'il vous plait"
                <<std::endl;
            }
            obj.addTemperature(temp);
            do
            {
                std::cout<<"voulez vous continuer (O/N) :";
                std::cin>>encore;
                /* pour les gens vraiment distraits */
                if(encore !="o" && encore !="O" &&
                   encore !="n" && encore !="N")
                {
                    std::cout<<"veuillez choisir uniquement O ou N"<<
                    std::endl;
                }
            }while(encore !="o" && encore !="O" &&
                      encore !="n" && encore !="N");
        }while(encore =="o" || encore =="O");
        std::cout<<"la moyenne est de "<<obj.average();
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Création et utilisation d'un module de classe
    Par Marcopololo dans le forum VBA Access
    Réponses: 0
    Dernier message: 29/11/2011, 08h57
  2. Réponses: 10
    Dernier message: 17/01/2011, 09h20
  3. [Taglibs] Utiliser les classes css ?
    Par PeteMitchell dans le forum Struts 1
    Réponses: 4
    Dernier message: 05/05/2007, 01h31
  4. utiliser des classes dont on n'a pas le source
    Par kocin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/08/2004, 16h05
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo