不确定如何使用另一个类中的对象创建带有参数的构造函数

Unsure of how to create a constructor with arguments using objects from another class

本文关键字:创建 参数 构造函数 对象 不确定 何使用 另一个      更新时间:2023-10-16

我对整个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;
}

编辑2:我已经设法解决了这个问题。非常感谢@user1158692、@Brian格拉丁和@Tristan布林德尔的详尽例子和解释。

当你定义一个接受某些参数的构造函数时,你并不关心这些参数是如何提供的或它们来自哪里(好吧,对于像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 );

您与 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 );

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

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

猜测你的Line类包含两个Point成员。假设它们被称为 pt1pt2 ,您需要在构造函数初始化列表中初始化它们:

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

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

没有额外的: Point(x, y)

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

只要编译器在到达此处之前已经看到了Point类的定义就可以了(通常您会这样做,包括包含class Pointpoint.h头文件)。

编辑到地址注释:

不幸的是,您没有提供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类添加一个默认构造函数 - 这将允许您将Point放入标准库容器中,这在某些时候可能很有用。

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

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

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

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