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