gpt4 book ai didi

c++ - 对象生命周期相关;以下问题是否存在术语/模式/不存在?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:21 24 4
gpt4 key购买 nike

我正在尝试为我的GUI窗口编写一个回调类。
为了(希望)实现这一目标,我正在使用委托(delegate)。

typedef srutil::delegate2<void,DWORD,DWORD> CallbackMethod;
typedef std::map<MESSAGE_TYPE,std::vector<CallbackMethod>> CallbackMap;

MESSAGE_TYPE是一个枚举。

我需要的是一种方法,该方法通过某种持久性/常量索引自动销毁在映射中的任何对象,而无需依赖于修改类析构函数。

我的意思是,好吧,我的计划可能从头开始存在缺陷(我仍在对这些高级内容进行半盲法编码),因为我指定了与某个签名匹配的回调,因此,实质上任何使用此功能的类都必须具有一些匹配它的方法,因此已经被迫遵守那些规则(耦合到类)。

因此,我可能只引用其中的 map 。
但是,仅此一项仍将需要遍历映射中的所有条目,并删除与被破坏对象匹配的条目。

所以我想我需要的是某种自我意识的常量引用指针索引的东西。

这样的事情存在吗?
在我看来,这应该是一个普遍的问题。

最佳答案

我想起来了……不,它不存在(至少对于C++不存在)。

您的建议意味着一个复杂的情况(即使您没有使用回调)。您所要求的东西,一旦其自身被破坏,就需要从(可能的)任何引用它的数据结构中删除对其自身的任何引用。这是一个非常高的要求,尤其是STL并不是要这样做的。

如果您真的想这样做(我敢肯定您会这样做),那么这就是我的初衷。每次将对象添加到数据结构时,您可能都要求将数据结构注册到该对象,例如使用类似Object::Register(const std::vector<Object> &v)的方法。然后,您可以存储对vector的引用(实际上,您可能会捕获到一个指针),因此您可以告诉vector在销毁该对象时将其删除。当然,这有两个问题:

  • 仍然很疯狂(特别是如果您想支持的结构不仅仅是 vector ,甚至在寻求完全通用的解决方案时,甚至更多)。
  • 每当将对象添加到结构
  • 中时,都需要其他编码器遵循此样式
  • 可能需要编辑Object的析构函数,您已明确告诉我们不应这样做。

  • 所以,是的,那里没有太多帮助。

    就我个人而言,我有一个更受青睐的解决方案,它围绕事件(特别是基于委托(delegate)的事件,例如我们在C#中使用的事件)发展。如果您不熟悉它们的工作原理,则可能需要阅读 programming guide。再说一遍,您可能不会,因为我们使用的是c++,而不是C#,而且由于我将自己进行描述。

    我喜欢事件提示的原因之一是您已经在使用回调。委托(delegate)(如在C#委托(delegate)中)只是回调的扩展。它们基本上将 vector<Callback>行为封装在 Delegate类中。如果重载了函数调用运算符,则 Delegate类允许通过一个操作来调用所有这些方法。另外,就像您已经在使用的 delegate一样,它可能是参数化类型。 (实际上,当 C++0x都准备就绪,即将推出时, variadic templates也将很有帮助)。

    不管怎么说,所有这些的重点是您可以将 Delegate作为任何类的成员变量:
    class Object
    {
    public:
    ... // whatever constructors, etc. you might need
    Delegate<void, Collection, EventArgs> destroyHandler;
    ... // and number of event handlers can be used.
    };

    现在,任何数据结构类都可以通过以下方式注册回调:
    obj.destroyHandler += myDelegate;

    其中 myDelegate是具有必需类型的任何函数。

    但是,这种方法存在更多问题。具体来说,它需要一个全新的库,其中包含了解事件模型的数据结构。这实际上并不那么难,因为可以简单地包装现有的STL容器。这将是很多工作,每个人都必须决定使用您的新库。

    Delegate<void, Collection, EventArgs> destroyHandler;行中找到另一个陷阱。这些类型参数分别是什么意思?好吧, void应该很清楚:这只是方法的返回类型。另外, EventArgs很简单:它只包装需要传递给回调的所有数据。 Collection类型是最奇怪的-为什么我们要对使用的类型集合进行参数化?

    这是为了避免在c++中使用指向成员函数的指针的麻烦。尽管这样的指针是可行的,但是它们却难以使用,而且(据我所知)没有办法从多种类型中获取指向成员函数的指针并将它们存储在单个集合中。

    取而代之的是,我过去尝试过的(虽然我并未真正完成构想)是
    class MyVector
    {

    static void DestructionHandler( MyVector & v, EventArgs & args )
    {
    // ... Handler code goes here
    }

    };

    需要注意的是参数 MyVector & v:它替换了通常的 this指针。另外,请注意,该方法是 static-这使它可用作常规的旧C样式功能指针。

    无论如何,我可能会有些失落,但是当您将所有这些放在一起时,您将获得一个相当不错的基于事件的系统,该系统在其他OOP语言中非常流行。另外,我告诉你这是一个很高的要求!

    关于c++ - 对象生命周期相关;以下问题是否存在术语/模式/不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406221/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com