2016-12-16 19 views
0

私は目的球に私のクラスの労働者のポインタを渡したいが、イムは、コンストラクタを呼び出すときに何かが間違っている...メンバー関数をクラスコンストラクタに渡すにはどうすればよいですか?

Worker.h

class Worker : public QObject 
{ 
Q_OBJECT 

public: 
Worker(void (*process)()); 

public slots: 
void work(); 

signals: 
void error(QString error); 
void paused(); 

private: 
void (*_task)(); 
}; 

Worker.cpp:

Worker::Worker(void (*task)()) 
{ 
_task = task; 
} 

void Worker::work() 
{ 
_task(); 
paused(); 
} 

これは私がしたいことです... ワーカーはどの関数の関数呼び出しも実行する必要があります。

MAIN.CPP(更新属性なし空隙はなく、静的またはCONST等である):

_worker = new Worker(someClass->Update()); 
+0

['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)と[' std :: bind'](http: //en.cppreference.com/w/cpp/utility/functional/bind)。 –

+0

あなたの問題については、あなたは* Update *関数を呼び出します。関数をコンストラクタに渡すのではなく、その結果を渡します。 –

答えて

3

まず、関数がクラスのnon staticメンバ関数であり、その最初の引数であります呼び出されたオブジェクトあなたの例では

は、オブジェクトsomeClassからあなたの関数Update()のための実際のコードは、「空隙を更新(&工ass)」第二

、あなたは、あなたがUpdate()関数を呼び出して行うと、そのリターンを取りますあなたのWorkerコンストラクタ。

メンバ関数ポインタを使用するには、構文は次のとおりです。&ClassType::FunctionName

「通常の」関数ポインタを使用するには、構文は次のとおりです。あなたのexempleで&FunctionName

、することができますexempleの静的に更新機能をオンにし、あなたのコンストラクタは次のように変更します。

_worker = new Worker(&someClassType::Update); 

誰かがあなたのコードを向上させたい場合は、C++ 11

からのstd ::機能について学ぶ、コメントで言ったように
0

Félicieの答えの変形です。

任意のオブジェクトで動作するメソッドを渡すことができる場合は、C++ 11の方法ではstd::functionstd::bindを使用します。

あなたが事前C++ 11のシステムを使用しなければならない何らかの理由で、あなたが任意の引数を渡すのC-っぽいスタイルに戻す必要があります場合は、古き良きvoid *タイプ:

​​

あなたはします少しあなたの宣言を変更する必要があります。

class Worker : public QObject 
{ 
Q_OBJECT 

public: 
Worker(void (*process)(), void *obj); 

... 

private: 
void (*_task)(); 
void *_obj; 
}; 

その後:

Worker::Worker(void (*task)(), void *obj;) 
{ 
_task = task; 
_obj = obj; 
} 

void Worker::work() 
{ 
_task(_obj); 
paused(); 
} 

とfinaly :

_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass)); 

しかし、これはC++ 11の方法で許可されたすべての可能なタイプのコントロールを失い - std::functionstd::bindが発明された理由は...

関連する問題