j'ai une classe :
class C_Tab
{
private:
vector <int> tableau(6);
public:
int somme(vector <int> tab);
bool comparetab(const vector <int> a,
const vector <int> b) const;
};
et sur la ligne de déclaration du vector, j'ai l'erreur suivante :
" invalid data member initialization"
donc je ne comprends pas, pourtant j'ai bien vu qu'on pouvait déclarer
des vector ainsi...
j'ai une classe :
class C_Tab
{
private:
vector <int> tableau(6);
public:
int somme(vector <int> tab);
bool comparetab(const vector <int> a,
const vector <int> b) const;
};
et sur la ligne de déclaration du vector, j'ai l'erreur suivante :
" invalid data member initialization"
donc je ne comprends pas, pourtant j'ai bien vu qu'on pouvait déclarer
des vector ainsi...
j'ai une classe :
class C_Tab
{
private:
vector <int> tableau(6);
public:
int somme(vector <int> tab);
bool comparetab(const vector <int> a,
const vector <int> b) const;
};
et sur la ligne de déclaration du vector, j'ai l'erreur suivante :
" invalid data member initialization"
donc je ne comprends pas, pourtant j'ai bien vu qu'on pouvait déclarer
des vector ainsi...
public:
int somme(vector <int> tab);
bool comparetab(const vector <int> a,
const vector <int> b) const;
tu préfèrerais pas utiliser operator< ?
surtout que là tu va devoir
travailler comme ça
a.comparetab(b, c);
};
à moins que ça soit didactique, ne réinvente pas la roue, regarde les
std::valarray et les boost::array (www.boost.org)
déclarer oui, initialiser non
private:
vector <int> tableau;
public:
C_Tab()
: tableau(6)
{
// ...
}
public:
int somme(vector <int> tab);
bool comparetab(const vector <int> a,
const vector <int> b) const;
tu préfèrerais pas utiliser operator< ?
surtout que là tu va devoir
travailler comme ça
a.comparetab(b, c);
};
à moins que ça soit didactique, ne réinvente pas la roue, regarde les
std::valarray et les boost::array (www.boost.org)
déclarer oui, initialiser non
private:
vector <int> tableau;
public:
C_Tab()
: tableau(6)
{
// ...
}
public:
int somme(vector <int> tab);
bool comparetab(const vector <int> a,
const vector <int> b) const;
tu préfèrerais pas utiliser operator< ?
surtout que là tu va devoir
travailler comme ça
a.comparetab(b, c);
};
à moins que ça soit didactique, ne réinvente pas la roue, regarde les
std::valarray et les boost::array (www.boost.org)
déclarer oui, initialiser non
private:
vector <int> tableau;
public:
C_Tab()
: tableau(6)
{
// ...
}
c'est ce que je viens de voir sur le site SGI, j'ignorais sont
existence... je viens de voir aussi :
bool operator==(const vector&,
const vector&)
ça s'utilise comme un opérateur '==' normal ?
Pas exactement, cette fonction doit être extérieure à la classe vector car
exemple
(a==b) renvoi false ou true suivant que les vector sont les même ou pas
Oui.
ce sont des opérateurs surchargés ?
Oui.
ce sont mes réflexes de langage C que de faire des fonctions comme
ça...
Reflexes à perdre, donc ;-)
à moins que ça soit didactique, ne réinvente pas la roue, regarde les
std::valarray et les boost::array (www.boost.org)
en fait c'est pour faire un projet pour mes cours, mais autant utiliser
des trucs standards qui vont bien. en cours nous n'avons vu que les
tableaux a la C. On m'avait dit ici que vector était bcp plus utilisé
pour les tableaux...
les std::valarray sont standards, (le namespace std te le prouve. Par
mais d'après ce que j'ai vu il existe tout un tas de conteneurs...
Oui des tas : regardes dans la doc list, deque, map, etc...
désolé, certainement par manque de bases, mais je comprend pas ton :
C_Tab():tableau(6)
c'est le constructeur de la classe qui initialise les données statiques
Ici la donnée n'est pas statique.
imaginons que j'ai n variables statiques a initialiser, je ferai :
PAS STATIQUE.
C_Tab()
:n1=2
:n2=3
.
.
.
:nn=9
{
}
Non, la syntaxe est
et que mettre dans le corps du constructeur s'i je n'ai que des
variables statiques a initialiser ? et rien d'autres a lui faire faire
?
Et bien rien. Tu ouvres et tu fermes les crochets, uniquement.
c'est ce que je viens de voir sur le site SGI, j'ignorais sont
existence... je viens de voir aussi :
bool operator==(const vector&,
const vector&)
ça s'utilise comme un opérateur '==' normal ?
Pas exactement, cette fonction doit être extérieure à la classe vector car
exemple
(a==b) renvoi false ou true suivant que les vector sont les même ou pas
Oui.
ce sont des opérateurs surchargés ?
Oui.
ce sont mes réflexes de langage C que de faire des fonctions comme
ça...
Reflexes à perdre, donc ;-)
à moins que ça soit didactique, ne réinvente pas la roue, regarde les
std::valarray et les boost::array (www.boost.org)
en fait c'est pour faire un projet pour mes cours, mais autant utiliser
des trucs standards qui vont bien. en cours nous n'avons vu que les
tableaux a la C. On m'avait dit ici que vector était bcp plus utilisé
pour les tableaux...
les std::valarray sont standards, (le namespace std te le prouve. Par
mais d'après ce que j'ai vu il existe tout un tas de conteneurs...
Oui des tas : regardes dans la doc list, deque, map, etc...
désolé, certainement par manque de bases, mais je comprend pas ton :
C_Tab():tableau(6)
c'est le constructeur de la classe qui initialise les données statiques
Ici la donnée n'est pas statique.
imaginons que j'ai n variables statiques a initialiser, je ferai :
PAS STATIQUE.
C_Tab()
:n1=2
:n2=3
.
.
.
:nn=9
{
}
Non, la syntaxe est
et que mettre dans le corps du constructeur s'i je n'ai que des
variables statiques a initialiser ? et rien d'autres a lui faire faire
?
Et bien rien. Tu ouvres et tu fermes les crochets, uniquement.
c'est ce que je viens de voir sur le site SGI, j'ignorais sont
existence... je viens de voir aussi :
bool operator==(const vector&,
const vector&)
ça s'utilise comme un opérateur '==' normal ?
Pas exactement, cette fonction doit être extérieure à la classe vector car
exemple
(a==b) renvoi false ou true suivant que les vector sont les même ou pas
Oui.
ce sont des opérateurs surchargés ?
Oui.
ce sont mes réflexes de langage C que de faire des fonctions comme
ça...
Reflexes à perdre, donc ;-)
à moins que ça soit didactique, ne réinvente pas la roue, regarde les
std::valarray et les boost::array (www.boost.org)
en fait c'est pour faire un projet pour mes cours, mais autant utiliser
des trucs standards qui vont bien. en cours nous n'avons vu que les
tableaux a la C. On m'avait dit ici que vector était bcp plus utilisé
pour les tableaux...
les std::valarray sont standards, (le namespace std te le prouve. Par
mais d'après ce que j'ai vu il existe tout un tas de conteneurs...
Oui des tas : regardes dans la doc list, deque, map, etc...
désolé, certainement par manque de bases, mais je comprend pas ton :
C_Tab():tableau(6)
c'est le constructeur de la classe qui initialise les données statiques
Ici la donnée n'est pas statique.
imaginons que j'ai n variables statiques a initialiser, je ferai :
PAS STATIQUE.
C_Tab()
:n1=2
:n2=3
.
.
.
:nn=9
{
}
Non, la syntaxe est
et que mettre dans le corps du constructeur s'i je n'ai que des
variables statiques a initialiser ? et rien d'autres a lui faire faire
?
Et bien rien. Tu ouvres et tu fermes les crochets, uniquement.
C_Tab():tableau(6)
Dans la définition d'un constructeur tu places après le signe : ce qu'on
appelle la liste d'initialisation, ie les différents appels des
constructeurs nécessaires pour construire ton objet.
Par exemple :
class X
{
///....
};
class Y
{
X x;
};
pour construire un Y, il te faut construire un X. Si tu ne le fais pas
explicitement,
Y::Y()
{...}
alors le compilateur va appeler le constructeur par défaut de X. Il a donc
besoin d'exister...
Dans le cas du vector , le constructeur par défaut de celui-ci ne fait pas
la même chose que le constructeur avec un entier en paramètre...
Lors de l'appel de ton constructeur :
C_Tab() {}
Tu ne précises pas au compilateur comment construire ton membre vector.
Alors il appelle le seul constructeur qu'il peut, à savoir le constructeur
par défaut. Alors que si tu fais :
C_Tab:tableau(6)
{}
Tu précises au compilateur qu'il construit "tableau" en utilisant le
constructeur de vector avec un entier en paramètre. Donc ton vecteur est
d'office déclaré avec une taille de 6 éléments.
c'est le constructeur de la classe qui initialise les données statiques
Ici la donnée n'est pas statique.imaginons que j'ai n variables statiques a initialiser, je ferai :
PAS STATIQUE.
C_Tab()n1=2
n2=3
.
.
.nn=9
{
}
Non, la syntaxe est
C_Tab() : n1(2), n2(3), .... nn(9) { // et ici tu fais du code, non des
init...}
C_Tab():tableau(6)
Dans la définition d'un constructeur tu places après le signe : ce qu'on
appelle la liste d'initialisation, ie les différents appels des
constructeurs nécessaires pour construire ton objet.
Par exemple :
class X
{
///....
};
class Y
{
X x;
};
pour construire un Y, il te faut construire un X. Si tu ne le fais pas
explicitement,
Y::Y()
{...}
alors le compilateur va appeler le constructeur par défaut de X. Il a donc
besoin d'exister...
Dans le cas du vector , le constructeur par défaut de celui-ci ne fait pas
la même chose que le constructeur avec un entier en paramètre...
Lors de l'appel de ton constructeur :
C_Tab() {}
Tu ne précises pas au compilateur comment construire ton membre vector.
Alors il appelle le seul constructeur qu'il peut, à savoir le constructeur
par défaut. Alors que si tu fais :
C_Tab:tableau(6)
{}
Tu précises au compilateur qu'il construit "tableau" en utilisant le
constructeur de vector avec un entier en paramètre. Donc ton vecteur est
d'office déclaré avec une taille de 6 éléments.
c'est le constructeur de la classe qui initialise les données statiques
Ici la donnée n'est pas statique.
imaginons que j'ai n variables statiques a initialiser, je ferai :
PAS STATIQUE.
C_Tab()
n1=2
n2=3
.
.
.
nn=9
{
}
Non, la syntaxe est
C_Tab() : n1(2), n2(3), .... nn(9) { // et ici tu fais du code, non des
init...}
C_Tab():tableau(6)
Dans la définition d'un constructeur tu places après le signe : ce qu'on
appelle la liste d'initialisation, ie les différents appels des
constructeurs nécessaires pour construire ton objet.
Par exemple :
class X
{
///....
};
class Y
{
X x;
};
pour construire un Y, il te faut construire un X. Si tu ne le fais pas
explicitement,
Y::Y()
{...}
alors le compilateur va appeler le constructeur par défaut de X. Il a donc
besoin d'exister...
Dans le cas du vector , le constructeur par défaut de celui-ci ne fait pas
la même chose que le constructeur avec un entier en paramètre...
Lors de l'appel de ton constructeur :
C_Tab() {}
Tu ne précises pas au compilateur comment construire ton membre vector.
Alors il appelle le seul constructeur qu'il peut, à savoir le constructeur
par défaut. Alors que si tu fais :
C_Tab:tableau(6)
{}
Tu précises au compilateur qu'il construit "tableau" en utilisant le
constructeur de vector avec un entier en paramètre. Donc ton vecteur est
d'office déclaré avec une taille de 6 éléments.
c'est le constructeur de la classe qui initialise les données statiques
Ici la donnée n'est pas statique.imaginons que j'ai n variables statiques a initialiser, je ferai :
PAS STATIQUE.
C_Tab()n1=2
n2=3
.
.
.nn=9
{
}
Non, la syntaxe est
C_Tab() : n1(2), n2(3), .... nn(9) { // et ici tu fais du code, non des
init...}
franchement j'ai du mal a comprendre ce que tu me dis, si j'ai :
class A
{
public :
int x;
A();
}
A::A()x(6)
{
}
x(6) fait bien l'initialisation de x à 6 lors de la création d'un
objet
de type A... et pourtant il n'est pas question d'allocation dynamique
Mais qui a parlé d'allocation dynamique? Il s'agit d'initialiser les membres
x est une variable entière, je vois pas ce que ça signifie
d'appeler le constructeur d'un entier...
Ca veut dire simplement l'initialiser à la valeur passée en paramètre ;-)
franchement j'ai du mal a comprendre ce que tu me dis, si j'ai :
class A
{
public :
int x;
A();
}
A::A()
x(6)
{
}
x(6) fait bien l'initialisation de x à 6 lors de la création d'un
objet
de type A... et pourtant il n'est pas question d'allocation dynamique
Mais qui a parlé d'allocation dynamique? Il s'agit d'initialiser les membres
x est une variable entière, je vois pas ce que ça signifie
d'appeler le constructeur d'un entier...
Ca veut dire simplement l'initialiser à la valeur passée en paramètre ;-)
franchement j'ai du mal a comprendre ce que tu me dis, si j'ai :
class A
{
public :
int x;
A();
}
A::A()x(6)
{
}
x(6) fait bien l'initialisation de x à 6 lors de la création d'un
objet
de type A... et pourtant il n'est pas question d'allocation dynamique
Mais qui a parlé d'allocation dynamique? Il s'agit d'initialiser les membres
x est une variable entière, je vois pas ce que ça signifie
d'appeler le constructeur d'un entier...
Ca veut dire simplement l'initialiser à la valeur passée en paramètre ;-)
L'effet final est le même mais c'est moins efficace, car le
compilateur commence par appeler le constructeur par défaut de int
(qui met la variable à 0), puis seulement ensuite dans le corps du
L'effet final est le même mais c'est moins efficace, car le
compilateur commence par appeler le constructeur par défaut de int
(qui met la variable à 0), puis seulement ensuite dans le corps du
L'effet final est le même mais c'est moins efficace, car le
compilateur commence par appeler le constructeur par défaut de int
(qui met la variable à 0), puis seulement ensuite dans le corps du
"Michel Michaud" writes:Dans news:3fc27273$0$27036$, ArnaudL'effet final est le même mais c'est moins efficace, car le
compilateur commence par appeler le constructeur par défaut de int
(qui met la variable à 0), puis seulement ensuite dans le corps du
« Malheureusement » non, ce n'est pas si logique que ça : le
constructeur par défaut de int ne fait rien... (Ne pas confondre
avec int() qui vaut bien 0 :-)
Je ne comprends pas ce que tu veux dire. int() est une expression
résulte en un appel de constructeur.
"Michel Michaud" <mm@gdzid.com> writes:
Dans news:3fc27273$0$27036$626a54ce@news.free.fr, Arnaud
L'effet final est le même mais c'est moins efficace, car le
compilateur commence par appeler le constructeur par défaut de int
(qui met la variable à 0), puis seulement ensuite dans le corps du
« Malheureusement » non, ce n'est pas si logique que ça : le
constructeur par défaut de int ne fait rien... (Ne pas confondre
avec int() qui vaut bien 0 :-)
Je ne comprends pas ce que tu veux dire. int() est une expression
résulte en un appel de constructeur.
"Michel Michaud" writes:Dans news:3fc27273$0$27036$, ArnaudL'effet final est le même mais c'est moins efficace, car le
compilateur commence par appeler le constructeur par défaut de int
(qui met la variable à 0), puis seulement ensuite dans le corps du
« Malheureusement » non, ce n'est pas si logique que ça : le
constructeur par défaut de int ne fait rien... (Ne pas confondre
avec int() qui vaut bien 0 :-)
Je ne comprends pas ce que tu veux dire. int() est une expression
résulte en un appel de constructeur.