Bin moi, je ne suis pas un grand nom de l'Informatique, je suis très très con, c'est pour ça que je fais des choses simples, je repompe le travail des autres en attendant de mieux comprendre les spécificités du problème et de me prendre les difficultés dans la gueule à ce moment là.
Mais au moins, j'ai pas à résoudre des problèmes que des personnes ben plus éclairées et expérimentées ont défrichés.
Je ne travaille pas pour la NASA, contrairement à toi visiblement @JadeSalina et tes problèmes "originaux".
#include <iostream>
#include "login.h"
using namespace std;
int main(){
do{
cout<<"entrez votre nom"<<endl;
cin>>name;
cout<<"saisir le mot de passe"<<endl;
cin>>p;
}while(isConnected==false);
login user1(name, pass);
user1.login(user1.getName(), user1.getPass());
}
voici les erreurs de compilation obtenues:
||=== Build: Debug in essai (compiler: GNU GCC Compiler) ===|
login.h|10|error: expected identifier before string constant|
login.h|10|error: expected ',' or '...' before string constant|
login.h|11|error: expected identifier before numeric constant|
login.h|11|error: expected ',' or '...' before numeric constant|
login.h|12|error: array bound is not an integer constant|
login.h|12|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|13|error: array bound is not an integer constant|
login.h|13|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|14|error: ISO C++ forbids initialization of member 'isConnected'|
login.h|14|error: making 'isConnected' static|
login.h|14|error: ISO C++ forbids in-class initialization of non-const static member 'isConnected'|
login.h|18|error: ISO C++ forbids declaration of 'connection' with no type|
login.h|20|error: extra qualification 'login::' on member 'getName'|
login.h|24|error: extra qualification 'login::' on member 'getPass'|
login.h|29|error: extra qualification 'login::' on member 'setName'|
login.h|33|error: extra qualification 'login::' on member 'setPass'|
login.cpp|5|error: redefinition of 'class login'|
login.h|5|error: previous definition of 'class login'|
||=== Build failed: 18 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
login.h|10|error: expected identifier before string constant|
login.h|10|error: expected ',' or '...' before string constant|
login.h|11|error: expected identifier before numeric constant|
login.h|11|error: expected ',' or '...' before numeric constant|
login.h|12|error: array bound is not an integer constant|
login.h|12|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|13|error: array bound is not an integer constant|
login.h|13|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|14|error: ISO C++ forbids initialization of member 'isConnected'|
login.h|14|error: making 'isConnected' static|
login.h|14|error: ISO C++ forbids in-class initialization of non-const static member 'isConnected'|
login.h|18|error: ISO C++ forbids declaration of 'connection' with no type|
login.h|20|error: extra qualification 'login::' on member 'getName'|
login.h|24|error: extra qualification 'login::' on member 'getPass'|
login.h|29|error: extra qualification 'login::' on member 'setName'|
login.h|33|error: extra qualification 'login::' on member 'setPass'|
main.cpp||In function 'int main()':|
main.cpp|12|error: 'name' was not declared in this scope|
main.cpp|14|error: 'p' was not declared in this scope|
main.cpp|16|error: 'isConnected' was not declared in this scope|
main.cpp|18|error: 'name' was not declared in this scope|
main.cpp|18|error: 'pass' was not declared in this scope|
main.cpp|20|error: invalid use of 'class login'|
||=== Build failed: 40 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
d’imaginer que "des gens plus compétents ont fait ceci ou cela", à un moment donné ce ne sont pas des dieux non plus.
Tu as tout à fait raison...Au fait, que penses tu de handmade? (attaque personnelle parfaitement assumée )
JadeSalina a écrit:
Et personne n’a résolu le problème exact qu’on a sous les yeux, il y a toujours des spécificités donc ça ne dispense par de réfléchir. Et quitte à réfléchir, autant en profiter pour faire la solution la plus sûr-mesure et adaptée possible à l’instance du problème qu’on a au lieu d’essayer de faire rentrer au chausse pied un pattern existant.
Tu as décidément l'art de te contredire sans même t'en rendre compte...
Car c'est exactement ce que je mettais en évidence dans le dernier point de mon intervention précédente, et que tu ne t'es senti obligé de démonter en plaidant pour " MAIS il est extrêmement important de savoir expérimenter et faire du code brouillon. "
JadeSalina a écrit:
Et quand on vous dis KISS, ça vous fait penser à quoi ? Pour moi ça veut dire ne pas partir bille en tête sur une solution over engineerée alors qu’on aurait pu faire un truc plus simple et flexible (oui je dit bien flexible car il est plus simple de mettre à jour du code avec une structure minimale que si il a déjà toute une hiérarchie à réécrire et réorganiser etc). Après il y a aussi un juste milieu à trouver
Où as tu vu que l'on proposais la moindre solution "over engineerée "? On dit juste -- et le pire, c'est que tu sembles d'accord avec nous -- qu'avant de se jeter sur le clavier et de commencer à "vomir du code", il faut essayer d'avoir une idée "suffisamment précise" de l'endroit d'où l'on part (c'est à dire de nulle part), de vers quoi l'on tend (c'est à dire vers un programme qui permet "un certain nombre" de choses plus ou moins bien définies),que pour se faire une idée assez précise des priorités pour la mise en oeuvre.
Une fois que l'on a cette "idée générale", on dit qu'il traiter chaque priorité de manière ordonnée, c'est à dire: commencer l'analyser avec suffisamment de précision que pour être sur de bien comprendre ce que l'on attend de sa part, afin de trouver la solution qui nous semble le mieux tenir debout et le mieux s'intégrer à ce qui existe.
Et surtout, de se dire que, si "quelque chose" (la bibliothèque standard en tête, d'autres bibliothèques tierces au besoin) peut nous éviter de nous casser la tête sur des problèmes triviaux, il faut partir du principe qu'il est préférable d'utiliser ce quelque chose plutôt que de réinventer la roue à chaque fois.
JadeSalina a écrit:
Un exemple de ce que j’appelle flexibilité : on a deux bouts de code qui font la même chose à 2 endroits différent, on pourrait se dire qu’il faut introduire une fonction pour ne pas dupliquer le code.
Oui, exactement...
JadeSalina a écrit:
Mais imaginons que dans la suite le deuxième bout de code qui faisait la même chose se retrouve à faire un truc un peu différent parce que le client à de nouvelles idées ou autre. Et bien dans le cas où on laisse le code dupliqué, il n’y a rien à faire à part coder le nouveau truc directement alors qu’avec la fonction on va se battre en essayant éventuellement de paramétrer la fonction pour qu’elle fasse l’une ou l’autre chose, ouais mais euh en fait non c’est pas tout à fait pareil mmmmh ouais du coup euuuh.
Héhé, même pas...
La règle (enfin, l'OCP) nous dit que le code qui a été écrit, testé et validé ne devrait jamais avoir à changer. La fonction qui répondait aux besoins dans un premier temps est l'exemple d'application de ce principe:
Si les besoins évoluent, il y a deux possibilités:
Soit les besoins évoluent à un tel point que le code existant en devient inutile, et on peut décider de garder (ou non)l'ancienne version "pour archive" (au risque de créer du code mort) mais en réécrivant une "nouvelle version"
Soit l'évolution des besoins ne rend pas le code existant inutile, parce qu'il continue à être appelé depuis "au moins un endroit". Et dans ce cas, il faut simplement de créer "une nouvelle fonction" (qui pourrait porter le même nom que l'ancienne si des paramètres supplémentaires sont requis) pour répondre à ces "besoins évolués".
Quoi qu'il en soit, ou bien le code qui a été testé et validé précédemment est (éventuellement) supprimé parce que devenu inutile, ou bien il reste intouché parce qu'encore nécessaire "en l'état".
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
||=== Build: Debug in essai (compiler: GNU GCC Compiler) ===|
login.h|10|error: expected identifier before string constant|
login.h|10|error: expected ',' or '...' before string constant|
login.h|11|error: expected identifier before numeric constant|
login.h|11|error: expected ',' or '...' before numeric constant|
login.h|12|error: array bound is not an integer constant|
login.h|12|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|13|error: array bound is not an integer constant|
login.h|13|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|14|error: ISO C++ forbids initialization of member 'isConnected'|
login.h|14|error: making 'isConnected' static|
login.h|14|error: ISO C++ forbids in-class initialization of non-const static member 'isConnected'|
login.h|18|error: ISO C++ forbids declaration of 'connection' with no type|
login.h|20|error: extra qualification 'login::' on member 'getName'|
login.h|24|error: extra qualification 'login::' on member 'getPass'|
login.h|29|error: extra qualification 'login::' on member 'setName'|
login.h|33|error: extra qualification 'login::' on member 'setPass'|
login.cpp|5|error: redefinition of 'class login'|
login.h|5|error: previous definition of 'class login'|
||=== Build failed: 18 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
login.h|10|error: expected identifier before string constant|
login.h|10|error: expected ',' or '...' before string constant|
login.h|11|error: expected identifier before numeric constant|
login.h|11|error: expected ',' or '...' before numeric constant|
login.h|12|error: array bound is not an integer constant|
login.h|12|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|13|error: array bound is not an integer constant|
login.h|13|error: a brace-enclosed initializer is not allowed here before '{' token|
login.h|14|error: ISO C++ forbids initialization of member 'isConnected'|
login.h|14|error: making 'isConnected' static|
login.h|14|error: ISO C++ forbids in-class initialization of non-const static member 'isConnected'|
login.h|18|error: ISO C++ forbids declaration of 'connection' with no type|
login.h|20|error: extra qualification 'login::' on member 'getName'|
login.h|24|error: extra qualification 'login::' on member 'getPass'|
login.h|29|error: extra qualification 'login::' on member 'setName'|
login.h|33|error: extra qualification 'login::' on member 'setPass'|
main.cpp||In function 'int main()':|
main.cpp|12|error: 'name' was not declared in this scope|
main.cpp|14|error: 'p' was not declared in this scope|
main.cpp|16|error: 'isConnected' was not declared in this scope|
main.cpp|18|error: 'name' was not declared in this scope|
main.cpp|18|error: 'pass' was not declared in this scope|
main.cpp|20|error: invalid use of 'class login'|
||=== Build failed: 40 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
merci
Pour etre vraiment, vraiment franc, faudrait que tu t'asseyes, tu relises proprement le C++ de préférence sur zestedusavoir.com puis après avoir fini au minimum les classes, tu reviennes avec tes erreurs(que tu n'auras probablement plus si tu lis bien).
Tu as beaucoup de lacunes et corriger tes erreurs de compilation ici n'arrangera pas cela.
ligne 23-24: Opte pour des std::array ou std::vector a la place de ces tableaux C (typename[])
Ca sert a rien de déclarer une fonction si c'est pour la definir juste apres je trouve, on déclare en haut pour définir dans un autre fichier ou dans une autre portion de code. Mais pas juste en bas. Et tu as encore tes variables globales!
On fais des suggestions/recommandations ici. Tu veux nous obliger a "faire" comme tu l'entends parce que tu trouves que c'est la "bonne" méthode (Et ne me sors plus des noms de personnes que je connais même pas)!??
Bah moi j'ai pas envie, tu saoules a la fin a force d'insister.
@JadeSalina, Pourrais tu -- s'il te plait -- prendre l'habitude, lorsque tu veux simplement "chicanner" sur ce que les autres intervenants ont pu écrire sans apporter quoi que ce soit à la discussion, d'entamer ta propre discussion afin d'aborder le sujet qui te chagrine, afin de ne pas polluer la discussion en cours?
Peut être est-ce déjà trop tard pour celle-ci, mais ca facilitera énormément la vie de tout le monde.
Tu ne dois même pas t'en faire : tu auras forcément les réponses que tu mérites
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Tu veux quelle révolution dans ce projet @JadeSalina? Le gars a plein de fautes de "grammaire" et d' "orthographe" dans son code mais toi tu veux lui apprendre a fait une dissertation et en donnant même déjà des références. Aide le a parfaire son "Français"(code) premièrement puis quand ce sera "lisible" tu pourras lui émettre ton idée de révolution et libre a lui de te suivre ou t'écouter a ce moment.
En lisant un autre post j'apprenais que j'étais un mauvais dev grâce à la sagesse de Jade Stalina. Maintenant j'apprends aussi que je suis un mauvais ingénieur R&D. Ça semble être le cas de tout mon labo aussi. Bon ben ne le dites pas à mon chef parce que ça craint pour nous sinon.
- créer un tableau qui va stocker les informations
- constante string pour le password, le même pour tout le monde
- créer un tableau qui va stocker des entiers, lié par les indexes
- écrire deux fonctions, la fonction créditer et débiter
- une fois qu'on lance le user doit pouvoir se connecter, il peut soit créditer ou débiter son compte, soit annuler
- initialement tous on un montant de 100
- pour débiter, il faut qu'après l'opération il reste au moins 100
- à la sortie on lui donne l'historique des opérations
voici ce que je veux réaliser lorsque j'ai parlé de petite application bancaire depuis le départ. j'aurais du commencé par la afin de vous donner avec exactitude le ce sur quoi j'ai utilisé tel ou tel élément.
j'exhorte les uns et les autres et ce avec amour : de répondre avec bienveillance et respect.
Tu pourrais créer une classe CompteBancaire pour les opérations bancaires: créditer, débiter, historique. Et chaque CompteBancaire aura un User(une autre classe si tu veux) qui sont identifiés par leur mot de passe par exemple.
class CompteBancaire{
private:
User proprietaire; // ou juste std::string nom, prenom, mdp, etc.
double solde;
std::vector<std::string> historique;
public:
void crediter(double montant);
void debiter(double montant); // bool est peut-etre mieux que void
void voir_historique(); // ou get
};
class User{
private:
int identifiant;
std::string nom;
std::string prenom;
// autres infos..
std::string mot_de_passe; // j'ai pas mis const car on doit pouvoir modifier son mot de passe je pense
public:
std::string get_nom_et_prenom();
std::string get_mot_de_passe();
// etc.
}
// Pour connecter l'utilisateur a son compte?
bool verifier_mot_de_passe(std::string, int);
c'est encore moi, mais cette fois j'ai tout écris mes différents fichiers et j'aimerais avoir des corrections sur certains manquements ou des ajustements car le code ne fonctionne pas
||=== Build: Debug in prog (compiler: GNU GCC Compiler) ===|
\c++\prog\Compte.cpp||In member function 'void Compte::crediter(int)':|
\c++\prog\Compte.cpp|40|error: 'sauv' was not declared in this scope|
\c++\prog\Compte.cpp||In member function 'void Compte::debiter(int)':|
\c++\prog\Compte.cpp|48|error: 'sauv' was not declared in this scope|
\c++\prog\Compte.cpp||In member function 'void Compte::annuler()':|
\c++\prog\Compte.cpp|61|warning: comparison between signed and unsigned integer expressions|
\c++\prog\Compte.cpp|66|error: 'isConnected' was not declared in this scope|
\c++\prog\Compte.cpp|66|error: 'exit' was not declared in this scope|
\c++\prog\Compte.cpp|75|error: expected unqualified-id before 'while'|
||=== Build finished: 5 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===
et lorsque j'inclus "User.cpp" dans "Compte.cpp" j'obtiens plutôt ce qui suit comme erreur:
||=== Build: Debug in prog (compiler: GNU GCC Compiler) ===|
\c++\prog\Compte.cpp||In member function 'void Compte::crediter(int)':|
\c++\prog\Compte.cpp|40|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp|41|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp|42|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp||In member function 'void Compte::debiter(int)':|
\c++\prog\Compte.cpp|48|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp|52|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp|53|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp|54|error: invalid types 'int[int]' for array subscript|
\c++\prog\Compte.cpp||In member function 'void Compte::annuler()':|
\c++\prog\Compte.cpp|61|warning: comparison between signed and unsigned integer expressions|
\c++\prog\Compte.cpp|66|error: 'exit' was not declared in this scope|
\c++\prog\Compte.cpp|75|error: expected unqualified-id before 'while'|
||=== Build failed: 9 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
d'accord
#include <iostream>
#include "User.h"
#include "Compte.h"
using namespace std;
int main()
{
string nom;
string mot_de_passe;
cout<<"saisir votre nom"<<endl;
cin>>nom;
cout<<"saisir votre mot de passe"<<endl;
cin>>mot_de_passe;
Compte cb(100);
cout << "Etat du compte : " ;
cb.afficher();
return 0;
}
- Edité par MelissaNgouleu 19 avril 2022 à 13:50:58
sauv est une variable global (on évite les variables global) qui est défini dans user.cpp toi tu essais de l'utiliser dans compte.cpp sans la déclarer (on utilise le mot clé extern pour l'utiliser dans un autre fichier source. (je le redis, on évite les variables global).
MelissaNgouleu a écrit:
et lorsque j'inclus "User.cpp" dans "Compte.cpp" j'obtiens plutôt ce qui suit comme erreur:
Je le redis, mais on inclus pas les fichier source .cpp
Les erreurs sont différentes car il n'y a plus qu'un fichier source en les incluants, mais il ne faut pas le faire !
Et les erreurs sont du à ce qu'une variable membre de ta classe porte le même nom qu'une de tes variable global et que tu veux appeler la variable global dans une fonction membre or c'est la variable membre qui est sollicitée au lieu de la variable global.
Il y a la possibilité de l’appeler avec l'opérateur de porté :: avant son nom ::solde[sauv] mais c'est mieux d'avoir des noms différent et encore mieux de ne pas avoir de variable global.
EDIT : /!\ Après je ne suis pas content que tu ne tienne pas compte de ce que l'on te dit :
C'est la troisième fois que je te le dis mais tu n'as toujours pas corrigé ton while ligne 75 de compte.cpp. Et en plus maintenant il est en dehors de toutes fonction !
Et les erreurs sont du à ce qu'une variable membre de ta classe porte le même nom qu'une de tes variable global et que tu veux appeler la variable global dans une fonction membre or c'est la variable membre qui est sollicitée au lieu de la variable global.
Il y a la possibilité de l’appeler avec l'opérateur de porté :: avant son nom ::solde[sauv] mais c'est mieux d'avoir des noms différent et encore mieux de ne pas avoir de variable global.
rouloude je peut avoir un exemple stp? car je comprends pas
Il y a la possibilité de l’appeler avec l'opérateur de porté :: avant son nom ::solde[sauv] mais c'est mieux d'avoir des noms différent et encore mieux de ne pas avoir de variable global.
Tu est en train de faire un projet qui n'est pas à ta portée, tu ne maîtrises pas suffisamment les bases du langage. Il faut comprendre que le forum n'est pas un débogueur en ligne. Il y a beaucoup d'erreur dans ton code aussi bien de conception que de syntaxe. parce que la demain on y est encore.
Si tu ne connait pas l'opérateur de résolution de portée :: alors change le nom de ta variable pour qu'il n'y ai pas de collisions, ou mieux n'utilise pas de variable globale ou lis un cours sur le C++, mais lis tout de même un cours.
PS : L'exemple je te l'ai donné, mais tu ne le vois pas !!! : ::solde[sauv] (C'est une solution pour te dépanner, mais pas une bonne solution).
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C