NSA - Non Solo Amiga

SOFTWARE => Linguaggi di programmazione e scripting => Topic aperto da: clros - 21 ſettembre 2011, 19:10:10

Titolo: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 21 ſettembre 2011, 19:10:10
Codice: [Seleziona]
struct myStruct
{

 //Ctor
 myStruct()
 {
 }

 void function_2()
 {
  //come faccio da qui a richiamare la function_1?? (attenzione, si tratta di una struct e nn di una classe (anche se dovrebbero essere la    stessa cosa...)
  //this.function_1?
  //boost::bind??
  //std::bind??
 }

private:
 void function_1(int a)
 {
  //...
 }

}
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: TheKaneB - 21 ſettembre 2011, 20:46:30
In C++ le struct funzionano quasi esattamente come le classi.

L'unica differenza è che le classi sono "default private" e le struct sono "default public". Questo implica anche la presenza del puntatore "this" e di tutte le altre cose che fai normalmente.

Quindi puoi chiamare function_1() oppure this->function_1() (attenzione non ci vuole il "punto" . perchè this è un puntatore) esattamente come se fosse una classe...

Ah, una cosa... non implementare i metodi direttamente in quel modo, è orrendo. Metti l'implementazione in un file cpp separato e usa la notazione void myStruct::function_1() { } esattamente come se fosse una classe.

Se proprio devi implementare il corpo dei metodi nell'header, allora fallo alla fine, in questo modo:

Codice: [Seleziona]
// myStruct.h
#pragma once
struct myStruct
{
public: // il default è già public, ma specificarlo non guasta
  myStruct();
  void function_2();

private:
  void function_1();
};

// Da qui in poi l'implementazione... se non ti piace qui, puoi fare cut-paste su un file .cpp separato

//Ctor
myStruct::myStruct()
{
}

void myStruct::function_2()
{
  //come faccio da qui a richiamare la function_1?? (attenzione, si tratta di una struct e nn di una classe (anche se dovrebbero essere la    stessa cosa...)
  //this.function_1?
  //boost::bind??
  //std::bind??

  function_1(42);
}

void myStruct::function_1(int a)
{
  //...
}
// END - myStruct.h
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: TheKaneB - 21 ſettembre 2011, 20:48:12
PS, leggasi curiosità mia: perchè usare una Struct quando in C++ praticamente non hanno senso? :D
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 21 ſettembre 2011, 22:32:52
Uhmmm
ma a fare stessa cosa cn std::bind o boost::bind? Il problema in realtà è proprio questo per me!
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: TheKaneB - 21 ſettembre 2011, 23:01:19
Citazione da: "clros"
Uhmmm
ma a fare stessa cosa cn std::bind o boost::bind? Il problema in realtà è proprio questo per me!

Non conosco Boost, fai un esempio concreto di codice e vediamo che si può fare... :-)
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: cdimauro - 21 ſettembre 2011, 23:02:40
Citazione da: "TheKaneB"
PS, leggasi curiosità mia: perchè usare una Struct quando in C++ praticamente non hanno senso? :D
Beh, dovresti chiederlo a Stroustrup. :D
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: TheKaneB - 21 ſettembre 2011, 23:12:19
Citazione da: "cdimauro"
Citazione da: "TheKaneB"
PS, leggasi curiosità mia: perchè usare una Struct quando in C++ praticamente non hanno senso? :D
Beh, dovresti chiederlo a Stroustrup. :D

Ho il suo libro, domani controllo se lo dice... prevedo bestemmie, preparate gli ombrelli che pioveranno santi da tutti i lati...  :whistle:  :shhh:  :shifty:
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 21 ſettembre 2011, 23:39:55
Citazione da: "TheKaneB"
Citazione da: "clros"
Uhmmm
ma a fare stessa cosa cn std::bind o boost::bind? Il problema in realtà è proprio questo per me!

Non conosco Boost, fai un esempio concreto di codice e vediamo che si può fare... :-)

Allora, con std::bind, farei:

std::bind(this->myFunction,54);//54 ad esempio è il parametro intero da passare alla funzione membro da richiamare

oppure, cn boost:

boost::bind(this->myFunction,this,54);

