Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de compilation avec un constructeur

16 réponses
Avatar
Jude
Bonjour

Pour une classe bigint (exo de td d'info scolaire)
je voudrais realiser un constructeur comme celui ci
Un bigint possede un entier taille et un vecteur Nt

BigInt::BigInt(string chaine) {

taille=chaine.size();

Nt=vector<int>(taille-1);

for(int i=taille-1;i<0;i--) {
Nt[taille-i]=chaine[taille-i+1]-'0';
}
}

Le but serait de rentrer les differents caracteres de chaine dans Nt

Le probleme est :

bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid

Voilà si vous voyez l'erreur, ou s'il vous faut plus de renseignements,
je vous remercie dejà pour votre reponse.

--
Jude
Pas très bon, mais debutant

10 réponses

1 2
Avatar
Fabien LE LEZ
On Sat, 02 Apr 2005 22:06:58 +0200, Jude :

bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid


T'es sûr que t'as déclaré le constructeur dans la classe ?

En tout cas, le code ci-dessous compile :

#include <string>
#include <vector>

using std::vector;
using std::string;

class BigInt
{
public:
BigInt(string chaine);

private:
int taille;
vector<int> Nt;
};

BigInt::BigInt(string chaine) {

taille=chaine.size();

Nt=vector<int>(taille-1);
// J'ai de gros doutes sur le "-1"

for(int i=taille-1;i<0;i--) {
Nt[taille-i]=chaine[taille-i+1]-'0';
}
}


Le même code, mais en un petit peu plus propre :

#include <string>
#include <vector>

class BigInt
{
public:
BigInt (std::string const& chaine);
int Taille() const { return chiffres.size(); }

private:
std::vector<int> chiffres;
};

using std::vector; // Si tu y tiens
using std::string; // (ça peut permettre d'alléger un peu)

BigInt::BigInt (string const& chaine)
{
for (int i=0; i<chaine.size(); ++i)
{
chiffres.push_back (chaine[i]-'0');
// le coup du " -'0' " me paraît discutable, mais bon...
}
}


ou, mieux :

BigInt::BigInt (string const& chaine)
{
for (string::const_iterator i= chaine.begin();
i != chaine.end(); ++i)
{
chiffres.push_back (*i - '0');
// même remarque sur " -'0' ".
}
}


--
;-)

Avatar
Cyrille
Bonjour

Le but serait de rentrer les differents caracteres de chaine dans Nt

Le probleme est :

bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid

Voilà si vous voyez l'erreur, ou s'il vous faut plus de renseignements,
je vous remercie dejà pour votre reponse.


A lui tout seul, ce code ne comporte pas de faute particulière, l'erreur
est avant. Vu le message d'erreur, je pencherais pour un point-virgule
manquant juste avant, genre à la fin du bloc de définition de la classe.

par exemple:
class BigInt
{
// ...
}; // ne pas oublier le point-virgule ici.

BigInt::BigInt(string){} *

si le point-virgule a été omis, le compilateur croit que le bloc
précédent est le type de retour du constructeur, et il couine avec les
messages d'erreurs que vous donnez:
- Il ne peut y avoir une définition de type à l'intérieur d'un return type.
- Un constructeur ne peut pas avoir de return type.

--
win the yes need the no to win against the no!

Avatar
Matthieu Moy
Jude writes:

Bonjour


Bonsoir,

bigint.cc:23: error: le C++ ISO interdit la définition de types à
l'intérieur
de return type
bigint.cc:23: error: return type specification for constructor invalid


Quelle est la ligne 23 dans le programme ?

--
Matthieu

Avatar
Jude

class BigInt
{
// ...
}; // ne pas oublier le point-virgule ici.

BigInt::BigInt(string){} *

si le point-virgule a été omis, le compilateur croit que le bloc
précédent est le type de retour du constructeur, et il couine avec les
messages d'erreurs que vous donnez:
- Il ne peut y avoir une définition de type à l'intérieur d'un return type.
- Un constructeur ne peut pas avoir de return type.



Merci c'etait ça

--
Jude

Avatar
Jude

BigInt::BigInt (string const& chaine)
{
for (int i=0; i<chaine.size(); ++i)
{
chiffres.push_back (chaine[i]-'0');
// le coup du " -'0' " me paraît discutable, mais bon...
}
}


ou, mieux :

BigInt::BigInt (string const& chaine)
{
for (string::const_iterator i= chaine.begin();
i != chaine.end(); ++i)
{
chiffres.push_back (*i - '0');
// même remarque sur " -'0' ".
}
}


Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).
Je cherche en fait juste a vouloir convertir en un entier le caractere
contenue dans ma chaine.
Il y a t'il une commande speciale?
Merci

