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 :

Instancier une classe à partir d'une variable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut Instancier une classe à partir d'une variable
    Bonjour à tous.

    Me voici confronté à un problème qui à du être posé plusieurs fois mais dont je ne trouve pas la solution. Veuillez m'excuser par avance de ce doublon.

    Je souhaite instancier de façon statique ma classe NavaidsPoint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        NavaidsPoint(QString code, double latitude, double longitude, QString country = "") 
        {
            m_code = code;
            m_latitude = latitude;
            m_longitude = longitude;
            m_country = country;
            m_position.setLatitude(latitude);
            m_position.setLongitude(longitude);
     
        }
    avec la variable str de ma fonction addNavaids :
    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
     
    void addNavaids(){
        QFile file(QCoreApplication::applicationDirPath() + "/data/Waypoints.txt");
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QMessageBox::information(0, "erreur lecture fichier : " + file.fileName(), file.errorString());
            return;
        }
        //Parser du fichier Waypoints
        QTextStream in(&file);
        while(!in.atEnd()) {
            QString line = in.readLine();
            QStringList fields = line.split(",");
            QString str = fields.at(1);
            double latitude = str.toDouble();
            str = fields.at(2);
            double longitude = str.toDouble();
            str = fields.at(0);
     
            NavaidsPoint str(str,latitude, longitude);
        }
        return;
    }
    A la compilation, je reçois l'erreur suivante : "conflicting declaration 'NavaidsPoint str' - NavaidsPoint str(str,latitude, longitude);"

    Je ne comprends pas mon erreur. Que dois-je corriger ?

    Merci pour votre aide.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NavaidsPoint str(str,latitude, longitude);
    Tu ne peux pas créer un NavaidsPoint nommé str, puisque tu as déjà une variable de ce nom (en l'occurence une QString).

    Je parie que la ligne d'erreur suivante est "previous declaration here: "

    essaye plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NavaidsPoint point(str,latitude, longitude);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    Oui, tu as raison, la ligne d'erreur suivante est bien : previous declaration as 'QString str'.

    Mais je ne veux pas appeler mon instance str, mais la valeur que vaut str à chaque boucle ( mettons d'abord Oslo, puis Paris, puis Berlin...).

    C'est ça qui ne fonctionne pas...

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ce qui ne va pas, c'est que ta variable NavaidsPoint a le même nom qu'une autre définie dans le même bloc.
    Change le nom de l'une des deux.

    Ton NavaidsPoint n'est probablement pas une string, nomme-le plus explicitement (point, current, current_point, somme_cool_place...)

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Si le but, c'est de créer des objets depuis un fichier, cela s'appelle de la désérialisation.
    Et des framework de sérialisation/désérialisation, c'est pas ça qui manque.
    Cela éviterait de réinventer une usine à gaz.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    voici la partie de code modifiée pour instancier mon NavaidsPoint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            str = fields.at(0);
     
            QString currentPoint = str;
     
            NavaidsPoint currentPoint(str, latitude, longitude);
        }
        return;
    }
    J'obtiens exactement le même message d'erreur. La valeur de currentPoint n'est pas utilisée. Le système utilise le "mot" currentPoint au lieu de le lire comme une variable et d'en extraire la valeur. Et bien sûr, il dit qu'il est déjà défini. Ce n'est pas possible qu'on ne puisse pas instancier une classe à partir d'une variable, je ne dois pas être le seul être humain sur terre à avoir voulu faire cela...

    Quant à la sérialisation/désérialisation, je pense que ce concept n'est pas relatif à ce que je veux faire.
    Le fichier waypoints.txt est simplement composé de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    ESPEG,30.96778,106.00889,ZP
    ESPEG,-33.82835,122.01582,YM
    ESPEH,-33.66709,121.77498,YM
    ESPEI,-33.74488,122.01744,YM
    ESPEM,-33.68509,121.83089,YM
    ESPER,-27.01139,-63.63222,SA
    ESPIG,43.51072,4.10519,LF
    ESPIN,40.84944,-2.50000,LE
    ESPIN,-20.93000,-54.91467,SB
    ...
    c'est assez simple en fait. Je veux que mon objet NavaidsPoint soit instancié avec le code à 5 lettres de la première colonne, pas plus.

    J'en oublierai presque de vous remercier pour votre aide.


  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Quant à la sérialisation/désérialisation, je pense que ce concept n'est pas relatif à ce que je veux faire.
    Vous vous leurrez, c'est parfaitement ce que vous tentez de faire, de manière très maladroite.

    Bon vu la "complexité" du bidule, pas besoin de sortir le croiseur interstellaire pour ça.

    Vous faites une méthode qui prend en entré un stream du fichier.
    Il lit ligne à ligne le stream en mettant la ligne courante dans une std::string.
    Vous utilisez une expression régulière pour valider et découper votre ligne.
    Un truc de la forme "([A-Z]{5}),(-?\d+(?:\.d+)),(-?\d+(?:\.d+)),([A-Z]{2})"
    Vous avez en sortie, les chaines découpés, et vous utilisez "std::stod" pour récupérer les doubles depuis les captures 2 et 3.
    Vous n'aurez ensuite qu'à utiliser le constructeur qui va bien avec ces 4 arguments tout chaud.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par KonTiKI Voir le message
    J'obtiens exactement le même message d'erreur. La valeur de currentPoint n'est pas utilisée. Le système utilise le "mot" currentPoint au lieu de le lire comme une variable et d'en extraire la valeur. Et bien sûr, il dit qu'il est déjà défini. Ce n'est pas possible qu'on ne puisse pas instancier une classe à partir d'une variable, je ne dois pas être le seul être humain sur terre à avoir voulu faire cela...
    Ben oui, mais tu as une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString currentPoint = str;
    qui déclare une variable de type QString, dont le nom est currentPoint et qui prend la même valeur que str (qui existe par ailleurs). Elle ne sert à rien ici!

    Puis, à la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NavaidsPoint currentPoint(str, latitude, longitude);
    tu déclares une variable qui s'appelle... currentPoint (tiens, c'est le même nom!!! ) mais qui est de type NavaidsPoint et qui sera construit en prenant str, latitude et longitude comme paramètre...

    Cherchez l'erreur! C++ est un langage fortement typé: une fois que l'on a déclaré qu'une variable était d'un type particulier, on ne peut plus changer le type de cette variable. Si l'on a besoin d'une variable d'un autre type, il faudra lui donner un nom différent de la première

    Il faut apprendre à lire et à comprendre les messages que le compilateur t'envoie, car ce n'est pas ton ennemi! Bien au contraire, c'est ton meilleur ami, qui fait tout ce qu'il peut pour s'assurer que le code que tu écrit soit correct, pour t'aider à trouver les endroits où il y a un problème, pour pour t'aider à déterminer l'origine du problème.

    Il faut juste arriver à comprendre ce qu'il dit. Et respecter les règles imposées par le langage.

    Tu viens sans doute de langages plus "permissifs" avec lesquels tu pouvais changer le type d'une variable à la volée, en décidant par exemple que maVar était une chaine de caractères au début d'une fonction, mais en décidant au milieu de la fonction que maVar devenait un entier. Tu ne peux pas faire cela en C++.

    Une fois que tu auras compris cela, tu t'évitera bien des soucis
    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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2011, 15h58
  2. accéder à variable privée d'une classe à partir d'une autre classe
    Par restapa dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/08/2010, 08h56
  3. modifier une variable d'une classe à partir d'une autre classe
    Par Rniamo dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/03/2008, 20h40
  4. Réponses: 2
    Dernier message: 29/03/2007, 14h08
  5. Accéder à des objets d'une Form à partir d'une classe
    Par kinouseb dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/01/2007, 18h07

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