代码之家  ›  专栏  ›  技术社区  ›  NaturalDemon

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

  •  -2
  • NaturalDemon  · 技术社区  · 4 年前

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

    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();
        
    }
    

    它会导致以下错误:

    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))'
    

    这只是一个傀儡,但那是我要做的。
    如何正确操作?

    1 回复  |  直到 4 年前
        1
  •  2
  •   fabian    4 年前

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

    如果你使用 using <return type> (*)(<parameter types>)

    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);
    

    void *p(int, int) 作为 (void*) p(int, int) .

    推荐文章