【问题标题】:Class with map containing function pointers of another class具有包含另一个类的函数指针的映射的类
【发布时间】:2011-06-20 16:14:52
【问题描述】:

我想做的是有一个包含第二个类的函数指针映射的类,但是第二个类的名称应该无关紧要(不能硬编码到第一个类中)我真的很想成为能够在不使用宏的情况下实现这一点。我遵循了 learncpp.com 上关于函数指针的示例,但是当在类之间传递它们时,我真的迷路了!我的尝试如下:

#include <map>
class Class1;
typedef double(Class1::*memFunc)();

class Class1
{
  private:

  std::map<std::string, memFunc> funcMap;

  public:

  void addFunc(std::string funcName, memFunc function)
  {
      funcMap.insert(std::pair<std::string, memFunc>(funcName, function));
  }

  };

  class MyClass
  {
  public:

  MyClass()
  {
      //How do I add member function getValue() to Class1?
      class1.addFunc("new function", getValue());
  }

  double getValue()
  {
      return 0;
  }

  private:

  Class1 class1;
  };

【问题讨论】:

  • 顺便说一句,您是否还想存储对象的this 指针,该对象的成员函数要存储指针?
  • @KerrekSB 事实证明,这也是我所需要的。很抱歉我之前没有看到这个回复。

标签: c++ function pointers member-function-pointers


【解决方案1】:

类的名称是函数指针类型的一部分,它成为映射类型的一部分,成为MyClass的一部分。根据“不能硬编码”的要求有多强,也许一个模板就足够了?

#include <string>
#include <map>
template<typename T>
class Class1
{
    typedef double(T::*memFunc)();
    std::map<std::string, memFunc> funcMap;
 public:
    void addFunc(std::string funcName, memFunc function)
    {
        funcMap.insert(std::pair<std::string, memFunc>(funcName, function));
    }
};

class MyClass
{
 public:
    MyClass()
    {
        class1.addFunc("new function", &MyClass::getValue);
    }
    double getValue()
    {
        return 0;
    }
private:
    Class1<MyClass> class1;
};
int main()
{
     MyClass mc;
}

【讨论】:

  • 哇,我期待一个到处都是指针、结构、宏和类似东西的答案。我忘记了模板如何解决这么多令人头疼的问题。非常感谢!
  • 还有一件事,如果您不介意的话:我将如何从 Class1 中的 MyClass 调用函数指针?假设我从地图中检索到它:double(T::*memFunc)();memFunc = (*mapIterator).second;(this-&gt;*memFunc)(); 这似乎不起作用。
  • @rem45acp 如果memFunc 是来自MyClass 的函数指针,则需要调用MyClass 类型的对象:ideone.com/YAHSG
  • 是否可以将 *this 传递到模板中,例如:Class1&lt;*this&gt;class1,避免需要额外的参数?
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多