不确定如何使用另一个类中的对象创建带有参数的构造函数
Unsure of how to create a constructor with arguments using objects from another class
我对整个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
成员。假设它们被称为 pt1
和 pt2
,您需要在构造函数初始化列表中初始化它们:
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 Point
的point.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) {}
我认为这就是您首先要实现的目标,您只是语法有点错误:-)
- 如何创建长度由常量参数指定的数组
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 创建派生自可变参数模板包的类型元组
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 基于参数创建数组
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 从可变参数创建枚举?
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 如何创建参数数量未知的函数?
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- 创建参数并从可变参数类型模板转发
- 如果模板化"ResourceCache"需要不同的创建参数/方法,它们如何加载/创建 T 类型的资源?
- 在不创建参数对象的情况下解析constexpr函数
- ADO 创建参数在尝试从 C++ 写入 Oracle 的 RAW(16) 字段时失败并出现0x800A0D5D
- C++:从字符串创建参数化指针
- 使用cgal创建参数化的3D原语