12

我有一个 C++ 学校项目,但我被困在一个方面:我必须重载运算符 + 和 * 才能处理几何图形。这没问题,但在这里它不起作用:我必须将运算符声明为纯虚方法,在所有其他类派生的抽象类中。

#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);
    } 
};

谢谢,请耐心等待,这是我第一次接触 C++。

4

3 回答 3

9

正如其他发帖人所指出的那样,这项任务远非微不足道,而且operator+通常不是成员。有两个问题需要解决:

  1. 如果你支持`FigAbs + Coord`,那么你也应该支持`Coord + FigAbs`。第一个可以是会员(那里没有真正的问题);第二,如果要成为成员,必须是`Coord`的成员,这可能不是想要的。
  2. `operator+` 的任何合理实现都必须按值返回。而且您不能(通常)按值返回多态类;你需要像信封成语这样的东西才能工作:基类必须看起来像:
    类图:BinaryOperators<图,坐标>
    {
        图* myImpl;
    上市:
        图&运算符+=(坐标常数&翻译)
        {
            myImpl->operator+=(翻译);
            返回*这个;
        }
    };
    
    当然,您需要工厂方法来正确实例化每种不同类型的“Figure”、虚拟“克隆”函数以及支持深度复制的复制构造函数、赋值和析构函数。(`BinaryOperators` 是一个模板类,它根据 `operator+=` 实现 `operator+`;这是提供二元运算符的常用方法。)

最后,我认为这是运营商重载滥用。加法的概念不适用于几何图形。您正在做的事情称为翻译,合乎逻辑的解决方案是提供一个成员函数来完成它,而不是重载加法。

于 2013-05-22T11:07:10.827 回答
3

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*
于 2013-05-22T10:49:28.340 回答
0

请查看以下链接以获取与问题相关的有用信息位

覆盖虚函数返回类型不同且不是协变的

virtual Figabs operator +() = 0;//Here ur not passing any i/p parameters

但是在派生类中传递参数

Point operator +(const Coord &vector)//here ur sending i/p parameter .
于 2013-05-22T10:49:39.623 回答