Конструктор, использующий {a, b, c} в качестве аргумента или что на самом деле делает {a, b, c}? - PullRequest
0 голосов
/ 23 мая 2018

Я знаю, что могу инициализировать данные следующим образом.

int array[3] = { 1, 2, 3 };

или даже

int array[2][2] = { {1, 2}, {3, 4} };

Я также могу сделать это с std::vector

std::vector<int> A = { 1, 2, 3 };

Допустим, я хочу написать свой собственный класс:

class my_class
{
     std::vector< int > A;
     public:
     //pseudo code
           my_class(*x) { store x in A;} //with x={ {1, 2}, {3, 4} }
     // do something
};

Можно ли написать такой конструктор и как это возможно?Что на самом деле делает это утверждение

{{1, 2}, {3, 4}}?

Я всегда просто нахожу, что вы можете инициализировать данные таким способом, но никогда точно не делаете.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы можете использовать initializer_list в конструкторе, чтобы иметь такую ​​опцию.

struct X {
    X() = default;
    X(const X&) = default;
};

struct Q {
    Q() = default;
    Q(Q const&) = default;
    Q(std::initializer_list<Q>) {}
};

int main() {
  X x;
  X x2 = X { x }; // copy-constructor (not aggregate initialization)
  Q q;
  Q q2 = Q { q }; // initializer-list constructor (not copy constructor)
}
0 голосов
/ 23 мая 2018

как это возможно?

Если у вас есть список инициализатора.

#include  <initializer_­list> // use std::initializer_list template
my_class(const std::initializer_list<int>& v) : A(v) {}

Что это за утверждение "{{1, 2}, {3, 4}} "на самом деле делает?

Это называется list-initialization

Если инициализатор является (без скобок) braced-init-list или = braced-init-list , объект или ссылка list-initialized .

0 голосов
/ 23 мая 2018

Это называется инициализация списка , и вам нужен std :: initilizer_list конструктор, который должен быть достигнут в вашем my_class.

См. ( Live Demo )

#include <iostream>
#include <vector>
#include <initializer_list> // std::initializer_list

class my_class
{
    std::vector<int> A;
public:
    // std::initilizer_list constructor 
    my_class(const std::initializer_list<int> v) : A(v) {}    

    friend std::ostream& operator<<(std::ostream& out, const my_class& obj) /* noexcept */;
};

std::ostream& operator<<(std::ostream& out, const my_class& obj) /* noexcept */
{
    for(const int it: obj.A) out << it << " ";
    return out;
}

int main()
{
    my_class obj = {1,2,3,4};  // now possible
    std::cout << obj << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...