搜尋

首頁  >  問答  >  主體

c++中自定义的类怎么使用大括号进行赋值

例如这样的一个类:

class myMatrix {
public:
    myMatrix(int row,int col);
private:
    int row;
    int col;
    double *pData;
};  

有没有办法实现如下样子的赋值?

myMatrix m(3,3) = {
    1,2,3
    4,5,6
    7,8,9
};
伊谢尔伦伊谢尔伦2807 天前475

全部回覆(2)我來回復

  • 迷茫

    迷茫2017-04-17 13:27:18

    有兩種方法,一是使用參數為std::initializer_list的建構子和/或賦值運算符,二是這個類別滿足 aggregate class 的條件。

    方法一

    使用參數為std::initializer_list的建構子和/或賦值運算符,任意類別都可以使用這個方法。例如:

    #include <initializer_list>
    #include <iostream>
    
    // 没有考虑各种边界问题,仅为示意
    class myMatrix {
    public:
      myMatrix(int r, int c)
         : row(r), col(c) { pData = new double[row * col]; }
      myMatrix(int r, int c, std::initializer_list<double> il)
         : myMatrix(r, c) { *this = il; }
      ~myMatrix() { delete[] pData; }
      // Other four copy-control members are omitted here.
      myMatrix &operator=(std::initializer_list<double> il) {
        std::size_t pos = 0;
        for (const auto &e : il)
          pData[pos++] = e;
        return *this;
      }
      double get(int r, int c) const { return pData[r * col + c]; }
    private:
      int row;
      int col;
      double *pData;
    };
    
    int main() {
      myMatrix m1(3, 3);
      m1 = {
        1, 2, 3,
        4, 5, 6,
        7, 8, 9
      };
      std::cout << m1.get(2, 2) << std::endl;  // 9
    
      myMatrix m2(4, 2, {
        11, 22,
        33, 44,
        55, 66,
        77, 88
      });
      std::cout << m2.get(2, 0) << std::endl;  // 55
    
      return 0;
    }

    方法二

    類別滿足 aggregate class 的條件,則自動可以使用大括號列表來初始化類別的成員。

    例如下面的類別滿足 aggregate class 的條件:

    struct C {
      int i;
      std::string s;
      double d;
    };

    所以可以如下初始化:

    C c = { 10, "abc", 6.66 };

    一個類別是 aggregate class 的條件是:

    • 所有的非常量資料成員(non-static data member)是公有的(public

    • 沒有定義任何建構子(但可以使用= default= delete

    • 沒有基底類

    • 沒有虛成員函數

    • 沒有類別內初始化(C++14後廢除)

    所以,題主的類別絕對不符合這個條件。

    回覆
    0
  • PHPz

    PHPz2017-04-17 13:27:18

    用初始化列表

    回覆
    0
  • 取消回覆