我在使用 C++ 中的子类时遇到问题。我有一个多边形类和一个三角形子类。我希望能够通过传递一个 Point* vector (这是一个自定义类)来声明一个多边形,并通过传递三个 Point* 来声明一个三角形。
我的理解是Triangle类的构造函数应该调用Polygon类的构造函数。
这是我目前所拥有的:
class Polygon
{
public:
vector<Point*> pts;
Polygon(vector<Point*> aPts) : pts(aPts) {};
};
class Triangle : public Polygon
{
public:
Triangle(Point* A, Point* B, Point* C)
{
vector<Point*> APts;
APts.push_back(A); APts.push_back(B); APts.push_back(C);
Polygon(APts);
}
};
但是,在 Triangle 构造函数的左括号中出现错误:
error: no matching function call to 'Polygon::Polygon()'
有人可以帮忙吗?
最佳答案
基类必须在派生类的构造函数体之前被初始化;如果构造函数需要参数,则必须在初始化列表中提供这些参数:
Triangle(Point* A, Point* B, Point* C) :
Polygon({A,B,C})
{}
请注意,这使用 C++11 语法来创建临时 vector ;如果你还停留在过去,那就有点复杂了:
static std::vector<Point*> make_points(Point* A, Point* B, Point* C) {
std::vector<Point*> points;
points.push_back(A);
points.push_back(B);
points.push_back(C);
}
Triangle(Point* A, Point* B, Point* C) :
Polygon(make_points(A,B,C))
{}
或者为基类提供默认构造函数可能更容易(但可能更容易出错),然后在派生类构造函数中填充 vector :
// In Polygon
Polygon() {} // constructed with no points
// pts must be "public" or "protected"
// In Triangle
Triangle(Point* A, Point* B, Point* C) {
pts.push_back(A);
pts.push_back(B);
pts.push_back(C);
}
关于c++ - 子类构造器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034422/