Override/reimplement 派生中的枚举 class

Override/reimplement enum in derived class

我正在为我的大学项目开发​​一个数据库程序。 我有代表 Invoice 的基础 class 和代表 CorrectedInvoice 的派生 class。最后我想将数据存储到文件中,所以我使用枚举来指示它们的存储顺序:

enum FIELD_ORDER
{
    ID, 
    IVOICE_NUM, 
    TIME, 
    CLIENT_ID,
    COST,

    SIZE // fields' length
};

在派生的 class 中,我们有额外的字段指示我们更正哪个发票,以及字段的顺序更改。 我试图用 #ifdef 块包围枚举,但预处理器总是首先通过基础 class 文件运行,所以我无法为每个 class 声明所需的枚举。我怎样才能达到这样的效果?有没有更好的方法来存储订单?我在(反)序列化中使用它,我希望它在 loop/switch 语句中灵活可用。

@编辑 我忘了提到字段顺序在运行时不会改变,所以这就是我想出枚举的原因。

只是一个建议,在 class 中声明枚举,如下所示,

class BaseClass
{
 public:
    enum FIELD_ORDER
    {
      ID, 
      IVOICE_NUM, 
      TIME, 
      CLIENT_ID,
      COST,

      SIZE // fields' length
   };
};

class DerivedClass : public BaseClass
{
 public:
    enum FIELD_ORDER
    {
       //Derived Version
    };
};

然后使用下面的方式访问对应版本的FIELD_ORDER

BaseClass::FIELD_ORDER

首先我要提到研究序列化技术,这是用于将内存中的 class 转换为永久形式的术语。

听起来您是在使用各种枚举的排序来表达某些意思。这不是应该使用枚举的方式,将实际的基础值视为实现细节(除非您将它们写入磁盘)。

我通常会避免在这里使用枚举,因为没有任何您想要的枚举。理论上您可以定义一个虚拟方法来确定顺序,但这不允许添加其他字段。

相反,您应该做的是创建一个虚拟方法来处理将 class 序列化到某个地方。

希望下面的代码对您有所帮助。

#define INVOICE_ENUM true
#define CORRECTED_INVOICE_ENUM false
template<bool>
class FIELD_ORDER
{
public:
    enum {
    ID, 
    IVOICE_NUM, 
    TIME, 
    CLIENT_ID,
    COST,

    SIZE // fields' length
    };
};

template<>
class FIELD_ORDER<false>
{
public:
enum {
    ID, 
    TIME, 
    CLIENT_ID,
    COST,
    IVOICE_NUM,
    SIZE // fields' length
};
};

cout<<FIELD_ORDER<INVOICE_ENUM>::TIME;
cout<<FIELD_ORDER<CORRECTED_INVOICE_ENUM>::TIME;