Problème objet/classe - C++ - Programmation
Marsh Posté le 03-01-2009 à 15:33:19
Ta classe doit se terminer par un ;
Code :
|
Marsh Posté le 03-01-2009 à 15:53:17
alexandre_j a écrit : Ta classe doit se terminer par un ;
|
Quel idiot je fais ... vivement que ça devienne un automatisme. Merci.
Les erreurs, quand il n'y en a plus, il y en a encore.
189 C:\Users\Keikoku\Desktop\Programmation\Projet BTS 2008\RPKeik\RPKeik.h no match for 'operator>>' in 'std::cin >> ((RPKeik*)this)->RPKeik::AttaqueJoueur1'
On ne peut pas utiliser de cin pour un attribut ?
Marsh Posté le 03-01-2009 à 17:01:19
Je ne sais pas. Perso je passerais par une variable intermédiaire qui ne soit pas un int, car si l'utilisateur rentre autre chose qu'un int, ça plante. Je passerais par un autre type (char) et je testerais si c'est un int et le balancerais dans le switch. Maintenant vu les experts qu'il y a ici, j'ai bien envie de savoir qu'elle solution adopter face à ce genre de problème.
Marsh Posté le 03-01-2009 à 17:03:10
A regarder le code de plus prêt... AttaqueJoueur1 est une fonction !
Marsh Posté le 03-01-2009 à 17:31:44
alexandre_j a écrit : A regarder le code de plus prêt... AttaqueJoueur1 est une fonction ! |
Exact, j'ai viré les parenthèses et ça va mieux. J'ai honte de faire des erreurs comme celles-ci. Encore merci.
Marsh Posté le 03-01-2009 à 21:29:49
Encore besoin d'aide... en espérant cette fois ci ne pas avoir fait d'erreurs de débutant.
[Linker error] undefined reference to `RPKeik::RPKeik()'
[Linker error] undefined reference to `RPKeik::~RPKeik()'
Je ne vois absolument pas ce qu'il faut faire, ce n'est pas faute d'avoir mis :
RPKeik::RPKeik()
{
}
RPKeik::~RPKeik()
{
}
Comme dit sur ce lien :
http://www.keil.com/support/docs/3136.htm
Marsh Posté le 04-01-2009 à 00:14:23
ReplyMarsh Posté le 04-01-2009 à 01:05:11
alexandre_j a écrit : Est-ce que tu peux remettre ton code mis à jour ? |
J'ai voulu faire de la POO (bon par contre je ne suis pas sur du résultat) mais j'ai toujours l'ancienne version mise à jour au cas où.
Code :
|
Le constructeur m'a pas l'air bon du tout (ou alors les objets) car quand je compile tout marche correctement, par contre à l'exécution ça plante (j'ai mis un system PAUSE au début du constructeur et ça plante quand même).
Marsh Posté le 04-01-2009 à 09:48:56
revois les abses avec un cours propre. La tu fait n'importe quoi ...
ligne 43 : RPKeik Joueur12 ;
pourquoi instancie tu un RPKeik dans le constructeur de RPKeik ?
L'erreur à l'execution est certaienemnt une stack overflow car l'instanciation rappelles le constructeur etc ...
Ensuite, tu melange code des entités, interface utilisateur et gestion du flux du programme.
La, y a genre 4-5 classes à faire : personnage, joueur, partie, etc ...
Des liens :
http://cpp.developpez.com/cours/cppavance/
http://bruce-eckel.developpez.com/ [...] icpp2vol1/
Marsh Posté le 05-01-2009 à 20:08:07
Merci pour les liens, ils sont très complet et j'ai enfin (je l'espère) saisis l'utilité des classes et des objets. J'ai donc fait la class Personnage comme tu le préconisais :
Code :
|
Je pense que jusque là, tout est à peu près bon (j'espère que je ne mélange plus rien cette fois ).
Malheureusement j'ai la droit aux messages d'erreur suivant :
[Linker error] undefined reference to `Personnage::Personnage()'
[Linker error] undefined reference to `Personnage::Personnage()'
[Linker error] undefined reference to `Personnage::~Personnage()'
[Linker error] undefined reference to `Personnage::~Personnage()'
ld returned 1 exit status
J'ai donc rajouté, après quelques recherches, ces lignes :
Personnage::Personnage()
{
}
et
Personnage::~Personnage()
{
}
sans grand succès, malheureusement.
Peut être faut-il implémenter
Marsh Posté le 05-01-2009 à 21:53:07
* Vegetta etc devrait etre des INSTANCES de personnage
* Pas de code dnas un .h mais dans un .cpp
* Pas de pollution de namespace ne ouvrant std dnas un .h
Marsh Posté le 05-01-2009 à 23:07:35
*Vegeta etc... en instance (objet si j'ai bien compris) ? En fait, je dois écrire dans le Personnage.cpp :
Code :
|
Puis dans ma class Joueur je ferai des méthodes du style :
Code :
|
Cette explication me parait assez tordu (je fais toujours compliqué), j'en conclus qu'elle est entièrement fausse.
*Effectivement, les méthodes se mettent dans un cpp, je viens de corriger.
*Pour le namespace, j'ai mis ça à cause du string. Mais je viens de remplacer par std::string pour virer le namespace.
Marsh Posté le 06-01-2009 à 11:14:17
Akumetsu a écrit : du caca... |
Revois tes bases.
Ta classe personnage devrait avoir un constructeur non trivial qui permet de construire un personnage ) partir de ces caractéristiques :
Code :
|
Ensuite, tu crée un personnage pré-défini ainsi :
Code :
|
Le mieux serait neanmoins de les ranger dans un tableau de personnage, de les remplir au début et d'associser à chacun un index.
Code :
|
Le choix du joueur est alors directement utilisé pr accéder au peros n° X.
C'est bancal et très moche, mais la solution propre te dépasse je pense. Tu es encore en train d'écrire des trucs sans savoir ce que ça veut dire.
Reprends les cours de 0 et valide morceaux par morceaux ton code.
Marsh Posté le 06-01-2009 à 18:35:47
Ah oui, j'avais omis l'utilisation des parenthèses...
Pour la deuxième méthode, ne faut-il pas un tableau à 2 dimensions par hasard ?
Et encore une fois merci.
Marsh Posté le 06-01-2009 à 20:03:38
Car tu mets plusieurs accolades dans une accolade : { {} {} } (Jamais vu ça)
Je pensais que c'était uniquement pour les tableaux 2D (D'ailleurs sur ce site il utilise cette méthode seulement pour le tableau 2D) où chaque accolade correspond à une colonne.
Mais en continuant de chercher ( http://forum.hardware.fr/hfr/Progr [...] 5716_1.htm ) j'ai vu que ça marchait de cette façon :
Code :
|
Donc pour mon cas, cela donnerait ceci (tout du moins si je suis le message de BifaceMcLeOD :
Code :
|
Bien sur ta manière de faire est bien plus courte car pas besoin de réécrire le nom de la classe (le constructeur donc) à chaque fois.
J'espère ne pas avoir dit trop de bêtises (pour une fois).
Marsh Posté le 06-01-2009 à 21:54:38
A posteriori ca marche pas avec {}, car ta classe Personnage n'est pas uen classe Plain Old Data. Reprends la syntaxe avec le nom de la classe.
Marsh Posté le 06-01-2009 à 23:26:46
Ah d'accord, c'est donc de là que venait l'erreur :
brace-enclosed initializer used to initialize `Personnage'
J'étais justement en train de chercher une solution. Après modification, il n'y a plus d'erreur hormis un LinkerError pour le destructeur.
Marsh Posté le 07-01-2009 à 19:59:14
Afin de faire en sorte que le joueur1 et le joueur2 ait des nom, a1 etc... distinctes, je ne vois pas du tout que faire car c'est l'objet Joueur1 qui "utilise" l'objet oPersos.
Marsh Posté le 07-01-2009 à 20:18:04
le joueur c'est pas le personnage ... Un joueur "utilise" un personnage.donc ta classe joueur contient une instance de personnage.
Revois les principes de modélisation objet de base v_v
Marsh Posté le 03-01-2009 à 15:09:08
Bonjour, j'ai quelques soucis à propos d'un programme que je suis en train de faire (pas compliqué du tout, je ne suis encore que débutant) et j'ai encore quelques soucis avec les objets/classes, c'est donc pour cette raison que je fais appel à vous. Mon programme s'apparente à un Pokemon-like avec des personnages et des attaques, bon pour l'instant il n'y a rien de très emballant mais je m'occuperai du reste lorsque les erreurs rencontrées seront corrigés.
Tout d'abord voici mon .h (si celui ci n'est pas à la norme, des petites erreurs, si les attributs sont mal utilisés ou si vous avez des conseils, n'hésitez pas à m'en faire part) :
FAUX (effacé pour ne pas encombrer la page).
Et voici les quelques messages d'erreurs :
43 RPKeik.h new types may not be defined in a return type
43 RPKeik.h two or more data types in declaration of `ChoixJoueur1'
43 RPKeik.h prototype for `RPKeik RPKeik::ChoixJoueur1()' does not match any in class `RPKeik'
Je ne vois pas trop où est le problème étant donné qu'il n'y a pas de return pour le premier message.
Merci d'avance.
Message édité par Akumetsu le 05-01-2009 à 23:18:02