Инициализировать класс с массивом - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть такой класс:

class MyClass {
    MyClass(double *v, int size_of_v){
        /*do something with v*/
    };
};

Мой вопрос : есть ли способ, я могу инициализировать такой класс, не определяя массив с двойным и кормить его конструктору?

Я хотел бы сделать что-то вроде:

auto x = MyClass({1.,2.,3.}, 3);

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

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

#include <initializer_list>  

class MyClass 
{
    double *_v;
    std::size_t _size;
public:

    MyClass(std::initializer_list<double> list) 
        :_v(nullptr), _size(list.size())
    {
        _v = new double[_size];
        std::size_t index = 0;
        for (const double element : list)
        {
            _v[index++] = element;
        }

    };

    ~MyClass() { delete _v; } // never forget, what you created using `new`
};

int main()
{
    auto x = MyClass({ 1.,2.,3. }); // now you can
    //or
    MyClass x2{ 1.,2.,3. };
    //or
    MyClass x3 = { 1.,2.,3. };
}

Также обратите внимание, что предоставление size_of_v в конструкторе является избыточным, поскольку его можно получить из метода std :: initializer_list :: size .

Идля полноты следуйте правилу три / пять / ноль .


В качестве альтернативы, если вы можете использовать std::vector, это можно сделать внамного более простой способ, при котором не требуется ручное управление памятью .Более того, вы можете достичь цели с помощью меньше кода и, не более избыточного _size члена.

#include <vector>
#include <initializer_list>    

class MyClass {
    std::vector<double> _v;
public:    
    MyClass(std::initializer_list<double> vec): _v(vec) {};
};
0 голосов
/ 01 февраля 2019

Ну, вы можете использовать std :: vector вместо двойного * v, и он идеально подойдет для вашей цели

class MyClass {
    MyClass(vector<double> v){
        /*do something with v*/
    };
};
...