Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]function object

    ciao .
    Ho scritto questa breve classe:

    codice:
    #pragma once
    #include <string>
    using namespace std;
    class CBase
    {
    public:
    	CBase(void);
    	~CBase(void);
    	string name ;
    	string Lastname;
    	virtual void call(CBase b);
    	virtual void call2(CBase b);
    };
    
    
    #include ".\base.h"
    #include <string>
    using namespace std;
    CBase::CBase(void)
    {
    }
    
    CBase::~CBase(void)
    {
    }
    class CProva:
    	public CBase
    {
    public:
    	CProva(void);
    	~CProva(void);
    	
    	
    };
    
    void CBase::call(CBase b)
    {
    	int i = 0;
    	i= 1;
    }
    void CBase::call2(CBase b)
    {
    	int i = 0;
    	i= 1;
    }
    
    int main()
    {
    	
    	
    	typedef void (CBase::*DerivedClassFunction)(CBase );
    
    	DerivedClassFunction my_memfunc_ptr;
    	my_memfunc_ptr = &CBase::call; 	
    	
    	std::map<std::string, DerivedClassFunction> m1;
    	m1["giugio"]= &CBase::call;
    	
    	my_memfunc_ptr = &CBase::call; 
    	m1["giugio2"]= &CBase::call2;
    	
    	
    	CBase y;
    	y.name = "giuseppe";
    	y.Lastname = "ferrari";
    
    	CBase p;
    	p.name = "pippo";
    	p.Lastname ="giugio";
    	
    	
    	(y.*my_memfunc_ptr)(p);
    	
    	
    	
    	// Map the functions to the names
    	/*m["foo"] = &foo;
    	m["bar"] = &bar;*/
    	// Display all of the mapped functions
    	/*std::map<std::string, std::string (*)()>::const_iterator it = m.begin();
    	std::map<std::string, std::string (*)()>::const_iterator end = m.end();*/
    	
    	std::map<std::string, DerivedClassFunction>::const_iterator it = m1.begin();
    	std::map<std::string, DerivedClassFunction>::const_iterator end = m1.end();
    	
    	while ( it != end ) {
    
    	DerivedClassFunction der = it->second;
    	(y.*der)(p);//--> richiamo la funzione
    	(y.*der)(y);//--> richiamo la funzione
    
    	++it;
    
    	}
    
    	
    }

    ecco , vorrei renderla generica , nella mia applicazione tutte le classi derivano da una CIfcBase e tutte le funzioni SetVarMEmbroIfc hanno di return type void e con parametro(CIfcBase), tutte.

    quindi ho stessi parametri e stesso type ,E' possibile creare una mappa di quaste funzioni e richiamarle all' occorrenza?
    quello che cambia è l'object che contiene la variabile membro , ma anche questo è di tipo CIfcbase.
    Grazie.

  2. #2

    Re: [c++]function object

    intendi una cosa del genere? (ho adattato il tuo codice con i i funtori std)
    Osserva anche che, dato che c'ero, ho messo i distruttori virtual.
    codice:
    #include <string>
    #include <map>
    #include <functional>
    using namespace std;
    class CBase
    {
    public:
    	CBase(void);
    	virtual ~CBase(void);
    	string name ;
    	string Lastname;
    	virtual void call(CBase b);
    	virtual void call2(CBase b);
    };
    
    
    #include <string>
    using namespace std;
    CBase::CBase(void)
    {
    }
    
    CBase::~CBase(void)
    {
    }
    class CProva:
    	public CBase
    {
    public:
    	CProva(void);
    	virtual ~CProva(void);
    	
    	
    };
    
    void CBase::call(CBase b)
    {
    	int i = 0;
    	i= 1;
    }
    void CBase::call2(CBase b)
    {
    	int i = 0;
    	i= 1;
    }
    
    int main()
    {
    	
    	typedef std::mem_fun1_t <void, CBase, CBase> MyMemberFunctor1Arg;
    	MyMemberFunctor1Arg aMemFunCall = std::mem_fun (&CBase::call);
    	MyMemberFunctor1Arg aMemFunCall2 = std::mem_fun (&CBase::call2);
    
    	
    	std::map<std::string, MyMemberFunctor1Arg > m1;
    	m1.insert (pair<std::string,MyMemberFunctor1Arg>("giugio",aMemFunCall));
    	m1.insert (pair<std::string,MyMemberFunctor1Arg>("giugio2",aMemFunCall2));
    	
    	
    	CBase y;
    	y.name = "giuseppe";
    	y.Lastname = "ferrari";
    
    	CBase p;
    	p.name = "pippo";
    	p.Lastname ="giugio";
    	
    	
    	// (y.*my_memfunc_ptr)(p);
    	aMemFunCall (&y, p);
    	
    	
    	// Map the functions to the names
    	/*m["foo"] = &foo;
    	m["bar"] = &bar;*/
    	// Display all of the mapped functions
    	/*std::map<std::string, std::string (*)()>::const_iterator it = m.begin();
    	std::map<std::string, std::string (*)()>::const_iterator end = m.end();*/
    	
    	std::map<std::string, MyMemberFunctor1Arg>::const_iterator it = m1.begin();
    	std::map<std::string, MyMemberFunctor1Arg>::const_iterator end = m1.end();
    	
    	while ( it != end ) {
    
    	MyMemberFunctor1Arg der = it->second;
    	
    	// (y.*der)(p);//--> richiamo la funzione
    	// (y.*der)(y);//--> richiamo la funzione
    	der (&y, p);	
    	der (&y, y);	
    	++it;
    
    	}	
    }

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.