OVH Cloud OVH Cloud

[debutant] Premier programme en C++, qu'en pensez-vous?

54 réponses
Avatar
Beware
Bonjour,

J'ai depuis une grosse semaine commenc=E9 =E0 apprendre le C++. Je
l'apprends de mani=E8re autonome (ce qui n'est pas totalement une
excuse). Pour ce fait, je suis les tutos pour C++ du site du zero.

J'ai donc utilis=E9 leur exemple de (tr=E9s tr=E9s) petit RPG, mais qui me
permet de manipuler certains concept de base en C++.

Pour en revenir donc =E0 ce message, je voudrais demander aux
connaisseurs qui peuvent et surtout qui veulent si il pouvait jeter un
oeil =E0 mon code pour me dire tout ce qu'il ne va pas et que par
cons=E9quent je devrais am=E9liorer (ou carr=E9ment changer :) )

Merci =E0 eux.

L'ensemble des fichiers sont disponibles =E0 cette adresse :
http://beware007.free.fr/Projet_C++/rpg/

Au revoir

PS : Je pr=E9cise que j'ai cod=E9 sous C::B et sous Linux.

10 réponses

2 3 4 5 6
Avatar
Alain Ketterlin
Beware writes:

Faut il implementer dans chacune des classes que l'on code et ce
évidement si l'on ne s'en sert pas :
- le desctructeur,
- le constructeur par copie,
- l'opérateur d'assignation ?



J'ai envie de répondre oui, mais bien sûr il y a des nuances.

Pour le destructeur, ce n'est pas forcément nécessaire mais sans
conséquence si tu en écris un vide. Le cas "particulier" est celu i d'une
classe qui aura éventuellement des sous-classes : dans ce cas, un
destructeur virtuel est pour ainsi dire indispensable, même s'il est
vide.

Dans les trois cas, assure-toi de bien comprendre quand ils sont
appelés, parce qu'il y a beaucoup d'appels implicites. Tout objet est
construit et détruit à des instants précis, il y a des effet s de cascade
pour les objets imbriqués, etc. Pour copy-ctor et operator=, le
compilateur t'en mettra un par défaut (qui agit champ par champ) si tu
n'en mets pas. Le conseil traditionnel est : si ta classe a besoin
d'allouer de la mémoire, alors écrire les deux.

