Тема: Створення масиву методів

Я раніше створював масив функцій для того щоб не використовувати розгалуження.
Ось приклад

#include <stdlib.h>
#include <iostream>
#include <conio.h>
using namespace std;

void main1()
{
    cout << "-> " << (char)251 << "1";
}

void main2()
{
    cout << "-> " << (char)251 << "2";
}

void main3()
{
    cout << "-> " << (char)251 << "3";
}

void main4()
{
    cout << "-> " << (char)251 << "4";
}

void Go_exit()
{
    exit(0);
}

void(*MAS_FYNK[5])() = {main1,main2,main3,main4,Go_exit};

int main()
{
    int namber_main;
    cout << "1) - \n2) - \n3) - \n4) - \n5) - Exit\nEnter the namber ->";
    cin >> namber_main;
    namber_main = abs(namber_main);
    if (namber_main > 5 || namber_main == 0)
        cout << "Error! " << namber_main << " > 5";
    else
        MAS_FYNK[namber_main - 1]();
    getch();
    return 0;
}

але в класі чомусь не виходить, підкажіть чому ?
файл MyClass.h (на ньому я і хочу створити масив методів)

#pragma once
class MyClass
{
    int choice;//Вибір пункта меню
public:
    MyClass();
    ~MyClass();
    void Menu();
    void CheckingStatements();
    void(*Items[1])() = { CheckingStatements };
};

і інші файли

#include "MyClass.h"
#include <iostream>

using namespace std;

MyClass::MyClass()
{
}


MyClass::~MyClass()
{
}

void MyClass::Menu()
{
    cout << "1 - Знайти чи є вірним висловлювання";
    cout << "->";
    cin >> choice;
}



#include <iostream>
#include <conio.h>
#include "MyClass.h"

using namespace std;

int main()
{
    setlocale(LC_ALL, "");
    MyClass obj;
    obj.Menu();
    getch();
    return 0;
}

2

Re: Створення масиву методів

Бо CheckingStatements - це не void(), це void MyClass::(), тобто функція-член MyClass, і треба проголошувати Items відповідно:

void (MyClass::*(Items[1]))() = {&MyClass::CheckingStatements};

На пальцях, чому це різні речі: коли ви пишете a.f(x), то насправді відбувається виклик f(&a,x), причому перший (неявний) параметр має назву this. Відповідно, якщо замість функції-члену викликати функцію - не член, буде важкий UB.

Подякували: Betterthanyou, quez, Arete, Chemist-i4

3

Re: Створення масиву методів

koala написав:

Бо CheckingStatements - це не void(), це void MyClass::(), тобто функція-член MyClass, і треба проголошувати Items відповідно:

void (MyClass::*(Items[1]))() = {&MyClass::CheckingStatements};

На пальцях, чому це різні речі: коли ви пишете a.f(x), то насправді відбувається виклик f(&a,x), причому перший (неявний) параметр має назву this. Відповідно, якщо замість функції-члену викликати функцію - не член, буде важкий UB.

Я бачив краєм ока, що такий запис хочуть дозволити в C++17, тоді здивувався то́му, наскільки дивні ідеї проскакують, тепер же дивуюсь, чому так не можна зараз.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

4

Re: Створення масиву методів

#pragma once
class MyClass
{
    int choice;//Вибір пункта меню
public:
    MyClass();
    ~MyClass();
    void Menu();
    void CheckingStatements();
    void (MyClass::*(Items[1]))() = { &MyClass::CheckingStatements };
};

В мене помилки
Ошибка    1    error C2276: &: недопустимая операция с выражением привязанной функции-члена
Ошибка    2    error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции

5

Re: Створення масиву методів

В якому рядку помилка 1? (На майбутнє - якщо очевидно, що якась помилка викликана попередніми, то не треба її наводити; а в C++ дуже часто одна помилка створює ще ланцюжок інших, так що зазвичай достатньо повідомляти тільки першу помилку).

6

Re: Створення масиву методів

koala написав:

В якому рядку помилка 1? (На майбутнє - якщо очевидно, що якась помилка викликана попередніми, то не треба її наводити; а в C++ дуже часто одна помилка створює ще ланцюжок інших, так що зазвичай достатньо повідомляти тільки першу помилку).

рядок 10

7 Востаннє редагувалося koala (04.11.2014 00:40:13)

Re: Створення масиву методів

Не знаю, що цій VS потрібно; у прикладі від авторів все так само. Спробуйте:
- прибрати масив, лишити вказівник;
- проголосити (typedef) новий тип - вказівник на функцію-член MyClass.
Щось спрацювало?

8

Re: Створення масиву методів

Масив прибирав ті самі помилки
а з typedef щось не зрозумів що ви маєте на увазі ось так:

typedef void (MyClass::*(Items))(); Items;
Подякували: koala1

9

Re: Створення масиву методів

А яка у вас версія VS?

10

Re: Створення масиву методів

Visual Studio 2013