课堂上课困难

Difficulty with classes in classes

本文关键字:课堂      更新时间:2023-10-16

我刚刚开始学习C++所以请原谅我一个非常菜鸟的问题。
我不知道如何分解编译器告诉我的内容。我只是看不出我的错误。

这是我的代码:

#include <iostream>
using namespace std;
class Point{
public:
    Point(int x, int y);    
    ~Point();
    int getX() const {return itsX;}
    int getY() const {return itsY;}
    void setX(int i) {itsX=i;}
    void setY(int i) {itsY=i;}
private:
    int itsX;
    int itsY;
};
Point::Point(int x, int y) {
    itsX = x;
    itsY = y;
}
Point::~Point() { // deconstructor - doesn't do anything
}
class Rectangle {
public:
    Rectangle(int w, int h, Point sP);
    ~Rectangle();
    void setUpperLeft(Point p)  {itsUpperLeft = p;}
    void setUpperRight(Point p) {itsUpperRight = p;}
    void setLowerLeft(Point p)  {itsLowerLeft = p;}
    void setLowerRight(Point p) {itsLowerRight = p;}
    void getPoints();
private:
    Point itsUpperLeft;
    Point itsUpperRight;
    Point itsLowerLeft;
    Point itsLowerRight;
    int itsWidth;
    int itsHeight;
};
Rectangle::~Rectangle() { // deconstructor - doesn't do anything
}
Rectangle::Rectangle(int w, int h, Point sP) {
    itsWidth = w;
    itsHeight = h;
    setUpperLeft( sP );
    setUpperRight(Point point( sP.getX() + itsWidth, sP.getY ));
    setLowerLeft( Point point( sP.getX(), sP.getY() + itsHeight) );
    setLowerRight( Point point( sP.getX() + itsWidth, sP.getY() + itsHeight ));
}

void Rectangle::getPoints() {
    cout << "Coordinates of upper left angle are:  "<< "x=" << itsUpperLeft.getX() << "t y=" << itsUpperLeft.getY() << endl;
    cout << "Coordinates of upper right angle are:   "<< "x=" << itsUpperRight.getX() << "t y=" << itsUpperRight.getY() << endl;
    cout << "Coordinates of lower left angle are:  "<< "x=" << itsLowerLeft.getX() << "t y=" << itsLowerLeft.getY() << endl;
    cout << "Coordinates of lower right angle are:  "<< "x=" << itsLowerRight.getX() << "t y=" << itsLowerRight.getY() << endl;
    cout << "----------------------------------------------------------";
}*/
int main() {
        Rectangle rect(100, 20, Point po(100, 200) );
        rect.getPoints();
}

如果这浪费了您的时间,请提前道歉。

首先要注意的是,您的 Point 类不能默认构造(它没有可以在没有任何参数的情况下调用的构造函数)。

第二件事是你在构造函数体中初始化矩形的点。您可能不知道的是,当到达构造函数主体时,对象的所有成员都已初始化。如果要自定义这些成员的初始化方式,则需要在初始化列表中执行此操作。由于您没有这样做,编译器将尝试默认为您初始化这些成员...并且由于Point无法默认初始化,因此会出现编译错误。

固定矩形控制器:

Rectangle::Rectangle(int w,int h,Point sP)
: itsUpperLeft(sP), itsUpperRight(sP.getX() + w, sP.getY()),
  itsLowerLeft(sP.getX(),sP.getY()+ h), itsLowerRight(sP.getX() +w, sP.getY() + h),
  itsWidth(w), itsHeight(h)
  {}

固定主线:

int main(){
  Rectangle rect(100,20, Point(100,200) );
  rect.getPoints();
}

setUpperRight(Point point( sP.getX()+itsWidth, sP.getY ));是错误的。您想将一个临时创建的Point传递给函数吗?然后写setUpperRight(Point( sP.getX()+itsWidth, sP.getY ));,这意味着只有一个没有变量名显式构造函数调用。

当您调用以下内容时:

setUpperRight(Point point( sP.getX()+itsWidth, sP.getY ));

您不会为传递的临时变量声明名称,只需说Point .喜欢这个:

setUpperRight(Point( sP.getX()+itsWidth, sP.getY ));

如果您打算使用它,则需要一个默认构造函数。