Я уже опубликовал еще один вопрос относительно структур и классов. Я считаю, что получил хорошие отзывы, поэтому вернулся к работе над своим кодом. Вот что меня смутило (может быть, это ребячество;))
Мне нужно иметь класс (или 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 &) '"
спасибо
Когда вы входите в тело конструктора, все члены инициализируются, и вы можете назначать только им и всем остальным, что вы можете сделать с живым объектом.
К тому моменту вы
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
}
/* 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
и определение этого оператора не было предоставлено.
operator()(int, int)
вcPoint
который не существует.