函数成员指针

时间:2012-03-09 08:57:40

标签: c++ function pointers

我有类似的东西

Base.h

#ifndef BASE_H
#define BASE_H

class Base
{
virtual Base* createNew() = 0;
}

#endif

D.h

#ifndef D_H
#define D_H

#include "Base.h"

class D : public Base
{
virtual Base* createNew();
}

#endif

D.cpp

#include "D.h"
Base* D:createNew()
{
return new D();
}

的main.cpp

typedef Base* (Base::*FP)(void);

#include "D.h"

void create(FP pointer)
{
//empty for now
}

int main()
{
create(&D::createNew); //This doesnt work =s?

}

我非常困惑,为什么这不起作用,任何人都可以给我一些关于我应该做什么的建议????

聚苯乙烯。对不起,如果代码没有运行我把它放在那里例如sakes只是为了告诉你我在做什么

3 个答案:

答案 0 :(得分:2)

您的代码中存在许多语法问题;

  • Base :: createNew()是私有和虚拟的。
  • 两个类声明都没有终止;
  • D:createNew()应该是D :: createNew()。 ...

我认为你所指的是拿一个成员函数指针并将它传递给一个方法是不行的。

问题在于您采用的方法只能使用D进行调用,并尝试将其作为指向函数的指针传递给可以采用不是Base的函数必须是D。反过来会起作用(即将Base::createNew()传递给一个D::createNew()的函数,因为Base::createNew()始终存在于D中,而不是相反)

答案 1 :(得分:1)

尝试:

 create(&Base::createNew);

毕竟,create想要一个指向成员的Base :: *指针,而不是D :: *。

我不认为指针到成员的继承行之间存在协方差; Base::*类型指向成员的指针与指向成员的D::*类型指针不兼容。

但是,您仍然可以通过D指向Base对象上的成员来调用D虚函数。 D确实是一种Base,因此您可以执行dinst->*pmemb,其中pmemb是& Base :: createNew`。

另外......

您的D::createNew可以返回D *。在C ++中允许虚函数的返回类型中的这种“协方差”。它仍然是覆盖Base中返回Base *的虚函数。当您直接致电D::createNew时,您有时可能会感谢获得D *指针,以便您可以使用D内容。

答案 2 :(得分:1)

在代码中修复了一些简单的编译器错误之后

  1. ;正文
  2. 后遗失class
  3. D:createNew更改为D::createNew
  4. D::createNew说明符
  5. 中制作public

    您的代码无法编译,create(&D::createNew)。因为它不可转换。错误消息很明确:

    error: cannot convert ‘Base* (D::*)()’ to ‘FP {aka Base* (Base::*)()}’ 
    

    编辑:如果您决定在编译时执行此操作,则一种方法是使用template评估。

    template<typename ReturnType, typename Class>
    void create(ReturnType (Class::*pointer)())
    {
    }
    

    将其命名为:

    create<Base*, D>(&D::createNew);