Comprensione sintassi visual c++

di il
11 risposte

Comprensione sintassi visual c++

Salve a tutti, usando il visual c++ .net mi sono imbattuto in alcune righe di codice con sintassi da me sconosciuta e mai vista, come ad esempio:

[ClassInterfaceAttribute(ClassInterfaceType::AutoDispatch)]

[DefaultBindingPropertyAttribute(L"Text")]   //la "L" cosa sarebbe?

[ComVisibleAttribute(true)]


questa l'ho trovata sulla documentazione microsoft

oppure ad esempio questo:

this->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Form1_MouseDown);
quel "+=" cosa sarebbe?

vi ringrazio per l'attenzione e disponibilità

11 Risposte

  • Re: Comprensione sintassi visual c++

    Ciao dna_programmer,
    come ti dicevo non uso il C++ in NetFramework, però all' ultima domanda ti so rispondere in quanto la questione è la stessa in C# o Visual Basic:

    Come già sai, tu puoi specificare quale funzione richiamare quando premi un pulsante, quello che è meno noto è che puoi specificare un elenco di funzioni e non usa sola. I vari controlli hanno l' evento MouseDown che è in pratica la lista delle funzioni che verranno richiamate (tutte) quando premerai quel controllo.

    Per specificare queste funzioni fai: (scrivo in C#)
    
    button1.MouseDown += MyFunction1;
    // di solito ti fermi qui, ma e se na hai voglia ne aggiungi altre
    button1.MouseDown += MyFunction2;
    
    Così come le aggiungi le puoi togliere col -=
    
    button1.MouseDown -= MyFunction2;
    
    Dopo questa chiamata il bottone smetterà di chiamare MyFunction2.
  • Re: Comprensione sintassi visual c++

    Ciao barba, senti per poter capire meglio quanto hai detto, mi potresti fare una panoramica generale della gestione degli eventi, cioè ad esempio cos'è il mousedown, oppure il MouseEventHandler, insomma un pò in generale.
    Ti ringrazio ancora per la disponibilità e pazienza
  • Re: Comprensione sintassi visual c++

    Domanda un po troppo impegnativa, ti scrivo solo qualche pensiero senza nessuna pretesa.

    Quello che si vuole ottenere è che quando premi su un bottone (o fai altre cose) venga richiamata una certa funzione scritta da te in cui specifichi le azioni da eseguire. Il concetto è semplice come ottenerlo un po meno. Ogni linguaggio ha i suoi sistemi e si usano concetti come puntatori a funzione, delegati, EventHandler ecc. in C#, dato che hanno potuto inventersi la sintassi ex novo, sono riusciti a farlo in maniera molto semplice. Ti basta scrivere:
    
    button1.MouseDown += MyFunction;
    
    In realtà si è arrivati a questo risultato dopo un processo di semplificazione, che ha portato a nascondere cosa c' è dietro e come funziona, ma ha reso più semplice la vita a chi programma.

    In realta quando il compilatore legge quella riga la interpreta come se tu avessi scritto:
    
    this.button1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyFunction);
    
    MouseEventHandler è un oggetto di tipo EventHandler che in pratica funge da puntatore a metodo (la differenza tra puntatore a metodo e puntatore a funzione ti è chiara?) e button1.MouseDown è un 'Evento', ovvero un oggetto che contiene una lista di EventHandler (di cui abbiamo accennato nei post precedenti).

    Per ora mi fermo qui, meglio digerire queste cose un po alla volta.
  • Re: Comprensione sintassi visual c++

    Allora per prima cosa ti volevo ancora ringraziare della tua disponibilità nello spiegare qualsiasi argomento, di qualsiasi difficoltà(in questo caso complesso).

    per quanto riguarda il topic, prima di farti domande su quanto scritto volevo chiederti:

    1)so cosa sono più o meno i puntatori a funzione,ma i puntatori a metodi è la prima volta che li sento(non dovrebbe essere più o meno la stessa cosa di quelli a funzione ?)

    2)in pratica MouseDown cos'è un array che contiene tutte le funzioni che verranno chiamate?
  • Re: Comprensione sintassi visual c++

    dna_programmer ha scritto:


    in pratica MouseDown cos'è un array che contiene tutte le funzioni che verranno chiamate?
    Si. E per essere precisi diciamo che non si tratta di funzioni ma di metodi di oggetti (o meglio delegati), cosi introduciamo il secondo argomemto.

    dna_programmer ha scritto:


    so cosa sono più o meno i puntatori a funzione,ma i puntatori a metodi è la prima volta che li sento(non dovrebbe essere più o meno la stessa cosa di quelli a funzione ?)
    Ho scritto puntatori a metodo ma a essere precisi dovevo dire 'delegati'.
    Tanto per comiciare in NetFramework non puoi scrivere una funzione, puoi solo scrivere metodi, tutto deve stare dentro una classe (questo l' ha preso da Java). Quindi per parlare di puntatori a funzione uso il C++.

    Nel caso dei puntatori a funzione supponi di avere due funzioni, una scrive 'ciao' e l' altra 'hello', puoi assegnare l' indirizzo di una funzione ad un puntatore e poi richiamarla attraverso di esso:
    
    #include <iostream>
    using namespace std;
    
    void FunctionCiao()
    {
    	cout << "Ciao";
    }
    
    void FunctionHello()
    {
    	cout << "Hello";
    }
    
    int main()
    {
    	void (*f)() = FunctionCiao; 
    	f(); // scrive Ciao
    
    	f = FunctionHello;
    	f(); // scrive Hello
    
    	int n = sizeof(f);
    	return 0;
    }
    
    Il puntatore f contiene l' indirizzo della funzione, la funzione è un blocco di codice che si trova in un certo posto nella memoria, per eseguirla basta spostare il program counter del programma a quella posizione (ho semplificato ma è cosi).
    Se esamini col debugger la variable f vedrai che contiene un numero e che la sua dimensione è di 4 byte.

    Ora invece supponi di avere una classe 'Persona' che ha un metodo che scrive il suo nome.
    
    class Persona
    {
    public:
    	string nome;
    
    	Persona(string nome) 
    	{
    		this->nome = nome;
    	}
    
    	void Scrivi()
    	{
    		cout << nome.c_str();
    	}
    };
    
    Non puoi fare la stessa cosa, cioè non puoi semplicemente richiamare la funzione Scrivi (cosa scrive? Mario, Antonio Piero?) devi prima creare un oggetto persona e poi richiamare la funzione Scrivi passandole l' indirizzo dell'oggetto (il famoso this). Quindi ti servono due informazioni, l' indirizzo del metodo e l' indirizzo dell' oggetto. Una entità che racchiude queste informazioni viene chiamato 'Delegato'.

    Nello standard del C++ non esistono i delegati (mi pare), però esistono i puntatori a metodo che sono una cosa leggermente diversa e si usano in questo modo:
    
    	Persona mario("Mario");
    	Persona luigi("Luigi");
    
    	void (Persona::* m) () = &Persona::Scrivi;
    	(mario.*m)();
    
    Ma di questo non ne parliamo. Se ci fosse una classe delegato (esisterà sicuramente qualcosa, per ora invento) si potrebbe usare in questo modo:
    
      Delegate d = mario.Scrivi();
      d(); // scrive Mario;
    
      d = luigi.Scrivi();
      d(); // scrive Luigi;
    
    Riassumendo, un puntatore a funzione contiene l' indirizzo di una funzione (è un numero di 4 byte), un delegato invece contiene due informazioni, l' indirizzo di una funzione e l' indirizzo di un oggetto.
  • Re: Comprensione sintassi visual c++

    Allora come al solito non mi sono chiari alcuni punti:

    a) tu dici che in .NET non è possibile scrivere funzioni, perché ? in VB.NET se scrivo:
    
    Public Class Form1
        Private b As Integer
        Private h As Integer
    
        Public Function area() As Integer
            b = 10
            h = 5
    
            Return b * h
    
        End Function
    End Class
    
    questa non è una funzione?

    b)Non ho capito se i puntatori e metodo sono la stessa cosa dei delegati

    c)Per quanto riguarda la creazione di un delegato, come si procede?
  • Re: Comprensione sintassi visual c++

    dna_programmer ha scritto:


    tu dici che in .NET non è possibile scrivere funzioni, perché ? in VB.NET se scrivo:
    Abbiamo parlato in C++, VB, C# la nomenclatura nei tre linguaggi è differente ed è facile fare confusione. Comunque in OOP una funzione dentro una classe viene chiamata 'metodo', in C++ è possibile scrivere metodi e funzioni (quelle fuori dalle classi) in .Net puoi scrivere solo metodi, non puoi scrivere funzioni fuori dalle classi. Poi in VB i 'metodi' vengono marcati con la parola chiave 'Function' (mentre in C# no) ma il concetto rimane.

    dna_programmer ha scritto:


    Non ho capito se i puntatori e metodo sono la stessa cosa dei delegati
    Anche qui aver parlato di C++ e NetFramework ha creato confusione. In C++ non c' è problema perchè esistono i puntatori a metodo e non i delegati. Anche in NetFramework non c' è problema in quanto esistono solo i delegati (su questo potrei sbagliare). In ogni caso il concetto di puntatore a metodo del C++ e di Delegato del NetFramework sono due cose diverse.

    dna_programmer ha scritto:


    Per quanto riguarda la creazione di un delegato, come si procede?
    Prima dichiari il tipo del delegato in questo modo (scrivo in C#):
    
    delegate int MyDelegate(int a);
    
    Hai dichiarato il tipo MyDelegate che potra fare riferimento a metodi di oggetti a patto che la loro firma sia del tipo 'int f(int)', ad esempio:
    
    class Gigio
    {
       public int Doppio(int n) { return n * 2; }
       public int Mezzo(int n) { return n / 2; }
    }
    
    Quindi al nostro MyDelegate potremo assegnare uno di quei due metodi in questo modo:
    
    Gigio gigio = new Gigio();
    MyDelegate d = new MyDelegate(gigio.Doppio);
    // e poi lo usi cosi:
    int n = d(5);  // n conterrà 10
    
    Questo è come deve essere fatto facendo i bravi e scrivendo tutto per bene, poi dato che siamo pigri (o meglio abbiamo poco tempo da perdere) il C# ci permette di scrivere più semplicemente:
    
    Gigio gigio = new Gigio();
    MyDelegate d = gigio.Mezzo;
    int n = d(100);  // n conterrà 50
    
    Manca la new MyDelegate, non si capisce bene che si sta creando un oggetto (cosa che viene comunque fatta dal compilatore) ma è più leggibile.
  • Re: Comprensione sintassi visual c++

    Ok,ora mi è tutto più chiaro,ancora domande però

    a)potresti spiegare la procedura dei delegati(o meglio puntatori a metodi) per quanto riguarda il C++?
    b)non riesco a capire il legame che c'è tra i delegati e il fatto degli eventi
    c)in generale quando vengono usati i delegati , e i puntatori a funzione
  • Re: Comprensione sintassi visual c++

    Forse per quel che riguarda il C++ è meglio aprire un thread specifico, altrimenti faccio una gran confusione tra concetti C++ e NetFramework

    Il legame che c' è tra i delegati e gli eventi è molto semplice, quando arriva un evento (che alla fine è un messaggio di Windows, ad esempio WM_MOUSE_CLICK) viene richiamata una funzione che controlla se tu hai specificato un delegato, nel qual caso lo chiama. Più semplice di cosi.
  • Re: Comprensione sintassi visual c++

    In generale quando vengono usati i delegati e i puntatori a funzione? Quindi se ho capito bene i metodi che noi andiamo a scrivere ( button1_click esempio) sono i delegati?
  • Re: Comprensione sintassi visual c++

    dna_programmer ha scritto:


    In generale quando vengono usati i delegati e i puntatori a funzione?
    (dato che abbiamo deciso di attenerci al NetFramework) I puntatori a funzione in NetFramework non ci sono, si usano i delegati.

    dna_programmer ha scritto:


    Quindi se ho capito bene i metodi che noi andiamo a scrivere ( button1_click esempio) sono i delegati?
    Facciamo il classico esempio con un form Form1, un pulsante button1 e il metodo button1_Click
    
    private void button1_Click(object sender, EventArgs e)
    {
    }
    
    Questo è un metodo della classe Form1 (non è un delegato è un metodo).
    
    this.button1.Click += new System.EventHandler(this.button1_Click);
    
    // che si può scrivere più semplicemente cosi:
    
    button1.Click += button1_Click;
    
    Button1.Click è il delegato e a questo delegato assegni il metodo button1_Click.

    Poi se vogliamo essere precisi diciamo che Button1.Click in realtà è un EventHandler che è un particolare tipo di delegato chiamato MulticastDelegate (in pratica è una lista di delegati) però il concetto rimane quello di prima.

    Forse il termine italiano 'delegato' (che è un participio passato) crea confusione e ti fa pensate al metodo che viene richiamato, Button1.Click verrebbe voglia di chiamarlo 'delegante' (participio presente) ma che ci vuoi fare ce lo teniamo cosi.
Devi accedere o registrarti per scrivere nel forum
11 risposte