現在、式エバリュエーターをコーディングしていて、ポリモーフィズムに関する問題に遭遇しました。私のクラス階層は次のとおりです。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
などの他のすべての演算子を省略しました。プラス、マイナスなどはすべて除算と同じであり、この質問をさらに複雑にするためです。