ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 为什么这堂课抽象?

2019-08-26 08:07:18  阅读:193  来源: 互联网

标签:virtual-method c class abstract-class abstract


我正在尝试创建表示多项式的LinkedList的实现.链接列表将是“术语”列表.术语是Data的实现(它是一个带有方法的抽象类:compareTo()和toString()). Polynomial类有一个名为head的变量,我试图将其初始化为Term.我的编译器说我“不能声明抽象类型的成员:Term”,但我不认为Term是抽象的,因为它是Data的一个实现(抽象类).如果你们可以看看这个,让我知道我失踪的任何巨大的红旗,我将不胜感激.
Collection.h:

  class Data {
  public:
  virtual ~Data() {}

virtual int compareTo(Data * other) const = 0;

virtual string toString() const = 0;
};

class Term : public Data { 
public:
int coefficient;
string variable1;
int exponentX;
string variable2;
int exponentY;
Term * next;

Term(int coeff, string var1, int exp1, string var2, int exp2, Term * next) : 
    coefficient(coeff), 
    variable1(var1),
    exponentX(exp1),
    variable2(var2),
    exponentY(exp2),
    next(next) {};

string convertInt(int number) {
    stringstream ss;//create a stringstream
    ss << number;//add number to the stream
    return ss.str();//return a string with the contents of the stream
}

int compareTo(Term * term) {
    if(this->exponentX > term->exponentX) {
    return 1;
    }
    else if(this->exponentX < term->exponentX) {
    return -1;
    }
    else {
        if(this->exponentY > term->exponentY) {
        return 1;
        }
        else if(this->exponentY < term->exponentY) {
        return - 1;
        }
        else {
        return 0;
        }
    }
}
string toString() {
    stringstream s;
    int * current = &this->coefficient;
    if(*current == 1 || *current == -1) {
    }
    else if(coefficient != 0) {
    s << convertInt(coefficient);
    }
    else { return s.str(); }
    if(variable1 != "" && this->exponentX != 0) {
    s << variable1;
    s << convertInt(exponentX);
    }
    if(variable2 != "" && this->exponentY != 0) {
    s << variable2;
    s << convertInt(exponentY);
    }
return s.str();
}   
};

此外,这里是LinkedList的实现.还有其他一些方法,但它们似乎没有给出任何问题.

LinkedList.cpp:

 class Polynomial : public LinkedList { 
public:
Term head;

Polynomial() {
this->head = NULL;
}

~Polynomial() {
Term * current = head;
    while (current != NULL) {
        Term * next = current->next;
        delete current;
        current = next;
    }
}

谢谢!

解决方法:

在覆盖虚拟方法时,必须精确匹配函数签名.返回类型可能根据协方差规则而有所不同,但参数类型必须完全相同.

在基类Data函数compareTo中声明为

virtual int compareTo(Data * other) const

在派生类Term中,它被声明为

int compareTo(Term * term)

首先,参数类型不同.其次,const缺失了.

这意味着您在派生类中编写了一个完全不相关的函数.它不会覆盖基类的纯虚函数.由于基本纯虚函数保持不重写,因此类Term仍然是抽象的.

在Term中,您必须准确地声明您的函数

int compareTo(Data * other) const

我假设你期望在Term中使用compareTo仅用于Term-to-Term比较.但在此设计中,您必须接收数据作为参数,然后将其转换为Term,或使用双重调度技术.

附:最重要的是,你将一个Term对象声明为Polynomial类的成员头,然后使用它就好像它是一个指针一样

Term * current = head;

这毫无意义.如果您希望您的头部成为指针,请将其声明为指针.如果您希望它是一个对象,则停止将其用作指针.无论是这个还是那个.

标签:virtual-method,c,class,abstract-class,abstract
来源: https://codeday.me/bug/20190826/1727908.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有