Чистый виртуальный оператор

У меня есть проект для школы на С++, и я застрял на одной части: Я должен перегружать операторов + и * для работы с геометрическими фигурами. Это не проблема, но вот здесь, где она не работает: я должен объявить оператор как чистый виртуальный метод, в абстрактном классе, из которого вытекают все остальные классы.

#include<iostream>
using namespace std;

class Figabs {
protected:
    int fel;
public:
    int getFEL() { return fel; }
    virtual Figabs operator +()=0; /*this is where I get an error: function returning  abstract class "Figabs" is not allowed : function Figabs::operator+ is a pure virtual function */
};

class Coord {
public: 
    int cx, cy; 
public: 
    Coord (){ 
        cx = cy = 0;
    }

    Coord (const int x, const int y) {
        cx = x;
        cy = y;
    }

    Coord (const Coord &din) { 
        cx = din.cx;
        cy = din.cy;
    }

    ~Coord () { }
    void setX(const int val) { cx = val; } ;
    void setY(const int val) { cy = val; };
    int getX() { return cx; }
    int getY() { return cy; }
};

class Point : public Coord, public Figabs { //one of the figures

public:
    Point() { 
        setX(0);
        setY(0);
        fel = 0;
    }

    Point(const int x, const int y): Coord (x,y) { 
        fel = 0;
    } 

    Point(const Point &din): Coord (din) { 
        fel = din.fel; 
    } 

    ~Point() { } 

    Point operator +(const Coord &vector) { /*this works perfectly when I delete the declaration from the abstract class Figabs, but I don’t know how to make them work together */
        int xp = cx + vector.cx;
        int yp = cy + vector.cy;
        return (Point (xp, yp));
    }

    Point operator *(const Coord &vector) {
        Point temp;
        temp.cx = cx * vector.cx;
        temp.cy = cy * vector.cy;
        return (temp);
    } 
};

Спасибо, и, пожалуйста, будьте терпеливы со мной, это мой первый контакт с С++.

Ответ 1

Как указывали другие плакаты, назначение далека от тривиально, и operator+ обычно не является членом. Есть два вопросы, которые необходимо решить:

  • Если вы поддерживаете `FigAbs + Coord`, то вы также должны поддерживать `Coord + FigAbs`. Первым может быть член (нет реальных проблема там); второй, если он должен быть членом, должен быть член "Координаты", который, вероятно, не является тем, что требуется.
  • Любая разумная реализация `operator +` должна возвращаться стоимость. И вы не можете (обычно) возвращать полиморфный класс стоимость; вам нужно что-то вроде идиомы письма-конверта для это для работы: базовый класс должен выглядеть примерно так:
    class Figure : BinaryOperators<Figure, Coord>
    {
        Figure* myImpl;
    public:
        Figure& operator+=( Coord const& translation )
        {
            myImpl->operator+=( translation );
            return *this;
        }
    };
    
    Конечно, вам понадобятся методы factory создание экземпляра `Figure` для каждого другого типа, виртуального `clone`, и конструктор копирования, назначение и деструктор, который поддерживает глубокую копию. (`BinaryOperators` является класс шаблона, который реализует `operator +` в терминах `Оператор + =`; это обычный способ предоставления двоичного кода операторы.)

Наконец, я бы сказал, что это оператор, перегружающий злоупотребления. Понятие добавления не относится к геометрическим фигурам. То, что вы делаете, называется переводом, а логическое решение заключается в предоставлении функции-члена, которая делает это, а не добавление перегрузки.

Ответ 2

Figabs содержит чистую виртуальную функцию-член virtual Figabs operator +()=0;, это означает, что вы не можете создать экземпляр Figabs

рассмотреть следующие вопросы:

virtual Figabs& operator +()=0; 
/*Now you will not be returning an actual instance but can return derived class instances*

Ответ 3

Пожалуйста, ознакомьтесь со следующей ссылкой для полезного информационного бита, связанного с вопросом

переопределение типа возвращаемой виртуальной функции отличается и не является ковариантным

виртуальный оператор Figabs +() = 0;//Здесь ur не передает никакие параметры i/p

Но в производном классе ур передают параметры

Точечный оператор + (const Coord & vector)//здесь ur отправляет параметр i/p.