Основная причина, по которой вы получаете эту ошибку. Это потому, что конструктор Line
не знает, как инициализировать point1
и point2
до ваших операторов присваивания в конструкторе. Вот для чего нужны списки инициализации конструктора. Обычно лучше инициализировать начальный элемент в списке инициализации конструктора, а не в теле конструктора. Без списка инициализации конструктора point1
и point2
создаются с конструктором по умолчанию (ошибка, потому что он отсутствует), а затем немедленно обновляются дополнительным кодом в теле конструктора. Вы можете избежать необходимости использования конструктора по умолчанию в Point
, задав Line
конструктор, заданный следующим образом:
Line(const Point& p1, const Point& p2) : point1(p1), point2(p2)
{}
Это разрешит ошибку вашего компилятора. Кроме того, все еще неплохо иметь конструктор по умолчанию для Point. Это тип класса, где часто бывает полезно иметь такой конструктор. И через некоторое время вам может понадобиться коллекция Point
экземпляров, и компилятор снова будет жаловаться без этого. В этом отношении ответ MakeCAT является правильным.
В сторону : Ваша функция Distance
передает Point
параметры по значению. Это означает, что компилятору необходимо создавать 3 новых экземпляра Point
каждый раз, когда вызывается Distance
. Измените свою подпись функции для Distance
следующим образом. Если это не сделает компилятор счастливым, он, по крайней мере, сгенерирует более эффективный код.
static double Distance(const Point& p1, const& Point p2, const& Point p3) {
double distance = (abs((p1.y - p2.y) * p3.x - (p2.x - p1.x) * p3.y + p2.x * p1.y - p2.x * p1.x) / (sqrt(pow((p2.y - p1.y), 2.0) + pow((p2.x - p1.x), 2.0))));
return distance;
}