Конструктор C ++ с одним параметром по умолчанию и одним переменным параметром - PullRequest
1 голос
/ 02 апреля 2020

Я пишу этот конструктор класса:

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

Параметры присваиваются переменным-членам в теле конструктора. Меня попросили заставить работать main() следующие вызовы:

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

Я не могу изменить порядок (3,5). Как и внутри конструктора, f должен быть передан первым, а a - вторым. Однако f необходимо инициализировать в 0, если значение не передается, таким образом, второй вызов сохраняет f в 0 и вместо этого только инициализирует a в 5.

Проблема с этим что я получаю ошибку, если помещаю параметры в этом порядке в сигнатуру конструктора.

Как мне решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 02 апреля 2020

Это объявление конструктора недопустимо:

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

Если параметр имеет аргумент по умолчанию, все последующие параметры также должны иметь аргумент по умолчанию.

Что вам нужно объявить два конструктора, как например:

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

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

Желательно объявить второй конструктор как explicit, чтобы предотвратить неявное преобразование из одного целого числа в тип element:

explicit element(int a) : element( 0, a )
{
}
2 голосов
/ 02 апреля 2020

Параметры со значениями по умолчанию не могут предшествовать нормальным параметрам без значений по умолчанию. Итак, вам нужно изменить порядок аргументов в прототипе вашего конструктора:

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

Другой альтернативой является определение перегруженного конструктора:

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

element(int a)
{
    first = 0;
    inc = a;
    current = first - inc;
}
2 голосов
/ 02 апреля 2020

Прежде всего, вы не можете иметь аргумент не по умолчанию после аргумента по умолчанию. Аргументы по умолчанию должны быть последними в списке аргументов функции. См. Аргументы по умолчанию .

. Вы можете создать перегрузку для конструктора:

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

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