关于类的想法给定实现的参数结构

时间:2017-05-21 15:59:16

标签: c++

简化问题:表达式是一个参数。它包括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:

};

1 个答案:

答案 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();

备注这不是唯一的方法,当你使用课程时,你会发现捷径可以减少工作量。