(J'avoue qu'il m'arrive assez souvent d'écrire des copy-ctor et
operator= dans la partie privée, juste pour m'assurer qu'ils ne sont pas
utilisés en dehors de la classe. En C++0x si j'ai bien compris, il y
aura ce qu'il faut pour réclamer soit le comportement par défaut, soit
l'absence d'un ou l'autre de ces éléments.)

-- Alain.
Avatar
Luc Hermitte
On 30 juil, 16:17, Beware wrote:
Faut il implementer dans chacune des classes que l'on code et ce
évidement si l'on ne s'en sert pas :
 - le desctructeur,
 - le constructeur par copie,
 - l'opérateur d'assignation ?



Les implémenter non, mais les expliciter souvent.

En cas d'héritage, public, et autres entités je pars par défaut sur :
- destructeur virtuel public,
- opérateur d'affectation désactivé
- constructeur de copie désactivé -- ou alors protégé et accompagn é
d'une fonction virtuelle de clonage pour les rares cas où j'ai besoin
de duplication sur des objets polymorphes

En cas d'objet valeur, soit je les définis en fonction de la présence
de ressource brute dans la classe. Soit je mets un commentaire comme
quoi les attributs de la classe me permettent de ne pas les définir.
Et en cas de ressources encapsulées dans des "capsules" RAII, seul le
destructeur échappe à sa définition explicite, mais pas à un
commentaire pour signaler que son absence est normale en fonction des
attributs courants de la classe.

--
Luc Hermitte
Avatar
Jean-Marc Bourguet
Luc Hermitte writes:

On 30 juil, 16:17, Beware wrote:
Faut il implementer dans chacune des classes que l'on code et ce
évidement si l'on ne s'en sert pas :
 - le desctructeur,
 - le constructeur par copie,
 - l'opérateur d'assignation ?



Les implémenter non, mais les expliciter souvent.

En cas d'héritage, public, et autres entités je pars par défaut sur :
- destructeur virtuel public,
- opérateur d'affectation désactivé
- constructeur de copie désactivé -- ou alors protégé et accompagné
d'une fonction virtuelle de clonage pour les rares cas où j'ai besoin
de duplication sur des objets polymorphes

En cas d'objet valeur, soit je les définis en fonction de la présence
de ressource brute dans la classe. Soit je mets un commentaire comme
quoi les attributs de la classe me permettent de ne pas les définir.



Je suis peut-être distrait, mais cette alternative me semble antinomique
avec l'idée de valeur.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
James Kanze
On Jul 30, 7:21 pm, Jean-Marc Bourguet wrote:
Luc Hermitte writes:
> On 30 juil, 16:17, Beware wrote:
>> Faut il implementer dans chacune des classes que l'on code et ce
>> évidement si l'on ne s'en sert pas :
>> - le desctructeur,
>> - le constructeur par copie,
>> - l'opérateur d'assignation ?



> Les implémenter non, mais les expliciter souvent.



> En cas d'héritage, public, et autres entités je pars par
> défaut sur :
> - destructeur virtuel public,
> - opérateur d'affectation désactivé
> - constructeur de copie désactivé -- ou alors protégé et
> accompagné d'une fonction virtuelle de clonage pour les
> rares cas où j'ai besoin de duplication sur des objets
> polymorphes



> En cas d'objet valeur, soit je les définis en fonction de la
> présence de ressource brute dans la classe. Soit je mets un
> commentaire comme quoi les attributs de la classe me
> permettent de ne pas les définir.



Je suis peut-être distrait, mais cette alternative me semble
antinomique avec l'idée de valeur.



Dans quel sens ? Ou est-ce que tu as simplement mal lu la
dernière phrase ? (J'ai dû le relire plusiers fois moi-même
avant de l'avoir compris. En gros, ce qu'il dit, c'est qu'il
met un commentaire, à la place de la fonction en question, si la
version générée automatiquement par le compilateur fait
l'affaire.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Jean-Marc Bourguet
James Kanze writes:

On Jul 30, 7:21 pm, Jean-Marc Bourguet wrote:
Luc Hermitte writes:
> On 30 juil, 16:17, Beware wrote:
>> Faut il implementer dans chacune des classes que l'on code et ce
>> évidement si l'on ne s'en sert pas :
>> - le desctructeur,
>> - le constructeur par copie,
>> - l'opérateur d'assignation ?



> Les implémenter non, mais les expliciter souvent.



> En cas d'héritage, public, et autres entités je pars par
> défaut sur :
> - destructeur virtuel public,
> - opérateur d'affectation désactivé
> - constructeur de copie désactivé -- ou alors protégé et
> accompagné d'une fonction virtuelle de clonage pour les
> rares cas où j'ai besoin de duplication sur des objets
> polymorphes



> En cas d'objet valeur, soit je les définis en fonction de la
> présence de ressource brute dans la classe. Soit je mets un
> commentaire comme quoi les attributs de la classe me
> permettent de ne pas les définir.



Je suis peut-être distrait, mais cette alternative me semble
antinomique avec l'idée de valeur.



Dans quel sens ? Ou est-ce que tu as simplement mal lu la
dernière phrase ?



Exact.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Luc Hermitte
On 30 juil, 21:56, James Kanze wrote:
On Jul 30, 7:21 pm, Jean-Marc Bourguet wrote:
[...]
> > En cas d'objet valeur, soit je les définis en fonction de la
> > présence de ressource brute dans la classe. Soit je mets un
> > commentaire comme quoi les attributs de la classe me
> > permettent de ne pas les définir.
> Je suis peut-être distrait, mais cette alternative me semble
> antinomique avec l'idée de valeur.

Dans quel sens ? Ou est-ce que tu as simplement mal lu la
dernière phrase ? (J'ai dû le relire plusieurs fois moi-même
avant de l'avoir comprise. En gros, ce qu'il dit, c'est qu'il
met un commentaire, à la place de la fonction en question, si la
version générée automatiquement par le compilateur fait
l'affaire.)



Oui c'est ça.
Désolé pour la tournure alambiquée de ma phrase ^^'.

--
Luc Hermitte
Avatar
jerome
"Luc Hermitte" a écrit dans le message de news:

On 28 juil, 20:17, Antoine wrote:

Hum ... cela doit faire un moment que tu n'y as plus mis les pieds.
Mais un sacré moment alors.



Je viens d'y faire un tour : c'est pire que ça : on se croirait à la
maternelle et c'est effectivement d'une nullité technique....
Avatar
jerome
"Gabriel Dos Reis" a écrit dans le message de news:


OK. À l'évidence, j'ai peu d'expérience des sites ados :-)



Lu aujourd'hui sur un de ces sites :
" attention ! une application cliente ne DOIT PAS se connecter à une base de
données sur un serveur distant... "

Les bras m'en tombent...
Avatar
Wykaaa
jerome a écrit :
"Gabriel Dos Reis" a écrit dans le message de news:


OK. À l'évidence, j'ai peu d'expérience des sites ados :-)



Lu aujourd'hui sur un de ces sites :
" attention ! une application cliente ne DOIT PAS se connecter à une base de
données sur un serveur distant... "

Les bras m'en tombent...




Au moins, si personne ne le faisait, ça éviterait certains cas de
piratage de données ;-)
Avatar
pjb
"jerome" writes:

"Gabriel Dos Reis" a écrit dans le message de news:


OK. À l'évidence, j'ai peu d'expérience des sites ados :-)



Lu aujourd'hui sur un de ces sites :
" attention ! une application cliente ne DOIT PAS se connecter à une base de
données sur un serveur distant... "

Les bras m'en tombent...



Non non, serrieusement, c'est aussi conseillé par Greenspun (qui a
quand même réussi à faire fortune en programmant des sites web).

La raison est la suivante: les serveurs RDBMS ont un degré zéro de
sécurité, ils sont restés (en tout cas en 1998 quand Greenspun a écrit
son livre
http://www.amazon.com/Philip-Alexs-Guide-Web-Publishing/dp/1558605347
) sur un mode intranet, et pas Internet. En gros, ils permettent
l'accès à n'importe quel ordinateur du moment qu'il a un nom de compte
et un mot de passe, et comme il y a des couples (nom de compte, mot de
passe) bien connus configurés par défaut, et qu'il passent en clair
dans les protocoles client/serveur de ces base de données, et que
sinon, de toutes façons ils se retrouvent en clair dans les
applications clients, il vaut mieux laisser le RDBMS derrière le
firewall, et donc interndir aux applications clientes de se connecter
à une base de données sur un serveur distant (sur Internet).

En plus, la gestion des droits d'accès à l'intérieur des RDBMS est
trop grossière: elle se fait verticalement, au niveau des tables,
alors qu'on ne voudrait permettre à un utilisateur que l'accès en
écriture à ses propres données, c'est à dire aux rangées qui le
concerne. Ceci les RDBMS ne le gèrent pas eux mêmes.

C'est donc aux applications de le gérer, et pour ces questions de
sécurité, ces applications ne peuvent pas être distribuées sur
Internet, elles doivent fonctionner près du RDBMS (eg. dans le serveur
web, derrière le firewall).


--
__Pascal Bourguignon__
2 3 4 5 6