使用宏通过额外操作定义类成员字段(C ++)

时间:2013-04-12 13:31:39

标签: c++ macros

有人可以帮我解决以下问题:

在类定义中,需要定义任意数量的特定类型的成员字段,并在创建此类的实例时自动调用它们的特定操作。像,

class C {
}
class F1 {
public:
   int check(C* host);
} 
class C1:public C {
public:
   C1() { this->pre_checks();   }
   F1 m_a1;
   F1 m_a2;
public:
   void pre_checks() { // use inline solution
      m_a1.check(this);
      m_a2.check(this);
   }
}

在上面的例子中,C1类包含两个F1类型的字段。因此在C1的函数pre_checks()中,每个字段将在创建C1的实例时自动执行其额外操作“check()”。

字段编号可以是任何或非。 C2类可以:

class C2: public C {
public:
   C2() { this->pre_checks();  }
   F1 m_t1;
   F1 m_t2;
   ...
   F1 m_tn;
public:
   void pre_checks() { // use inline solution
      m_t1.check(this);
      m_t2.check(this);
      ...
      m_tn.check(this);
   }    
} 

如何使用宏,比如说MDEF_FIELD,这样做:

class C3: public C {
   MDEF_FIELD  m_b1;
   MDEF_FIELD  m_b2;
   ...
   MDEF_FIELD  m_bn;
}

并且C3类定义还将包含以下代码:

m_b1.check(this);
m_b2.check(this);
...
m_b3.check(this);

每次创建C3实例时都会自动执行它们。

由于

2 个答案:

答案 0 :(得分:0)

这看起来/听起来像是一个真正的问题(老实说,“混乱”这个词浮现在脑海中)。我(强烈)建议尽可能找到一些完全不同的方法。

如果你真的需要这样做,宏几乎肯定是错误的方式。正确的方式(在某种程度上不仅仅是矛盾)是一个有点复杂的类结构:首先,F1_proxy,这是客户实际使用的。在大多数方面,这将是一个简单的pImpl类型的东西,只是将其功能转发给它“拥有”的F1对象。

它的不同之处在于代理类将包含指向F1实例的指针的静态向量。每次创建F1代理时,它都会遍历当前向量并对每个实例执行“检查”。假设成功,它将创建一个F1实例并将其添加到向量中。当您销毁F1代理时,它将销毁关联的F1对象从静态向量中删除指向该F1对象的指针,因此在创建其他对象时将不再检查它。 / p>

然而,我觉得有必要重申,虽然(我认为)这符合您所说的要求,但这些要求对我来说是个问题。它会按你所说的去做,但它让我觉得不太可能成为解决真正问题的好方法(无论是什么)。

答案 1 :(得分:0)

使用包装类。

class F1_autocheck : public F1 {
public:
    F1_autocheck(C *p) : F1() { this->check(p); }
};

class C1 : public C {
public:
   C2() : m_t1(this), m_t2(this), ..., m_tn(this) { }
   F1_autocheck m_t1;
   F1_autocheck m_t2;
   ...
   F1_autocheck m_tn;
}