方程式の式を評価するために使用される 2 つのクラス、つまり、Equation と Expression を作成しています。Equation クラスには、式の右辺と左辺を操作するために使用する必要がある 2 つの Expression* メンバー変数が含まれています。それぞれが保持する式 (文字列) にアクセスする方法の問題に対処するために、式クラスのコンストラクターに対して次の定義と実装を作成しました。
#ifndef EXPRESSION_H
#define EXPRESSION_H
#include <string>
using namespace std;
class Expression
{
private:
int l, r;
public:
Expression(string part);
string equationPart;
};
#endif
#include "Expression.h"
#include<cmath>
#include<iostream>
using namespace std;
Expression::Expression(string part)
{
int len = part.length();
equationPart[len];
for(int i = 0; i < len; i++)
{
equationPart[i] = part[i];
}
}
また、Equation クラスの実装について次のように記述しました。
#ifndef EQUATION_H
#define EQUATION_H
#include "Expression.h"
#include <string>
using namespace std;
class Equation
{
public:
Equation(string eq);
~Equation();
int evaluateRHS();
int evaluateLHS();
void instantiateVariable(char name, int value);
private:
Expression* left;
Expression* right;
};
#endif
#include "Equation.h"
#include<cmath>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
Equation::Equation(string eq)
{
int length = eq.length();
string l;
string r;
bool valid = false;
short count = 0;
for(int i = 0; i < length; i++)
{
if(eq[i] == '=')
{
valid = true;
for(short j = i+1; j < length; j++)
{
r += eq[j];
}
for(short j = i-1; j > 0; j--)
{
count++;
}
for(short j = 0; j < count; j++)
{
l += eq[j];
}
}
}
if(valid == false)
{
cout << "invalid equation" << endl;
}
else if(valid == true)
{
left = new Expression(l);
right = new Expression(r);
}
}
上記のようにプログラムを実行すると、コンパイルされます。しかし、Equation で宣言された左右の Expression オブジェクトの文字列メンバー変数にアクセスしようとすると、次のようになります。
void Equation::instantiateVariable(char name, int value)
{
string s1 = left.equationPart;
string s2 = right.equationPart;
short length1 = s1.length();
short length2 = s2.length();
bool found1 = false;
for(short i = 0; i < length1; i++)
{
found1 = true;
if(left.equationPart[i] == name)
{
left.equationPart[i] = itoa(value);
}
}
//and so on...
}
最終的にコンパイラエラーが発生します:
error: request for member 'equationPart' in '((Equation*)this)->Equation::left', which is of non-class type 'Expression*'
このエラーは、instantiateVariable 関数だけで数回発生します。ヘルプやアドバイスをいただければ幸いです。