Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针问题:如何提供从非成员函数到成员函数的指针_C++_Function Pointers - Fatal编程技术网

C++ 函数指针问题:如何提供从非成员函数到成员函数的指针

C++ 函数指针问题:如何提供从非成员函数到成员函数的指针,c++,function-pointers,C++,Function Pointers,在我的一个项目中,我需要做这样的事情 class Alpha{ public: Alpha(void* p(int, int) = nullptr); void* calculatePointer; void test(); }; Alpha::Alpha(void* p(int, int)) : calculatePointer(p){}; Alpha::test(){ calculatePointer

在我的一个项目中,我需要做这样的事情

class Alpha{
    
public:
    Alpha(void* p(int, int) = nullptr);
        
    void* calculatePointer;
    
    void test();
};
    

Alpha::Alpha(void* p(int, int)) : calculatePointer(p){};

Alpha::test(){
        calculatePointer(5, 10);
    }  


  
    
void calculate(int a, int b){
    std::cout << "cum: " << a +b << "\n";  
}
    
    
int main(){
    
    Alpha A = Alpha(&calculate);
    A.test();
    
}
这只是个傀儡,但这就是我要做的。

如何正确执行?

如果您对函数指针的确切语法感到困惑,最好定义一个类型别名

如果您使用
使用
,则“rhs”是
(*)()


括号是必需的,因为编译器将
void*p(int,int)
视为
(void*)p(int,int)

计算器指针是一个void*,它不是一个函数,您希望如何将函数指针存储到其中而不进行强制转换?不要因为它是UB而强制转换,所以请更改您的类型ha,这就是我要问的,正确的语法。
calculateinter
具有type
void*
。这不是函数指针。将其类型更改为
void(*)(int,int)
,这是指向接受两个
int
并返回一个
void
的函数的指针。另外,在构造函数中更改参数
p
的类型,因为它指定参数是指向返回
void*
的函数的指针(而传递的函数返回
void
)。@n.1.8e9-where's-my-sharem。在我的项目中,我有一个类,它希望作为驻留在“int main(){…}”正上方的绘图函数访问;在让函数自己工作之前,不要尝试获取指向函数的指针以在类中工作。实际上,如果不这样做,它就不会编译:(*p),但它现在可以编译了。
error: invalid conversion from ‘void* (*)(int, int)’ to ‘void*’ [-fpermissive]
       15 |     : calculatePointer(p),
          |                        ^
          |                        |
          |                        void* (*)(int, int)
error: cannot initialize a member subobject of type 'void *' with an lvalue of type 'void *(*)(int, int)'
     error: expression cannot be used as a function
     In constructor 'Alpha::Alpha(void* (*)(int, int))':
    error: invalid conversion from 'void (*)(int, int)' to 'void* (*)(int, int)' [-fpermissive]
note: initializing argument 1 of 'Alpha::Alpha(void* (*)(int, int))'
class Alpha{
    
public:
    using FunctionPtr = void (*)(int, int);

    Alpha(FunctionPtr p = nullptr) : calculatePointer(p) {}
        
    FunctionPtr calculatePointer;
    
    void test()
    {
        if (calculatePointer != nullptr)
        {
            calculatePointer(5, 10);
        }
    }
};
    
void calculate(int a, int b){
    std::cout << "sum: " << (a + b) << "\n";  
}
Alpha(void (*p)(int, int) = nullptr);