C++ 无法实例化抽象类的对象,但必须返回该类的对象

C++ 无法实例化抽象类的对象,但必须返回该类的对象,c++,C++,该功能的要求如下: “一种加法运算符,它接收对两个不可修改的点对象的引用,并返回一个点对象,该点对象保存两个对象坐标相加的结果” 我的观点是 #ifndef _POINT_H_ #define _POINT_H_ #include "Showable.h" #include <iostream> using namespace std; class Point : public Showable { public: int x; int y; Point(); Point(i

该功能的要求如下:

“一种加法运算符,它接收对两个不可修改的点对象的引用,并返回一个点对象,该点对象保存两个对象坐标相加的结果”

我的观点是

#ifndef _POINT_H_
#define _POINT_H_
#include "Showable.h"
#include <iostream>
using namespace std;

class Point : public Showable {

public:

int x;
int y;

Point();
Point(int a, int b);
ostream& display(ostream& os) const;
friend Point& operator+(const Point& pointA, const Point& pointB);
friend Point& operator/(const Point& pointA, int b);


};

#endif
我想做的是,创建一个新的Point对象,添加pointA和pointB的值,然后返回新的Point对象,但它不允许我创建一个新对象,因为它是一个抽象类。我能做什么

错误是不允许“抽象类类型的对象”点

编辑:我的Showable.h

#ifndef _SHOWABLE_H_
#define _SHOWABLE_H_
#include <iostream>
using namespace std;

class Showable { 

public:

virtual ostream& display(ostream& os) const = 0;
virtual istream& operator>>(istream& is) const = 0;

};

#endif
\ifndef\u可显示\u H_
#定义可显示的_
#包括
使用名称空间std;
类可显示{
公众:
虚拟ostream&display(ostream&os)常数=0;
虚拟istream和运算符>>(istream和is)常量=0;
};
#恩迪夫

可能不相关,但需要按值返回:

Point  operator+(const Point& pointA, const Point& pointB) {
//   ^ no & here
  Point a; 
  // ...
  return a;
}
要解决抽象类的问题,请查看
Showable
。它确实有一个纯虚拟方法(即
=0
的方法),您需要在类
点中实现该方法


在显示了
Showable.h
之后:理论上,现在需要实现

virtual istream& operator>>(istream& is) const;
对于类
Point
,这很奇怪,但有三个原因:方法被标记为
const
,因此它不能修改
Point
,因此它不能读入值。此外,签名非常不寻常,这意味着您将使用
my_Point>>is;
-不管这是什么意思。最后:如果act基类被称为
Showable
,为什么它有一个输入值的方法?我认为您可能需要重新考虑
Showable
是否应该有这个
操作符>
,或者是否应该将它移到其他地方

  • 您应该定义基类的所有纯虚函数,这些函数可以在类点中显示
  • 按以下方式定义运算符

    常量点运算符+(常量点a、常量点b) { 返回点(a.x+b.x,a.y+b.y); }


  • 您必须实现所有抽象的可显示类成员 1) 将virtual关键字添加到display()方法 2) 实施istream和操作员>>


    另外,您应该逐值返回,而不是从+运算符返回引用。

    显示完整错误。将其设置为非抽象类。并按值返回,而不是引用。您还应该按值返回。@0x499602D2错误是“抽象类类型的对象”点是不允许的。juanchopanza我不能让它成为一个非抽象类,它必须是这样的。难道不是一个抽象类吗?也许您忘记了将virtual关键字添加到其中一个方法(例如display?)中,当我去掉&,我得到一个错误消息:返回抽象类“Point”的函数不正确allowed@user2140629这并不意味着添加
    &
    可以解决问题,而是会产生另一个问题。Show-us“Showable.h”。@user2140629在考虑了
    Showable
    operator>
    之后再次更新了答案,看看它是否对您有意义。当我尝试第二部分时,我得到一个错误“不允许转换到抽象类”点。”在做第二部分之前,你必须先做第一部分。所以我在我的观点中定义了所有的纯虚函数,错误并不罕见!感谢不要返回
    常量点
    ,只返回
    。否则会破坏移动语义。
    virtual istream& operator>>(istream& is) const;