Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    8

    [C++] uso di un vettore di puntatori a funzioni

    Salve, mi trovo a dover usare un vettore a puntatori a funzioni all'interno di una classe.

    Dopo aver definito le varie funzioni come public ho definito come private nella classe stessa "Machine"

    codice:
    bool (Machine::*funzArr[20])(int);

    Ho poi assegnato i valori al vettore mettendo

    codice:
    bool (Machine::*funzArr[20])(int) = { &Machine::mSelect
    (risparmio di mettere tutte le funzioni )

    Devo ora in una funzione della stessa classe Machine chiamare una specifica funzione tra le 20 possibili... e non so come fare

    Pensavo bastasse un

    codice:
    funzArr[numero](parametro);
    ma compilando mi dice che

    error; must use .* or ->* to call poiinter-to-member function

    ovvero... se ho capito bene... serve un'istanza della classe.

    Suggerimenti?

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    prova a vedere qui ,se nessuno ti risponde , io personalmente non so come fare , ma so usare google




    http://www.codeguru.com/cpp/cpp/arti...r-Function.htm



    in particolare questo listato di codice ,dovrebbe fare a caso tuo .

    codice:
    #include <stdio.h>
    #include <string>
    #include <iostream>
    class Printer{//An abstract printing machine
    public:
      void Copy(char * buff, const char * source){//copy the file
        strcpy(buff, source);
      }
      void Append(char * buff, const char * source){//extend the file
        strcat(buff, source);
      }
    };
     
    enum OPTIONS { COPY, APPEND };//two possible commands in the menu.
    typedef void(Printer::*PTR) (char*, const char*);//pointer-to-member function 
     
    void working(OPTIONS option,
    Printer* machine,
    char* buff,
    const char* infostr){
     
      PTR pmf[2]= {&Printer::Copy, &Printer::Append}; //pointer array 
     
      switch (option){
      case COPY:
        (machine->*pmf[COPY])(buff, infostr);
        break;
      case APPEND:
        (machine->*pmf[APPEND])(buff, infostr);
        break;
      }
    }
     
    int main(){
      OPTIONS option; 
      Printer machine;
      char buff[40];//target
     
      working(COPY, &machine, buff, "Strings ");  
      working(APPEND, &machine, buff, "are concatenated! ");
     
      std::cout<<buff<<std::endl;
    } 
    Output:
      Strings are concatenated!
    Tecnologia

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    8
    Sì l'avevo vista ma non ce ne sto levando le gambe lo stesso...

    il mio problema è che dovrei utilizzare le varie funzioni all'interno di una specifica funzione della stessa classe...

    ho provato ad usare la chiamata

    codice:
    bool res = (*this.*funzArr[chiamata])(times);
    e compila normalmente... eseguendo però il programma... si blocca tutto...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Perché la tua assegnazione funzioni bisogna che il metodo mSelect sia dichiarato statico.
    Vedi per esempio qui:
    http://support.microsoft.com/kb/94579
    Il motivo per cui deve essere dichiarato statico è abbastanza ovvio:
    se non fosse statico infatti su quale istanza dovrebbe essere chiamato quel metodo?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.