Ошибка при обращении к полю другого класса при наследовании

Пытаюсь создать набор геометрических фигур на с++: многоугольник (задаётся вектором объектов Point, эллипс(задаётся двумя фокусами и суммой расстояния от эллипса до них), от этих классов потом наследуются другие геом фигуры.

Есть набор методов (perimeter, area) которые можно вызывать у всех фигур, а также абстрактный класс Figure в котором методы perimeter и area объявлены pure virtual. Также:

  1. Есть Struct Point - точка на плоскости, задаётся двумя double координатами.
  2. Есть class Line - линия на плоскости, заданная общим уравнением Ax + By + C = 0 может задаваться двумя точками / точкой и наклонным коэффицентом.
  3. у класса Ellipse можно вызвать std::pair<Line, Line> GetDirectrices(), то есть вернуть пару директрисс элипса. Формула директриссы эллипса: (+-) a / epsilon, epsilon - эксцентриситет.

Так как эллипс может быть наклонным нужно в общем виде задавать уравнения директрисс, то есть учитывать их угловой коэффицент: внутри класса Эллипс сделаем прямую main_axis, которая задаёт главную ось эллипса и узнаем её угловой коэффицент (он равен -A/B). Таким образом узнаем градус, на который повёрнут эллипс относительно горизонтальной прямой, далее директрису заданную общим уравнением a / epsilon повернём на этот угол и получим искомое уравнение наклонной директрисы.

Вопрос следующий: у меня возникло три ошибки:

  1. при создании внутри Ellipse объекта Line и при попытке обратиться к его полям A и B получается expression must have class type but it has type "Line (Ellipse::*) (Point &focus1, Point &focus2). Как я понимаю это значит, что я обращаюсь к указателю, а не к самим полям класса Line, но не понимаю как это исправить и как обратиться к полям прямой main_axis

  2. При попытке создания конструктора в классе Circle, который наследуется от Ellipse ошибка no default constructor exists for class "Ellipse", тоже не очень понятно зачем ему нужен дефолтный конструктор

  3. При попытке создания 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 шт):

Автор решения: DmitryK

По порядку:
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){};
 };
  1. 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? Используйте тот, что уже есть.

→ Ссылка