Bonsoir tout le monde, je viens d'apprendre qu'il est possible de faire de la POO en C alors je ne comprend plus la différence entre le C et le C++ et je suis plutôt perdu (il m'en faut pas beaucoup). Merci de partager votre sagesse ! HO SAGE ZERO PUISSIEZ VOUS M'EBLOUIR DE VOTRE INTELLIGENCE SUPERIEUR ... et caetera (pour changer et non je ne suis pas fou ! Seulement FATIGUE)
Veuillez agréer l'expression de ma considération distinguée. (sa veut dire cordialement)
Avant tout merci beaucoup de m'avoir répondu aussi vite.
Je m'explique, dans son excellent tutoriel Matthieu Nebra explique, je cite :" Si vous avez fait du C, vous connaissez le mot-clé struct. On peut aussi l'utiliser en C++ pour créer des classes. La seule différence avec le mot-clé class est que, par défaut, les méthodes et attributs sont publics au lieu de privés."
Il explique également que les classes sont des prototypes de la POO, donc faire une classe est faire un "genre" de POO ?
Cordialement.
Ma bible -> Le langage C++ par Bjarne stroustrup (je comprend pas tout mais il sait de quoi il parle !)
La POO, c'est plus que de l’encapsulation de données dans des structures. Il faut aussi pouvoir encapsuler des fonctions, faire de l'héritage, polymorphisme, etc. Attention : struct (C++) ~ class (C++), mais struct (C) != struct (C++).
Même s'il est possible de "simuler" la POO en C, ce n'est pas un langage POO. En particulier parce qu'il ne permet pas d'abstraction forte.
Et le C++ n'est pas un langage POO, c'est un langage qui permet la POO (mais pas que)
J'ajouterais qu'on peut faire des classes et malgré tout avoir une conception pas du tout orientée-objet.
Mohack a écrit:
Comment utiliser la POO dans le C °_O
Ça dépend jusqu'où tu veux aller. Mais typiquement, l'encapsulation est assez simple :
Fichier header :
#ifndef _TRUC
#define _TRUC
typedef struct machin* machin_t;
machin_t create();
void service(const machin_t m, int* autre_truc);
void mutant(machin_t m, int a);
void destroy(machin_t m);
#endif
Fichier source :
#include "machin.h"
struct machin{
int m_a;
int m_b;
float m_f;
};
void fonction_privee(machin_t m){
}
//et on implémente les fonctions publiques.
Et voilà, on a une manière d'encapsuler les données et les fonctionnalités en C, c'est une première étape pour l'objet. Après, on peut faire des choses pour le polymorphisme mais je vais pas écrire d'exemples parce que c'est très chiant. La question c'est pas "est-ce possible de faire de l'OO en C ?" parce que, oui évidemment, même si c'est la croix et la bannière. Mais plutôt "est-ce que c'est pratique ?", non clairement pas.
Et puis pour finir, et rebondir sur ce que dit @lmghs, dans le cas présent, tu es obligé d'appeler le create/destroy à la main pour entraîner la libération des ressources (mémoire, socket, mutex, handler de fichier, handler de machin à espresso ...). En C++, non, le destructeur c'est automatique quand on dépile, c'est ça la magie du RAII.
C++ se veut compatible C (la plupart du temps un code C fonctionnera parfaitement avec un compilateur C++), une des différences c'est qu'en C++ les struct peuvent contenir des fonctions et hériter d'autre struct. L'héritage n'existe pas en C.
La différence ne s'arrête pas là, par défaut en C++, le struct se comporte comme en C, tu peux t'en apercevoir lorsque tu effectue un cast, sauf que lorsque ton struct hérite d'une autre struct (rappel : l'héritage n'existe pas en C), le comportement du cast change avec les types d'une même famille. Le polymorphisme n'existe pas en C.
Il n'est pas possible de faire de la POO en C, car déjà tu n'as pas d'héritage et polymorphisme.
Des articles qui expliquent comment faire de la "POO" (*) en C, il y en a (cf google / SO). On peut d'ailleurs allez assez loin dans la simulation de mécanismes du C++ (ie avoir des éléments proche du polymorphisme), sauf que, si pour des éléments de base ça se passe sans trop de mal, dès qu'on complexifie un peu, ça devient rapidement assez peu lisible et utilisable.
(*) J'aime de moins en moins cet acronyme personnellement, j'ai de plus en plus l'impression qu'il est vide de sens, ou plus exactement qu'il n'a pas le même sens pour tout le monde (ce qui n'aide pas à la discussion).
Il n'est pas possible de faire de la POO en C, car déjà tu n'as pas d'héritage et polymorphisme.
Si, tu peux, mais tu ne veux pas, sans déconner.
Ce n'est pas parce que tu as des struct en C que c'est de la POO.
Je parle pas à légère tu sais ? Tu peux jouer d'héritage, de polymorphisme et tout le tralala qui permet la POO en langage C, ça n'a rien à voir avec le fait qu'on aie struct (le post plus haut montre la technique pour encapsuler, mais je précise bien qu'on peut faire le reste quand on est fou). Tu peux aussi faire du méta-programming si ça te chante. Le fait que ce soit ultra chiant ne rend pas ça impossible.
Gugelhupf a écrit:
En effet je ne veux pas me forcer à adopter un style OO pour un langage fonctionnel.
C est procédural, pas fonctionnel. Par ailleurs, il existe des langages fonctionnels et objets.
@Freedom : POO est trop générique sans doute, et regroupe trop de concepts à mon goût.
En effet je ne veux pas me forcer à adopter un style OO pour un langage fonctionnel.
C est procédural, pas fonctionnel. Par ailleurs, il existe des langages fonctionnels et objets.
"Un langage fonctionnel (parfois appelé langage procédural) est un langage dans lequel [...]" (source).
Oui il existe des langages fonctionnels et objets, C++, Python, PHP, Visual Basic .NET...
DAMNED ! Eh ben ça c'est de l'erreur ! Ta source a un gros problème et est fausse.
Particulièrement si tu dis à un programmeur Haskell et Ocaml (ou autre) que C est fonctionnel, il va te regarder avec les yeux comme des billes. sans rire. Je te conseille d'aller jeter un oeil aux langages proposés par la page Wikidedia du paradigme fonctionnel, pas que wikipedia soit plus une référence mais pour le coup c'est pas faux.
Donc faut pas le differencié !Ces sont "deux langages jumaux"
Je ne vois pas trop ou tu veux en venir en fait. Il est vrai que le C++ a pour but de simplifier/corriger ce qui entraîne des erreurs en C. Mais ça n'a rien avoir avec du C. Le Java est à mon avis plus proche du C++ que le C.
Mohack a écrit:
J'ai des question pour kass ,qui jusqu'a la a donné des arguments très covaincant!
Pourquoi avoir creer le C++ alors qu'on pouvait nous montrer (nous le dev C) le principe du POO en C?
Et les C a t-il des conteneurs autre que "struct"?
La reponse est (surement ) NON ! Car on ne peut appeler un constructeur en C ,donc on ne peut creer un objet!
Alors la j'ai l'impression que t'écris ce message depuis un coffee-shop d'Amsterdam.
struct n'a jamais été un conteneur.
Pour le reste, on a l'impression que les débuts de tes phrases ne font pas partie de la même phrase que la fin.
EDIT : au passage puisque t'as pas l'air d'avoir lu ce que je t'ai dis sur l'autre topic, je m'autoquote
Mohack : "Tout pour te dire que le C++ est le C avec des classes , des templates etc... Ce qui facilite enorme le codage et sa comprehension !!"
Cytosol --> bullshit. Le C++ est le C++. si tu veux des classes tu peux le faire en C orienté objet. C'est lourd mais c'est faisable.
Deux langages bien différents malgré ce que certains se forcent à dire... Peut-être qu'un codeur C te dira que le C++ n'est "qu'une amélioration du C", un codeur C++ te dira que c'est bien un langage différent. Il y à certes des similitudes, un code C compilera en C++, mais un langage ne se résume pas à sa syntaxe. Le style de programmation est totalement différent en C++ qu'en C, et faire C -> C++ amène à faire beaucoup plus d'erreurs que si on commence directement par le C++.
Mohack : "Ben dans le C++ ,ton code de jeu serait bien structuré avec la POO !!"
Cytosol : Total bullshit. Vu la ou t'en es [le PO du thread], tu vas suivre le tutoriel C++, si tu te lances tout de suite après dans la programmation de ton jeu autant le faire en C, parce que sinon bonjour les classes monolithiques, l'héritage à outrance, et les problèmes évidents de conception qui à un moment donné t'obligeront à arrêter le développement pour tout refactorer.
Donc faut pas le differencié !Ces sont "deux langages jumaux"!
Heureusement, ce n'est plus vrai. C++ aujourd'hui est C++ et plus du C amélioré. Ce sont deux langages complètement différents
Mohack a écrit:
Pourquoi avoir creer le C++ alors qu'on pouvait nous montrer (nous le dev C) le principe du POO en C?
C++, ce n'est pas que l'objet. C'est aussi des possibilités de fonctionnel, de la programmation générique, etc ... Et comme l'a déjà dit @lmghs, C++ c'est surtout le RAII.
fonctionnel -> non impératif ; fonctions qui s’enchainent -> lisp
procédural : impératif ; avec des procédures -> Pascal, C, Ada, C++, Eiffel, Python, javascript, php, ...
Une excellente lecture sur des sujets connexes -> http://www.codeproject.com/Articles/635264/Open-Multi-Methods-for-Cplusplus11-Part-1
Je ne connais pas Lisp. Donc en gros, le terme "procédural" est synonyme de "impératif", et une procédure est une fonction qui ne retourne pas de valeur (void).
Mais JavaScript, et autres langages que tu cites pour procédural, peuvent retourner des valeurs et la récursivité est possible. Donc tous ces langages sont fonctionnel et procédural... sauf Lisp qui est que fonctionnel ?
Impératif, c'est des instructions. Fais machin, fais ceci, change l'état de truc, etc.
Du procédural, c'est avec des sous-routines. Quand on rentre dedans, on ressort par où on est arrivés.
De l'impératif non procédural, c'est du code spaghetti, à la façon des vieux BASIC si on n'utilisait pas gosub, mais que des goto.
Dans les langages fonctionnels, c'est plus tourné mathématiques: des fonctions s'enchainent, il n'existe pas vraiment de notion de variable (dont l'état va changer). Certains disent que c'est plus intuitif que l'impérativo-procédural. Perso, quand je cuisine, ou donne des directions à quelqu'un qui cherche son chemin, je fais de l'impératif. Mais bon.
En C++11, constexpr oriente les fonctions vers du fonctionnel : pas de variables, pas de changement d'état, les fonctions doivent toute renvoyer des valeurs et ne rien faire d'autre.
@Gugelhupf: La différence sur fonctionnel/impératif est sur la notion d'instruction/expression/mémoire. Un langage impératif est caractérisé par un état et une suite d'instruction qui fait évoluer cet état. Un langage fonctionnel est caractérisé par l'absence d’état et la notion d'expression et son évaluation.
Sur le fond impératif/fonctionnel s'opposent, tu es l'un ou l'autre, mais pas les deux. Ceci dit il s'avère que des features proposés par des langages sont plus ou moins associés aux paradigmes de ces langages et qu'ainsi lorsqu'un autre langage propose une feature proche, on finit par dire "il permet du fonctionnel".
Pour ceux qui disent qu'on ne peux pas faire de l'orienté objet en C, je pense que le projet GTK vous montre que c'est tout à fait possible et tout à fait propre .
En faisant une petite recherche sur google ,j'ai vu et entendue de termes qui me semble un peu fou!
Premierement j'ai vu :
Le C est un langage procédural (terme qui j'ignore completement)
Le C++ est un langage Orienté objets tout comme le PHP et Java ... (ca je le connaissais )
Donc en relisant ,tout ce grand debat , je viens d'en conclure :
Le C et C++ sont en finale deux langages très differents . Meme leur facon de programmer sont differents !
Seule la syntaxe se ressemble!Le C++ a garder la syntaxe du C tout en ajoutant d'autres fonctionnalités et bien sur en facilitant et corrigant quelques notions .
Au final :
Le C++ est du C++ et le C est du C
Euuhh oui meme si leur syntaxe se covoisine !
Voila ce que moi je conclus :
Si tu sais faire du C++ ,tu saura faire du C (dans mon cas je appris le C++ est je connais aussi le C [je n'ai pas lu son tuto])
Le cas contraire serait bien impossible !
Je suis juste un débutant expérimenté. RTFM | RTFD
Merci de m'avoir répondu, mes connaissances étant limitées.
Je vais juste retenir que l'héritage multiple fait la différence entre le C et le C++ pour me permettre d'avancer sans trop me prendre la tête et finir par comprendre toutes les nuances.
On a parlé de l'héritage multiple ? La différence, je le dis depuis le début, certes avec des messages de 2 phrases, c'est la gestion des ressources et des erreurs. Soit, le RAII. Tout le reste c'est du sucre syntaxique. Le RAII, c'est une philosophie de développement radicalement différente.
C'est cette seule différence qui fait que de faire du C me casse les pieds.
1) Le C est un langage procédural (terme qui j'ignore completement)
Le C++ est un langage Orienté objets tout comme le PHP et Java ... (ca je le connaissais )
2) Si tu sais faire du C++ ,tu saura faire du C (dans mon cas je appris le C++ est je connais aussi le C [je n'ai pas lu son tuto])
1) Tu y es presque C++ est multi-paradigme : tu peux y être objet, procédural, fonctionnel (dans une certaine mesure seulement), générique et d'autres petites choses que je suppose.
2) Tu sauras faire du C ... mais en galérant beaucoup car beaucoup des mécanismes du C++ n'y existent plus. Donc il faudra que tu sois beaucoup plus rigoureux. En l'occurrence, un très bon programmeur C++ sera éventuellement un bon programmeur C et il peut devenir très bon programmeur C avec du travail. Pour le programmeur C c'est plus compliqué de devenir très bon programmeur C++ parce qu'il aura généralement tendance à vouloir en faire trop.
Impératif, c'est des instructions. Fais machin, fais ceci, change l'état de truc, etc.
Du procédural, c'est avec des sous-routines. Quand on rentre dedans, on ressort par où on est arrivés.
De l'impératif non procédural, c'est du code spaghetti, à la façon des vieux BASIC si on n'utilisait pas gosub, mais que des goto.
Dans les langages fonctionnels, c'est plus tourné mathématiques: des fonctions s'enchainent, il n'existe pas vraiment de notion de variable (dont l'état va changer). Certains disent que c'est plus intuitif que l'impérativo-procédural. Perso, quand je cuisine, ou donne des directions à quelqu'un qui cherche son chemin, je fais de l'impératif. Mais bon.
En C++11, constexpr oriente les fonctions vers du fonctionnel : pas de variables, pas de changement d'état, les fonctions doivent toute renvoyer des valeurs et ne rien faire d'autre.
Merci @lmghs, @Freedom pour l'explication, je comprends mieux.
Du coup je viens d'apprendre un peu Lisp, ça me fait penser au langage DAX de Microsoft, ce sont des expressions qui s'emboitent ou s'encapsule (pas vraiment des fonctions qui s'enchainent ). Beaucoup de parenthèses, j'ai eu du mal à m'y retrouver par moment
J'ai l'impression que les langages fonctionnelles ne doivent pas êtres simples à maintenir, surtout si elles sont longues... et puis commencer à lire du code à partir du milieu
@Ksass`Peuk -> Du coup un exemple de langage fonctionnel et objet à la fois (donc multi-paradigme) -> OCaml
"gbdivers" me repond : "La POO, c'est plus que de l’encapsulation de données dans des structures. Il faut aussi pouvoir encapsuler des fonctions, faire de l'héritage, polymorphisme, etc. Attention : struct (C++) ~ class (C++), mais struct (C) != struct (C++)." Cela confirme les propos de wikipedia concernant ce qui fait que le C++ se démarque des langages populaires comme le C, JAVA ou C# est l'héritage multiple, ton argument aussi est intéressant cependant.
Cordialement,
Je m'excuse pour l'orthographe mais vue l'heure ...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Je suis juste un débutant expérimenté. RTFM | RTFD
Discord NaN. Mon site.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Je suis juste un débutant expérimenté. RTFM | RTFD
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Je suis juste un débutant expérimenté. RTFM | RTFD
Je suis juste un débutant expérimenté. RTFM | RTFD
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C