问题描述 投票:0回答:1
#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?
c++ constructor
1个回答
0
投票
作为旁注,您实际上应该在上面的两个构造函数中初始化两个坐标,并且应以类在类中定义的顺序初始化成员:

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 ++并不罕见。但是,您应该问他们。当需求不清楚时,您的客户希望您提出要求,而不是根据猜测实施某些事情。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.