在C+中实现一个工厂,向其注册非静态成员函数+; 我有一个C++单工厂类,叫做MEMGR,负责管理库中对象的堆内存: #include <vector> class MemMgr { public: // Callback interface of functions to register with MemMgr typedef size_t (*MemSizeFunc)(void); void Register(MemSizeFunc memSizeFunc); static MemMgr & GetInst(void); // more public functionality related to managing memory private: // a vector (not a map) of functions pointers to keep track of std::vector<MemSizeFunc> m_memSizeFuncs; MemMgr(void); MemMgr(MemMgr const &); MemMgr & operator= (MemMgr const &); // more private functionality related to managing memory };

在C+中实现一个工厂,向其注册非静态成员函数+; 我有一个C++单工厂类,叫做MEMGR,负责管理库中对象的堆内存: #include <vector> class MemMgr { public: // Callback interface of functions to register with MemMgr typedef size_t (*MemSizeFunc)(void); void Register(MemSizeFunc memSizeFunc); static MemMgr & GetInst(void); // more public functionality related to managing memory private: // a vector (not a map) of functions pointers to keep track of std::vector<MemSizeFunc> m_memSizeFuncs; MemMgr(void); MemMgr(MemMgr const &); MemMgr & operator= (MemMgr const &); // more private functionality related to managing memory };,c++,function,factory,member,C++,Function,Factory,Member,(然后,在MemMgr实际分配任何内存之前,它将查询注册到它的与大小相关的函数,以找出要分配的内存量。) 然而,当我尝试上述方法时,编译器对我大喊大叫。b/c我试图注册成员函数指针,而不是普通的函数指针 有人对我如何实现这样的功能有什么建议吗?我在了解如何实现模板实现(或多态实现)时遇到问题 谢谢, Aaron您甚至不尝试注册成员函数指针。必须将其指定为&MemMgrUser::GetManagedMemSize。不能使用成员函数的普通名称,除非在调用它的表达式中使用 但是,即使您有一个成员函数

(然后,在MemMgr实际分配任何内存之前,它将查询注册到它的与大小相关的函数,以找出要分配的内存量。)

然而,当我尝试上述方法时,编译器对我大喊大叫。b/c我试图注册成员函数指针,而不是普通的函数指针

有人对我如何实现这样的功能有什么建议吗?我在了解如何实现模板实现(或多态实现)时遇到问题

谢谢,


Aaron

您甚至不尝试注册成员函数指针。必须将其指定为
&MemMgrUser::GetManagedMemSize
。不能使用成员函数的普通名称,除非在调用它的表达式中使用

但是,即使您有一个成员函数指针,它也不能以与具有相同明显签名的普通函数指针相同的方式使用。调用成员函数总是需要一个对象来调用它。函数中可用的
指针是一个附加的隐藏参数

如果可以使用C++11标准库的功能,则可以
typedef std::function MemSizeFunc而不是当前的typedef。它允许您将可使用该签名调用的各种函数和函数对象存储为
MemSizeFunc
。特别是,您可以注册绑定到合适的
MemMgrUser
对象的
GetManagedMemSize
成员函数,例如:

MemMgrUser()
{
   MemMgr::GetInst().Register(std::bind(&MemMgrUser::GetManagedMemSize, *this));
}

使用
std::function
(或者
boost::function
,如果您没有访问C++11库的权限)。如果我理解,您尝试使用对象的一个成员函数来获取对象的大小,但在创建对象之前?听起来不太可能(也许我错了)。曼卡塞,谢谢你!这确实奏效了!工作得很有魅力!非常感谢。
MemMgrUser()
{
   MemMgr::GetInst().Register(std::bind(&MemMgrUser::GetManagedMemSize, *this));
}