1

私がやりたいのは、2番目のクラスの関数ポインターのマップを含むクラスを作成することですが、2番目のクラスの名前は重要ではありません(最初のクラスにハードコーディングすることはできません)。これはマクロを使用せずに。関数ポインターについて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;
  };
4

1 に答える 1

5

クラスの名前は、関数ポインタの型の一部であり、マップの型の一部になり、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;
}
于 2011-06-20T16:33:50.617 に答える