有人可以帮我解决以下问题:
在类定义中,需要定义任意数量的特定类型的成员字段,并在创建此类的实例时自动调用它们的特定操作。像,
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实例时都会自动执行它们。
由于
答案 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;
}