Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++;创建指向头中所有公共静态成员函数的指针数组,然后使用它_C++_Arrays_Member Function Pointers - Fatal编程技术网

C++ C++;创建指向头中所有公共静态成员函数的指针数组,然后使用它

C++ C++;创建指向头中所有公共静态成员函数的指针数组,然后使用它,c++,arrays,member-function-pointers,C++,Arrays,Member Function Pointers,[Ubuntu 13.10] 我正在创建一个包含一系列回调函数的类。在我的主程序中,我将这些回调分配给各个节点。我希望能够在循环中实现这一点,因此我尝试在头类(no.cpp)中创建一个静态指针数组,该数组包含其成员函数的所有地址 我似乎无法想出这样做的语法 1) 下面是我的头定义类。我初始化cbPointer的方式正确吗 #include "std_msgs/String.h" typedef void (*FunctionPointer)(const std_msgs::String_<

[Ubuntu 13.10]

我正在创建一个包含一系列回调函数的类。在我的主程序中,我将这些回调分配给各个节点。我希望能够在循环中实现这一点,因此我尝试在头类(no.cpp)中创建一个静态指针数组,该数组包含其成员函数的所有地址

我似乎无法想出这样做的语法

1) 下面是我的头定义类。我初始化cbPointer的方式正确吗

#include "std_msgs/String.h"

typedef void (*FunctionPointer)(const std_msgs::String_<std::allocator<void> >::ConstPtr &);

class myCallbacks {

public:


    static void cbEvent1(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }

    static void cbEvent2(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }

    constexpr static const FunctionPointer cbPointer[2] = {&myCallbacks::cbEvent1, &myCallbacks::cbEvent2};

};
但是我得到一个链接错误:
未定义对myCallbacks::cbPointer的引用
。我尝试了
subList[j]=(sNode[j])->subscribe(myCallbacks::cbPointer[j])的各种变体但似乎没有任何效果

有人能帮我解释一下正确的语法吗?
(另外,是否可以在不拼写每个函数名的情况下在标题中创建thet数组?

我已经找到了实现方法:

#ifndef MYCALLBACKS_H
#define MYCALLBACKS_H

#include "std_msgs/String.h"

typedef void (*FunctionPointer)(const std_msgs::String_<std::allocator<void> >::ConstPtr &);

class myCallbacks {

public:


    static void cbEvent1(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }

    static void cbEvent2(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }

    static FunctionPointer cbPointer[];

}
FunctionPointer myCallbacks::cbPointer[] = {&myCallbacks::cbEvent1, &myCallbacks::cbEvent2};

#endif
\ifndef MYCALLBACKS\u H
#定义MYCALLBACKS\u H
#包括“标准msgs/String.h”
typedef void(*FunctionPointer)(const std_msgs::String_uu::ConstPtr&);
类myCallbacks{
公众:
静态void cbEvent1(const std_msgs::String::ConstPtr&msg){

std::除了声明之外,您不能在.cpp文件中定义
cbPointer
?不,在头文件中定义所有数据。在头文件中定义数据是一个坏主意,因为它可能违反。通过在头文件中定义数组,您有违反的风险。如果头文件包含在多个翻译单元中(即,通过多个.cpp文件),则每个转换单元将获得数组的一个副本,这违反了ODR。正确的方法是为静态数据成员定义使用一个单独的.cpp文件,并且只在头文件中保留声明。是的,它有点冗长,但会为您以后省去麻烦。是的,我没有在代码中包含#ifndef指令,我会添加它。@SchighSchagh,ic。这会导致错误,还是只是使可执行文件变大?(此标题用作较大对象的子对象,不会单独包含在任何其他内容中。)请发表评论?
template<class M , class T >
subscribe (void(T::*fp)(M))
#ifndef MYCALLBACKS_H
#define MYCALLBACKS_H

#include "std_msgs/String.h"

typedef void (*FunctionPointer)(const std_msgs::String_<std::allocator<void> >::ConstPtr &);

class myCallbacks {

public:


    static void cbEvent1(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }

    static void cbEvent2(const std_msgs::String::ConstPtr& msg) {
            std::cout << "I heard: " << msg->data.c_str() << std::endl;
    }

    static FunctionPointer cbPointer[];

}
FunctionPointer myCallbacks::cbPointer[] = {&myCallbacks::cbEvent1, &myCallbacks::cbEvent2};

#endif