1

我会尽我所能,尽可能清楚地解释这一点。

我的示例目前涉及 3 个不同的类。

  1. 我的模型课(让我们称之为MyModel.cpp
  2. MyModel 具有 ( MyData.cpp)对象的我的数据类
  3. 我的撤消重做类修改了我的模型(MyModelUR.cpp

MyModel有一个MyData对象。 MyData包含一堆双打,每个都有自己的 get 和 set 功能。我的系统的工作方式是通过调用redo()in来调用 setter MyModelUR。当检测到更改时调用此redo()函数。MyModel不过,这超出了问题的范围。

MyModelUR有 3 个函数,一个构造函数,它需要一些参数,undo()并且redo()不允许使用任何参数。

发生的情况是,我想MyModel将所需设置器的函数指针传递MyDataMyModelUR.

因此,这意味着 for 的构造函数MyModelUR需要将函数指针作为 arg,然后将其存储在私有全局变量中。到目前为止,我有这样的事情......

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);
}

我想以这种方式实现它,所以我不需要每个 double in的 X 个undo()/函数。redo()MyData

感谢您的帮助和建议,但在考虑回复时我有一些限制,例如,由于我有一些其他限制,我想使用此架构,并且我不能使用 Boost 库。

TLDR;我想调用一个 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);
}

但是,这会在第二行代码中引发错误redo():“必须使用 '. ' 或 '-> ' 在 ... 中调用指向成员函数的指针”

4

1 回答 1

1

首先,您的函数指针应该是一个方法指针,并且您正在尝试使用一个自由函数指针。

其次,不要尝试将其存储为void*,它不能保证大小相同。只需将其声明为方法指针并停止强制转换。

最后,您当前正在(在您的void*)存储瞬态函数指针参数的地址,即使它是正确的类型也是无效的。

您的代码最终应该是这样的:

class MyModelUR {
    ...
    MyModel *Model;
    double NewValue;
    void (MyData::*FunctionToCall)(double);
    ...
    MyModelUR(MyModel* model, double newValue, void (MyData::*function)(double))
      : Model(model), NewValue(newValue), FunctionToCall(function)
    {}
    void redo() {
        MyData &data = Model->data();
        (data.*FunctionToCall)(NewValue);
    }
};

实例化其中之一,例如:

MyModelUR *ur = new MyModelUR(model, 3.4, &MyData::setSomeValue);

功能说明:如果要撤消,您将需要一个 getter 方法指针和存储旧值的地方。

美学说明:初始大写成员名称很糟糕,这与您用于类型的方案相同。只是海事组织。

于 2013-01-04T14:03:12.620 回答