web-dev-qa-db-fra.com

Erreur: affectation à un tableau à partir d'une liste d'initialiseurs

J'ai un cours tel que:

class dialog
{
    public:
    double dReturnType[][5][3];
};

#include <cstdlib>
#include <iostream>
include <string>

using namespace std;
#include "dialog.h";

int main(int argc, char *argv[])
{
    dialog People;
    People.dReturnType[0][1] = {1.2,2.3,6.6};
    return 0;
}

Il retourne:

[Avertissement] Les listes d'initialisation étendues ne sont disponibles qu'avec -std = c ++ 11 ou -std = gnu11 [activé par défaut] [Erreur]: affectation à un tableau à partir d'une liste d'initialiseurs

Je l'ai un peu cherché en ligne et je n'ai vraiment pas trouvé le moyen de contourner cela. Je préférerais ne pas éditer la classe à l'intérieur de son fichier de classe (un peu contraire à l'objectif). De l'aide?

Remarque: la classe est dans un fichier de projet séparé.

15
Kearito

Les listes d'initialiseur ne sont utilisables que pendant l'initialisation.

Si vous voulez utiliser std::initializer_list après l'initialisation:

auto init = std::initializer_list<double>({1.2,2.3,6.6});
std::copy(init.begin(), init.end(), your_array);
18
deepmax

Vous ne pouvez initialiser une liste étendue que si vous êtes sur c ++ 11.

Et si j’étais vous, la bonne habitude est d’utiliser * au lieu de "[]" vide et d’allouer de la mémoire lorsque vous connaissez la taille (avec new ou malloc). d Le type de retour sur votre programme est un pointeur de matices.

Et vous donnez une liste complète à un seul membre du vecteur.

People.dReturnType[0]={1.2,2.3,6.6};

Cela fait plus de sens.

Essayez d'encapsuler et d'utiliser/créer des fonctions d'initialisation qui vous aideront à le faire aussi. C++ mettra tous les 0 au début, mais vous pouvez faire une fonction et appeler:

dialog People("the_atributes_are_here").

C'est une bonne pratique de rendre le dReturnType privé et d'utiliser des fonctions pour accéder à ses données et insérer/modifier des éléments. Mais c'est à vous de décider.

0
Breno Santos