简化问题:表达式是一个参数。它包括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:
};
答案 0 :(得分: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();
备注这不是唯一的方法,当你使用课程时,你会发现捷径可以减少工作量。