NSA - Non Solo Amiga
SOFTWARE => Linguaggi di programmazione e scripting => Topic aperto da: clros - 21 ſettembre 2011, 19:10:10
-
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)
{
//...
}
}
-
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:
// 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
-
PS, leggasi curiosità mia: perchè usare una Struct quando in C++ praticamente non hanno senso? :D
-
Uhmmm
ma a fare stessa cosa cn std::bind o boost::bind? Il problema in realtà è proprio questo per me!
-
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... :-)
-
PS, leggasi curiosità mia: perchè usare una Struct quando in C++ praticamente non hanno senso? :D
Beh, dovresti chiederlo a Stroustrup. :D
-
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:
-
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)
-
#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....
-
#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:
bind(&myStruct::function_2, this, 45);
per fare anche la chiamata all'oggetto funzione risultante, basta inserire alla fine della riga le parentesi:
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)
-
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...
-
Python? 8-)
-
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!
-
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:
-
Python? 8-)
C++11 e Java per la GUI! :D
-
Sono un Pyvangelist. :mrgreen:
-
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.
-
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...
-
OK. Comunque se hai imparato C++11, in mezz'ora con Python lavori già. ;)