例如这样的一个类:
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
};
迷茫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後廢除)
所以,題主的類別絕對不符合這個條件。