OVH Cloud OVH Cloud

Initialisation de tableaux membres

18 réponses
Avatar
Vincent Jacques
Bonjour à tous,

comment initialise-t-on un tableau membre d'une classe ?

class A
{
public:
A(int);
// Pas de constructeur par défaut
};

A::A(int)
{
};

class B
{
public:
B();
private:
A tableau[5];
};

B::B() :
tableau( ??????? )
{
// Je ne peux pas me contenter d'affectations dans une boucle ici,
puisque A n'a pas de constructeur par défaut.
}

Merci d'avance pour votre aide,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok

8 réponses

1 2
Avatar
James Kanze
Alexandre wrote:

ceci n'est pas vraiment un tableau, mais un pointeur. Je
sais, je pinaille, mais pour expliquer que l'initialisation
ne sera pas possible...




C'est un tableau, certainement pas un pointeur.



pas vraiment :
int tab1[5], tab2[5];


tab1=tab2 ne produit pas une recopie du tableau.


Parce que le langage ne supporte pas la copie des tableaux. Et
alors... ? Quel rapport avec des pointeurs ? S'ils étaient des
pointeurs, l'affectation serait légale.

Ce n'est pas une sémantique de valeur.


Quel rapport ? Les tableau C sont des objets deuxième classe.
C'est un défaut connu du langage. Mais ça n'en fait pas des
pointeurs.

Pas vraiment un tableau, quoi, mais un pointeur "caché"


Non. Vraiment un tableau. Avec toutes les restrictions que C met
sur des tableaux. Certainement pas un pointeur.

--
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
Fabien LE LEZ
On Fri, 4 Nov 2005 19:29:59 +0100, "Alexandre"
:

ceci n'est pas vraiment un tableau, mais un pointeur.


C'est bien un tableau, mais un tableau à la C, qui est une entité un
peu spéciale, puisqu'il ne s'agit pas d'un objet.

Dans bien des cas (retour de fonction par exemple), seuls les objets
sont acceptés. On convertit donc le tableau en un objet --
généralement, un pointeur vers le premier élément du tableau.

Avatar
Fabien LE LEZ
On Sun, 6 Nov 2005 10:27:36 +0100, "Alexandre"
:

je ne trouve pas, au sens littéral du terme, puisque la variable tableau
n'est ni copiable ni assignable, elle possède plutôt une sémantique
d'adresse. Donc pour moi, au sens strict, ce n'est pas un tableau. ça peut
s'utiliser comme.


C'est un tableau, mais pas un objet tableau.
Il ne supporte pas la copie "directe", puisque ce n'est pas un objet,
mais s'il est contenu dans un objet, il est copié lors de la copie de
cet objet :


class A
{
int tableau[42];
int *pointeur;
A();
};

int main()
{
A a;
A b= a; // le membre "tableau" est bien copié ; le membre
"pointeur" aussi, mais pas la variable pointée.
}

Avatar
James Kanze
Alexandre wrote:
ceci n'est pas vraiment un tableau, mais un pointeur.




Dans quel langage ? En C++, c'est un tableau.



je ne trouve pas, au sens littéral du terme,


Au sens littéral du terme, un tableau de type C est un tableau.
C-à-d une suite d'éléments du même type. Il n'y a aucune doute
possible. (Voir §8.3.4 de la norme.)

puisque la variable tableau n'est ni copiable ni assignable,


Quel rapport ? C'est une restriction, qui fait qu'effectivement,
des tableaux sont des types de la deuxième classe.

À l'encontre d'un pointeur, qui est copiable et affectable.

elle possède plutôt une sémantique d'adresse.


Aucune sémantique d'adresse. Tout au plus une conversion
implicite dans certains cas bien précis.

Donc pour moi, au sens strict, ce n'est pas un tableau. ça
peut s'utiliser comme.


D'où est-ce que tu tires ça ? C'est un tableau. Dans certains
cas bien précis, il se convertit en pointeur ; dans ces cas (et
seulement dans ces cas), il peut s'utiliser comme un pointeur.
De même que la constante 0 peut s'utiliser comme un pointeur
(mais n'est pas un pointeur).

il reste des cas où les « bons » vieux tableaux de C sont à
préférer.



tout à fait, d'ailleurs ça m'arrive très souvent, mais je
trouve que le terme "tableau" est un peu usurpé ici.


Cependant, c'est bien ce qu'il est.

De même, peut-on vraiment dire qu'un (char *) est une chaîne
de caractères ?


Pas forcement. C'est un pointeur à un char. Dans la mesure qu'un
pointeur n'est pas une chaîne, et un char n'est pas un
caractère, j'ai du mal à considérer un char* comme une chaîne de
caractères. Tout au plus : faute de mieux, j'utilise char pour
stocker des caractères -- si char* pointe au premier char d'une
suite de char dans laquelle on a stocké une chaîne de
caractères, il sert à localiser une chaîne de caractères. (Chose
qui est extrèmement rare en C++.)

--
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
Fabien LE LEZ
On Sun, 6 Nov 2005 10:27:36 +0100, "Alexandre"
:

De même, peut-on vraiment dire qu'un
(char *) est une chaîne de caractères ?


Non. C'est un pointeur vers un "char". Typiquement, vers le premier
élément d'un tableau de "char". Si ce tableau de "char" contient un
caractère '', ce pointeur peut avoir une sémantique de chaîne de
caractères.

Note que std::string est aussi un tableau, fondamentalement pas très
différent de std::vector<char>, mais conçu pour être utilisé comme un
objet "chaîne de caractères".

Avatar
Fabien LE LEZ
On Sun, 06 Nov 2005 17:09:50 +0100, James Kanze :

si char* pointe au premier char d'une
suite de char dans laquelle on a stocké une chaîne de
caractères, il sert à localiser une chaîne de caractères. (Chose
qui est extrèmement rare en C++.)


Sauf quand on appelle une fonction C :

std::vector<char> buf (LaTailleQuiVaBien());
UneFonctionC (&buf[0], buf.size());

Avatar
James Kanze
Fabien LE LEZ wrote:
On Sun, 6 Nov 2005 10:27:36 +0100, "Alexandre"
:


je ne trouve pas, au sens littéral du terme, puisque la
variable tableau n'est ni copiable ni assignable, elle possède
plutôt une sémantique d'adresse. Donc pour moi, au sens
strict, ce n'est pas un tableau. ça peut s'utiliser comme.



C'est un tableau, mais pas un objet tableau.


C'est aussi un objet.

Il ne supporte pas la copie "directe", puisque ce n'est pas un
objet,


Il ne supporte pas la copie, parce que la norme dit qu'il ne le
supporte pas. C'est tout. Mais c'est un objet, au sens de la
norme. Un objet deuxième classe, mais un objet quand même.

--
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
James Kanze
Fabien LE LEZ wrote:
On Sun, 6 Nov 2005 10:27:36 +0100, "Alexandre"
:


Note que std::string est aussi un tableau, fondamentalement
pas très différent de std::vector<char>, mais conçu pour être
utilisé comme un objet "chaîne de caractères".


Ça se discute. Si c'était conçu pour être une « chaîne de
caractères », où en sont les fonctionnalités ? Genre trim()
(ôter les espèces blancs des bouts). Ou même simplement une
fonction pour dire combien de caractères il y en a dans la
chaîne.

En regardant bien, il faut constater que le C++ n'a pas de type
de donnée pour des caractères (où il n'a peut-être pas tort). Et
que std::string n'est qu'une vulgaire suite de char (et non de
caractères).

--
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

1 2