0

現在、式エバリュエーターをコーディングしていて、ポリモーフィズムに関する問題に遭遇しました。私のクラス階層は次のとおりです。Divide は、基本クラス Expression から継承する Operator から継承します。基本クラス Expression を使用して Divide 型のオブジェクトをインスタンス化し、関数divide(int, int) にアクセスしようとすると、次のエラーが発生します。

「Expression.cpp: メンバー関数 'int Expression::evaluate()': Expression.cpp:37:6: エラー: 'class Expression' には 'divide' という名前のメンバーがありません」

ここに「Expression.h」があります

#ifndef EXPRESSION_H
#define EXPRESSION_H
#include <string>
using namespace std;
class Operator;
class Divide;
class Expression 
{
  protected:
    char **ana, *exp;

  public:
   Expression();
   ~Expression();
   Expression(char* ex);
   int evaluate();
   void tokenize();

    class EmptyException
    {
       public:
     EmptyException(string a){reason = a;};
     string getReason() const{return reason;};
       private:
     string reason;
    };

};

#endif

そしてこちらが「Expression.cpp」

#include "Expression.h"
#include "Stack.h"
#include "Queue.h"
#include "Node.h"
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include "Operator.h"
#include "Divide.h"

Expression::Expression()
{

} 

Expression::~Expression()
{
   delete [] exp;
}

Expression::Expression(char* ex)
{
   exp = ex;
   //tokenize();

}

int Expression::evaluate()
{
  Stack stack;

  Expression *tmp;
  Divide d;
  tmp = &d;
  tmp->divide(4, 2);
  stack.push(tmp);
   tmp = stack.pop();

 }

 void Expression::tokenize()
 {  
   int space = 0;

   for(int i  =0 ; i < strlen(exp); i++)
   {
     if(exp[i] == ' ')
     space++;
   } 

   char ** ana = new char*[space + 1];
   ana[0] = strtok(exp, " ");

   for(int i = 1 ; i < space + 1; i++)
   {        
   ana[i]= strtok (NULL, " ");
   }

  } 

そして今、「operator.h」

#ifndef OPERATOR_H
#define OPERATOR_H
#include "Expression.h"

using namespace std;

class Operator : public Expression
{
  protected:
    bool unary, binary;
  public:
    Operator();
    bool isUnary() const;
    bool isBinary() const;
};

#endif

「オペレーター.cpp」

#include "Operator.h"
#include <string>
#include <cmath>
#include "Expression.h"

Operator::Operator()
{

}

bool Operator::isUnary() const 
{
      if(unary)
    return true;
      else
    return false;

}

bool Operator::isBinary() const 
{
      if(binary)
    return true;
      else
    return false; 
}

「割る.h」

#ifndef DIVIDE_H
#define DIVIDE_H

#include <string>
#include "Operator.h"
class Expression;
using namespace std;


class Divide : public Operator
{
        private:
      char id;
    public:
        Divide();
        Divide(char);
        int divide(int a, int b);
        char identity() const;
};

#endif

「分割.cpp」

#include "Divide.h"

int Divide::divide(int a, int b)
{
  return a/b;
}

Divide::Divide(char _id)
{
 id = _id; 
}

char Divide::identity() const
{
  return id;
}

場合に備えて、メイクファイル

main: Expression.o Equation.o Operator.o Divide.o Stack.o Queue.o main.o
   g++ -static main.o Equation.o Expression.o Operator.o Divide.o Stack.o Queue.o -o main

main.o : main.cpp 
        g++ -c main.cpp 

Equation.o : Equation.cpp Equation.h
    g++ -c Equation.cpp

Expression.o : Expression.cpp Expression.h 
    g++ -c Expression.cpp 

Operator.o : Operator.cpp Operator.h Expression.h 
    g++ -c Operator.cpp 

Divide.o : Divide.cpp Divide.h Operator.h
    g++ -c Divide.cpp 

Stack.o : Stack.cpp Stack.h Node.h
    g++ -c Stack.cpp

Queue.o : Queue.cpp Queue.h Node.h
    g++ -c Queue.cpp

などの他のすべての演算子を省略しました。プラス、マイナスなどはすべて除算と同じであり、この質問をさらに複雑にするためです。

4

2 に答える 2

4

それはかなり明確ですよね?Expressionメソッドがありませんdivide

Expression *tmp;
Divide d;
tmp = &d;
tmp->divide(4, 2); //tmp is an Expression*

また...なぜあなたはこれをするのですか?どうしたの:

Divide d;
d.divide(4,2);
于 2012-10-01T19:30:18.243 に答える
1

あなたの問題は、ここへのポインターである呼び出さdivideれた変数を呼び出していることです。変数 で除算を呼び出す必要があります。tempExpressiontmp->divide(4, 2);d

于 2012-10-01T19:30:09.757 に答える