【问题标题】:Setting a class function to a pointer in constructor C++将类函数设置为构造函数C++中的指针
【发布时间】:2020-10-13 15:34:21
【问题描述】:

我有一个类,我希望在无参数构造时指向一个默认函数,但我希望在使用其中一个参数传入函数时更改该功能。

我收到错误“无法将“int (MyClass::*)(int myVar)”类型的值分配给“MyClass::funcptr”类型的实体” 但似乎 defaultFunction 应该将定义与函数指针相匹配。 我为此奋斗了一段时间,但我无法理解这里的问题所在。 任何帮助表示赞赏。

--MyClass.h--

class MyClass{
    private:
        typedef int (*funcptr)(const int myVar);
        funcptr myfuncptr;
        int defaultFunc(int myVar);
    public:
        MyClass(funcptr functionpointer);
        MyClass();
        void callFunction(int myVar);
        
};

--MyClass.cpp--

MyClass::MyClass(){
    myfuncptr = defaultFunc; //a value of type "int (MyClass::*)(int myVar)" cannot be assigned to an entity of type "MyClass::funcptr"

};

MyClass::MyClass(funcptr functionpointer){
    myfuncptr = functionpointer;
};

void MyClass::callFunction(int myVar){
    int i = (*myfuncptr)(myVar);

};
int MyClass::defaultFunc(int myVar){
    return myVar + 3;
};

【问题讨论】:

  • funcptr 是一个指向函数的指针。 &MyClass::defaultFunc(不是原始的defaultFunc,这是一个错误,除了 Microsoft 的不符合标准的编译器)是一个指向成员函数的指针。它们不一样。

标签: c++ function pointers constructor


【解决方案1】:

改成

        typedef std::function<int(int)> funcptr;

(顺便说一句,using 现在比 typedef 更惯用)和

myfuncptr = [this](int x){ return defaultFunc(x); };

【讨论】:

    【解决方案2】:

    我尝试了函数指针 typedef 和 using 的每种组合的感觉,但最后我认为 lambda 是有效的。感谢大家的帮助。

    --MyClass.h--

    class MyClass{
        private:
            std::function<int(int)> func;
            int defaultFunc(int myVar);
        public:
            MyClass(std::function<bool(int)> func);
            MyClass();
            void callFunction(int myVar);
            
    };
    

    --MyClass.cpp--

    MyClass::MyClass(){
        this->func = [=] (int a) {return defaultFunc(a);};
    
    };
    
    MyClass::MyClass(std::function<int(int)> func;){
        this->func = func;
    };
    
    void MyClass::callFunction(int myVar){
        int i = func(myVar);
    
    };
    int MyClass::defaultFunc(int myVar){
        return myVar + 3;
    };
    

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2022-01-21
      相关资源
      最近更新 更多