J'écris ce constructeur de classe:

element(int f=0, int a)
{
    first = f;
    inc = a;
    current = first - inc;
}

Les paramètres sont affectés aux variables membres dans le corps du constructeur. On m'a demandé de recevoir les appels suivants à main() pour travailler:

prog = new element(3,5);
prog = new element(5);

Je ne peux pas modifier l'ordre de (3,5). Comme dans le constructeur, f doit être passé en premier, et a en second. Cependant, f doit être initialisé à 0 si aucune valeur n'est transmise, de cette façon le deuxième appel garde f à 0 et initialise uniquement a à 5.

Le problème avec ceci est que j'obtiens une erreur si je place les paramètres dans cet ordre dans la signature du constructeur.

Comment résoudre ce problème?

1
Jad 2 avril 2020 à 21:47

3 réponses

Meilleure réponse

Cette déclaration du constructeur est invalide:

element(int f=0, int a)
{
    first = f;
    inc = a;
    current = first - inc;
}

Si un paramètre a un argument par défaut, tous les paramètres suivants doivent également avoir un argument par défaut.

Ce dont vous avez besoin est de déclarer deux constructeurs, comme par exemple:

element(int f, int a) : first( f ), inc( a )
{
    current = first - inc;
}

element(int a) : element( 0, a )
{
}

Il est souhaitable de déclarer le deuxième constructeur comme explicit pour empêcher les conversions implicites d'un seul entier vers le type element:

explicit element(int a) : element( 0, a )
{
}
5
Remy Lebeau 2 avril 2020 à 19:28

Vous ne pouvez pas avoir de paramètres avec des valeurs par défaut précédant des paramètres normaux sans valeurs par défaut. Vous devez donc réorganiser les arguments dans votre prototype de constructeur:

element(int a, int f=0)
{
    first = f;
    inc = a;
    current = first - inc;
}

Une autre alternative consiste à définir un constructeur surchargé:

element(int f, int a)
{
    first = f;
    inc = a;
    current = first - inc;
}

element(int a)
{
    first = 0;
    inc = a;
    current = first - inc;
}
2
Remy Lebeau 2 avril 2020 à 19:29

Tout d'abord, vous ne pouvez pas avoir d'argument autre que celui par défaut après un argument par défaut. Les arguments par défaut doivent être les derniers dans la liste des arguments de la fonction. Voir Arguments par défaut.

Vous pouvez créer une surcharge pour le constructeur:

element(int f, int a)
{
    first = f;
    inc = a;
    current = first - inc;
}

element(int a) : element(0,a)
{
}
2
Remy Lebeau 2 avril 2020 à 19:31