Класс с картой, содержащей указатели на функции другого класса - PullRequest
1 голос
/ 20 июня 2011

То, что я хочу сделать, - это иметь класс, который содержит карту указателей на функции второго класса, но имя второго класса не должно иметь значения (не может быть жестко закодировано в первом классе).возможность реализовать это без использования макросов.Я следовал за примерами с 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;
  };

1 Ответ

5 голосов
/ 20 июня 2011

Имя класса является частью типа указателя функции, который становится частью типа карты, которая становится частью 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;
}
...