簡體   English   中英

如何從另一個類參數訪問類構造函數參數

[英]How to access a class constructor parameter from the another class parameter

與 C++ 構造函數參數斗爭

所以,我剛從 TS/JS/Py 過來,並試圖理解 C++ 概念。 但是我正在努力使用類的構造函數的參數來聲明參數的默認值。 這是我試圖運行的代碼:

double Phythagorean_Hypotenuse (int& a, int& b ) {
    return sqrt((a * a) + (b * b));
};

class Triangle {
    public:
      int a;
      int b;
      double c;
      Triangle(int a_param, int b_param, double c_param = Phythagorean_Hypotenuse(a_param, b_param)) {
            a = a_param;
            b = b_param;
            c = c_param;
      }
};

和主函數內部

Triangle mytri_1(10, 20);
std::cout << mytri_1.a << std:endl;

但是當我嘗試運行此代碼時,IDE 向我拋出了一些錯誤,例如

[Error] 'a_param' was not declared in this scope

或者

[Error] call to 'Triangle::Triangle(int, int, double)' uses the default argument for parameter 3, which is not yet defined

所以,請問,可以解決這個問題的人可以回答這個問題嗎?

謝謝。

正如編譯器所指出的,其他構造函數參數不可用作 c_param 參數的默認參數。 與其使用默認值,不如重載構造函數,包括只接受 2 個參數的構造函數。 這個構造函數然后可以調用另一個接受所有 3 的構造函數:

 // Constructor overload that accepts all 3 parameters
 Triangle(int a_param, int b_param, double c_param):
  a(a_param), b(b_param), c(c_param) {
  }

  // Constructor overload that accepts just a and b, call the other constructor
  // to set all 3 members
  Triangle(int a_param, int b_param):
  Triangle(a_param, b_param, Phythagorean_Hypotenuse(a_param, b_param)) {
  }

默認參數值不能引用其他參數。 您可以定義兩個重載,其中一個委托給另一個,以執行您想要的操作:

class Triangle {
public:
    double a;
    double b;
    double c;

    Triangle(double a_param, double b_param, double c_param)
        : a{a_param},
          b{b_param},
          c{c_param}
    {}

    Triangle(double a_param, double b_param)
        : Triangle{a_param, b_param, Phythagorean_Hypotenuse(a_param, b_param)}
    {}
};

現場演示


其他一些注意事項:

  • 類構造函數沒有返回類型。 我將void Triangle(...)更改為Triangle(...)
  • 我在構造函數的主體中使用了構造函數初始化列表而不是賦值。 對於像int s 或double s 這樣的小原始值可能沒有區別,但這是一個好習慣,並且可以對更復雜的類型產生很大的影響
  • intc的類型(或ab就此而言)沒有意義。 三角形的邊不可能都是整數
  • 沒有理由通過引用將參數傳遞給Pythagorean_Hypotenuse 按值傳遞它們更簡單,也可能更快

有一些問題會阻止您的代碼編譯,即:

  1. 構造函數沒有返回類型。
  2. double c_param = Phythagorean_Hypotenuse(a_param, b_param)對參數a_param, b_param將無法識別a_param, b_param

建議更改:

由於假設計算的結果很可能是十進制值,因此c應該是double

你可以這樣做:

運行示例

#include <iostream>
#include <cmath>

double Phythagorean_Hypotenuse (int& a, int& b ) {
    return sqrt((a * a) + (b * b));
};

class Triangle {
    public:
      int a;
      int b;
      double c; //should be double

      //initializer list is a good practice for member initialization
      Triangle(int a_param, int b_param) 
          : a(a_param), b(b_param), c(Phythagorean_Hypotenuse(a, b)) {} 
};

int main(){

    Triangle mytri_1(10, 20);
    std::cout << mytri_1.a << std::endl;
    std::cout << mytri_1.b << std::endl;
    std::cout << mytri_1.c << std::endl;
}

輸出:

10
20
22.3607

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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