C ++与范围和声明混淆

时间:2014-02-01 18:52:13

标签: c++ instantiation

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

我需要有一个叫做cPoint的类(或者结构并不真正介意),它只是在空间中用X,Y坐标定义一个Point。  从中可以得出所有形状类。因此对于cRectangle,这是一个矩形类,cPoint将用作基本元素。 要实例化一个Rectangle,调用者必须提供2个点的坐标,这些坐标是UpperLeft& LoowerRight角落分别。 我希望cRectangle构造函数做的是实例化这两个点,因为它拥有私有点并使用它们来定义矩形,进行计算等。这两点不应该对公共范围可见,所以调用者不能直接更改它们。 以下是我尝试做的一个例子(显然是错误的):

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不匹配调用'(cPoint)(int&,int&)'”

谢谢

2 个答案:

答案 0 :(得分:1)

/* 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);
        }

您想在operator(int,int)类的实例上调用cPoint,并且未提供此运算符的定义。

答案 1 :(得分:1)

输入构造函数的主体后,所有成员都会被初始化,您只能分配给它们以及您可以对生命对象执行的所有其他操作。

到此为止

        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
}