2017-05-21 32 views
0

問題被簡化了:一個表達式是參數。它包括2個類型參數的對象。但是,該參數是一個string_class,ID_class或Expression_class參數嗎?如果我只是說參數,它不會有這些某些特徵,是嗎?我如何擁有這些對象,使用邏輯,然後我可以知道Expression的私有數據成員是字符串,id還是表達式參數?有時我希望左邊的參數是一個表達式,有時我希望它是一個字符串,有時候是一個ID。思想定實現

class Parameter 
{ 
public: 

private: 

}; 

class String_class : public Parameter 
{ 
    public: 
     String_class(string in_string) 


    private: 
     string my_string; 

}; 

class ID_class : public Parameter 
{ 
    public: 
     insert_id(string in_ID); 

    private: 
     string my_ID; 

}; 


class Expression_class : public Parameter 
{ 
private: 
    Parameter left_parameter; 
    Parameter right_parameter; 
    string op; 

public: 

}; 
+3

這真的很難閱讀你的問題。我建議改寫或至少編輯帖子,以便更容易理解問題所在。 – pingul

+0

我改變了你 –

+0

你在尋找'std :: any'或'std :: variant'嗎?我想可能是 – UnholySheep

回答

0

很多方法可以做到這一點...

enum ParameterType{ 
    PT_INVALID_TYPE = -1, 
    PT_OPERATION_TYPE= 0, 
    PT_STRING_TYPE, 
    PT_ID_TYPE, 
    PT_INT_TYPE, 
    ... 
    PT_MAX_TYPES 
} 

class Parameter { 
    public: 
    ... 
    virtual ParameterType GetType() = 0; 
    virtual string ToString() = 0; // GetValue(), etc... 
} 

class String_class : public Parameter 
{ 
    public: 
     String_class(string in_string){} 

     virtual ParameterType GetType() override { return PT_STRING_TYPE; } 
     virtual string ToString() override {return my_string;}; 


    private: 
     string my_string; 

}; 

class ID_class : public Parameter 
{ 
    public: 
     insert_id(string in_ID); 

     virtual ParameterType GetType() override { return PT_ID_TYPE; } 
     virtual string ToString() override {return my_ID;}; 

    private: 
     string my_ID; 

}; 

enum OperationType { 
    OP_INVALID_OP = -1, 
    OP_CONCATENATE = 0, 
    OP_ADD, 
    OP_COMPARE_EQUAL, 
    OP_COMPARE_LESS_THAN, 
    OP_XOR, 
    ... // whatever 
    OP_MAX, 
} 

class Expression_class : public Parameter 
{ 
private: 
    Parameter* left_parameter; 
    Parameter* right_parameter; 
    string op; 

public: 

}; 

一些有用的例子...

class Expression_class : public Parameter 
{ 
private: 
    Parameter* left_parameter; 
    Parameter* right_parameter; 
    string op; 

public: 

    Expression_class(string _op, Parameter* lhs, Parameter* rhs): 
    left_parameter(lhs), right_parameter(rhs), op(_op) 
    { 
     // alternatively 
     left_parameter = lhs; 
     right_parameter = rhs; 
     op = _op; 
    } 

    ~Expression_class(){ 
     left_parameter = nullptr; 
     right_parameter = nullptr; 
    } 

    virtual ParameterType GetType() { return PT_OPERATION_TYPE; }; 
    virtual string ToString() { return eval(); } 

protected: 
    string eval() { 

     if(left_parameter.GetType() != PT_ID_TYPE) return "Invalid left_parameter."; 
     if(right_parameter.GetType() != PT_STRING_TYPE) return "Invalid right_parameter"; 

     switch(op){ // op is better as OperationType than string 
      case OP_CONCATENATE : return left_parameter.ToString() + " " + right_parameter.ToString(); 
      // ... 

     } 

     if(CompareNoCase(op, "+") == 0) 
      return left_parameter.ToString() + " " + right_parameter.ToString(); 

     return "Invalid Opertaion"; 

    } 
}; 


String_class employee_name("Rick"); 
String_Id employee_id("007"); 

Expression_class exp(OP_CONCATENATE, &employee_id, employee_name); 
return exp.ToString(); 

注意這是不這樣做的唯一途徑,當你使用你的班級時,你會發現捷徑可以減少工作量。

+0

有一個類層次結構_and_「ParameterType」有什麼意義?對我來說似乎非常多餘。 – pingul

+0

因爲您可以使用基類指針並在不知道派生類型的情況下查詢類型/值。這種方法比RTTI方法略快並且避免了強制轉換。 –

+0

James Poag - 看起來很棒,看起來像我需要的東西。只有一個問題,因爲我不是最好的指針。然後我需要一個Expression類中的函數來分配這些左和右參數。什麼是語法,在這個函數的實現,分配左參數,比如說,指針爲ACTUALLY一個ID類對象爲例? –