簡體   English   中英

使用另一個類C ++構造一個類

[英]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)

請注意以下事項:

  • 此表單只能與構造函數一起使用。
  • 您必須(至少在C ++之前的版本11中)使用此表單初始化非靜態const數據成員。
  • 您必須使用此表單初始化參考數據成員。

另外,請注意,有std::vector ,您可能希望將自己的向量重命名為void命名沖突,並且最好通過const引用傳遞vector

這就是出錯的原因

對象的構造分多個階段進行。 對於矩陣類,首先需要構造所有成員對象, 然后才執行構造函數體。 這里要認識到的重要一點是,在輸入構造函數體之前,必須構造所有成員對象(在您的情況下為m1m2m3 )。

問題是編譯器不能自己構造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;
         }
  };

你得到這個錯誤的原因是:

  1. 您的vector類沒有默認構造函數,因為您已經定義了一個帶參數的顯式構造函數。
  2. 在對象構造期間但在執行構造函數中的代碼之前,將初始化一個對象的數據成員。

因此,當編譯器想要創建矩陣對象時,它需要首先構造/初始化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。 這是因為:

  1. 當未定義時,編譯器將提供“默認復制構造函數”(實際上只是針對您的情況的逐位復制)。
  2. 可以通過成員初始化列表調用此“默認復制構造函數”。

或者使用“推薦的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM