0

方程式の式を評価するために使用される 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 関数だけで数回発生します。ヘルプやアドバイスをいただければ幸いです。

4

2 に答える 2

1

「左」はポインタで、「->」でアクセスします。「左」に変更。「左→」へ

于 2012-10-02T20:21:51.787 に答える
1

leftとはどちらrightExpressionポインタなので、 経由でアクセスする必要がありますoperator->。次に例を示します。

string s1 = left->equationPart; 
于 2012-10-02T20:23:08.647 に答える