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

如何使结构中的变量带有指向非静态成员函数的指针?[副本]

  •  1
  • Owen  · 技术社区  · 1 年前

    我正在创建一个与神经网络相关的项目。当得到输出时,我想让一个神经元调用之前所有神经元的“ReturnValue”函数。我已经创建了一个具有上述函数的神经元类。我希望能够将这些函数指针存储在结构中(将其与其他一些适用的数据值配对),然后将该结构存储在向量中。总之,上一层中的每个神经元在向量中都有一个条目。每个条目都是一个结构,包含一个函数指针和其他一些东西。我的问题是,我一开始就无法获得指向函数的指针。下面是一些代码进行说明。

    #include <iostream>
    #include <vector>
    
    struct previous_neuron_struct {
        double weight;
        double (*funcPtr)(); //I think that this is correct
    };
    
    class neuron {
    public:
        double value;
        std::vector<previous_neuron_struct> previous_neurons_vector;
    
        double Return_Value() {
            return value;
        }
    };
    
    int main() {
        neuron neuron1;
        neuron neuron2;
        //I know that it would be easier to avoid pointers, but this better illustrates the environment of the actual use case.
        previous_neuron_struct* temp = new previous_neuron_struct;
        temp->weight = 0.5;
        temp->funcPtr = neuron2.Return_Value; //<- Problem is here
    
    //Rest of code
    }
    
    

    第25行是有问题的一行。我遇到的星号或与号的组合都不允许我将neuron2.return_value()的地址(而不是返回值)放入temp->funcPtr。此示例代码现在将为我提供Visual Studio错误代码0300: a pointer to a bound function may only be used to call the function 。但我在一些教程网站上看到的组合略有不同, neuron2.*Return_Value; 我明白了 Identifier "Return_Value" is undefined 谢谢

    1 回复  |  直到 1 年前
        1
  •  1
  •   user12002570    1 年前

    声明和调用成员函数指针的语法与普通指针的语法不同。语法如下所示:

    struct previous_neuron_struct {
        double weight;
        double (neuron::*funcPtr)();  //syntax for declaring member function pointer 
    };
    int main() {
        //other code as before
        temp->funcPtr = &neuron::Return_Value; //works now
        std::invoke( temp->funcPtr, neuron1);  //call
    
        (neuron1.*(temp->funcPtr))();//another way of calling
    }
    

    Working demo