-9

在 C++ 中,我正在尝试使用点类创建一个三角形类。java中的正确方法是:

    public class Point {
    double x, y;

    public Point(double x, double y){
        this.x=x;
        this.y=y;
    }    
    }

public class Triangle {
Point p1,p2,p3;

public Triangle(Point p1, Point p2, Point p3){
    this.p1=p1;
    this.p2=p2;
    this.p3=p3;
}
}

主要:

Point p1=new Point(0,0);
Point p2=new Point(1,1);
Point p3=new Point(-1,1);
Triangle t1=new Trianle(p1,p2,p3);

在 C++ 中我有:

class point{
double x1,y1;

public:

       point(double x, double y){
       x1=x;
       y1=y;
       }  

};         

class triangle{
point p1, p2, p3;

public:

       triangle(point varp1, point varp2, point varp3){
       p1=varp1;
       p2=varp2;
       p3=varp3;
       }
};

主要:

    point p1(-1,1);
    point p2(1,1);
    point p3(0,0);
    triangle t1(p1,p2,p3);

不知何故,这不起作用,为什么?..................................................... ..................................................... ..................................................... ..................................................... ………………………………………………………………………………………………………………………………………………

4

3 回答 3

3

它不起作用,因为triangle构造函数将在分配给它们之前尝试默认构造其point成员,但point没有默认构造函数。这是因为您只提供了一个带有point2 个参数的构造函数,因此删除了默认的默认构造函数。

相反,您应该使用成员初始化列表来初始化点:

dreieck(point varp1, point varp2, point varp3)
  : p1(varp1), p2(varp2), p3(varp3)
{ }

这将分别使用参数、和初始化每个成员p1p2和,因此避免了默认构造。p3varp1varp2varp3

于 2013-05-12T14:54:01.180 回答
2

在 C++ 中,成员变量是在构造函数的主体之前构造的,如果你不指定它们应该如何构造,那么它们将被默认初始化,所以你的构造函数相当于这个

 triangle(point varp1, point varp2, point varp3)
 : p1(), p2(), p3()  // <--- default-initialize each member
 {
   p1=varp1;
   p2=varp2;
   p3=varp3;
 }

现在应该很明显,您的构造函数不会将成员创建为构造函数参数的副本,而是将它们创建为默认构造的对象,然后为它们分配新值,为此,point该类需要一个默认构造函数。

其他答案显示了如何正确地做到这一点:使用成员初始化列表。您也应该为point构造函数执行此操作。使用成员初始化器是在 C++ 中构造成员变量和基类的惯用方式,而不是在构造函数主体中进行赋值。对于某些类型的成员变量(引用、常量对象和非 DefaultConstructible 类型),这是初始化成员变量的唯一方法。

于 2013-05-12T15:05:16.407 回答
1

您的point类没有定义(或自动提供)默认构造函数。因为您重载了构造函数,所以不包括编译器生成的构造函数。在您的triangle课程中,您默认构造了三个 type 对象point。你会得到一个错误,因为没有可用的默认构造函数。

您应该明确定义您的构造函数(并且您应该通过member-initializer list初始化您的成员),例如:

class point
{
    public:
        point() : x1(0), y1(0) {}
        ...
};

此外,如果我们让您的参数化构造函数采用可选参数,它可以充当默认构造函数。例如:

class point
{
    public:
        point(double x = 0, double y = 0) : x1(x), y1(y) {}
        ...
};
于 2013-05-12T14:54:37.727 回答