2012-10-02 73 views
0

我正在寫兩個類,用於評估等式中的表達式,即:等式和表達式。 Equation類包含兩個Expression *成員變量,需要使用這些變量來主要控制方程的右側和左側。爲了解決他們將如何訪問各持(串)表達的事情,我已經創建了下面的定義和實施的Exression類的構造函數:請求會員是非班級類型*

#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]; 
    } 
} 

我也寫了方程類的實現以下:

#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); 
    } 
} 

當我運行程序,如上所示,它編譯;但是當我嘗試訪問的左邊和右邊表達式的字符串成員變量對象在公式中聲明,就像這樣:

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函數中多次。 任何幫助或建議將不勝感激。

+0

避免把「使用命名空間」在頭文件中的指令或任何人誰​​#包括你的文件最終會包含std命名空間中的所有類型,當它們可能不期待它時。參見:http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c –

回答

1

「left」是一個指針,用「 - >」進行訪問。改變「左」。以「左>」

1

兩個leftrightExpression指針,所以你需要通過operator->訪問它們,例如:

string s1 = left->equationPart; 
相關問題