#include <iostream>
class Point{
public:
Point(char n,double i_x, double i_y) : name(n),x(i_x), y(i_y){}
Point(char n,double i_x) : name(n),x(i_x){}
void print(){
std::cout << name << "("<< x <<","<< y <<")"<< std::endl;
}
private:
double x;
double y;
char name;
};
int main(void){
Point p('A',12);
p.print();
return 0;
}
我知道我可以做到这一点:
但是,有没有一种方法可以在不更改构造函数的结构的情况下进行操作?
Point(char n,double i_x) : name(n),x(i_x){} Point(double i_y, char n): y(i_y), name(n){}
,我犯了其他错误或次优元素吗?
这里是任务的全文(可能很奇怪,我不是很擅长从语言中翻译)。我要问的部分是大胆的:实验室编号2。class.
在继续执行任务之前,请全部阅读文本。
创建一个定义2D点类的程序,该程序具有两个字段和三个构造函数(第一个指定了两个坐标,另外一个坐标)。
创建一个包含三个点的三角形类别:a,b,C。定义在三角形的一个构造函数和确定的方法中:面积,每一侧的长度,外围。在主函数中,定义3点,创建三角形并输出我们可以使用方法获得的所有值。 最重要的是:字段必须是私人的,方法可以是私人和公共的。如果某种方法不是私人的,那么值得解释为什么它是公开的。
创建一个定义2D类的程序,该程序具有两个字段和三个构造函数(第一个指定了两个坐标,另外一个坐标)
可能是我想念一些东西,但是意识到这是您已经找到的方式的唯一简单方法:
Point(char n,double i_x) : name(n),x(i_x){} Point(double i_y, char n): y(i_y), name(n){}
,但是,这是非常不友好的用户。呼叫者必须记住哪种构造函数初始化坐标:
Point p1('A',12); // x or y coordinate? Point p2(42,'B'); // x or y coordinate?
注意,这并不能解决上述呼叫者的问题。
Point(char n,double i_x) : x(i_x),y(0),name(n) {} Point(double i_y, char n): x(0),y(i_y),name(n){}
有使呼叫者更加明显的方法,他们在与两个构造函数呆在一起的同时通过了他们通过的协调。不过,它们增加了更复杂的收益。只是为了完整,我提到您可以使用标签:
struct x_tag{};
struct y_tag{};
// and then...
Point(x_tag,double i_x,char n) : x(i_x),y(0),name(n) {}
Point(y_tag,double i_y,char n): x(0),y(i_y),name(n){}
如果不是x
y
,但是两个根本无法使用的数量(例如香蕉的数量和苹果量),您可以为自己引入类型(struct banana_quantity { int value; }
.
更惯用的方法是不要从字面上遵循说明,而是提供静态方法:
class Point{
public:
Point(char n,double i_x, double i_y) : x(i_x), y(i_y),name(n){}
static Point PointFromX(double i_x, char n) { return {n,i_x,0}; }
static Point PointFromY(double i_y, char n) { return {n,i_y,0}; }
// etc...
};
您的导师实际上希望您写信,我无法告诉您。不幸的是,要求学生写非惯用性C ++并不罕见。但是,您应该问他们。当需求不清楚时,您的客户希望您提出要求,而不是根据猜测实施某些事情。