【问题标题】:C++, Passing a member pointer to a non member function [duplicate]C ++,将成员指针传递给非成员函数[重复]
【发布时间】:2015-11-22 11:42:39
【问题描述】:

我正在尝试将指向成员函数的指针传递给非成员函数,如下例所示:

class Main
{
    static void runMain (void (*progress)(double))
    {
        for (int i=1; i<=100; ++i)
        {
            // Do something
            progress(i/100.0);
        }
    }
};

class A
{
    void setProgress (double) {/*Do something else*/}
    void runA ()
    {
        Main::runMain (&setProgress); // Error: incompatible parameter from void(A::*)(double) to void(*)(double)
    }
};

class B
{
    void updateProgress (double) {/*More things to do*/}
    void runB ()
    {
        Main::runMain (&updateProgress); // The same error
    }
};

由于从 A 传递到 Main 的类型函数 void( A::* )(double) 与 void( * )(double) 不匹配,因此出现错误。

如何在以下约束下传递成员函数:我不允许更改类 A 和 B 的结构,除了 runA 和 runB 实现(但我可以更改 Main 类,包括其函数签名)。

谢谢!

【问题讨论】:

  • 制作成员函数static.
  • 成员函数在不使用有效this 调用时是否有效?函数如何知道要对哪个类数据进行操作?
  • Main::runMain 接受std::function。然后使用您喜欢的方法传递函数 + 上下文。
  • 我从之前问过这个问题的数百种方式中挑选了一个,并将其标记为重复。

标签: c++ pointers member


【解决方案1】:

所以,您可能通常使用 C# 编写代码。 在 C++ 中,指向函数(或静态函数)的指针与指向类的方法(成员函数)的指针不兼容。

也许passing-member-function-as-argument可以帮助你。

一种可能的解决方案:

class IProgressUpdater {
public:
    virtual void updateProgress( double ) = 0;
};

class Main
{
public:
    static void runMain ( IProgressUpdater* progressUpdater )
    {
        for (int i=1; i<=100; ++i)
        {
            // Do something
            progressUpdater->updateProgress( i/100.0 );
        }
    }
};

class A : public IProgressUpdater
{
    virtual void updateProgress( double ) {/*Do something else*/}
    void runA ()
    {
        Main::runMain( static_cast<IProgressUpdater*>( this ) );
    }
};

class B : public IProgressUpdater
{
    virtual void updateProgress( double ) {/*More things to do*/}
    void runB ()
    {
        Main::runMain( static_cast<IProgressUpdater*>( this ) );
    }
};

【讨论】:

  • 第一句无关紧要。其余的都是正确的,但这并不意味着没有办法做 OP 想要的。
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多