C++ est un langage compliqué avec des pièges à tous les coins de rues
Et donc ta question initiale était un peu trop générale pour une réponse courte, ce qui explique le silence relatif.
Oui on peut faire un tableau d'objets. Oui les objets seront construits mais le constructeur appelé sera celui sans argument : on ne peut pas passer des argument lors de la construction de chaque objet d'un tableau (en fait si, dans le cas où le tableau est initialisé explicitement, voir
http://forum.locoduino.org/index.php?topic=549.msg6577#msg6577).
Dans la manière dont tu t'y es pris : déclarer des objets puis les utiliser comme valeur d'initialisation de ton tableau, il y a 2 problèmes :
- l'initialisation du tableau réalise une copie des objets
- La copie d'objet est piègeuse
Pour le 1., la conséquence est que tu vas avoir tes objets en doublon. D'une part tes objets led1, led2 et led3 et d'autre part une copie dans le tableau. Donc une consommation de mémoire double et un risque de confusion : appeler une méthode de led1 et une méthode de tableau_led[0] ne s'adresse pas au même objet.
Pour le 2., copier un objet est fait selon différentes façons :
- Il n'existe pas de constructeur par recopie. La copie est réalisée en copiant brutalement la zone mémoire occupée par l'objet
- Il existe un constructeur par recopie : un constructeur de la forme Led(Led & objToCopy) ou bien un opérateur d'affectation : operator=(Led & objToCopy). La copie est réalisée en appelant le constructeur par recopie ou l'opérateur =
Qu'est ce que ça change ? Eh bien si l'objet à copier contient un membre qui est un pointeur vers un tableau alloué dynamiquement lors de la construction de l'objet, la copie brutale réalisera une copie du pointeur. Par conséquent, l'objet et ça copie partageront ce tableau alloué dynamiquement, ce qui n'est peut être pas ce que l'on veut. Dans ce cas, il faut définir un constructeur par recopie dont le rôle sera d'allouer un tableau et d'effectuer la copie du tableau. L'objet et sa copie ont donc leur propre tableau au lieu d'en partager un seul.
En résumé, faire :
Led led1;
Led led2;
Led led3;
Led tabl[] = { led1, led2, led3 };
Ne fait sans doute pas ce que tu voudrait. Si il est nécessaire d'avoir des arguments pour construire un objet, il vaut mieux avoir un objet Led avec une méthode permettant de l'initialiser à postériori, appelons la init. Donc il suffit d'écrire
Led tabl[3];
void setup()
{
for (int i = 0; i < 3; i++) {
tab[i].init(monArgumentQuiVaBien);
}
}