[英]How to access a class constructor parameter from the another class parameter
所以,我剛從 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 這樣的小原始值可能沒有區別,但這是一個好習慣,並且可以對更復雜的類型產生很大的影響int
對c
的類型(或a
或b
就此而言)沒有意義。 三角形的邊不可能都是整數Pythagorean_Hypotenuse
。 按值傳遞它們更簡單,也可能更快有一些問題會阻止您的代碼編譯,即:
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.