【发布时间】:2015-10-20 12:38:03
【问题描述】:
我在做一些可能不是真正“传统”的事情时遇到了 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”的特定方法时(为简单起见,这里不包含这么长的部分,因为它与错误无关,而只是描述这个sn的目标-p of code)该方法可以做一些事情并通过指向函数的指针调用其父对象“用户”的私有方法(我希望这足够清楚......)。
现在,我认为对象的初始化顺序存在问题,但我不确定在哪里以及如何解决它。 特别是我认为,由于“func1”方法不对“user”类的任何成员进行操作,那么它的引用可以直接在初始化列表中用于初始化“init”对象并将其提供给“item” " 对象。
提前谢谢大家
【问题讨论】:
-
如果将来有人想重用此代码,请发表评论。在“init”类的方法“has_funcPtr”中,我忘记返回对象本身。它应该是: init& has_funcPtr(funcPtr fp) { m_fp = fp;返回 *this;}
标签: c++ function-pointers initialization-list in-class-initialization initialization-order