使用数组初始化类

Ste*_*tti 7 c++ arrays initialization class c++11

我有一个这样的课:

class MyClass {
    MyClass(double *v, int size_of_v){
        /*do something with v*/
    };
};
Run Code Online (Sandbox Code Playgroud)

我的问题:有什么办法,我可以初始化这样的类而不定义一个double数组并将其提供给构造函数?

我想做的事情如下:

auto x = MyClass({1.,2.,3.}, 3);
Run Code Online (Sandbox Code Playgroud)

JeJ*_*eJo 10

它被称为列表初始化,你需要一个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. };
}
Run Code Online (Sandbox Code Playgroud)

另请注意,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) {};
};
Run Code Online (Sandbox Code Playgroud)