C++ 如何获取实例的所有“this”的数组

C++ 如何获取实例的所有“this”的数组,c++,inheritance,C++,Inheritance,假设单击按钮时,将触发btn\u Click事件处理程序 我有sender,这个参数包含对引发事件的控件/对象的引用。发送方部分将是对已单击按钮的引用。如果控件向自身引发事件,则中止进程(只需调用return) struct EventArgs{/*事件的参数*/}; 结构A{int x;virtual~A()=default;}; 结构B{int y;virtual~B()=default;}; 结构C:公共虚拟A,公共虚拟B{ void btn_单击(void*sender,EventArg

假设单击按钮时,将触发
btn\u Click
事件处理程序

我有
sender
,这个参数包含对引发事件的控件/对象的引用。发送方部分将是对已单击按钮的引用。如果控件向自身引发事件,则中止进程(只需调用return)

struct EventArgs{/*事件的参数*/};
结构A{int x;virtual~A()=default;};
结构B{int y;virtual~B()=default;};
结构C:公共虚拟A,公共虚拟B{
void btn_单击(void*sender,EventArgs*e){
if(sender==static_cast(this))返回;
else{/*处理事件*/}
}
};
int main(){
A*A=新的C();
动态播放(a)->btn播放(a,空播放);
}
假设发送方是
a
,则上述代码
sender==此
将计算为false


我该怎么做才能让它回归真实?我认为我需要创建一个包含所有
指针的数组,然后将
发送方
与所有指针进行比较。

我认为您确实需要比较所有子对象,但编写函数比使用数组更好:

struct C: A, B
{
    bool is(void* that) const
    {
        return this == that
            || static_cast<const A*>(this) == that
            || static_cast<const B*>(this) == that;
    }

    void btn_Click(void* sender, EventArgs* e) {
       if (this->is(sender)) return;
       // ...
    }
}
结构C:A,B { 布尔是常数 { 返回这个==那个 ||静态(这个)=那个 ||静态(这个)=那个; } void btn_单击(void*sender,EventArgs*e){ 如果(此->为(发送方))返回; // ... } } 请注意,强制转换必须位于
this
,而不是
that
,因此编译器可以根据类型生成正确的指针调整


不过,使用
void*
是有问题的-您可能希望使用一些不太通用且不容易出错的东西。

我认为您确实需要比较所有子对象,但编写函数比使用数组更好:

struct C: A, B
{
    bool is(void* that) const
    {
        return this == that
            || static_cast<const A*>(this) == that
            || static_cast<const B*>(this) == that;
    }

    void btn_Click(void* sender, EventArgs* e) {
       if (this->is(sender)) return;
       // ...
    }
}
结构C:A,B { 布尔是常数 { 返回这个==那个 ||静态(这个)=那个 ||静态(这个)=那个; } void btn_单击(void*sender,EventArgs*e){ 如果(此->为(发送方))返回; // ... } } 请注意,强制转换必须位于
this
,而不是
that
,因此编译器可以根据类型生成正确的指针调整


使用
void*
是有问题的,但是-您可能想使用一些不太通用和容易出错的东西。

假设
void*
约束来自您的GUI框架(这是常见的,并且有一些很好的理由),我实际上会尝试采取完全不同的方法,就像让这些对象包含一些伪唯一的“ID”

您可以通过简单地递增和计算一些构造上的
静态
下一个ID计数器来生成这个值。然后,您需要做的就是比较ID,而不需要进行指针比较

您的“下一个ID计数器”最终将结束,但在您的程序生命周期中,您是否将拥有9223372036854775807个按钮?可能不会


但是,如果您将拥有许多这样的对象,并且新成员占用的额外空间是一个问题,那么您可以求助于molbdnilo所展示的内容。

假设
void*
约束来自您的GUI框架(这很常见,并且有一些很好的理由),实际上,我会尝试采取一种完全不同的方法,比如让这些对象包含一些伪唯一的“ID”

您可以通过简单地递增和计算一些构造上的
静态
下一个ID计数器来生成这个值。然后,您需要做的就是比较ID,而不需要进行指针比较

您的“下一个ID计数器”最终将结束,但在您的程序生命周期中,您是否将拥有9223372036854775807个按钮?可能不会


但是,如果您将拥有许多这样的对象,并且新成员占用的额外空间是一个问题,那么您可以求助于molbdnilo所展示的内容。

请提供一个示例。粘贴代码段时至少没有编译错误。@PasserBy我编辑了代码使其编译。根据发送方的基类类型,而不是通过
void*
@jrok:这里是否可能涉及某种GUI框架来删除回调中的类型?@LightnessRacesinOrbit是的。我希望OP能澄清。请提供一个答案。粘贴代码段时至少没有编译错误。@PasserBy我编辑了代码使其编译。根据发送方的基类类型,而不是通过
void*
@jrok:这里是否可能涉及某种GUI框架来删除回调中的类型?@LightnessRacesinOrbit是的。我希望OP能澄清这一点。