难以传递父对象和子对象的构造函数的初始化列表
Having difficulty passing initialization list for constructor for parent and child objects
我必须制作具有高度+宽度或半径的构造函数,以及三个默认值为零的 x、y、z 坐标的新可选参数。
所有四个构造函数(圆形值和引用、矩形值和引用)都必须有一个调用 3 参数 Shape 构造函数的初始化列表。
如果 x、y、z 是传入的构造函数参数,将它们传递给 Shape。
对于复制构造函数,使用传入矩形或圆形参数的 x、y、z。
我已经在“: Shape(.......)”中尝试了各种方法,但没有成功。谁能指出我正确的方向?
Shape.h
class Shape {
private:
// disallow copy constructor
Shape(const Shape &) {}
static int numinstances;
int myid;
protected:
const int getId() const { return myid; }
double posx, posy, posz;
public:
Shape(const double inx, const double iny, const double inz) {
myid = numinstances;
++numinstances;
posx = inx;
posy = iny;
posz = inz;
}
// destructor must be public to be used without overriding
~Shape() { --numinstances; }
const double getX() const { return posx; }
const double getY() const { return posy; }
const double getZ() const { return posz; }
}
Rectangle.h
class Rectangle : public Shape {
private:
double dimx, dimy;
public:
Rectangle(double indimx, double indimy) : Shape (0, 0, 0)
{
setWidth(indimx);
setHeight(indimy);
}
Rectangle(const Rectangle& inrect) : Shape (inrect.getX(), inrect.getY(), inrect.getZ())
{
setWidth(inrect.getWidth());
setHeight(inrect.getHeight());
}
const double getWidth() const { return dimx; }
const double getHeight() const { return dimy; }
Circle.h
const double PI = 3.14159;
class Circle : public Shape {
private:
double radius;
double x, y, z;
public:
Circle(double inrad) : Shape (0, 0, 0)
{
setRadius(inrad);
}
Circle(const Circle& incirc) : Shape (incirc.getX(), incirc.getY(), incirc.getZ())
{
setRadius(incirc.getRadius());
}
const double getRadius() const { return radius; }
void setRadius(double inrad) {
radius = (inrad < 0 ? (0 - inrad) : inrad);
}
Main.cpp
Rectangle r1(2,3);
Circle c1(4);
Shape * shapeset[NUMSHAPES];
Rectangle * rectset[NUMRECT];
Circle * circset[NUMCIRC];
// populate arrays with generic shapes
for(i=0;i<NUMSHAPES;++i) {
shapeset[i] = new Shape(1,2,3);
}
for(i=0;i<NUMRECT;++i) {
rectset[i] = new Rectangle(i, i+1);
}
for(i=0;i<NUMCIRC;++i) {
circset[i] = new Circle(i);
}
Shape * shapeset[NUMSHAPES];
Rectangle * rectset[NUMRECT];
Circle * circset[NUMCIRC];
// populate arrays with generic shapes
for(i=0;i<NUMSHAPES;++i) {
shapeset[i] = new Shape(1,2,3);
}
for(i=0;i<NUMRECT;++i) {
rectset[i] = new Rectangle(i, i+1, 1,2,3);
}
for(i=0;i<NUMCIRC;++i) {
circset[i] = new Circle(i, 1,2,3);
}
错误代码
||=== Build: Debug in Project (compiler: GNU GCC Compiler) ===|
C:\X\main.cpp||In function 'int main()':|
C:\X\main.cpp|52|error: no matching function for call to 'Rectangle::Rectangle(int&, int, int, int, int)'|
C:\X\main.cpp|52|note: candidates are:|
C:\X\Rectangle.h|29|note: Rectangle::Rectangle(const Rectangle&)|
C:\X\Rectangle.h|29|note: candidate expects 1 argument, 5 provided|
C:\X\Rectangle.h|23|note: Rectangle::Rectangle(double, double)|
C:\X\Rectangle.h|23|note: candidate expects 2 arguments, 5 provided|
C:\X\main.cpp|55|error: no matching function for call to 'Circle::Circle(int&, int, int, int)'|
C:\X\main.cpp|55|note: candidates are:|
C:\X\Circle.h|30|note: Circle::Circle(const Circle&)|
C:\X\Circle.h|30|note: candidate expects 1 argument, 4 provided|
C:\X\Circle.h|25|note: Circle::Circle(double)|
C:\X\Circle.h|25|note: candidate expects 1 argument, 4 provided|
C:\X\main.cpp|13|warning: unused variable 'ARSIZE' [-Wunused-variable]|
||=== Build failed: 2 error(s), 1 warning(s) (0 minute(s), 2 second(s)) ===|
感谢您的帮助!我真的很困惑。
您需要将参数添加到子构造函数并将它们传递给父构造函数:
Rectangle(double indimx, double indimy, double x=0, double y=0, double z=0) : Shape (x, y, z)
{
setWidth(indimx);
setHeight(indimy);
}
如果未在调用中传递,double x=0
会设置 x
的默认值。
这里有几个问题:
(1) C:\X\main.cpp|52|error: no matching function for call to 'Rectangle::Rectangle(int&, int, int, int, int)'
这是说它无法找到接受 5 个参数的矩形的构造函数。您在 Rectangle.h
中提供的 (Rectangle(double indimx, double indimy)
) 仅需要 2 个参数。
(2) C:\X\main.cpp|55|error: no matching function for call to 'Circle::Circle(int&, int, int, int)'
与 (1) 相同的问题。您将 4 个参数传递给仅需要两个 (Circle(double inrad)
) 的 Circle 的构造函数。
尝试修复调用 Rectangle
和 Circle
构造函数的方式(您只需传入两个 - 矩形的宽度和高度以及圆形的半径),然后查看如果可行的话。
我必须制作具有高度+宽度或半径的构造函数,以及三个默认值为零的 x、y、z 坐标的新可选参数。
所有四个构造函数(圆形值和引用、矩形值和引用)都必须有一个调用 3 参数 Shape 构造函数的初始化列表。
如果 x、y、z 是传入的构造函数参数,将它们传递给 Shape。
对于复制构造函数,使用传入矩形或圆形参数的 x、y、z。
我已经在“: Shape(.......)”中尝试了各种方法,但没有成功。谁能指出我正确的方向?
Shape.h
class Shape {
private:
// disallow copy constructor
Shape(const Shape &) {}
static int numinstances;
int myid;
protected:
const int getId() const { return myid; }
double posx, posy, posz;
public:
Shape(const double inx, const double iny, const double inz) {
myid = numinstances;
++numinstances;
posx = inx;
posy = iny;
posz = inz;
}
// destructor must be public to be used without overriding
~Shape() { --numinstances; }
const double getX() const { return posx; }
const double getY() const { return posy; }
const double getZ() const { return posz; }
}
Rectangle.h
class Rectangle : public Shape {
private:
double dimx, dimy;
public:
Rectangle(double indimx, double indimy) : Shape (0, 0, 0)
{
setWidth(indimx);
setHeight(indimy);
}
Rectangle(const Rectangle& inrect) : Shape (inrect.getX(), inrect.getY(), inrect.getZ())
{
setWidth(inrect.getWidth());
setHeight(inrect.getHeight());
}
const double getWidth() const { return dimx; }
const double getHeight() const { return dimy; }
Circle.h
const double PI = 3.14159;
class Circle : public Shape {
private:
double radius;
double x, y, z;
public:
Circle(double inrad) : Shape (0, 0, 0)
{
setRadius(inrad);
}
Circle(const Circle& incirc) : Shape (incirc.getX(), incirc.getY(), incirc.getZ())
{
setRadius(incirc.getRadius());
}
const double getRadius() const { return radius; }
void setRadius(double inrad) {
radius = (inrad < 0 ? (0 - inrad) : inrad);
}
Main.cpp
Rectangle r1(2,3);
Circle c1(4);
Shape * shapeset[NUMSHAPES];
Rectangle * rectset[NUMRECT];
Circle * circset[NUMCIRC];
// populate arrays with generic shapes
for(i=0;i<NUMSHAPES;++i) {
shapeset[i] = new Shape(1,2,3);
}
for(i=0;i<NUMRECT;++i) {
rectset[i] = new Rectangle(i, i+1);
}
for(i=0;i<NUMCIRC;++i) {
circset[i] = new Circle(i);
}
Shape * shapeset[NUMSHAPES];
Rectangle * rectset[NUMRECT];
Circle * circset[NUMCIRC];
// populate arrays with generic shapes
for(i=0;i<NUMSHAPES;++i) {
shapeset[i] = new Shape(1,2,3);
}
for(i=0;i<NUMRECT;++i) {
rectset[i] = new Rectangle(i, i+1, 1,2,3);
}
for(i=0;i<NUMCIRC;++i) {
circset[i] = new Circle(i, 1,2,3);
}
错误代码
||=== Build: Debug in Project (compiler: GNU GCC Compiler) ===|
C:\X\main.cpp||In function 'int main()':|
C:\X\main.cpp|52|error: no matching function for call to 'Rectangle::Rectangle(int&, int, int, int, int)'|
C:\X\main.cpp|52|note: candidates are:|
C:\X\Rectangle.h|29|note: Rectangle::Rectangle(const Rectangle&)|
C:\X\Rectangle.h|29|note: candidate expects 1 argument, 5 provided|
C:\X\Rectangle.h|23|note: Rectangle::Rectangle(double, double)|
C:\X\Rectangle.h|23|note: candidate expects 2 arguments, 5 provided|
C:\X\main.cpp|55|error: no matching function for call to 'Circle::Circle(int&, int, int, int)'|
C:\X\main.cpp|55|note: candidates are:|
C:\X\Circle.h|30|note: Circle::Circle(const Circle&)|
C:\X\Circle.h|30|note: candidate expects 1 argument, 4 provided|
C:\X\Circle.h|25|note: Circle::Circle(double)|
C:\X\Circle.h|25|note: candidate expects 1 argument, 4 provided|
C:\X\main.cpp|13|warning: unused variable 'ARSIZE' [-Wunused-variable]|
||=== Build failed: 2 error(s), 1 warning(s) (0 minute(s), 2 second(s)) ===|
感谢您的帮助!我真的很困惑。
您需要将参数添加到子构造函数并将它们传递给父构造函数:
Rectangle(double indimx, double indimy, double x=0, double y=0, double z=0) : Shape (x, y, z)
{
setWidth(indimx);
setHeight(indimy);
}
如果未在调用中传递,double x=0
会设置 x
的默认值。
这里有几个问题:
(1) C:\X\main.cpp|52|error: no matching function for call to 'Rectangle::Rectangle(int&, int, int, int, int)'
这是说它无法找到接受 5 个参数的矩形的构造函数。您在 Rectangle.h
中提供的 (Rectangle(double indimx, double indimy)
) 仅需要 2 个参数。
(2) C:\X\main.cpp|55|error: no matching function for call to 'Circle::Circle(int&, int, int, int)'
与 (1) 相同的问题。您将 4 个参数传递给仅需要两个 (Circle(double inrad)
) 的 Circle 的构造函数。
尝试修复调用 Rectangle
和 Circle
构造函数的方式(您只需传入两个 - 矩形的宽度和高度以及圆形的半径),然后查看如果可行的话。