不能在类型转换为void *的对象上调用成员函数指针
Cannot call a member function pointer on a object typecasted as void *
所以我想使用成员函数指针的原因是调用函数从一个地方,对象的类型是未知的,其中所有的对象被视为void *对象。但我不能这样做,即使理性地似乎函数指针指向子程序的地址,因此对象的类型应该是无关紧要的。我的假设是,系统所要做的就是将"this"指针设置为调用成员函数指针的对象。下面是我的代码。我怎样才能实现我想要的
class C2
{
public:
int y;
void SetValue(int);
};
void C2::SetValue(int k)
{
cout<<"Setting Value inside C2"<<endl;
y=k;
}
int main()
{
void (C2::*f)(int);
C2 *Ob=new C2();
void *Ob2=(void *)Ob;
f = &C2::SetValue;
((Ob2)->*f)(10);
}
这段代码甚至不能用vc++编译器编译,错误为
错误C2296: '->*':非法,左操作数类型为'void *'
好吧,你的问题的简单解决方案是static_cast
你的Ob2
到正确的类型,因为你需要知道函数属于的类:
(static_cast<C2*>(Ob2)->*f)(10);
你可以用模板自动完成:
template <typename Ret, class C, typename... Params, typename... Args>
Ret callMemPtr (Ret (C::*fun) (Params...), void* obj, Args&&... args)
{
return (static_cast<C*>(obj)->*fun)(std::forward<Args>(args)...);
}
//usage
callMemPtr(f,Ob2,10);
然而,这似乎是一种奇怪的方法。您最好使用继承或某种形式的类型擦除。
按理说,函数指针似乎指向子程序的地址,因此对象的类型应该是无关紧要的。
虽然指向独立函数的指针和指向static
成员函数的指针都是正确的,但是指向实例成员函数的指针是不同的。指向成员函数的指针可以是一个数据结构,而不是单个指针,因为它需要支持虚拟分派。
考虑以下代码片段:
#include <iostream>
struct Base {
virtual void foo() = 0;
};
struct Derived : public Base {
virtual void foo() {
std::cout << "Hello" << std::endl;
}
};
typedef void (Base::*MemFn)();
int main() {
Derived d;
MemFn f(&Base::foo);
(d.*f)();
return 0;
}
上面,f
是指向Base::foo
的指针,但是Derived::foo
被调用了(demo)。
这就是为什么不能将函数指针转换为void*
的原因之一。Void指针是指向数据的指针,而函数指针是指向代码的指针。
我不知道你为什么要这样做,但是你可以这样做:
#include <iostream>
class test
{
public:
test(){}
void echo(int x)
{
std::cout << "I'm being called: " << x << std::endl;
}
};
int main()
{
test t;
(t.*((void(test::*)(int))&test::echo))(10);
std::cin.get();
return 0;
}
相关文章:
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 在 transform() 中调用成员函数
- C++::在构造函数退出之前通过指针调用成员函数
- 为什么我可以通过野生指针调用成员函数
- 从 Qt 中的信号调用成员函数的问题
- 调用C++成员函数指针,而不知道哪个类
- 如何从嵌套在命名空间中的类调用成员函数?
- 无法在非成员函数中调用成员函数
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 通过带有成员函数指针的 QHash 调用成员函数的正确方法
- 使用可变参数模板调用成员函数
- 调用成员对象的构造函数
- 有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
- 如何调用成员初始化器列表中参考成员的构造函数
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
- 在另一个成员函数中调用成员函数时'int'之前的预期主表达式
- 为什么调用成员函数不调用该对象的 ODR-USE?
- 如何在模板参数中调用成员
- 是否可以使用 EXPECT_CALL 来验证模拟对象的构造函数是否在某些时候调用成员函数?