tablou de functii

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
david_stelian
Junior
Junior
Posts: 17
Joined: 13 Sep 2014, 22:35
Judet: Dolj

tablou de functii

Post by david_stelian » 21 Nov 2017, 12:40

Buna ziua!

In codul urmator am incercat sa afisez 4 functii grupate intr-un tablou de functii cu ajutorul unui pointer catre tabloul de functii.
void (tab[4])() - tablou de 4 functii ce returneaza void; - compilatorul genereaza eroare ???
in schimb site-ul https://cdecl.org/ zice ca este ok.
Nu am reusit, asadar am nevoie de ajutor.
Astept pareri.

Code: Select all

#include <iostream>
using namespace std;

class MyClass
{
public:
    MyClass()
    {
        cout << "\n MyClass() called!" << endl;
    }
    void MyFunc();
    void func1();
    void func2();
    void func3();
    void func4();
};

int main()
{
    MyClass obj;
    obj.MyFunc();
    return 0;
}

void MyClass::func1()
{
    cout << "\n Called Func1!" << endl;
}

void MyClass::func2()
{
    cout << "\n Called Func2!" << endl;
}

void MyClass::func3()
{
    cout << "\n Called Func3!" << endl;
}

void MyClass::func4()
{
    cout << "\n Called Func4!" << endl;
}

void MyClass::MyFunc()
{
    void (tab[4])() = { func1[0], func2[1], func3[2], func4[3] };
    void (*ptr)();
    ptr[0] = &func1[0];
    ptr[1] = &func2[1];
    ptr[2] = &func3[2];
    ptr[3] = &func4[3];
    for (int i=0; i<4; i++)
        ptr[i]();
}



Viorel
Microsoft MVP
Microsoft MVP
Posts: 287
Joined: 13 Jul 2007, 12:26

Re: tablou de functii

Post by Viorel » 21 Nov 2017, 17:57

Nu cred că există tablouri de funcții, dar e posibilă declararea unui tablou de pointeri spre funcții: ‘void (*tab[4])( )’. Dar acest tip de tablou nu va accepta funcții membru. Se vor utiliza ori funcții ne-membru, or funcții statice, de exemplu ‘static void func1()’. Pentru a simplifica definiția, poate fi adăugată o declarație separată a unui pointer:

Code: Select all

class MyClass
{
   . . .
   static void func1();
   static void func2();
   static void func3();
   static void func4();
};

void MyClass::MyFunc()
{
   typedef void( *POINTER_SPRE_FUNCTIE )( );
   POINTER_SPRE_FUNCTIE tab[4] = { func1, func2, func3, func4 };

   for( int i = 0; i < 4; i++ )
   {
      POINTER_SPRE_FUNCTIE ptr = tab[i];
      ptr();
   }
}
Pentru cazul funcțiilor membru care nu sînt statice:

Code: Select all

typedef void ( MyClass::*POINTER_SPRE_FUNCTIE )( );
POINTER_SPRE_FUNCTIE tab[4] = { &MyClass::func1, &MyClass::func2, &MyClass::func3, &MyClass::func4 };
for( int i = 0; i < 4; i++ )
{
   POINTER_SPRE_FUNCTIE ptr = tab[i];
   (this->*ptr)();
}

david_stelian
Junior
Junior
Posts: 17
Joined: 13 Sep 2014, 22:35
Judet: Dolj

Re: tablou de functii

Post by david_stelian » 21 Nov 2017, 20:38

Multumesc pt raspuns.

Post Reply