C++ 类中具有指向函数的指针的结构是否需要类外函数的前向声明?

C++ 类中具有指向函数的指针的结构是否需要类外函数的前向声明?,c++,pointers,struct,forward-declaration,C++,Pointers,Struct,Forward Declaration,我的类菜单中有一个包含菜单项属性的私有结构。这些属性之一是指向函数的指针。当我在类外转发声明函数时,我所写的似乎是有效的,但是在类外定义函数似乎是非常糟糕的做法 #pragma once #include <string> //forward declaration outside the class void completelyRandom();//does not throw error class Menu { private: typedef void(*Men

我的类菜单中有一个包含菜单项属性的私有结构。这些属性之一是指向函数的指针。当我在类外转发声明函数时,我所写的似乎是有效的,但是在类外定义函数似乎是非常糟糕的做法

#pragma once
#include <string>

//forward declaration outside the class
void completelyRandom();//does not throw error
class Menu
{

private:
    typedef void(*Menu_Processing_Function_Ptr)();

    struct MenuItem
    {
        unsigned int  number;
        const char *  text;
        Menu_Processing_Function_Ptr p_processing_function;
    };

    MenuItem menu[] =
    {
        {1, "Completely random", completelyRandom}

    };

public:
    Menu();

    ~Menu();
};
#pragma一次
#包括
//类外转发声明
完全无效随机()//不会抛出错误
班级菜单
{
私人:
typedef void(*菜单_处理_功能_Ptr)();
结构菜单项
{
无符号整数;
常量字符*文本;
菜单处理功能Ptr p处理功能;
};
菜单项菜单[]=
{
{1,“完全随机”,完全随机}
};
公众:
菜单();
~Menu();
};
下面是一些抛出错误的代码,但更接近我所希望的:

#pragma once
#include <string>


class Menu
{

private:
    typedef void(*Menu_Processing_Function_Ptr)();

    struct MenuItem
    {
        unsigned int  number;
        const char *  text;
        Menu_Processing_Function_Ptr p_processing_function;
    };

    MenuItem menu[1] =
    {
        {1, "Completely random", completelyRandom}

    };

public:
    Menu();
    //declaration within the class
void completelyRandom();//does throw error
    ~Menu();
};
#pragma一次
#包括
班级菜单
{
私人:
typedef void(*菜单_处理_功能_Ptr)();
结构菜单项
{
无符号整数;
常量字符*文本;
菜单处理功能Ptr p处理功能;
};
菜单项菜单[1]=
{
{1,“完全随机”,完全随机}
};
公众:
菜单();
//类内的声明
void completelyRandom();//是否引发错误
~Menu();
};
我尝试在菜单范围内移动completelyRadom()声明,但得到了错误

类型为“void(Menu::*)()”的值不能用于初始化类型为“Menu::Menu\u Processing\u Function\u Ptr”的实体

是否有一种方法可以在最佳实践中向前声明函数?或者我应该后悔我糟糕的设计选择,重新开始吗?

“非静态成员函数(实例方法)有一个隐式参数(this指针),它是指向它正在操作的对象的指针,因此对象的类型必须包含在函数指针的类型中。”

检查此代码以获取示例:

#pragma once
#include <string>

class Menu
{

private:
    //By specifying the class type for the pointer -> 'Menu::' in this case 
    // we no longer have to forward declare the functions
    //outside of the class
    typedef void(Menu::*Menu_Processing_Function_Ptr)();

    struct MenuItem
    {
        unsigned int  number;
        const char *  text;
        Menu_Processing_Function_Ptr p_processing_function;
    };

    MenuItem menu[1] =
    {
        {1, "Completely random", completelyRandom}

    };

public:
    Menu();
void completelyRandom(); // no longer throws an error
};
#pragma一次
#包括
班级菜单
{
私人:
//在本例中,通过指定指针->'菜单::'的类类型
//我们不再需要向前声明函数
//课外
typedef void(菜单::*菜单\处理\功能\ Ptr)();
结构菜单项
{
无符号整数;
常量字符*文本;
菜单处理功能Ptr p处理功能;
};
菜单项菜单[1]=
{
{1,“完全随机”,完全随机}
};
公众:
菜单();
void completelyRandom();//不再抛出错误
};

显示的代码中唯一的错误是,如果没有大小,则无法定义数组。必须指定
菜单
数组的大小。这也是显示的唯一错误(如果设置数组的大小,它将消失)。因此,请创建一个适当的程序,我们可以自己复制和复制问题。如果您提供初始化列表,则不能。在这种情况下,暗示大小为1。不适用于类内内联初始化,因为类中不允许这样做。另请参见。您展示的第二个示例确实应该给出您所说的错误,这是因为指向非成员函数的指针并不等于指向成员函数的指针。(非静态)成员函数需要调用一个对象(在函数内部成为
this
),该对象作为隐藏的第一个参数隐式传递。非成员函数没有,我明白了。我没有想到搜索“指向成员函数的指针”而不是“指向函数的指针”。快速检查似乎提供了一个解决方案——明天我就要睡着了,我将试一试。将为其他人发布解决方案,以查看是否一切都很好。谢谢你的帮助!