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

时间:2013-11-11 08:37:32

标签: c++ constructor

我比较熟悉C ++语言和整个编程。关于创建包含作为另一个类的对象的参数的构造函数,我有一个问题。

对象的示例构造函数:

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

然后现在当我尝试创建一个需要之前所述Object参数的构造函数时,这就是我想出来的。

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

这给了我一个错误,其中'Point'不是'Line'的直接基础。 我得到了它想要说的,因为Line不是Point的派生类。但是,如何创建一个构造函数,该构造函数需要作为来自另一个类的对象的参数?

任何帮助都将不胜感激。

此致 YXT。

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

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

EDIT2: 我设法解决了这个问题。非常感谢@ user1158692,@ Brian Gradin和@Tristan Brindle的精心设计的例子和解释。

4 个答案:

答案 0 :(得分: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 );

您与Line构造函数一起使用的语法是将参数传递给以太类的成员或该类的基类 - 在您的情况下可能是成员。为了给你一个推动,这里将是你的Line类的一对构造函数,假设你的point类有一组很好的构造函数 - 如果没有,添加它们!

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

}

答案 3 :(得分:0)

  

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

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

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

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

修改以发表评论:

你很遗憾没有提供你的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) {}

我认为这是你首先想要实现的,你只是把语法弄错了: - )