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

时间:2013-10-29 22:42:00

标签: c++

此功能的要求如下:

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

My Point.h

#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& operator+(const Point& pointA, const Point& pointB) {

Point a; 


}

我想要做的是,创建一个新的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

3 个答案:

答案 0 :(得分:3)

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

Point  operator+(const Point& pointA, const Point& pointB) {
//   ^ no & here
  Point a; 
  // ...
  return a;
}

解决有关抽象类的问题:查看Showable。它确实有一个纯虚方法(带有=0的方法),您需要在类Point中实现。


显示Showable.h之后:从理论上讲,您现在需要实施

virtual istream& operator>>(istream& is) const;

用于类Point,但由于三个原因,这很奇怪:该方法标记为const,因此无法修改Point,因此无法将值读入其中。此外,签名非常不寻常,这意味着您将使用my_point >> is; - 无论这意味着什么。最后:如果抽象基类被称为Showable,为什么它有一个输入值的方法?我想你可能想重新考虑Showable是否应该有operator>>或者是否应该将其移到其他地方。

答案 1 :(得分:0)

  1. 您应该在类Point中定义基类Showable的所有纯虚函数。
  2. 按以下方式定义运算符

    const Point运算符+(const Point&amp; a,const Point&amp; b) {     return(Point(a.x + b.x,a.y + b.y); }

答案 2 :(得分:0)

您必须实现所有抽象的Showable类成员。去做这个 1)将virtual关键字添加到display()方法中 2)实现istream&amp;运营商GT;&GT;

此外,您应该返回Point by值而不是+运算符的引用。