Структура внутри класса, который имеет указатель на функцию, требует предварительного объявления функций вне класса? - PullRequest
0 голосов
/ 06 ноября 2019

В моем классе есть частная структура, которая содержит атрибуты пунктов меню. одним из этих атрибутов является указатель на функцию. Кажется, что то, что я написал, работает, когда я пересылаю объявления функций вне класса, но определение функций вне класса кажется очень плохой практикой.

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

Я попытался переместить объявление полностьюRadom () по всемуОбласть меню, но появляется ошибка

a value of type "void (Menu::*)()" cannot be used to initialize an entity of type "Menu::Menu_Processing_Function_Ptr"

Есть ли способ, которым я могу переслать объявление функции, которая будет соответствовать передовым методам? Или я должен сожалеть о своем неудачном выборе дизайна и начинать все сначала?

1 Ответ

0 голосов
/ 06 ноября 2019

"Нестатические функции-члены (методы экземпляра) имеют неявный параметр (указатель this), который является указателем на объект, с которым он работает, поэтому тип объекта должен быть включен как часть типа объекта. указатель функции. "- https://en.wikipedia.org/wiki/Function_pointer

проверьте этот код для примера:

#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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...