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

Pointeurs sur tableaux

8 réponses
Avatar
Arman Ozcelik
Bonjour,
J' ai un petit probleme d'initalization.

Jai une classe Brick avec un contructeur: Brick(int width , int height)
cette classe n'a pas de constructeur par defaut.

Maintenant je declare dans une autre classe un pointeur comme ceci ;

Brick *bricks;

lorsque je veux initialiser avec bricks=new Brick[50];
j'ai une erreur de compilation :no appropriate default constructor
available.

Je ne comprends pas comment je pourrais initaliser un tableau d'objets qui
n'ont pas de contructeur par defaut.
Je suis programmeur java et il me suffit de faire

Brick[] bricks=new Brick[50];
puis si je veux initialiser un Brick je fais bricks[10]=new Brick(10,10);

Comment faire la même chose en c++
Merci d'avance.

8 réponses

Avatar
Marc Boyer
Arman Ozcelik wrote:
Bonjour,
J' ai un petit probleme d'initalization.

Jai une classe Brick avec un contructeur: Brick(int width , int height)
cette classe n'a pas de constructeur par defaut.

Maintenant je declare dans une autre classe un pointeur comme ceci ;

Brick *bricks;

lorsque je veux initialiser avec bricks=new Brick[50];
j'ai une erreur de compilation :no appropriate default constructor
available.

Je ne comprends pas comment je pourrais initaliser un tableau d'objets qui
n'ont pas de contructeur par defaut.
Je suis programmeur java et il me suffit de faire

Brick[] bricks=new Brick[50];
puis si je veux initialiser un Brick je fais bricks[10]=new Brick(10,10);


Parce que la declaration Java
Brick [] foo;
est grosso-modo equivalente en C++ a
vector<Brick*> foo;
ou, sans vector (mais on se demande pourquoi s'en passer, surtout dans
ce cas), a
Brick**

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Jean-Marc Bourguet
"Arman Ozcelik" writes:

Jai une classe Brick avec un contructeur: Brick(int width , int
height) cette classe n'a pas de constructeur par defaut.

Maintenant je declare dans une autre classe un pointeur comme ceci ;

Brick *bricks;

lorsque je veux initialiser avec bricks=new Brick[50];
j'ai une erreur de compilation :no appropriate default constructor
available.


Normal. Si tu veux des tableaux, utilise plutot std::vector. Utilise
reserve pour reserver la taille et ensuite push_back pour initialiser
les valeurs.

Je ne comprends pas comment je pourrais initaliser un tableau
d'objets qui n'ont pas de contructeur par defaut.


Et comment ces objets seraient-ils initialise?

Je suis programmeur java et il me suffit de faire

Brick[] bricks=new Brick[50];
puis si je veux initialiser un Brick je fais bricks[10]=new Brick(10,10);


Je connais mal Java, mais j'ai l'impression qu'un plus proche
equivalent C++ de ce que tu as ecrit est

Brick **bricks = new *Brick[50];
for (int i = 0; i != 50; ++i)
bricks[i] = NULL;

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jonathan Mcdougall
Jai une classe Brick avec un contructeur: Brick(int width , int
height) cette classe n'a pas de constructeur par defaut.

Maintenant je declare dans une autre classe un pointeur comme ceci ;

Brick *bricks;

lorsque je veux initialiser avec bricks=new Brick[50];
j'ai une erreur de compilation :no appropriate default constructor
available.


C'est impossible en C++. Tu as deux solutions :

1)

Brick **bricks;

// bricks est un tableau de 50 pointeurs vers des Brick
// schématiquement :
//
// 1 2 3 4 ... 48 49 50
// -+---+---+---+---+- -+---+---+---+-
// | | | | | . | | | |
// -+---+---+---+---+- -+---+---+---+-
//
bricks = new *Bricks[50];

// maintenant, tu n'as qu'à créer chaque Brick individuellement
//
// 1 2 3 4 ... 48 49 50
// -+---+---+---+---+- -+---+---+---+-
// | o | o | o | | . | | | |
// -+-|-+-|-+-|-+---+- -+---+---+---+-
// | | |
// | | +-----+
// V +--+ |
// +---+ | V
// | | V +---+
// | | +---+ | |
// +---+ | | | |
// | | +---+
// +---+
// où chaque boite est un objet Brick
//
for ( int i=0; i<50; ++i )
bricks[i] = new Brick(10, 10);

