C 与范围和声明混淆

C++ confused with scope and declarations

本文关键字:声明 范围      更新时间:2023-10-16

我已经发布了另一个有关结构与类别的问题。我相信我得到了很好的反馈,所以我回去处理我的代码。这是让我感到困惑的原因(也许是幼稚的;))

我需要一个称为CPORT的类(或结构不介意),它只是用x,y坐标定义了一个空间点。 所有形状级都将得出。因此,对于Crottangle,这是用于矩形的类,Copt将用作基本元素。要实例化矩形,呼叫者必须提供2分的坐标,这将是矩形上尺&分别弯曲的角落。我希望Crottangle构造器要做的是实例化这两个点,因为它自己的私人点并使用它们来定义矩形,进行计算等。,因此呼叫者无法直接更改它们。这是我尝试做的示例(显然是错误的):

class cPoint
{
    public:
    int X,Y;
    cPoint();
    cPoint(int x, int y)
    {
        X=x;
        Y=y;
    }
};
class cRectangle
{
friend class cPoint;
public:
    Rectangle(int x1,int y1,int x2,int y2)    //the constructor of cRectangle
        {
            ul(x1,y1);
            dr(x2,y2);
        }
    unsigned int area()
        {
            return((dr.X-ul.X) * (dr.Y-ul.Y));//example function that uses ul,dr
        }           
private:    
    cPoint ul;  //uP lEFT point
    cPoint dr;  //dOWN Right point
};

我遇到的错误是"错误1 copt

谢谢

/* use initilization list */
Rectangle(int x1,int y1,int x2,int y2) : ul(x1,y1), dr(x2,y2)
{
}

您的代码不会编译,因为这里

Rectangle(int x1,int y1,int x2,int y2)    //the constructor of cRectangle
        {
            ul(x1,y1);
            dr(x2,y2);
        }

您想在cPoint类的实例上调用operator(int,int),并且尚未提供该操作员的定义。

输入构造函数的主体后,所有成员都是初始化的,您只能分配给它们以及您可以为活物体做的所有其他成员。

在您尝试这个

        ul(x1,y1);
        dr(x2,y2);

uldr已经被默认初始化(默认的构造函数是如果您不明确启动初始化器成员,则称为构造器 - 读取)。当编译器看到这两行时,似乎您正在尝试调用不存在的过载的operator(),因此自然会报告错误。

要初始化成员,请使用构造函数初始化列表:

Rectangle(int x1,int y1,int x2,int y2)
    : ul(x1,y1), dr(x2,y2) // <-- initialization list
                           // using cPoint::Cpoint(int, int) constructor
{
    // note, empty body
}