Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Problema puntatori a funzione

    Vi illustro il problema...

    Sto costruendo una classe per fare un menù di scelta fra varie funzioni nella consolle.
    La voglio fare piu generica possibile in modo che la posso usare con tutti i programmi che farò.
    Per dirgli quale funzione deve eseguire quando avvieve la scelta ho una variabile membro puntatore a funzione e al momento della costruzione gli passo tutte le funzioni in un vettore di puntatori a funzione...
    fin qui tutto ok, ma per avere massima portatilità ho bisogno di passare parametri di vario tipo ai puntatori...
    come faccio!?!?

    Questa è la dichiarazione della classe:

    codice:
    #ifndef _MENU_CLASS_
    	#define _MENU_CLASS_
    	
    	#pragma once
    
    #include <iostream>
    #include "conio.c"
    using namespace std;
    
    namespace mnx
    {
    
    typedef void (*fPtr)();
    typedef char* String;
    
    // Element of menu
    class Word
    {
    public:
    	String name;
    	short x, y;
    	fPtr fp;	// Pointer to function
    
    	Word(String name, short x, short y, fPtr fp);
    	Word();
    };
    
    // The Menu
    class Menu
    {
    private:
    	Word *_Menu;
    	String title;		// Title of Menu
    	const short X, Y;	// Default coordinates
    
    	void WriteMenu();
    
    public:
    	short numElem;
    
    	Menu(String Title, short numElem, String vctString[], fPtr vctFun[]);
    	~Menu();
    	
    	short Choice();
    	void Function(short fun);
    };
    
    } // END mnx
    
    #endif /* _MENU_CLASS_ */
    Grazie in anticipo!
    ciao ciao!

  2. #2
    Puoi passare un puntatore void e poi fare il cast che ti serve:
    codice:
    typedef (*fPtr)(void**);
    
    /*... Codice ...*/
    
    void funzione_che_richiede_int(void **parameters){
    
       int a = ((int)**parameters) + 5;
    
       return a;
    
    }
    
    void funzione_che_richiede_stringa(void **parameters){
    
       char *string = (char*)*parameters;
    
       printf("%s\n", string);
    
    }

  3. #3
    scusa per il ritardo...

    e ancora non l'ho provato, perché questo periodo sono molto indaffarato...

    comunque grazie mille per la risposta!!


    ciao

  4. #4
    Mi dispiace riportare a galla un problema vecchio...

    ma mi ci sono messo solo ora a provare e devo ammettere che questa soluzione non ho ben capito come farla.
    Riesprimo il problema:

    Ho bisogno di poter passare i parametri ai puntatori a funzione della classe, in quantità e tipo indefiniti, in modo che il mio menu possa concepire tutte le funzioni che gli passerò...
    non so nemmeno se è possibile fare una cosa del genere... ma è x questo che chiedo aiuto!
    grazie a tutti!


  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Io adotterei un approccio diverso basato su oggetti funzione.
    codice:
    struct MenuItem {
       virtual void execute()=0;
    };
    
    
    struct MenuItemA : public MenuItem {
       Type1 param1;
       Type2 param2;
       void execute() {
           // qualcosa con param1 e param2
       }
    };
    
    struct MenuItemB : public MenuItem {
       Type1 param1;
       Type2 param2;
       Type1 param3;
       Type1 param4;
       void execute() {
           // qualcosa con param1, param2, param3, param4
       }
    };
    
    vector<MenutItem*> menuList;
    menuList.push_back(new MenuItemA);
    menuList.push_back(new MenuItemB);
    
    for(int i=0;i<menuList.size();i++) {
       menuList[i]->execute();
    }
    Ovviamente prima dovrai settare i parametri delle varie classi.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.