在做一些可能不是真正“传统”的事情时,我遇到了 C++ 编译错误。为了让事情变得更容易,我只是以更易于阅读的方式重新编写了我试图使用的机制,并检查了我是否遇到了同样的问题。
首先这里是代码:
test.h // - - C++ - -
template <typename MODULE> class item;
template <typename MODULE>
class init {
public:
typedef int (MODULE::*funcPtr)(int);
private:
funcPtr m_fp;
public:
init& has_funcPtr(funcPtr fp) { m_fp = fp;}
init() {}
virtual ~init() {}
private:
friend class item<MODULE>;
};
template <typename MODULE>
class item {
public:
typedef int (MODULE::*funcPtr)(int);
private:
funcPtr m_fp;
public:
item(init<MODULE> params) : m_fp(params.m_fp) {}
virtual ~item() {}
};
class user {
public:
typedef init<user>::funcPtr funcPtr;
private:
// Method CB
int func1(int i);
// Item member
item<user> m_item;
public:
user();
virtual ~user();
};
test.cpp // - - C++ - -
#include "test.h"
user::user() : m_item(init<user>().has_funcPtr(this->func1) ) {}
int user::func1(int i) {return 1;}
这是错误:
/test.cpp:5:59: error: invalid use of non-static member function
user::user() : m_item(init<user>().has_funcPtr(this->func1) ) {
^
所以,我不确定这是实现我想要的最好的方法(可能不是,无论如何,如果你有其他建议,他们是非常受欢迎的)但我现在的目标是让它发挥作用或确切地理解为什么它不能工作让我从中学到一些东西!
基本思想是:
- 类“item”可以使用命名参数惯用语使用连接到其构造函数的类“init”的方法“has_funcPtr”来初始化,例如:“init().has_funcPtr(&function_name)”。
- 类“user”可以将指向其私有方法“func1”的指针存储为其类型为“item”的私有成员的私有成员。
这样,当调用对象“item”的特定方法时(为简单起见,我不在这里包含这么长的部分,因为它与错误无关,而只是描述这段代码的目标)该方法可以做一些事情并通过指向函数的指针调用其父对象“用户”的私有方法(我希望这足够清楚......)。
现在,我认为对象的初始化顺序存在问题,但我不确定在哪里以及如何修复它。特别是我认为,由于“func1”方法不对“user”类的任何成员进行操作,那么它的引用可以直接在初始化列表中用于初始化“init”对象并将其提供给“item” “ 目的。
谢谢大家