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;
我正在为我的大学项目开发一个数据库程序。
我有代表 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;