小编Mis*_*ter的帖子

C#与C++中的代理相似

我已经就此事做了一些研究,但还没有找到具体的解决方案.我真的希望能够做到这一点:

    public delegate void VoidFloatCallback(float elapsedTime);
    public VoidFloatCallback OnEveryUpdate;
    public VoidFloatCallback OnNextUpdate;

    public virtual void Update(GameTime gameTime)
    {
        if (OnNextUpdate != null)
        {
            OnNextUpdate(gameTime);
            OnNextUpdate = null;
        }

        if (OnEveryUpdate != null)
        {
            OnEveryUpdate(gameTime);
        }

        this.OnUpdate(gameTime);
    }
Run Code Online (Sandbox Code Playgroud)

但是在C++当然.我发现只有一种解决方案可以为我提供这样的功能; 但此后一直处于脱机状态,但我将其转发到http://codepad.org/WIVvFHv0.我发现解决方案的唯一问题是它不是现代的C++ 11代码,缺乏lambda支持.

我知道我可以用

    std::function
Run Code Online (Sandbox Code Playgroud)

但是,唯一的问题是它不支持的运营商" ,".现在我已经考虑过创建自己的Events类并拥有一个+=-===

    vector<std::function>
Run Code Online (Sandbox Code Playgroud)

有一些模板,但我发现std :: function没有实现运算符,==所以我不能让它看起来像C#那样.

无论如何,我的问题是:

我想知道如何使用C++ 11实现这样的事件系统 - 或者甚至是可能的.或者即使您知道一种更好/正确的方法来实现支持多个侦听器的回调(我想尽可能避免完整的Observer模式实现.)

更新#1

我对运营商的意图是这样的:

    void some_func(float f) { /** do something with f **/ }
    void some_other_func(float f) { /** do something …
Run Code Online (Sandbox Code Playgroud)

c# c++ c++11

7
推荐指数
1
解决办法
4747
查看次数

返回智能指针

假设我有一个管理器类,其中包含某个对象的向量:

class SomeObjectManager
{
private:
    std::vector<SomeObject> _heldObjects;
};
Run Code Online (Sandbox Code Playgroud)

在那个类中,我有一些函数可以遍历所述向量以返回请求的对象。

SomeObject getSomeObjectByName(std::string nameToFind);
Run Code Online (Sandbox Code Playgroud)

我需要知道的是什么时候使用智能指针是合适的。我真的应该返回如下内容吗?

std::shared_ptr<SomeObject> getSomeObjectByName(std::string nameToFind);
Run Code Online (Sandbox Code Playgroud)

或者我应该使用诸如 unique_ptr 或 weak_ptr 之类的其他东西吗?我希望 SomeObjectManager 类拥有返回的实际对象,并且永远不会说 SomeObject 被删除,除非 Manager 这样做。

我在 C# 模式下工作了一段时间后,最近才回到 C++ 世界;感谢您的帮助并消除我的困惑。

我已经阅读了很多关于这件事的书,但从未真正找到针对我的特定情况的直接答案。


编辑 #1

我想用这个改写我的最后几句话:

我希望 SomeObjectManager 类拥有返回的实际对象,并且从未说过 SomeObject 从向量中删除并随后被删除,超出范围,直到 Manager 强制它这样做。例如:

void SomeObjectManager::removeSomeObjectByName(const std::string& objectToRemove);
Run Code Online (Sandbox Code Playgroud)

这只会迭代向量,找到 said SomeObject,然后从向量中删除它。

c++ smart-pointers resource-management shared-ptr unique-ptr

4
推荐指数
1
解决办法
1168
查看次数