// on peut maintenant avoir accès aux objets Brick comme ça
//
Brick *ma_brick = bricks[10];

ma_brick->afficher();


2)

Utiliser un std::vector (recommandé)

# include <vector>

int main()
{
// on peut voir un vector comme étant un array qui grandit
// sur demande. Ici, il est vide.
//
std::vector<Brick> bricks;

// ici, on ajoute 50 nouveaux objets Brick un après l'autre
//
for ( int i=0; i<50; ++i)
bricks.push_back(Brick(10, 10));

// on peut alors leur accéder comme ]ca
//
bricks[10].afficher();
}


Jonathan

Avatar
Luc Hermitte
"Jonathan Mcdougall" wrote in
news:eTDib.36768$:
2) Utiliser un std::vector (recommandé)

# include <vector>

int main()
{
// on peut voir un vector comme étant un array qui grandit
// sur demande. Ici, il est vide.
std::vector<Brick> bricks;

// ici, on ajoute 50 nouveaux objets Brick un après l'autre
for ( int i=0; i<50; ++i)
bricks.push_back(Brick(10, 10));
}


Je ne crois pas que cette solution résolve son problème d'absence de
constructeur sans arguments.

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
Jonathan Mcdougall
2) Utiliser un std::vector (recommandé)

# include <vector>

int main()
{
// on peut voir un vector comme étant un array qui grandit
// sur demande. Ici, il est vide.
std::vector<Brick> bricks;

// ici, on ajoute 50 nouveaux objets Brick un après l'autre
for ( int i=0; i<50; ++i)
bricks.push_back(Brick(10, 10));
}


Je ne crois pas que cette solution résolve son problème d'absence de
constructeur sans arguments.


Ah non?


Jonathan


Avatar
kanze
Luc Hermitte wrote in message
news:...
"Jonathan Mcdougall" wrote in
news:eTDib.36768$:

2) Utiliser un std::vector (recommandé)

# include <vector>

int main()
{
// on peut voir un vector comme étant un array qui grandit
// sur demande. Ici, il est vide.
std::vector<Brick> bricks;

// ici, on ajoute 50 nouveaux objets Brick un après l'autre
for ( int i=0; i<50; ++i)
bricks.push_back(Brick(10, 10));
}


Je ne crois pas que cette solution résolve son problème d'absence de
constructeur sans arguments.


Pourquoi pas ? Moi, je crois que ça le résoudre.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
kanze
"Arman Ozcelik" wrote in message
news:<bme887$f5f$...

J' ai un petit probleme d'initalization.

Jai une classe Brick avec un contructeur: Brick(int width , int
height) cette classe n'a pas de constructeur par defaut.

Maintenant je declare dans une autre classe un pointeur comme ceci ;

Brick *bricks;

lorsque je veux initialiser avec bricks=new Brick[50];
j'ai une erreur de compilation :no appropriate default constructor
available.


C'est normal.

Je ne comprends pas comment je pourrais initaliser un tableau d'objets
qui n'ont pas de contructeur par defaut.


Tu ne peux pas. C'est aussi simple que ça. Pour faire un tableau (au
moins, un tableau de type C), il faut un constructeur par défaut.

Je suis programmeur java et il me suffit de faire

Brick[] bricks=new Brick[50];
puis si je veux initialiser un Brick je fais bricks[10]=new
Brick(10,10);


Comment faire la même chose en c++


Pour faire exactement la même chose :

Brick** bricks = new Brick*[ 50 ] ;
bricks[ 10 ] = new Brick( 10,10 ) ;

En revanche, au moins que les Brick ont une identité, je ne crois pas
que c'est une bonne idée.

La meilleur solution, probablement, c'est :

std::vector< Brick > bricks ;

puis de les initialiser avec vector::push_back. Sinon, tu pourrais
donner un constructeur par défaut à Brick. D'après mon expérience, c'est
bonne idée en général que les types à valeur aient un constructeur par
défaut.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Luc Hermitte
wrote in
news::

Je ne crois pas que cette solution résolve son problème d'absence de
constructeur sans arguments.
Pourquoi pas ? Moi, je crois que ça le résoudre.



Au temps pour moi, je viens de vérifier et j'ai été extrapolé (à tort) ce
qui ce passait avec
std::vector<Brick> titi(10);
(qui requiert le constructeur sans arguments) à reserve() et push_back().

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>