函数成员指针
Function member 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?
}
我非常困惑,为什么这不起作用?有人能给我一些建议吗????
Ps。很抱歉,如果代码没有运行,我把它放在那里只是为了向你展示我在做什么
您的代码中存在许多语法问题;
- Base::createNew()是私有的和虚拟的
- 两个类声明都没有终止的
;
- D: createNew()应该是D::createNew[()]。
不过,我认为您所指的是,获取成员函数指针并将其传递给方法是行不通的。
问题是,您正在使用一个只能用D
调用的方法,并试图将其作为指向一个函数的指针来传递,该函数可以使用不一定是D
的Base
。反之亦然(即将Base::createNew()
传递给采用D::createNew()
的函数,因为Base::createNew()
总是存在于D中,而不是相反)
try:
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
之类的东西。
在修复了代码中的以下琐碎编译器错误后,
class
正文后缺少;
- 将
D:createNew
更改为D::createNew
- 在
public
说明符中制作D::createNew
您的代码不能在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);
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队