0

我对 C++ 语言和整个编程都很陌生。我有一个关于创建包含作为另一个类的对象的参数的构造函数的问题。

对象的示例构造函数:

Point::Point(int x, int y)
{
    //initiating the values of x and y...
}

然后现在当我尝试创建一个需要上述对象参数的构造函数时,这就是我想出的。

Line::Line(Point pt1, Point pt2):Point(x, y)
{
    //initiating the values of the class...
}

这给了我一个错误,其中“点”不是“线”的直接基础。我明白它想说什么,因为 Line 不是 Point 的派生类。但是如何创建一个需要来自另一个类的对象的参数的构造函数?

任何帮助,将不胜感激。

问候,yxt。

编辑:根据某些人的要求,这是 Line 的构造函数:

Line::Line(Point newPt1, Point newPt2)
{
    pt1 = newPt1;
    pt2 = newPt2;
}

EDIT2:我已经设法解决了这个问题。非常感谢@user1158692、@Brian Gradin 和@Tristan Brindle 的详尽示例和解释。

4

4 回答 4

2

当您定义一个带有某些参数的构造函数时,您并不关心这些参数是如何提供的或它们来自哪里(嗯,对于一些简单的事情,比如int你不知道)。举个例子

Point::Point( int x, int y )

如果调用者希望使用另一个对象中包含的值,则由他来获取它们并提供它们——但这绝对与你如何编写构造函数无关。所以他会像这样调用上面的构造函数:

Point apoint( 1, 2 );
// or:
Point apoint( anObj.GetX(), and Obj.GetY() );
// or:
Point apoint ( anObj.GetX(), anOtherObj.Y );

您与 s 构造函数一起使用的语法Line是用于将参数传递给该类的成员或该类的基类 - 在您的情况下可能是成员。Line给你一个轻推,假设你的点类有一组很好的自己的构造函数,这将是你的类的几个很好的构造函数——如果没有,添加它们!

class Line
{
public:
    Line( const Point& p1, const Point& p1 )
    : m_Point1(p1), m_Point2(p2)
    {}

    Line( int x1, int y1, int x2, int y2) 
    : m_Point1(x1, yx), m_Point2(x2, y2)
    {}
private:
    Point m_Point1;
    Point m_Point2;
};

像这样调用:

Point aPoint, bPoint;
.
.
Line aline( aPoint, bPoint );
Line bline( 1, 1, 2, 2 );
于 2013-11-11T09:00:03.080 回答
1

:Point(x, y)是不必要的:

Line::Line(Point pt1, Point pt2)
{
    //initiating the values of the class...
}
于 2013-11-11T08:44:24.800 回答
1

我会大胆猜测您的Line班级包含两个Point成员。假设它们被调用pt1and pt2,你需要在构造函数初始化列表中初始化它们:

Line::Line(Point pt1, Point pt2): pt1(pt1), pt2(pt2)
{

}
于 2013-11-11T08:48:58.280 回答
0

如何创建一个需要来自另一个类的对象的参数的构造函数?

没有多余的: Point(x, y)

Line::Line(Point pt1, Point pt2)
{
    //initiating the values of the class...
}

只要编译器Point在它到达这里之前已经看到了你的类的定义(通常你会这样做,包括一个point.h包含 . 的头文件class Point)。

编辑地址评论:

不幸的是,您没有提供您的Point课程,但我想它看起来像这样:

struct Point
{
    Point(double x, double y) : x(x), y(y) {}

    double x;
    double y;
};

Line看起来像这样:

struct Line
{
    Line::Line(Point pt1, Point pt2);
    Point pt1;
    Point pt2;
};

发生的事情是,当编译器查看您的Line(Point, Point)构造函数时,它注意到您没有在初始化列表中为成员变量提供任何值,因此它尝试使用默认Point构造函数(不带参数的构造函数)。不幸的是,不存在这样的构造函数,导致错误。你可以做两种不同的事情来绕过它,但实际上最好同时做这两件事。

第一个是为您的Point类添加一个默认构造函数——这将允许您将Points 放入标准库容器中,这在某些时候可能很有用。

Point::Point() : x(0), y(0) {}

会做的。这将解决您的错误,因为现在您的Line构造函数将为每个点使用默认构造函数,然后(在构造函数的主体中)分配值。但我们可以做得更好:您可以使用初始化列表直接复制构造点,跳过默认构造:

Line::Line(Point pt1, Point pt2) : pt1(pt1), pt2(pt2) {}

我认为这是您首先要实现的目标,只是语法有点错误:-)

于 2013-11-11T08:44:59.830 回答