我在執行可能不是「傳統」的事情時遇到了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)) {
^
所以,我不知道這是爲了達到我想要的最好的方式(可能不是,無論如何,如果你有他們非常歡迎其他建議),但現在我的目標是,使工作或正確理解爲什麼它無法工作,所以我從中學到了一些東西!
的基本思想是:
- 類「項目」可以使用該方法的類「has_funcPtr」命名參數成語被初始化「初始化」串聯到它的構造,如:「INIT( ).has_funcPtr(& function_name)「。
- 類「用戶」可以一個指向它的私有方法「func1的」存儲類型「項目」的其私有成員的私有成員。
通過這種方式,當調用對象「item」的特定方法時(爲了簡單起見,我不在這裏包含這個長部分,因爲它與錯誤無關,但它只是描述目標這段代碼),該方法可以做的東西,並通過該指針調用其父對象「用戶」的私有方法功能(我希望這是足夠清晰的...)。
現在,我認爲這是與對象的初始化順序的問題,但我不知道在哪裏以及如何解決它。 特別是我認爲既然「func1」方法不對類「user」的任何成員進行操作,那麼它的引用可以直接用在初始化列表中來初始化一個「init」對象並將它提供給一個「項目「對象。
謝謝大家提前
如果將來有人想要重複使用此代碼,則發表評論。在「init」類中的方法「has_funcPtr」中,我忘記了返回對象本身。它應該是: init&has_funcPtr(funcPtr fp){m_fp = fp;返回*這;} – Bertone