0

有人可以帮我解决以下情况:

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

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 实例时都会自动执行它们。

谢谢

4

2 回答 2

0

这对我来说看起来/听起来像是一个真正的问题(老实说,我想到了“混乱”这个词)。如果可能的话,我(强烈)建议尝试找到一些完全不同的方法。

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

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

然而,我觉得有必要重复一遍,虽然(我认为)这符合你所说的要求,但这些要求让我觉得很成问题。它会做你所说的你想要的,但它让我觉得不太可能是解决真正问题的好方法(不管它是什么)。

于 2013-04-12T14:53:06.190 回答
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;
}
于 2013-04-12T15:16:00.090 回答