2009-11-02 6 views
0

Le code ci-dessous donne une erreur de compilation lorsque j'essaie de créer le test t [2]; car il n'existe aucun constructeur par défaut pour cela.C++ Initialisation du tableau

Mais si je crée Test t[2] = {test(1,2), test(2,3)}; Ensuite, cela fonctionne très bien.

1) Mais pensez à une situation, si nous voulons créer plus de 100 éléments de tableau. Nous avons besoin de créer 100 éléments dans les accolades comme .. Test t [100] = {test (1,2), test (1,2) ....../100 fois /};

Le code ci-dessus est difficile à maintenir. Une solution supplémentaire consiste à créer une fonction membre publique qui prend 2 entiers et s'exécute en boucle. Cela résout le problème, mais je veux savoir toute autre bonne méthode.

2) Si je crée à l'aide de nouveaux

Test *t = new test[10]; 

J'obtiens l'erreur de compilation (Aucun constructeur par défaut). Comment résoudre ceci.

class test 
{ 
    int _a;int _b; 

public: 
    test(int a, int b); 
    void display(); 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    test t[10]; 

    for (int i = 0 ; i< 10; i++) 
     t[i].display(); 
} 

Répondre

3

Afin de construire vos 10 éléments dans le tableau, le compilateur doit en quelque sorte les instacer à travers un constructeur. Pour les tableaux, seul un constructeur par défaut (sans arguments) peut être utilisé, car vous ne pouvez pas passer d'arguments aux éléments du tableau. Therfor vous devez prouver un constructeur

test::test() 

en prenant aucun argument.

+0

Le tableau peut-il être créé uniquement via le constructeur par défaut? n'est-il pas possible de créer un tableau avec un autre constructeur? – Naruto

+0

Non, ce n'est pas possible. Comment écririez-vous cela? Il n'y a pas de syntaxe pour cela. –

+0

Merci, Test t [2] = {test (1,2), test (2,3)}; .. nous pouvons écrire de cette façon, mais si le nombre d'éléments augmente, il est difficile de maintenir .. donc je demande un autre moyen est là? – Naruto

1

Dans votre exemple, que pensez-vous être affiché?
Si vous le savez, vous pouvez écrire un CTor par défaut (un qui n'a pas de paramètres) et définir vos valeurs aux valeurs par défaut.

Un exemple de défaut Ctor:

// Variant 1: Use the initialization list 
test() 
: a(-1) 
, b(-1) 
{ 
} 

// OR 
// Variant 2: Do it in the CTor's body 
test() 
{ 
    a = -1; 
    b = -1; 
} 

Note: Vous pouvez écrire plusieurs cteurs (il est appelé "surcharge"). Une qui ne prend aucun paramètre et définit les valeurs par défaut et d'autres qui prennent des paramètres et définissent ces valeurs.

+0

La fonction d'affichage est comme ceci cout << "a =" << _ a << "b =" << _ b; si j'écris un constructeur par défaut ou un qui n'a pas de paramètres. alors comment puis-je passer des valeurs dans l'exécution aux variables. – Naruto

+0

Si vous ne transmettez pas de valeurs au moment de la construction, vous devez les transmettre plus tard, par exemple (1) setValues ​​(int a, int b) ou (2) setA (int a) et setB (int b) ou (3) directement modifier les variables membres. – foraidt

+0

@GrabIt: Ajoutez des méthodes d'accesseurs setA(), getA() à votre classe pour changer a et b plus tard. Pour paraphraser la question de mxp: est-il même sensé de définir implicitement a et b à -1 (ou zéro, ou une autre valeur) dans un constructeur par défaut (qui est exactement le constructeur sans paramètres)? – digitalarbeiter

0

Vous pouvez également définir un constructeur avec des valeurs par défaut pour tous les paramètres qui seront utilisés comme constructeur par défaut. Comme tous les paramètres ont des valeurs par défaut, ce constructeur sera utilisé par défaut. Laisser de côté la liste d'initialisation ou ne pas initialiser les variables membres dans le corps du constructeur peut vous donner des valeurs de données aléatoires. Certains systèmes peuvent mettre à zéro toutes les allocations de mémoire, mais d'autres non.