--
Jude

Avatar
Miguel
Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).


Pourquoi ca marche pas??? (à lire avec un air d'enfant de 5-6 ans)

Avatar
Cyrille

BigInt::BigInt (string const& chaine) {
for (string::const_iterator i= chaine.begin(); i !=
chaine.end(); ++i)
{
chiffres.push_back (*i - '0'); // même remarque sur "
-'0' ".
}
}



Oui vous avez raison de vouloir discuter sur le -'0' car cela ne marche
pas (une indication de notre prof d'info).
Je cherche en fait juste a vouloir convertir en un entier le caractere
contenue dans ma chaine.
Il y a t'il une commande speciale?


Si votre prof vous a dit que ça ne marchait pas sans vous en dire plus,
c'est sans doute qu'il s'attend à ce que vous fassiez ça en exercice.
Aussi, réfléchissez-y, ça n'a rien de difficile, de faire une fonction
qui prend un char en paramètre et qui renvoye l'entier int correspondant.

--
win the yes need the no to win against the no!


Avatar
James Kanze
Jude wrote:

BigInt::BigInt (string const& chaine) {
for (int i=0; i<chaine.size(); ++i)
{
chiffres.push_back (chaine[i]-'0'); // le coup du " -'0'
" me paraît discutable, mais bon...
}
}



ou, mieux :



BigInt::BigInt (string const& chaine) {
for (string::const_iterator i= chaine.begin(); i ! >> chaine.end(); ++i)
{
chiffres.push_back (*i - '0'); // même remarque sur "
-'0' ".
}
}



Oui vous avez raison de vouloir discuter sur le -'0' car cela
ne marche pas (une indication de notre prof d'info).


Ça dépend bien du contenu de la chaîne, non ? Si on a vérifié
d'avance que la chaîne ne contient que des chiffres (isdigit()
renvoie vrai), je ne vois pas le problème. (Ce n'est pas comme
ça que je ferais, parce que j'aimerais bien que le même code
fonctionne aussi pour des chiffres hexadécimaux. Mais pour les
chiffres décimaux, c'est garanti par la norme.)

Je cherche en fait juste a vouloir convertir en un entier le
caractere contenue dans ma chaine.


S'il s'agit uniquement de convertir un seul chiffre, de '0' à
'9', et qu'on sait que isdigit renvoie true, ch - '0' est la
façon la plus simple à en avoir la valeur du chiffre dans un
entier.

Il y a t'il une commande speciale?


Ça dépend ce que tu veux faire. Pour convertir une chaîne en
entier, il existe plusieurs possibilités. Pour convertir un seul
chiffre, sans en faire une chaîne, il n'y a rien de prévu, à
part la soustraction de '0'.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
Loïc Joly
Jude wrote:

Oui vous avez raison de vouloir discuter sur le -'0' car cela
ne marche pas (une indication de notre prof d'info).


Ça dépend bien du contenu de la chaîne, non ? Si on a vérifié
d'avance que la chaîne ne contient que des chiffres (isdigit()
renvoie vrai), je ne vois pas le problème. (Ce n'est pas comme
ça que je ferais, parce que j'aimerais bien que le même code
fonctionne aussi pour des chiffres hexadécimaux. Mais pour les
chiffres décimaux, c'est garanti par la norme.)


Pourrais-tu citer une référence ? J'ai jetté un oeil et n'ai rien trouvé.

--
Loïc


Avatar
kanze
Loïc Joly wrote:
Jude wrote:

Oui vous avez raison de vouloir discuter sur le -'0' car
cela ne marche pas (une indication de notre prof d'info).


Ça dépend bien du contenu de la chaîne, non ? Si on a
vérifié d'avance que la chaîne ne contient que des chiffres
(isdigit() renvoie vrai), je ne vois pas le problème. (Ce
n'est pas comme ça que je ferais, parce que j'aimerais bien
que le même code fonctionne aussi pour des chiffres
hexadécimaux. Mais pour les chiffres décimaux, c'est garanti
par la norme.)


Pourrais-tu citer une référence ? J'ai jetté un oeil et n'ai
rien trouvé.


Je ne sais pas où le chercher dans la norme C++ non plus.

Dans la norme C, §5.2.1/3, on a « In both the source and
execution basic character sets, the value of each character
after 0 in the above list of decimal digits shall be one greater
than the value of the previous. » Je ne trouve pas où on le dit
dans la norme C++, mais je ne crois pas que l'intention était
d'être différent de C ici. (Au moins, cette différence
n'apparaît pas dans l'appendice C.1.)

Est-ce qu'il faut poser la question dans comp.std.c++ ?

--
James Kanze GABI Software
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



1 2