私はこれをできるだけ明確に説明するために最善を尽くします。
私の例には現在、3 つの異なるクラスが含まれています。
- 私のモデルクラス(それを呼びましょう
MyModel.cpp
) - MyModel が (
MyData.cpp
)のオブジェクトを持つ私のデータ クラス - モデルを変更する undo redo クラス (
MyModelUR.cpp
)
MyModel
オブジェクトを持っていMyData
ます。 MyData
それぞれ独自の get および set 関数を持つ double の束が含まれています。私のシステムの仕組みは、セッターが を呼び出すことによって呼び出されることredo()
ですMyModelUR
。このredo()
関数はMyModel
、変更が検出されたときに呼び出されます。ただし、これは問題の範囲外です。
MyModelUR
いくつかの引数を取り、引数を取ることを許可されていundo()
ないコンストラクターの 3 つの関数があります。redo()
MyModel
何が起こるかというと、目的のセッターの関数ポインターを に渡したいのMyData
ですMyModelUR
。
したがって、コンストラクターはMyModelUR
関数ポインターを引数として受け取り、それをプライベートグローバル変数に格納する必要があることを意味します。これまでのところ、私はこのようなものを持っています...
MyModelUR::MyModelUR(MyModel* model, double newValue, void (*function)(double))
{
Model = model;
NewValue = newValue;
//FunctionToCall is a void*
FunctionToCall = &function;
}
今、私のredo()
関数で使用したいFunctionToCall
...これをやろうとしていますが、うまくいかず、コンパイルエラーが発生するだけです...
MyModelUR::redo()
{
Model->data()->FunctionToCall(NewValue);
}
このように実装したいので、ダブルインごとに X 個のundo()
/関数は必要ありません。redo()
MyData
あなたの助けと提案に感謝しますが、他の制約のためにこのアーキテクチャを使用したい、Boost ライブラリを使用できないなどの返信を検討する際に、いくつかの制限があります。
TLDR; オブジェクトで呼び出されている別のクラスで double を取る void 関数ポインターを呼び出したいです。
ありがとうございました!
編集:以下のコメントの後、これは私が取り組んでいるものです...
MyModelUR::MyModelUR(MyModel* model, double newValue, void (MyModel::*function)(double)) :
Model(model),
NewValue(newValue),
FunctionToCall(function)
{
}
void MyModelUR::redo()
{
MyData data = Model->data();
data.*FunctionToCall(NewValue);
}
ただし、これにより、コードの 2 行目で次のようなエラーがスローされredo()
ます。