"alors pourquoi avoir créé iostream.h, pour ensuite dire que c'est deprecated?"
parce que ca n'est pas standard ! iostream.h ca date de l'epoque du c++ pre standard (avant 97), c'est deprecié et ca va disparaitre au prochain standard
maintenant tout est dans le namespace standard, meme lib standard c
Wow, y a du message ici !
Juste un petit mot au sujet des librairies "C" qui sont deprecated.. J'ai juste a remplacer iostream.h par iostream, et les librairies C classiques par leurs equivalents C++ comme je l'avais dit.. Ca change franchement pas grand chose, d'ailleurs c'est deprecated parce qu'ils ont envie que ca soit deprecated... D'ailleurs, est-ce que iostream existe en C? Je dirais que non, alors pourquoi avoir créé iostream.h, pour ensuite dire que c'est deprecated? :)
Bon en tout cas quand j'aurai le temps, je mettrai mes libs à jour pour prendre en compte tes remarques, djl, ca ne me coute absolument rien de toute facon! Sauf cinq minutes de mon temps pour changer quelques include ;)
++
Soilwork
PS : J'avais pas regardé qui était l'auteur du document. Si c'est le createur du C++, alors ok, il a le droit de faire le boss lol! Je retire ce que j'ai dit sur l'aspect pédant du texte :)
en fait les CString étaient décrétés prioritaires sur mes BString sans causé de conflit
un bug amené par les modfis récentes : const:
les CString prenaient en charge la comparaison avec un caractere =>
résolu en rajoutant ceci ds le header
//deb: rajouté pr régler PB avec les MFC
du coup, pr résoudre ce pb, G inclu ds Visual uniquement les lignes suivantes ds le header.
> tout ce qui est inliner devrais pas poser de probleme
je repete, ce n'est pas un conseil que je donne, je dis juste que tes fonction inline doivent etre definie dans un header (si tu veut qu'elles soit sytematiquement inliner)
ça me semble logique que Truc soit défini ds B.obj &C.obj
sinon, on fait à l'ancienne & on met ts nos srce ds un unique
et vu que ce sera un cpp, po de pb
& si là tu conseille ça,
ben je comprend plus rien du tout à la prog
ou soit ts mes bouquins étaient nuls de mm que ts mes profs & moi mm
tu vas me faire désespérer...
++
PS' : au fait, tu as vu, G corrigé un bug des BString ammené par une modif récente qu'on a fait ensemble!!!
un conflit entre CString & BString... causé par les const...
m'enfin, réglé!
"et y me semblais bien que definir le tt en fichiers séparés était une des bases de la prog structurée...
"
faudrais savoir ce que tu veux aussi, si tu veux que tes fonctions soit inliner, elles ne peuvent etre compiler separement (puisque leur definition doit etre connue lors de la compilation du source)
moi je fais toujours declaration dans le .h et definition dans le .c (sauf pou les fonctions inline) pour ne pas avoir a tous recompiler a chaque fois, comme le fais make
tu peux pas toujours y echapper en c++, la preuve avec les templates et les fonctions inline
justement djl, si tout est ds le .h, une question se pose !!!
comment résouds tu les inclusions multiples
mettons que j'ai une classe A, ayant 2 membres b et c de classe B et C
soit la classe truc, declarée entierement ds le header
dans ma classe B & ds ma classe C, j'ai des instances de Truc
donc les headers B et C contiennent un include sur Truc mais pas A
là, le compilo va raller car il va trouver deux sortes de Truc, ceux de B & ceux de C
et ces deux Trucs ont été précompilés dans les b.o et c.o
j'espere que vs suivez tjs
sinon, je vais illustrer cet exemple:
Bref, voici l'erreur générée par VC6 & pkoi j'ai abandonné cette idée de tt mettre ds les headers
error LNK2005
detail d'un essai avec MP:
acceleration : nouvelle politique : toutes les bibli sont des headers => inline automatisés.... [ABANDONNE]
=> ne plus inclure les bibli ds les prj...
ABANDONNE car :
> si certains srce ne st pas ds des cpp > compilés plsrs fois
ex=> HashTable.obj : error LNK2005: "class BString __cdecl BIBLI_BC::ELangageDeProgToString(enum ELangageDeProg const &)" (?ELangageDeProgToString@BIBLI_BC@@YA?AVBString@@ABW4ELangageDeProg@@@Z) already defined in AnaTrace.obj
=> Debug/MetaProg.exe : fatal error LNK1169: one or more multiply defined symbols found
C'est ok pour quelques modifs, merci pour l'aide que vous m'apportez
oui j'utilise VC6, c'est vrai qu'on m'a déjà fait la remarque par rapport aux variable déclarées localement dans les boucles, j'ai donc corrigé cela et je ferai en sorte de ne plus faire ce genre "d'erreur"
concernant le fait que le source ne fait qu'un .h je me pose la question suivante par rapport à ce qu'on m'a dis : les fonctions déclarées dans la classe (comme c'est le cas ici) sont considérées comme "inline" et c'est pour cela qu'à l'origine j'ai tout mis dans un seul fichier, je ne le fait pas tout le temps si ca peux vous rassurer mais je vais surement voir pour changer cela et déclarer les fonctions dans un .cpp et ajouter la commande inline devant celles qui en ont "besoin"
quand aux librairies std, va faloir que je m'y mette
encore merci
Soilwork9 > "stdlib.h, string.h, et meme iostream.h" le probleme c'est que c'est pas du c++ standard ca, donc portabilité pas assurée, pir avec iostream.h elle est proche du neant maintenant
le documenté que j'ai cité, qui est de bjarne stroustrup (le pere du c++, d'ou son assurance que tu as remarqué dans son propre langage :D) a pour but de montrer, en comparant un c-style code avec un pur c++ (comme tu l'a remarqué) que utilisé la bibliotheques standard (ce que tu n'aime pas) te permet d'avoir un code claire, rapide a produire, facile a maintenir ... et performant
ton c++ est deprecated, et aujourd'hui ca ne vaut rien (reconnu nul part ), seul le c++ standard a raison d'etre
rien qu'avec la stl, tu imagine tout ce qu'on peut faire, a quelle point ca facilite la vie du programmeur ?
Le document que tu cites a plutot l'air de comparer le C et le C++... Les programmes qu'il donne en "C-style C++" sont du C, tout simplement (Pourquoi utiliser malloc dans un programme C++?). En plus je trouve l'auteur un peu arrogant et pédant, mais bon c'est une autre histoire.
Ce que je voulais dire dans mon précédent post, c'est que j'utilise les headers "C-style"(stdlib.h, string.h, et meme iostream.h) plutot que les nouveaux headers C++(iosteram, cstdlib, cstring?). Bon, un jour, je changerai peut-etre ca, comme ca je n'aurai plus besoin de faire taire mon compilateur avec le flag -Wno-deprecated lol
Après c'est vrai que je n'utilise pas les classes standard comme "string", mais c'est simplement parce qu'elles ne me conviennent pas. Pendant un moment, j'ai développé sous C++ Builder et j'utilisais les AnsiString, mais jamais les string. Je préfère faire ma propre classe, qui sera peut-être un peu moins efficace, mais qui conviendra à l'utilisation que je veux en faire.
Hehe, un compilateur qui laisse passer n'importe quoi ;) Pas de doute, c'est un produit Microsoft! Apres on va s'etonner que Windows soit buggé :P
En tout cas, il vaut mieux prendre de bonnes habitudes dès le début, et NE PAS s'habituer a utiliser le C++ "made in crosoft" qui n'a rien a voir avec le C++ standard ... :( GCC/G++ POWER...
Sinon, personnellement je n'aime pas les librairies standard C++, ni l'utilisation des namespace, donc j'avoue que je prefere utiliser les anciennes librairies C plutot que les equivalents C++ ^_^
Allez, a plus tard
++
Soilwork
PS: Maintenant que j'y repense, ca me choque vraiment, ce comportement de VC++ 6... La portée des variables est une des premières choses importantes à retenir lorsqu'on apprend le C ou le C++, et ils ne sont meme pas capables de l'implémenter correctement dans leur compilo? *choqué*
Salut et bienvenue dans le cercle des createurs de classes gérant des chaines de caractères ;)
Bon, je vois que djl et Nono sont arrivés avant moi pour examiner ton code source, donc je ne vais pas spécialement m'attarder sur celui-ci (mais un peu quand meme ;) ), d'autant plus que la solution que tu as choisie ressemble un peu à celle que j'ai utilisée pour ma propre classe CString, donc je ne vais pas critiquer! lol
Quelques petits détails pour commencer... D'abord, il vaut mieux zipper ton code source et l'uploader sur le site, si tu peux faire tout ca, plutôt que de le mettre directement en texte sur la page, c'est beaucoup plus pratique, pour ceux qui veulent l'utiliser, je trouve.
Ensuite, il vaut mieux séparer ton code en deux parties, un header avec la déclaration de ta classe et de ses méthodes (fichier H ou HPP), et un fichier source CPP avec le corps des méthodes. C'est plus pratique et plus lisible.
Deux petites choses concernant le code, au passage: D'abord, n'oublie pas de mettre les include nécessaires à ta classe (en l'occurence, stdlib et string).
Deuxième chose : dans le constructeur qui prend les N premiers caractères d'une autre chaine, tu marques ceci:
for(unsigned long i=0; i < lengthfromstart ;i++)
this->_pstr[i]=chaine[i];
this->_pstr[i] = 0;
Tu déclares la variable i à l'intérieur du FOR, donc sa portée se limite exclusivement à l'intérieur de cette boucle, qui ne contient qu'une seule instruction. Cela signifie qu'à la sortie de la boucle, pour l'instruction:
this->_pstr[i] = 0;
la variable i n'existe plus! A la place, tu dois écrire:
unsigned long i;
for(i=0; i < lengthfromstart ;i++)
this->_pstr[i]=chaine[i];
this->_pstr[i] = 0;
Et la, ca compile :)
Voila, c'est tout pour l'instant, je crois. Bravo en tout cas, c'est pas mal du tout, ca compile sans problèmes ni Warnings (après les deux petites corrections mineures) et tout a l'air de fonctionner, d'après les quelques petits tests que j'ai faits. Well done!
Si tu veux l'améliorer, tu peux ajouter des méthodes de remplacement, qui sont toujours très pratiques!
Pour ce qui est de std::string je ne suis pas allé en profondeur mais je l'ai trouvé imcomplète (pas de comparaison ignorant la casse par exemple), je verrai plus tard pour dériver une classe mais je ne me sens pas encore à l'aise avec ce système
concernant le warning, je retourne bien *this, c'est pour cela que je ne comprend pas ce qui ne va pas, voici ce que j'ai mis :
CString& operator + (const CString *s) const { return *this + s->_pstr; }
si je laisse CString au lieu de CString& ca marche, où est mon erreur ?
ben si tu retourne une refernce sur un objet temporaire ca va pas aller, retourne *this, ca existera toujours dans le context appelant (considere le comme un parametre caché)
Merci pour vos commentaires, je sais que c'est une classe de plus mais je ne trouvais pas de classe à mon gout quand au nom je trouve que tant qu'à utiliser les MFC autant utiliser la classe CString de microsoft étant donné qu'à partir du moment où on plonge une partie du programme dans les MFC il ne fonctionnera que sous microsoft -__-
pour la gestion de taille je vais voir cela, c'est vrai que l'automatiser ne serai pas plus mal, quand à l'augmenter je le ferai si je constate qu'il manque des méthodes réellement utiles
à propos des opérateurs j'y avais songé mais si je met CString& en retour j'obtient un warning :
Warning C4172: returning address of local variable or temporary
comment faire dans ce cas ?
à mon avis c'est moi qui fait quelque chose de travers
en passant j'ajouterai juste un bravo pour tes BString Nono
13 sept. 2004 à 08:28
7 sept. 2004 à 23:16
parce que ca n'est pas standard ! iostream.h ca date de l'epoque du c++ pre standard (avant 97), c'est deprecié et ca va disparaitre au prochain standard
maintenant tout est dans le namespace standard, meme lib standard c
7 sept. 2004 à 22:44
Juste un petit mot au sujet des librairies "C" qui sont deprecated.. J'ai juste a remplacer iostream.h par iostream, et les librairies C classiques par leurs equivalents C++ comme je l'avais dit.. Ca change franchement pas grand chose, d'ailleurs c'est deprecated parce qu'ils ont envie que ca soit deprecated... D'ailleurs, est-ce que iostream existe en C? Je dirais que non, alors pourquoi avoir créé iostream.h, pour ensuite dire que c'est deprecated? :)
Bon en tout cas quand j'aurai le temps, je mettrai mes libs à jour pour prendre en compte tes remarques, djl, ca ne me coute absolument rien de toute facon! Sauf cinq minutes de mon temps pour changer quelques include ;)
++
Soilwork
PS : J'avais pas regardé qui était l'auteur du document. Si c'est le createur du C++, alors ok, il a le droit de faire le boss lol! Je retire ce que j'ai dit sur l'aspect pédant du texte :)
7 sept. 2004 à 15:39
un bug amené par les modfis récentes : const:
les CString prenaient en charge la comparaison avec un caractere =>
résolu en rajoutant ceci ds le header
//deb: rajouté pr régler PB avec les MFC
du coup, pr résoudre ce pb, G inclu ds Visual uniquement les lignes suivantes ds le header.
bool operator==(const char s)const{return operator==((BString) s);}
par ex pr cet opérateur: le suivant était choisi
(syntaxe ptet approximative)
friend bool operator(const char& ,const CString&)const
vu que rien ne laissait présagé de cette erreur... ben détecté il y a une semaine seulement...
y avait une différence ! la comparaison de la casse !
voilu
++
Nono.
7 sept. 2004 à 15:30
> tout ce qui est inliner devrais pas poser de probleme
je repete, ce n'est pas un conseil que je donne, je dis juste que tes fonction inline doivent etre definie dans un header (si tu veut qu'elles soit sytematiquement inliner)
c'etait quoi le bug avec les bstring ?