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 :

pointeurs et classes


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 48
    Points : 49
    Points
    49
    Par défaut pointeurs et classes
    Bonsoir,

    J'ai pas mal de difficultés à comprendre les pointeurs... et en plus, lorsqu'ils sont utilisés dans les classes. J'ai un exercice où je dois créer une classe mère "Simple" et sa fille "Simple_F" comme ceci:
    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
    class Simple
    {
    //classe pour définir une fonction de base
    public:
            Simple(){}; //constructeur par défaut
    	virtual double f(double x)=0; //cette méthode est fournie et doit rester inchangée
    };
     
    class Simple_F : public Simple
    {
    private:
    	double a, b, c, d;
    public:
    	Simple_F(double A, double B, double C, double D) //constructeur
    	{
    		a = A;
    		b = B;
    		c = C;
    		d = D;
    	}
     
    	virtual double f(double x)
    	{
    		double f = a*(x*x*x) + b*(x*x) + c*x + d; //méthode pour définir la fonction qui nous intéresse dans un premier temps
    	}
    };

    J'ai deux autres classes, une mère "RF", et sa fille "RF_b" ci-dessous (je dois écrire "RF_b", et ma question est en commentaire dans le code ci-dessous):
    Ici j'aimerais initialiser la variable "fA" en faisant appel à la méthode "f" de la classe "Simple_F", et en remplaçant le paramètre x (argument de la fonction f) par la valeur de y et je ne suis pas certain de savoir comment faire avec le pointeur "Simple* F"

    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
    class RF
    {
    	virtual double findRoot(Simple* F, double y) = 0; //cette méthode est fournie et doit rester inchangée
    };
     
    class RF_B
    {
    private:
    	double fA, fB, xp; //on définit quelques variables qui seront utilisées
            double fxp=100000000;
    public:
    	virtual double findRoot(Simple* F, double y) //c'est là que j'ai un peu de mal, on pointe sur F, qui, d'après le main, fait référence à un objet de type "Simple_F" 
    	{
     
    		while (fxp > 1e-10) //je commence mon algorithme
    		{
     
                          //avant même d'aller plus loin et d'écrire l'algorithme, 
                         //ici j'aimerais initialiser la variable "fA" en faisant appel à la méthode "f" de la classe "Simple_F", et en remplaçant le paramètre x (argument de la fonction f) par la valeur de y
                        //je ne suis pas certain de savoir comment faire avec le pointeur "Simple* F"
    		}
    }

    Le main est fourni et est comme ceci:
    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
    int main() {
    	{
    		double A = 1;
    		double B = -6;
    		double C = 11;
    		double D = -6;
    		Simple_F f(A, B, C, D); //Ici on créé un objet Simple_F appelé "f", les paramètres a b c d sont initialisés à A B C D via le constructeur de Simple_F
     
    		RF_B bisec; // créer un objet RF_B appelé bisec
     
    		ofstream myfile;
    		myfile.open("Simple_FRoots.csv");
    		myfile << "x,bisection,secant,f(bisection),f(secant)" << endl;
     
                    for (double x = -1.0; x <= 6.0; x += 0.01) {
    			//appel de la méthode findroot de l'objet bisec, argument 1 = adresse de f (objet de type Simple_F), argument 2 = x (qui vaut -1 d'abord)
    			double r_bisec = bisec.findRoot(&f, x);
                    }
             myfile.close();
             }
    }

    Merci à tous

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 48
    Points : 49
    Points
    49
    Par défaut
    Re-bonsoir,

    En fait il suffit d'écrire:

    J'ignorais que (*F) existait...

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je te conseille vivement d'éviter les pointeurs de fonction de nos jours, et de regarder du côté de std::function qui a une syntaxe plus simple, et qui peut pointer sur tout un tas de choses (une fonction libre, une fonction membre, une lambda...).

    Après, ce n'est pas forcément l'idéal en perfs (mais c'est équivalent à ta solution actuelle), mais l'autre solution je pense à apprendre pour plus tard (et je ne sais pas en voyant ton code si elle est applicable).

    Sinon, il fait quoi pour toi ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	virtual double f(double x)
    	{
    		double f = a*(x*x*x) + b*(x*x) + c*x + d; //méthode pour définir la fonction qui nous intéresse dans un premier temps
    	}

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Maxnihilist Voir le message
    J'ignorais que (*F) existait...
    Ca s'appelle déréférencer un pointeur. Et si F est un pointeur, y'a l'opérateur -> pour accéder à ses membres.
    Nommer correctement les variables et classes aideraient aussi à comprendre mieux ce qu'il se passe.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 48
    Points : 49
    Points
    49
    Par défaut
    Bonjour

    Désolé du retard et merci pour vos réponses.
    Jolyloic: la fonction ne faisait rien puisque j'ai oublié de mettre " return f; "

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

Discussions similaires

  1. Problème de pointeurs sur classe
    Par fabiin dans le forum Delphi
    Réponses: 1
    Dernier message: 05/08/2006, 18h13
  2. Pointeurs de classes et méthodes
    Par insomniak dans le forum C++
    Réponses: 9
    Dernier message: 10/05/2006, 15h18
  3. polymorphisme, pointeurs et classes abstraites
    Par legend666 dans le forum C++
    Réponses: 10
    Dernier message: 02/11/2005, 16h44
  4. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  5. [C#] Pointeur de classe
    Par papouAlain dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/01/2005, 12h32

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