Queste due righe danno errori di compilazione!
E, purtroppo devo richiamare per forza la mia funzione membro così (motivo: sto usando le semantic actions di boost::spirit che NON supportano le funzioni lambda di C++11 vedi:http://http://boost.2283326.n4.nabble.com/Semantic-actions-1-and-member-functions-td3828384.html)
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 21 ſettembre 2011, 23:49:20
Codice: [Seleziona]
#include <iostream>
#include <functional>

using namespace std;

struct myStruct
{
    void function_1()
    {
        std::bind(function_2,45);
    }

  private:
        void function_2(int n)
        {
            cout<<"richiamata funzione 2"<<endl;
        }
};

Questo non compila su GCC4.6.1...problemi cn bind....
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: Z80Fan - 22 ſettembre 2011, 00:24:02
Citazione da: "clros"
Codice: [Seleziona]
#include <iostream>
#include <functional>

using namespace std;

struct myStruct
{
    void function_1()
    {
        std::bind(function_2,45);
    }

  private:
        void function_2(int n)
        {
            cout<<"richiamata funzione 2"<<endl;
        }
};

Questo non compila su GCC4.6.1...problemi cn bind....

Quello scrittura funzionerebbe se function_2 fosse una funzione a se stante. Poichè è un membro di myStruct, devi:
- chiamarla myStruct::function_2, per far contento il compilatore;
- devi passare a bind l'indirizzo della funzione, con &myStruct::function_2, per far contento il compilatore;
- come secondo parametro di bind devi passare un riferimento all'istanza dell'oggetto, che può essere anche un puntatore, quindi passerai this.

Quindi:
Codice: [Seleziona]
bind(&myStruct::function_2, this, 45);
per fare anche la chiamata all'oggetto funzione risultante, basta inserire alla fine della riga le parentesi:
Codice: [Seleziona]
bind(&myStruct::function_2, this, 45)();
Fonti:
http://www.boost.org/doc/libs/1_47_0/li ... /bind.html (http://www.boost.org/doc/libs/1_47_0/libs/bind/bind.html)
http://stackoverflow.com/questions/5274 ... tbind-work (http://stackoverflow.com/questions/527413/how-boostfunction-and-boostbind-work)
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 22 ſettembre 2011, 21:49:46
Ok, risolto!
In effetti avevo anche provato il metodo suggerito da z80fan (ma poi ho avuto dubbi perchè cmq non funzionava e pensavo che i metodi delle strutture si richiamassero in maniera differente e non con il ::)

Cmq il problema era con il placeholder _1 : io usavo quello del namespace sbagliato e ottenevo errori di compilazione! E per questo pensavo che l'errore fosse sul richiamo della funzione membro!

In ogni caso, grazie a tutti!!

P.S.: mi sa che ads il progetto sta davvero diventando trp complesso per me...devo trovare qualcuno che mi aiuti...
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: cdimauro - 22 ſettembre 2011, 21:53:38
Python? 8-)
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 22 ſettembre 2011, 21:55:57
Citazione da: "TheKaneB"

Ah, una cosa... non implementare i metodi direttamente in quel modo, è orrendo. Metti l'implementazione in un file cpp separato e usa la notazione void myStruct::function_1() { } esattamente come se fosse una classe.

Se proprio devi implementare il corpo dei metodi nell'header, allora fallo alla fine, in questo modo: [...]


Si si hai perfettamente ragione, è così che faccio sempre solo che per farvi vedere il codice ho tagliato un bel po' di roba e messo tt insieme per farvi vedere il tutto con un solo colpo d'occhio!
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: TheKaneB - 22 ſettembre 2011, 21:58:21
Citazione da: "cdimauro"
Python? 8-)

tu sei un serpente tentatore  :lol:
ti insinui strisciando tra le discussioni più spinose del C++, avvolgi la preda tra le spire e... "track" gli spezzi le ossa semplicemente esclamando "Python!".  :lol:  :ugeek:

@clros: ma che bravo studente!  :angelic-green:
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 22 ſettembre 2011, 21:59:02
Citazione da: "cdimauro"
Python? 8-)
C++11 e Java per la GUI! :D
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: cdimauro - 22 ſettembre 2011, 22:05:25
Sono un Pyvangelist.  :mrgreen:
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: cdimauro - 22 ſettembre 2011, 22:07:05
Citazione da: "clros"
Citazione da: "cdimauro"
Python? 8-)
C++11 e Java per la GUI! :D
:shock: Sei un pazzo! Ma perché non ti affidi a strumenti più comodi e produttivi?

In questo periodo sto realizzando un'applicazione in IronPython + WPF (per la GUI) e sto GO-DEN-DO, scrivendo poche righe di codice e ottenendo risultati notevoli.
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: clros - 22 ſettembre 2011, 22:19:00
Citazione da: "cdimauro"
Citazione da: "clros"
Citazione da: "cdimauro"
Python? 8-)
C++11 e Java per la GUI! :D
:shock: Sei un pazzo! Ma perché non ti affidi a strumenti più comodi e produttivi?

In questo periodo sto realizzando un'applicazione in IronPython + WPF (per la GUI) e sto GO-DEN-DO, scrivendo poche righe di codice e ottenendo risultati notevoli.
Purtroppo nn conosco Python..anche se come detto diverse volte mi piacerebbe impararlo...però è anche vero che ads convertire tutto in un altro linguaggio credo sia abbastanza difficile...ci ripenserò seriamente dopo che la versione 1.3 sarà pronta...
Titolo: Re: [C++] Richiamare funzione membro di una struct
Inserito da: cdimauro - 22 ſettembre 2011, 22:23:15
OK. Comunque se hai imparato C++11, in mezz'ora con Python lavori già. ;)