Autore Topic: [C++] Richiamare funzione membro di una struct  (Letto 4192 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
[C++] Richiamare funzione membro di una struct
« il: 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)
 {
  //...
 }

}
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] Richiamare funzione membro di una struct
« Risposta #1 il: 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
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] Richiamare funzione membro di una struct
« Risposta #2 il: 21 ſettembre 2011, 20:48:12 »
PS, leggasi curiosità mia: perchè usare una Struct quando in C++ praticamente non hanno senso? :D
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #3 il: 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!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] Richiamare funzione membro di una struct
« Risposta #4 il: 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... :-)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #5 il: 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

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] Richiamare funzione membro di una struct
« Risposta #6 il: 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:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #7 il: 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)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #8 il: 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....
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re: [C++] Richiamare funzione membro di una struct
« Risposta #9 il: 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://stackoverflow.com/questions/5274 ... tbind-work
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #10 il: 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...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #11 il: 22 ſettembre 2011, 21:53:38 »
Python? 8-)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #12 il: 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!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] Richiamare funzione membro di una struct
« Risposta #13 il: 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:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] Richiamare funzione membro di una struct
« Risposta #14 il: 22 ſettembre 2011, 21:59:02 »
Citazione da: "cdimauro"
Python? 8-)
C++11 e Java per la GUI! :D
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Tags: