【问题标题】:Identify Caller Object识别调用者对象
【发布时间】:2018-07-23 06:56:16
【问题描述】:

更新:下面的场景可以简单地通过 this 指针来实现,但我想知道是否有其他方法。我已经简化了问题的要求。但是在 jist 中,问题是在将调用者类的成员变量提交给另一个被调用者类之后,被调用者类是否有任何方法来跟踪 [调用者实例 调用者成员] 变量对。

假设我有Class CalleeClass CallerClass Caller 使用Class Callee 的方法将其成员变量dummy 注册到Class Callee。现在Class Caller 再次调用Class Callee 的方法。 Class Callee 必须识别调用者实例并返回 dummy 变量值。

有没有办法识别调用者对象?还是需要第一次为调用者类分配一个id,并且每当调用者再次调用时调用者需要使用该id?

伪代码:

class Callee {
    Callee : id(0) {}

    void AddVariable(Data dummy) {
        std::pair<int, Data> p;
        p.first = id;
        p.second = dummy;
    }

    Data GetVariable() {
        //Find the variable, process it and return 
    }

private:
    std::set<std::pair<int, Data>> dummy_list;
    int id;
}



class Caller {
    Caller {
        m_callee->AddVariable(dummy);
    }

    void SomeFunc() {
        std::cout << m_a->GetVariable() << std::endl;
    }

private:
    Data dummy;
    Callee* m_callee;
}

【问题讨论】:

  • 您是在尝试识别调用类还是调用对象?
  • 您能否详细说明您想要实现的目标?
  • 我的错,对象实例。当多个 B 类实例注册其成员变量 dummy 时,用于识别目的。 B 类必须从虚拟变量列表中检查并返回适当的值。
  • 真的不清楚你想要实现什么。请编辑问题以包含您目前拥有的任何代码,以便我们了解 A 类和 B 类在这里尝试做什么。如果需要,请使用伪代码,但这样更有可能回答这个问题。
  • 用例用于服务器设计:服务器类->为每个连接创建一个通用管理器实例和连接实例连接类->这处理消息,将它们放入队列等。它还注册了这个队列到管理器类管理器类 - > 工作线程实现,将消息和调用库现在我想为库实现锁定/解锁,即连接实例可以调用管理器类的锁定/解锁方法。现在管理器取决于哪个名为 lock 的实例应该为该连接执行消息并停止其他连接的执行

标签: c++ oop


【解决方案1】:

不告诉A什么实例调用这个问题是无法解决的; C++ 不提供此类信息。即使这样,您也必须相信所提供的实例是正确的(也就是说,在这种情况下,没有针对主动恶意代码的保护措施)。

【讨论】:

  • 就是这样。假设A类是Manager,B类在连接实例中,每次B调用A时,都需要包含this作为参数。这将使 Manager 始终能够识别正在调用的连接实例。
  • 如何使用该指针从变量列表中识别变量 dummy(之前为此实例保存的)?也许保留一个 std::map 但问题归结为从此指针获取正确的 id。此信息不会保存在任何地方,因此调用者应该使用 id 来标识自己。我对么? PS。我不想这样做->变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多