0

我尝试编译以下代码:

#include "Fraction.cpp"
#include "Pile.cpp"
#include "Plus.cpp"
#include <iostream>

using namespace std;

Nombre calcul(Element* tab [], int nbElement){

  Pile<Nombre> pile  = Pile<Nombre>(30);
  for(int i = 0 ; i < nbElement ; i++){
      if( tab[i]->getType() == "o" ){
        Fraction f = (*tab[i])(pile.pop(),pile.pop());
        pile.push(f);
      }
      else if(tab[i]->getType() == "n"){
        pile.push(*(tab[i]));
      }
  }
  return pile.pop();

}

int main(){

}

以下是所需的类:

分数.hpp:

#include <iostream>
#include "Element.cpp"
using namespace std;


class Fraction : public Nombre{

private:
  int nume;
  int deno;
  static int pgcd(int x, int y);

public:
  Fraction(int n, int d);
  Fraction(int n);
  int getNume() const;
  int getDeno() const;
  virtual string getType();
  Fraction operator+(const Fraction &) const;
  Fraction operator-(const Fraction &) const;

};

ostream &operator<<(ostream &os,const Fraction &f);
Fraction operator+(const int &n,const Fraction &f);

桩.hpp:

template <typename T> class Pile{

  private:
    int size;
    int top;
    T* stacktab;

  public:
    Pile<T>();
    Pile<T>(int s);
    bool isEmpty();
    bool isFull();
    bool push(T elt);
    T pop();
    void afficher(ostream &flux);

};

元素.cpp:

#include <string>
using namespace std;

class Element{

public:
  virtual string getType() = 0;
};


class Operateur : public Element{
public:
    virtual string getType() ;
};

class Nombre : public Element{
public:
    virtual string getType() ;
};

string Operateur::getType() {
  return "o";
}

string Nombre::getType() {
  return "n";
}

加号.cpp:

class Plus : public Operateur{
public:
  Fraction operator()(Fraction f1, Fraction f2);
};

class Moins : public Operateur{
public:
  Fraction operator()(Fraction f1, Fraction f2);
};

Fraction Plus::operator()(Fraction f1,Fraction f2){
  return f1 + f2;
}

Fraction Moins::operator()(Fraction f1, Fraction f2){
  return f1 - f2;
}

尝试编译此代码时出现 2 个错误:

1) error: no match for call to ‘(Element) (Nombre, Nombre)’
         Fraction f = (*tab[i])(pile.pop(),pile.pop());

这里,*tab[i] 是 Element 上的指针,但实例应该是 Plus 或 Moins(它们都来自 Operateur,而 Operateur 来自 Element)。我理解这个问题:我只在 Plus 和 Moins 类中实现了 operator(),所以编译器在 Element 中找不到它,但我该如何解决这个问题?

2) error: no matching function for call to ‘Pile<Nombre>::push(Element&)’
         pile.push(*(tab[i]));
note: candidate: bool Pile<T>::push(T) [with T = Nombre]
template <typename T>  bool Pile<T>::push(T elt){
                             ^
note:   no known conversion for argument 1 from ‘Element’ to ‘Nombre’

我使用 Pile 并尝试使用 Element 对象来 push()。由于 Nombre 是从 Element 派生的,我不应该能够使用 Element 对象而不是 Nombre 对象吗?

我一直在寻找几个小时的答案,但我仍然不明白。我觉得我还没有理解一些非常基本的东西。

4

1 回答 1

0

你需要有一个virtual Fraction operator()(Fraction f1, Fraction f2);in Element。

但这不会那么容易,因为 Fraction 是从 Element 派生的,所以还没有被声明。你可以试试virtual Element operator()(Element e1, Element e2);。但是你会发现从 Plus 和 Moins 返回一个非同质类型将是另一个问题。

您正在将非同质类型推入 Pile。那是行不通的。尽管 Fraction 是从 Nombre 派生的,但它并不完全是 Nombre,而是会切片。

于 2017-11-18T21:02:17.167 回答