C++ 描述要处理的数据时int/enum vs virtual function

C++ 描述要处理的数据时int/enum vs virtual function,c++,C++,我是编程新手,遇到一个需要您经验的问题: 我有一份数据清单。每个数据都有一种格式。 我有一个类生成器,它扫描数据列表,并根据其格式构建数据树 据我所知,有两种方法可以做到这一点: 1.用int/enum值绑定每个数据以描述它是什么,构建器可以检查int/enum值以决定应该使用哪个函数来处理令牌。 2.使用实现接口的虚拟函数绑定每个数据,并调用虚拟函数来处理数据 听起来第二种方法更好。但是,我也遇到了一些问题: 1.是否可以将处理数据的代码嵌入到数据包中?如果有一天我需要修改Builder类,我

我是编程新手,遇到一个需要您经验的问题:

我有一份数据清单。每个数据都有一种格式。 我有一个类生成器,它扫描数据列表,并根据其格式构建数据树

据我所知,有两种方法可以做到这一点: 1.用int/enum值绑定每个数据以描述它是什么,构建器可以检查int/enum值以决定应该使用哪个函数来处理令牌。 2.使用实现接口的虚拟函数绑定每个数据,并调用虚拟函数来处理数据

听起来第二种方法更好。但是,我也遇到了一些问题: 1.是否可以将处理数据的代码嵌入到数据包中?如果有一天我需要修改Builder类,我可能需要修改每个数据类? 2.在某些场景中,我需要两个数据来协同工作,在方法2中很难做到这一点

你能告诉我哪一个更好吗

以下是一些示例代码:

方法1:

struct FormatedData
{
    std::string data;
    int format;
};

class Builder
{
public:
    void build(std::list<FormatedData> *data_list)
    {
        for (auto it : *data_list)
        {
            switch (it.format)
            {
            case:
                do something;
                break;
            default:
                do something;
                break;
            }
        }
    }
};
struct formatteddata
{
std::字符串数据;
int格式;
};
类生成器
{
公众:
无效构建(标准::列表*数据列表)
{
用于(自动it:*数据列表)
{
开关(it.format)
{
案例:
做点什么;
打破
违约:
做点什么;
打破
}
}
}
};
方法2:

class Builder;

struct IIterface
{
    virtual void dosomething(Builder*) = 0;
};

class FormatedData :public IIterface
{
    std::string data;
    int format;
    void dosomething(Builder*) override
    {
        ....
    }
};

class Builder
{
public:
    void build(std::list<IIterface*> *data_list)
    {
        for (auto it : *data_list)
        {
            it->dosomething(this);
        }
    }
};
类生成器;
结构接口
{
虚拟空穴剂量仪(生成器*)=0;
};
类格式化数据:公共接口
{
std::字符串数据;
int格式;
无效dosomething(生成器*)覆盖
{
....
}
};
类生成器
{
公众:
无效构建(标准::列表*数据列表)
{
用于(自动it:*数据列表)
{
它->dosomething(这个);
}
}
};

方法2更好。一些评论:

1) 处理数据的所有行为都应该封装在处理数据的类中。不应该有依赖于管理类中数据类型的条件语句

2) 使用factory模式创建新对象而不更改以前定义的类: