【问题标题】:Initialize a class with an array用数组初始化一个类
【发布时间】:2019-06-25 12:49:17
【问题描述】:

我有这样的课:

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

我的问题:有什么方法可以在不定义 double 数组 的情况下初始化此类并将其提供给构造函数?

我想做这样的事情:

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 std::vector 代替 double*v & 它非常适合您的目标

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

    【讨论】:

      【解决方案2】:

      它被称为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) {};
      };
      

      【讨论】:

      • 这个类违反了 0/3/5 的规则。为什么不使用std::unique_ptr&lt;double[]&gt;。或者更简单的是std::vector
      • @MikeVine 刚刚添加了替代方案。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2013-05-29
      • 1970-01-01
      • 2016-12-17
      • 2011-07-30
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多