Ошибка при обращении к полю другого класса при наследовании
Пытаюсь создать набор геометрических фигур на с++: многоугольник (задаётся вектором объектов Point, эллипс(задаётся двумя фокусами и суммой расстояния от эллипса до них), от этих классов потом наследуются другие геом фигуры.
Есть набор методов (perimeter, area) которые можно вызывать у всех фигур, а также абстрактный класс Figure в котором методы perimeter и area объявлены pure virtual. Также:
- Есть Struct Point - точка на плоскости, задаётся двумя double координатами.
- Есть class Line - линия на плоскости, заданная общим уравнением Ax + By + C = 0 может задаваться двумя точками / точкой и наклонным коэффицентом.
- у класса Ellipse можно вызвать std::pair<Line, Line> GetDirectrices(), то есть вернуть пару директрисс элипса. Формула директриссы эллипса: (+-) a / epsilon, epsilon - эксцентриситет.
Так как эллипс может быть наклонным нужно в общем виде задавать уравнения директрисс, то есть учитывать их угловой коэффицент: внутри класса Эллипс сделаем прямую main_axis, которая задаёт главную ось эллипса и узнаем её угловой коэффицент (он равен -A/B). Таким образом узнаем градус, на который повёрнут эллипс относительно горизонтальной прямой, далее директрису заданную общим уравнением a / epsilon повернём на этот угол и получим искомое уравнение наклонной директрисы.
Вопрос следующий: у меня возникло три ошибки:
при создании внутри Ellipse объекта Line и при попытке обратиться к его полям A и B получается expression must have class type but it has type "Line (Ellipse::*) (Point &focus1, Point &focus2). Как я понимаю это значит, что я обращаюсь к указателю, а не к самим полям класса Line, но не понимаю как это исправить и как обратиться к полям прямой main_axis
При попытке создания конструктора в классе Circle, который наследуется от Ellipse ошибка no default constructor exists for class "Ellipse", тоже не очень понятно зачем ему нужен дефолтный конструктор
При попытке создания Line main_axis(focus1, focus2) была ошибка member Ellipse::focus1 is not a type name тоже не очень понятно почему, ведь я в Ellipse объявил Point focus1, focus2. Эту ошибку исправил прямым указанием типа Point при создании main_axis, но верно ли это и почему возникла эта ошибка?
struct Point { double x, y; Point(double new_x = 0.0, double new_y = 0.0) : x(new_x), y(new_y); }; class Line { public: double a, b, c; // будем задавать прямую по уравнению ax + by + c = 0; Line() = default; Line(const Point& new_point, const double new_coef); // от точки и углового коэфф Line(const Point& first, const Point& second); // от двух точек }; class Figure { virtual double perimeter() const = 0; virtual double area() const = 0; }; class Ellipse: Figure { Point focus1, focus2, center; // два фокуса и центр эллипса double distance, a; // сумма расстояний до эллипса и половина большей полуоси //конструктор Ellipse(const Point& new_focus1, const Point& new_focus2, double new_distance) : focus1(new_focus1), focus2(new_focus2), distance(new_distance), center((focus1.x + focus2.x) / 2, (focus1.y + focus2.y) / 2), a(distance / 2){}; Line main_axis(Point& focus1, Point& focus2); double k_main_axis = - (main_axis.a / main_axis.b); // expression must have class type but it has type "Line (Ellipse::*) (Point &focus1, Point &focus2) }; class Circle: Ellipse { Point center; double radius; // конструктор Circle(const Point& new_center, double new_radius) : center(new_center), radius(new_radius) {} ; // no default constructor for class Ellipse exists // методы double radius() const { return radius; } }; Line::Line(const Point& new_point, const double new_coef) { a = -new_coef; b = 1; c = (new_coef * new_point.x - new_point.y); } Line::Line(const Point& first, const Point& second) { a = (second.y - first.y); b = (first.x - second.x); c = (first.y * second.x - first.x * second.y); }
Ответы (1 шт):
По порядку:
1 и 3 Вы не создаете
внутри Ellipse объект Line
Вы хотели создать объект Line внутри Ellipse. А на самом деле объявили функцию main_axis с 2 параметрами и возвращающая объект Line. Должно было быть как-то так:
class Ellipse: Figure
{
Point focus1, focus2, center; // два фокуса и центр эллипса
double distance, a; // сумма расстояний до эллипса и половина большей полуоси
Line main_axis;
double k_main_axis;
Ellipse(const Point& new_focus1, const Point& new_focus2, double new_distance) :
main_axis( new_focus1, new_focus2),
focus1(new_focus1), focus2(new_focus2), distance(new_distance),
center((new_focus1.x + new_focus2.x) / 2, (new_focus1.y + new_focus2.y) / 2),
a(new_distance / 2), k_main_axis(-main_axis.a / main_axis.b){};
};
class Circleнаследуется отclass Ellipse. При создании объектаCircleего конструктор должен вызвать конструктор базового класса. Либо вы его вызываете сами явно, либо вызывается конструктор по-умолчанию, который должен быть!
class Circle: Ellipse {
Circle(const Point& new_center, double new_radius) :
Ellipse(param1, param2, param3), center(new_center), radius(new_radius) {}
Ну и замечание - раз уж вы наследуете Circle от Ellipse зачем дублирование данных? В Ellipse уже есть Point center;, зачем его повторно объявлять в Circle? Используйте тот, что уже есть.