C ++ перепутан с областью видимости и объявлениями

0

Я уже опубликовал еще один вопрос относительно структур и классов. Я считаю, что получил хорошие отзывы, поэтому вернулся к работе над своим кодом. Вот что меня смутило (может быть, это ребячество;))

Мне нужно иметь класс (или struct does not really mind), который называется cPoint, и он просто определяет точку в пространстве с координатами X, Y. из него выйдут все формы. Таким образом, для cRectangle, который является классом для прямоугольников, cPoint будет использоваться в качестве базового элемента. Чтобы создать экземпляр Rectangle, вызывающий должен предоставить координаты из двух точек, которые будут соответственно прямоугольниками 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 &) '"

спасибо

  • 1
    Вы должны использовать списки инициализации для инициализации переменных-членов или вызова родительских конструкторов. Используемый там синтаксис пытается вызвать operator()(int, int) в cPoint который не существует.
Теги:
instantiation

2 ответа

1

Когда вы входите в тело конструктора, все члены инициализируются, и вы можете назначать только им и всем остальным, что вы можете сделать с живым объектом.

К тому моменту вы

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

ul и dr уже инициализированы по умолчанию (конструктор по умолчанию - это тот, который вызывается, если вы явно не используете элементы инициализатора - читайте дальше). Когда компилятор видит эти две строки, похоже, что вы пытаетесь вызвать перегруженный 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
}
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 и определение этого оператора не было предоставлено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню