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 :

probleme :request for member 'begin'


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 1
    Par défaut probleme :request for member 'begin'
    Bonjour;

    Voila je galère un peu. Depuis quelque temps j'ai un problème redondant que je n'arrive pas à résoudre...
    Code :
    $$Nom : 1.PNG
Affichages : 389
Taille : 16,4 Ko
    Nom : 2.PNG
Affichages : 361
Taille : 15,8 Ko
    Nom : 3.PNG
Affichages : 374
Taille : 17,2 Ko
    Nom : 4.PNG
Affichages : 329
Taille : 10,5 Ko
    Nom : 5.PNG
Affichages : 324
Taille : 11,4 Ko

  2. #2
    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, et bienvneue sur le forum.

    Avant de répondre à ta question, je vais me permettre quelques remarques d'ordre générale :

    1- au lieu d'utiliser une capture d'écran pour nous présenter ton code, pourrais tu simplement faire un copier coller du code lui-même et nous le transmettre au travers du bouton en forme de #

    C'est plus facile pour tout le monde : pour toi, parce que que la création de capture d'écran et la transmission d'image sur le forum représente des manipulations fastidieuses, pour nous parce que cela nous permet -- le cas échéant -- de copier ton code plus facilement (sans devoir le taper nous même) au travers d'un autre copier coller

    2- tu ne dois inclure dans un fichier que les fichiers d'en-tête qui te sont absolument indispensables :

    Dans toute la liste des fichiers d'en-tête que tu as inclus, les seuls qui soient réellement indispensables seraient <vector> et <iostream>. Et encore : car

    3- L'idéal, quand tu te trouve face à une situation dans laquelle la fonction que tu développe n'est pas en mesure de fournir le résultat attendu, est toujours de mettre fin purement et simplement au processus en cours, car, autrement, c'est toute la suite des opérations qui risque de provoquer des résultats incohérents.

    Selon le cas, tu peux le faire au travers d'une assertion si le problème est forcément du à une erreur de logique de la part de celui qui fait appel à la fonction ou en lançant une exception, si l'erreur est "indépendante de la volonté du développeur".
    ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(start>n || dest>n || start<0 || dest<0){
        cout<<"erreur"<<endl;
    }
    est très loin d'être suffisant en l'espèce, car il se contente d'effectuer un affichage, alors qu'il devrait obliger le développeur qui fait appel à la fonction à vérifier la logique qui mène à l'appel de la fonction, et qu'il faudrait donc utiliser -- idéalement -- au moins une assertion.

    Ce qui, du coup, implique que l'affichage ne serait même pas nécessaire et donc que l'inclusion de <iostream> n'aurait aucun intérêt dans le cas présent (par contre, l'inclusion de <cassert> ou de <stdexcept> serait nécessaire, selon que tu décide de recourir à une assertion ou à une exception).

    4- On n'utilise JAMAIS la directive using namespace std;...

    Cette directive a été proposée dans les tous premiers temps de la normalisation, quand il a été décidé de placer le contenu de la bibliothèque standard dans l'espace de noms std, pour permettre au code écrit avant la normalisation de continuer de compiler avec "un minimum de modifications".

    On peut difficilement prétendre qu'un code écrit dans les années 2000 et quelques date d'avant la normalisation, qui date des année 1990

    5- Enfin, ton code est fondamentalement buggué, parce que new risque de lancer une exception et qu'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    visited = new bool[n]; // (1)
    adj = new int* [n]; //(2)
    for(int i=0;i<n;i++){
        adj[i] = new int[n]; // (3)
    }
    peut donc lancer "n'importe quand" une exception en (1), en (2) et en (3).

    Si une exception survient en (1), tu n'auras pas trop de problème. Si elle survient en (2) ou en (3), ce sera la catastrophe
    Pour répondre à ta question, il faut comprendre que std::vector est une classe, qui dispose de fonctions membres que les développeurs ont définies pour lui permettre de fournir les services auxquels les utilisateurs sont en droit de s'attendre de sa part.

    Parmi les fonctions membres en question, se trouvent les fonction begin(), qui fournit l'accès à un itérateur donnant accès au premier élément de la liste et la fonction end() qui donne accès à un itérateur sur "ce qui suit" le dernier élément de la liste.

    De plus, cette directive pose pas mal de problème. Pour t'en convaincre, essaye simplement d'afficher une donnée nommée cout (de type entier, par exemple) en utilisant cette directive, tu seras surpris du résultat

    La donnée membre adj n'est pas une instance de classe : c'est un pointeur de pointeur sur un entier. C'est à dire : l'adresse mémoire à laquelle nous trouverons une autre adresse mémoire à laquelle nous trouverons (normalement) une donnée de type int. Or, le type int n'est pas une classe : c'est un type primitif qui est directement manipulable par le langage, qui ne dispose donc d'aucune fonction membre.

    Au mieux, un pointeur de pointeur peut il être considéré comme étant un ensemble de pointeurs (sur entier) contigus en mémoire, auquel nous pourrons accéder au travers de l'opérateur [] et l'élément auquel nous accédons au travers de adj[x] peut il être considéré comme... un ensemble d'entier contigus en mémoire, pour lequel il sera possible d'accéder aux différents entiers qui le composent au travers de l'opérateur [].

    C'est, en gros, ce que te dis le compilateur au travers de son message (qu'il faut apprendre à décrypter, je te l'accorde):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: request for member begin in <snip> wich is non-class type int *
    A l'heure actuelle, on n'utilise pour ainsi dire plus jamais new (ou delete), car on préfère utiliser des classes qui s'occupent elles-mêmes de gérer correctement la mémoire qu'elles utilisent comme std::vector ou std::string, par exemple.

    De manière générale, si tu as besoin de tableaux, surtout s'ils s'agit de tableau dont la taille ne sera connue qu'à l'exécution, utilise std::vector: c'est une classe spécifiquement prévue à cet effet. Cela t'évitera bien des soucis par la suite (en plus d'être une classe qui dispose d'un grand nombre de fonctions membres adaptées aux différentes situations)

    De la même manière, au lieu d'utiliser un tableau C style sous une forme proche de int tab[3];, nous préférerons utiliser la classe std::array, qui est également une classe spécifiquement dédiée à cet usage, et qui permet également d'utiliser les fonctions membres begin() et end()

    En résumé :

    Tu es, de toute évidence, un débutant qui se heurte à un très mauvais cours.

    Ne prends pas les remarques que j'ai faites comme une attaque personnelle, mais comme le "résultat logique" de ce mauvais cours.

    Dis toi au contraire que nous avons tous été débutants à un moment ou à un autre, et que nous avons tous été confrontés à des problèmes similaire, mais que tu as "la chance" de pouvoir profiter de notre expérience, et de corriger les mauvaises habitudes que ton cours est occupé à te donner.

    Pour notre part, nous avons pour certains du changer des habitudes prises depuis beaucoup plus longtemps, et nous avons du le faire "à la dure". Si l'on peut t'éviter ce genre de piège, ce sera tout bénéfice pour toi
    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. Réponses: 2
    Dernier message: 17/02/2013, 20h59
  2. Réponses: 29
    Dernier message: 23/08/2010, 09h24
  3. request for member
    Par annesophiedecar dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2009, 21h20
  4. [C] request for member ". . ." in
    Par Meri Nose dans le forum C
    Réponses: 11
    Dernier message: 30/01/2009, 20h03
  5. Réponses: 14
    Dernier message: 14/09/2007, 17h28

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