probleme de compréhension au niveau des class (amateur)
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

probleme de compréhension au niveau des class (amateur)



  1. #1
    cosmoff

    probleme de compréhension au niveau des class (amateur)


    ------

    Bonjour,

    Je vois actuellement les classes et j'ai un petit probleme de compréhension, voici mon code :

    Code:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Bonjour{
    	public:
    		Bonjour(){
    			cout<<"bonjour !"<<endl;
    		}
    		void Bye(){
    			cout<<"Au revoir !"<<endl;
    		}
    };
    
    int main(int argc, char const *argv[])
    {
    	Bonjour B;
    	B.Bye();
    	Bonjour::Bye();
    
    
    	return 0;
    }
    Mon code fonctionne sauf si je met la ligne Bonjour::Bye();, mais je ne comprend pas pourquoi mon compilateur crie quand il voit ca, car quand j'utilise la class std je peux tres bien faire appelle à la méthode cout : std::cout et ca ne pose aucun probleme pour le compilateur, alors pourquoi dans ce cas ci ca pose des problemes ?

    Merci d'avance pour votre aide.

    -----

  2. #2
    Jack
    Modérateur

    Re : probleme de compréhension au niveau des class (amateur)

    Bonjour::bye() voudrait dire que bye est une méthode de classe, donc que bye ait été déclarée comme static. (fais une recherche sur attributs et méthodes statiques)

  3. #3
    cosmoff

    Re : probleme de compréhension au niveau des class (amateur)

    Je viens de tomber sur un Tuto d'openclassroom sur les méthodes statics, je vais jeter un coup d'oeil, merci de l'info Jack

  4. #4
    Paraboloide_Hyperbolique

    Re : probleme de compréhension au niveau des class (amateur)

    Bonjour,

    Au passage, "std" est un namespace, pas une classe...

  5. A voir en vidéo sur Futura
  6. #5
    cosmoff

    Re : probleme de compréhension au niveau des class (amateur)

    je viens de regarder les namespaces et j'ai un probleme de compréhension la dessus, en faite le namespace std indique que par exemple, la méthode cout doit etre la méthode qui se trouve dans le namespace std de la bibliothèque <iostream> c'est bien ca ?

  7. #6
    Dlzlogic

    Re : probleme de compréhension au niveau des class (amateur)

    Bonsoir,
    Je comprends vos interrogations.
    Je sais bien que le C++ est considéré comme un langage différent du C, mais malgré toutes mes lectures, je reste persuadé que c'est une extension du C. Pour simplifier, l'extension consiste en l'existence de classes, avec tout cela implique. Il a donc été crée des classes pour des opérations classiques, par exemple la classe iostream. Cela a provoqué l'écriture de code à rallonge. L'instruction "namespace" signifie que toutes les fonction "inconnues" peuvent être dans la librairie précisée. C'est un peu comparable à la présence d'un .h qui contient touts les prototypes concernés.
    Tout ceci concerne le chapitre "utilisateur" avec ses clés d'utilisation. Mon conseil, faites les développements que vous souhaitez et pour ce genre de détail, respectez strictement les indications des différentes doc.
    Pour être plus précis, personnellement, j'utilise la logique et les possibilités du C++, mais pas les différentes classes considérées comme faisant partie du langage. Pour être précis, je n'en utilise qu'une ou deux.C'est à dire que dans mes programmes cohabitent des malloc et des new. Je sais que c'est hérétique, mais la qualité du résultat est indiscutable.
    Bonne soirée.

  8. #7
    Paraboloide_Hyperbolique

    Re : probleme de compréhension au niveau des class (amateur)

    Bonjour,

    Citation Envoyé par cosmoff Voir le message
    je viens de regarder les namespaces et j'ai un probleme de compréhension la dessus, en faite le namespace std indique que par exemple, la méthode cout doit etre la méthode qui se trouve dans le namespace std de la bibliothèque <iostream> c'est bien ca ?
    La principale utilité d'un namespace est d'éviter les conflits de noms. Cela permet d'avoir des classes/fonctions portant le même nom, mais ayant des utilités différentes. Par exemple, on peut créer une classe "vector" modélisant un vecteur de * qui n'entrera pas en conflit de nom avec std::vector (qui est un conteneur d'objets).

    *Avec les opérations mathématiques correspondantes.

    Le namespace "std" (standard) contient toutes les classes et fonctions standards du C++ (comme cout). J'ai tendance à considéré qu'il s'agit là d'un namespace "réservé", même si en pratique on peut coder ses propres classes/fonctions dans ce namespace (ce que je ne recommande pas).

  9. #8
    Paraboloide_Hyperbolique

    Re : probleme de compréhension au niveau des class (amateur)

    Bonjour Dlzlogic,

    Quelques précisions sur ce que vous dites, car les puristes risquent de sortir de leurs gonds:

    Citation Envoyé par Dlzlogic Voir le message
    Je sais bien que le C++ est considéré comme un langage différent du C, mais malgré toutes mes lectures, je reste persuadé que c'est une extension du C.
    En grande partie oui, mais pas tout à fait. Certaine instructions permises en C ne le sont pas en C++.

    Par exemple:
    Code:
    int *j = malloc(sizeof(int)*5);
    est interdit en C++ (il faut ajouter un cast explicite devant le malloc).
    Pour plus d'informations, voyez par exemple: https://en.wikipedia.org/wiki/Compat..._C_and_C%2B%2B

    Citation Envoyé par Dlzlogic Voir le message
    Pour simplifier, l'extension consiste en l'existence de classes, avec tout cela implique. Il a donc été crée des classes pour des opérations classiques, par exemple la classe iostream. Cela a provoqué l'écriture de code à rallonge.
    En général, c'est plutôt le contraire qui se passe (code plus court et synthétique*). Je suppose que vous avez en tête l'exemple du "cout" et du "printf" où "printf" s'avère plus pratique d'utilisation dans certains cas.

    *Par exemple la concaténation de chaînes en C++:
    Code:
    std::string s = "Hello"; s += " World";
    Citation Envoyé par Dlzlogic Voir le message
    [...]dans mes programmes cohabitent des malloc et des new. Je sais que c'est hérétique, mais la qualité du résultat est indiscutable.
    Non seulement hérétique, mais dangereux. Tout malloc doit être suivit d'un free et tout new d'un delete, le mélange des deux donne lieu, au mieux, à des fuites mémoire. Il faut donc être (très) prudent quand on fait un tel mélange.

  10. #9
    Dlzlogic

    Re : probleme de compréhension au niveau des class (amateur)

    Bonjour Paraboloïde Hyperbolique,
    Oui, d'accord pour tout.
    Citation Envoyé par Dlzlogic Voir le message
    [...]dans mes programmes cohabitent des malloc et des new. Je sais que c'est hérétique, mais la qualité du résultat est indiscutable.
    Non seulement hérétique, mais dangereux. Tout malloc doit être suivit d'un free et tout new d'un delete, le mélange des deux donne lieu, au mieux, à des fuites mémoire. Il faut donc être (très) prudent quand on fait un tel mélange.
    Par contre, là je me suis peut-être mal exprimé.
    Dans certains cas j'utilise malloc pour créer une variable ou une structure et lorsque je supprime cette structure, je libère la mémoire avec free.
    Je pense par exemple à une gestion par liste chainée.
    Mais dans le même programme, je peux avoir des cas où je préfère, parce que c'est mon choix, créer un objet avec un new. Si je le supprime, naturellement je le ferai avec delete.
    Et, il m'arrive même d'utiliser la classe TList de CLX, et d'autres dont je ne ferai pas état ici.
    Il existe un langage qu'on appelle C++ qui a une syntaxe et une logique précise. Pour ce langage, on a écrit des librairies. C'est mon droit de les utiliser toutes ou pas, à ma convenance, selon mes besoins. Exemple, pour faire une boucle il existe plusieurs formes, contenues dans le langage, pourquoi se limiter à une seule forme dans un même programme.

    [MP] As-tu regardé la résolution de systèmes du second degré ? C'est plus des math que de l'informatique.[/MP]
    Bonne journée.

  11. #10
    pm42

    Re : probleme de compréhension au niveau des class (amateur)

    Citation Envoyé par Dlzlogic Voir le message
    Il a donc été crée des classes pour des opérations classiques, par exemple la classe iostream. Cela a provoqué l'écriture de code à rallonge.
    Non. Le C++ permet au contraire une syntaxe plus concise, extensible. Voir par exemple plus haut la manipulation des string comparé à celle des char*.

    Citation Envoyé par Dlzlogic Voir le message
    L'instruction "namespace" signifie que toutes les fonction "inconnues" peuvent être dans la librairie précisée. C'est un peu comparable à la présence d'un .h qui contient touts les prototypes concernés.
    Absolument pas. C'est un espace de dommage qui peut être orthogonal avec les .h.

    Citation Envoyé par Dlzlogic Voir le message
    .C'est à dire que dans mes programmes cohabitent des malloc et des new. Je sais que c'est hérétique, mais la qualité du résultat est indiscutable.
    Personne ne connait la qualité du résultat et sauf à avoir une bonne raison, c'est une aberration ne serait ce qu'en terme de maintenance et d'évolutivité.

    Citation Envoyé par Dlzlogic Voir le message
    . C'est mon droit de les utiliser toutes ou pas, à ma convenance, selon mes besoins. Exemple, pour faire une boucle il existe plusieurs formes, contenues dans le langage, pourquoi se limiter à une seule forme dans un même programme.
    Pour chaque langage, on définit des "meilleures pratiques", l'une d'elle étant d'utiliser les différentes constructions à bonne escient, de façon cohérente et régulière pour limiter les risques d'erreurs, faciliter la relecture et la maintenance, la factorisation de code, etc.
    Dire "à ma convenance" traduit une incompréhension de ce qu'est la programmation.

    Dans votre coin vous faites ce que vous voulez. Mais donner des conseils aussi aberrants à un débutant est plus que critiquable.

  12. #11
    Dlzlogic

    Re : probleme de compréhension au niveau des class (amateur)

    @ Pm42,
    Ce que vous dites est très bien. Concernant les conseils que je donne, c'est assez rare puisque je préfère dire comment je fais.
    Concernant mes compétences, je voudrais savoir ce qui vous permet d'en parler ainsi. Vous n'avez aucune idée de ce qu'elle sont. Vous n'avez aucune idée des tests que j'ai faits avant d'affirmer quelque-chose.

    Pour chaque langage, on définit des "meilleures pratiques", l'une d'elle étant d'utiliser les différentes constructions à bonne escient, de façon cohérente et régulière pour limiter les risques d'erreurs, faciliter la relecture et la maintenance, la factorisation de code, etc.
    Dire "à ma convenance" traduit une incompréhension de ce qu'est la programmation.
    Cette phrase me laisse penser que vous faites un amalgame entre "programmation" et "langage". La "bonne pratique" se situe au niveau de la programmation, c'est à dire l'algorithmique, mais apparemment ce terme a changé de signification. Ce qui concerne le langage n'est qu'une traduction suivant une syntaxe précise. Si j'estime que la bonne pratique dans tel cas est d'utiliser "for" plutôt que "do" ou "while", c'est mon choix, ma convenance etc., et pourquoi pas le goto ? De la même façon, je dispose de deux fonctions de création d'objet (alloc et new), j'utilise l'une ou l'autre suivant les cas et selon mon choix.

    Vous citez les avantages de string par rapport à char*. Là aussi, j'utilise les deux, suivant les cas. D'ailleurs, s'il n'y avait qu'une bonne pratique, les langages tiendraient compte de ce fait, ce qui n'est pas le cas, puisque tous les langages (que je connais) offrent plusieurs méthodes pour une action donnée.

  13. #12
    pm42

    Re : probleme de compréhension au niveau des class (amateur)

    Citation Envoyé par Dlzlogic Voir le message
    Cette phrase me laisse penser que vous faites un amalgame entre "programmation" et "langage".
    N'importe quoi.

    Citation Envoyé par Dlzlogic Voir le message
    La "bonne pratique" se situe au niveau de la programmation, c'est à dire l'algorithmique
    N'importe quoi également. La programmation n'est pas que l'algorithmique.
    Je sais bien que dans chaque post, vous expliqué qu'il faut faire son algorithme avant même quand on parle de Prolog que vous ne connaissez pa....

    Citation Envoyé par Dlzlogic Voir le message
    et pourquoi pas le goto ?
    Parce qu'il y a eu des études sur l'impact du dit goto et qu'on y a renoncé autant que possible. Faites une recherche sur qui est Dijkstra.
    Essayez d'apprendre aussi ce qu'est la transparence référentielle et son impact sur la parallélisation, l'optimisation par mémoization notamment et ce que l'absence d'effet de bord fait coté bugs et on pourra reparler de comment le goto pourrait être compatible avec tout ça.

    Je suis désolé mais votre ignorance en informatique est immense et ce que vous racontez n'a pas de sens pour quiconque programme sérieusement.

  14. #13
    Dlzlogic

    Re : probleme de compréhension au niveau des class (amateur)

    Juste un mot concernant le goto.
    D'abord, de Dijkstra, j'avoue ne connaitre que son algorithme dans le domaine des graphes, utilisé en particulier pour trouver le chemin le plus court. J'ai fait une recherche (rapide), le n'ai rien trouvé d'autre que des références à son algorithme.
    Le goto est une instruction comme les autres. On l'utilise ou pas, mais elle existe, et je n'ai pas vu qu'elle était dépréciée.
    On a certainement écrit beaucoup de chose sur cette instruction issue du Basic.
    Il est vrai que je me suis laissé impressionné par cela et mes programmes n'en contiennent pratiquement pas.
    Je voudrais bien voir un code utilisant cette instruction et que cela provoque des problèmes.
    Le saut est tout de même l'une des instructions fondamentales de la programmation. Il peut se faire sous plusieurs formes (for, do, while, return, switch, break, continue etc.).
    Un mot sur le switch. Il est souvent présenté comme une alternative à la forme
    if (...){....}
    else if(...){...}
    else if(...){...}
    else {...}
    dans un but de présentation.
    En fait c'est tout à fait différent. Si les variables testées sont des variables entières, ce qui est toujours possible avec un enum, alors switch est préférable et équivaut à l'instruction goto(a1, a2, a3, ... an) inexistante en C mais très utilisée en FortranIV et 77.
    On pourrait faire le même type d'explication pour toutes les instruction concernant les boucles. L'instruction break est un cas particulièrement intéressant.
    Il est vrai que mon ignorance en informatique est assez grande. Il y a tellement de sujets différents et tellement d'évolution que je suis un peu dépassé. Par contre, concernant la programmation, je ne sais pas ce qui vous permet de dire que je suis incompétent.

  15. #14
    pm42

    Re : probleme de compréhension au niveau des class (amateur)

    Citation Envoyé par Dlzlogic Voir le message
    D'abord, de Dijkstra, j'avoue ne connaitre que son algorithme dans le domaine des graphes, utilisé en particulier pour trouver le chemin le plus court. J'ai fait une recherche (rapide), le n'ai rien trouvé d'autre que des références à son algorithme.
    Comme je disais, c'est grave d'être ignorant à ce point.
    Et de ne pas être capable d'utiliser un moteur de recherche vu que "Dijkstra goto" renvoie immédiatement son article.

    Citation Envoyé par Dlzlogic Voir le message
    Le goto est une instruction comme les autres. On l'utilise ou pas, mais elle existe, et je n'ai pas vu qu'elle était dépréciée.
    C'est grave d'être ignorant à ce point.

    Citation Envoyé par Dlzlogic Voir le message
    On a certainement écrit beaucoup de chose sur cette instruction issue du Basic.
    Non, elle n'est pas issue du Basic mais de l'assembleur puis du Fortran notamment.
    C'est grave d'être ignorant à ce point.

    Citation Envoyé par Dlzlogic Voir le message
    je ne sais pas ce qui vous permet de dire que je suis incompétent.
    Tous vos posts et l'ampleur de votre ignorance, voir plus haut.

  16. #15
    Dlzlogic

    Re : probleme de compréhension au niveau des class (amateur)

    #### supprimé : HS en effet.

    L'article date de 1968 !
    Nous, on parle de langages et de compilateurs beaucoup plus modernes.
    S'il te plait, donne un exemple de code où le goto provoque une erreur, effet de bord ou autre.
    Il est vrai que de telles certitudes sont assez répandues. Autre exemple du même type : l'utilisation du break. J'en ai lu de toute sorte, par exemple des gens qui ne l'utilisaient pas, sauf dans le contexte du switch.
    Je sais bien que K&R déconseille son utilisation, mais apparemment pour des raisons de clarté et de lisibilité.
    Quand à mon compilateur, il ne donne aucun conseil particulier.
    Dernière modification par JPL ; 10/02/2017 à 21h23.

  17. #16
    Paraboloide_Hyperbolique

    Re : probleme de compréhension au niveau des class (amateur)

    pm42 et Dlzlogic: je vous suggère amicalement d'arrêter votre (nème) dispute avant qu'un modérateur ne le décide à votre place.

  18. #17
    pm42

    Re : probleme de compréhension au niveau des class (amateur)

    Citation Envoyé par Paraboloide_Hyperbolique Voir le message
    pm42 et Dlzlogic: je vous suggère amicalement d'arrêter votre (nème) dispute avant qu'un modérateur ne le décide à votre place.
    Corriger un gros paquet d'erreurs répétées en boucle à chaque fil sur la programmation n'est pas une dispute.

  19. #18
    pm42

    Re : probleme de compréhension au niveau des class (amateur)

    A titre indicatif, l'article "Goto considered harmful" date de 1968. C'est aussi vers cette époque qu'on passe à la programmation structurée, Pascal datant de 1970.
    On arrête les goto et on utilise des méthodes avec arguments, des boucles, etc. On limite si possible les variables globales...

    Ensuite, on passe à l'objet et maintenant, on introduit dans tous les langages courants des structures de la programmation fonctionnelle...
    Tout cela se fait pour de bonnes raisons, largement documentées.

    Les gens qui ne savent rien de tout ça et viennent nous expliquer que le goto ne pose pas de problème ou que le Forth est comme un langage moderne sont exactement l'équivalent de ceux qui viennent nous expliquer la gravité après avoir lu un article de vulgarisation sur Agoravox...

  20. #19
    JPL
    Responsable des forums

    Re : probleme de compréhension au niveau des class (amateur)

    Stop on arrête là et on est attentifs aux besoins de cosmoff. Plus aucun échange de flèches ne sera autorisé et si dans la suite X n'est pas d'accord avec Y vous êtes priés de le dire de façon neutre et sans aucune considération personnelle.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  21. #20
    cosmoff

    Re : probleme de compréhension au niveau des class (amateur)

    donc si j'ai bien compris les namespace, alors la bilbiotheque <iostream> possede plusieurs classes/fonctions du meme nom, par exemple une class cout et une autre class cout mais dans le namespace std? je trouve ca tres bizarre de ne pas s'etre contenté de ne pas utiliser le meme nom tout simplement ...

  22. #21
    CM63

    Re : probleme de compréhension au niveau des class (amateur)

    Oui, en principe c'est possible, mais je ne pense pas que ce soit le cas pour cet espace de nommage là et pour ces fonctions là, les fonctions cout et cin n'existent que dans <iostream>.
    Mais dans d'autres cas, ça peut se trouver, oui, une même fonction peut se trouver dans des espaces de nommage différents, elle sera alors implémentée différemment, et c'est en générale pour palier à des insuffisance de la première implémentation, qu'on conserve pour compatibilité.

    Tout cela, et bien d'autres choses (comme par exemple une gestion mémoire digne de ce nom) est "nettoyé" et assaini dans des langages plus modernes tels que Java ou C#

  23. #22
    Jack
    Modérateur

    Re : probleme de compréhension au niveau des class (amateur)

    donc si j'ai bien compris les namespace, alors la bilbiotheque <iostream> possede plusieurs classes/fonctions du meme nom
    Non, la classe iostream a été défininie dans l'espace de nom std.

    par exemple une class cout
    cout n'est pas une classe, mais une instance de la classe iostream, un objet donc.

    je trouve ca tres bizarre de ne pas s'etre contenté de ne pas utiliser le meme nom tout simplement ...
    Je ne comprends pas trop ce que tu veux dire, mais il n'y a qu'un seul cout qui existe lorsque tu inclus iostream (std::cout).
    Libre à toi de créer une classe dont une instance s'appellerait cout, mais définis alors cette classe dans un nouvel espace de nom monNamespace, et tu pourras utiliser monNamespace::cout

  24. #23
    Jack
    Modérateur

    Re : probleme de compréhension au niveau des class (amateur)

    les fonctions cout et cin n'existent que dans <iostream>.
    ce ne sont pas des fonctions.

    Mais dans d'autres cas, ça peut se trouver, oui, une même fonction peut se trouver dans des espaces de nommage différents, elle sera alors implémentée différemment, et c'est en générale pour palier à des insuffisance de la première implémentation, qu'on conserve pour compatibilité.
    C'est un point de vue personnel ou tu as vu un article concernant cette interprétation? Parce que ce n'est pas du tout mon interprétation de l'usage du nemespace.
    Cette FAQ est assez claire: https://cpp.developpez.com/faq/cpp/?page=Les-namespaces

Discussions similaires

  1. probleme avec mon code ( niveau amateur)
    Par Albert-cosmoff dans le forum Électronique
    Réponses: 14
    Dernier message: 25/06/2014, 16h19
  2. je suis a la recherche de cours d'info niveau amateur/debutant
    Par invite28b666d0 dans le forum Électronique
    Réponses: 6
    Dernier message: 08/03/2012, 09h18
  3. Réponses: 0
    Dernier message: 08/03/2010, 21h50
  4. [Blanc] Problème de Vapeur DOMENA Class 150
    Par inviteb9ab4321 dans le forum Dépannage
    Réponses: 0
    Dernier message: 05/03/2009, 09h43
  5. [Blanc] probleme class 150
    Par invited7eaf35b dans le forum Dépannage
    Réponses: 1
    Dernier message: 30/11/2008, 15h34