Инициализировать параметр в конструкторе, отличном от первого - PullRequest
2 голосов
/ 23 июня 2019

Я хочу явно изменить второй параметр в конструкторе структуры в следующем сценарии.Возможно ли, если да, то как?

struct foo{
    int x;
    int y;
    foo(int a=4, int b=6){
        x=a;
        y=b;
    }
};

int main(){
    foo *f = new foo();
    cout<<f->x<<" "<<f->y<<endl;
   //4 6 
    foo *g = new foo(3,4);
    cout<<g->x<<" "<<g->y<<endl;
    //3 4
    foo *h = new foo(3);
    cout<<h->x<<" "<<h->y<<endl;
   //3 6
   //Can something like this be 
   //done in C++, if I want
   //to change the value of the 
   //second variable only
    foo *k = new foo(b = 13);

return 0;

}

1 Ответ

3 голосов
/ 23 июня 2019

Возможно ли, если да, то как?

Это невозможно с помощью конструктора.В общем, c ++ не поддерживает аргументы именованных ключевых слов для функций, и невозможно пропустить аргументы, даже если они имеют значение по умолчанию, если вы хотите передать нестандартное значение после него.

Это будет возможнобез конструктора, использующего синтаксис инициализации списка, так как C ++ 20 использует назначенные инициализаторы, если вы используете инициализаторы членов по умолчанию:

struct foo{
    int x = 4;
    int y = 6;
};

int main(){
    foo f {.y = 4};
}

Вы можете добиться чего-то подобного с диспетчеризацией тегов;Нет необходимости в будущем стандарте:

struct foo{
    int x = 4;
    int y = 6;

    enum Xtag { Xinit };
    enum Ytag { Yinit };

    foo(int a, int b) : x(a), y(b) {}
    foo(Xtag, int a)  : x(a) {}
    foo(Ytag, int b)  : y(b) {}
};

int main(){
    foo f(foo::Yinit, 4);
}

Решение, использующее лямбду, которое можно использовать без изменения существующего класса.Следующее работает с вашим определением foo:

auto make_foo_x4 = [](int b) {
    return foo(4, b);
};
foo f = make_foo_y(4);

Недостатком является то, что мы должны явно повторить значение по умолчанию x, так что это может нарушить предположения, если значение по умолчанию изменяется в определении класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...