用数组初始化一个类

时间:2019-02-01 00:08:17

标签: c++ arrays class c++11 initialization

我有一个这样的班级:

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

我的问题:有什么方法可以初始化此类,而无需定义 double数组并将其提供给构造函数?

我想做类似的事情:

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

2 个答案:

答案 0 :(得分:8)

它称为list initialization,您需要一个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方法中获取它。

为完整起见,请遵循three/five/zero的规则。


或者,如果您可以使用std::vector,则可以通过更简单的方式完成,而无需手动进行内存管理 。而且,您可以通过更少的代码来实现目标,而不再需要多余的 _size成员。

#include <vector>
#include <initializer_list>    

class MyClass {
    std::vector<double> _v;
public:    
    MyClass(std::initializer_list<double> vec): _v(vec) {};
};

答案 1 :(得分:3)

那么您可以使用std :: vector而不是double * v,它将完全适合您的目标

sum