C++ 使用宏定义具有额外操作的类成员字段(C+;+;)

C++ 使用宏定义具有额外操作的类成员字段(C+;+;),c++,macros,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 inl

有人能帮我解决以下情况吗

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

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_字段)执行以下操作:

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


谢谢

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

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

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

然而,我觉得有必要重复一次,虽然(我认为)这符合您所说的需求,但这些需求给我的印象是相当有问题的。它可以做你想做的事情,但我觉得它不太可能是解决实际问题的好方法(不管是什么)。

使用包装器类

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;
}

check
的作用是什么,在
F1
构造函数中无法完成?“check()实际上需要在C1、C2或C3对象中传递。我只是进行了编辑,以使它们具有正确的含义。我仍然想了解
check
实际上做了什么-至少在概念上是这样。你的问题似乎是一个“XY问题”“,当你有一个问题X,你认为解决方案是Y,而实际上你应该问如何解决X。为什么你要在类中添加一个字段,而不是使用对象向量(或者更好的)指针?@Mats:也许你是对的。问题实际上是,类C1需要注册特定类型的字段,并且需要在C1对象创建时完成。但是我不能用宏来实现。我必须为每个这样的成员字段添加每个额外代码。我想用宏来做这件事,就像这样:MDEF_字段(F1,m_字段1)谢谢你的回复。我仔细考虑了您的代理解决方案,认为它不适用于我的案例。这些类F1和C、C1等对于其他程序员来说是一个代码库,这里的问题实际上是一个编码问题,而不是运行时逻辑问题。使用宏来实现这一点(如果可能的话)会将底层逻辑隐藏在后面,而其他编码人员只会正常地完成他们的工作。即使代理解决方案成功实现了业务逻辑,但仍然需要为其他程序员创建的每个类(如C4、C5)添加额外的代码。他们不明白为什么,但也很整洁…谢谢你的回复。不过,正如我向Jerry提到的,这是一个编码文字问题,而不是运行时业务逻辑问题。根据您的解决方案,在定义字段m_t1时,您需要为m_t2字段添加额外的代码段m_t1(this),m_t2(this),等等。这是额外的代码。我想把它们藏在后面。因此,执行
MDEF_字段m_t1
不仅会将
F1\u自动检查m_t1
,还会将代码
m_t1(this)
放在constructor@duney但至少如果你忘记了这两个步骤中的一个,你会得到一个编译器错误。(这都是运行时行为。
check
是在运行时调用的,而不是在编译时调用的。)宏混淆了IDE(和人类)。如果你真的想使用一个宏,你必须做X宏的把戏。谢谢雷蒙德。我想如果
mt1(这个),
忘记了写,编译器不会抱怨的。我尝试过很多宏观解决方案,但都没有成功。我意识到,我实际上是在询问C++语言的额外语义,即在一个地方写一些新的语法,结果会影响代码块的几个地方。到目前为止,我还没有看到任何解决方案。真的希望能在宏上找到解决方案this@duney如果您忘记编写
m\u t1(this)
,编译器会抱怨,因为
F1\u autocheck
没有默认构造函数。正如我所说的,如果你想要一个基于宏的解决方案,你可以使用一个X宏。对不起,没有注意到你给了F1额外的限制。在我的例子中,F1对象可以在C外部创建,也可以使用默认构造函数创建。似乎我需要为F1和C类、C1类、C2类等指定更多细节。不确定是否需要重述我的问题。也许,我的问题应该描述为:在类中,必须定义F1类型的字段,并且在创建对象时,每个字段都要执行特定的操作。低级逻辑将隐藏在后面,其他人使用宏定义从C继承的任何类的字段。X宏不能这样做,因为#define子句不能在另一个宏中。