[英]Error with constructing a dynamic array of threads in C++, using the thread class
[英]Constructing a class using an another class C++
我是C ++的新手,最近開始研究面向目標的編程。 我想編寫自己的線性代數模塊來處理三維向量和3x3矩陣。 我試圖將矩陣定義為由三個向量組成的類。
class vector {
public:
double n1, n2, n3;
vector (double a, double b, double c) {
n1 = a; n2 = b; n3 = c;
}
};
class matrix {
public:
vector m1, m2, m3;
matrix (vector a, vector b, vector c) {
m1 = a; m2 = b; m3 = c;
}
};
但是,我收到編譯錯誤:
In constructor `matrix::matrix(vector, vector, vector)':
no matching function for call to `vector::vector()'
我猜這個程序不知道如何使用我定義的向量類構造矩陣。 但是我不明白為什么。 如果有人能解釋,我將非常感激。
您需要按成員初始化列表初始化m1,m2,m3
成員:
matrix (const vector& a, const vector& b, const vector& c)
: m1(a),m2(b),m3(c)
請注意以下事項:
另外,請注意,有std::vector
,您可能希望將自己的向量重命名為void命名沖突,並且最好通過const引用傳遞vector
。
這就是出錯的原因 :
對象的構造分多個階段進行。 對於矩陣類,首先需要構造所有成員對象, 然后才執行構造函數體。 這里要認識到的重要一點是,在輸入構造函數體之前,必須構造所有成員對象(在您的情況下為m1
, m2
和m3
)。
問題是編譯器不能自己構造vector
成員:它只知道vector
一個構造函數,並且它需要三個double
s用於構造,它沒有。 您可以提供編譯器與那些缺少構造函數參數為vector
使用初始化列表語法,通過billz的答案的建議。
這是有效的,因為初始化程序列表在啟動的成員構建階段執行,這發生在構造函數 - 體階段之前。
或者,為vector
提供默認構造函數,以便編譯器能夠自動構造矩陣成員而無需其他信息,如Zac的回答所示。
它需要類向量的默認構造函數,沒有參數的構造函數:
class vector {
public:
double n1, n2, n3;
vector () { // <- this one
n1 = 0; n2 = -1; // sample initializing code
};
vector (double a, double b, double c) {
n1 = a; n2 = b; n3 = c;
}
};
你得到這個錯誤的原因是:
因此,當編譯器想要創建矩陣對象時,它需要首先構造/初始化m1 / m2 / m3,因為矩陣構造函數的這些代碼“{m1 = a; m2 = b; m3 = c;}”。 但是,m1 / m2 / m3的類沒有要調用的默認構造函數。 這就是編譯器報告“在構造函數matrix::matrix(vector, vector, vector)': no matching function for call to
vector :: vector()'“
解決方案是通過成員初始化列表初始化m1 / m2 / m3。 這是因為:
或者使用“推薦的c ++ 11”方式:
matrix (vector a, vector b, vector c)
: m1(std::move(a)),m2(std::move(b)),m3(std::move(c)) {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.