|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
[C++]array di puntatori a funzione in una classe-help!
Buongiorno,
Vi scrivo per chiederVi consiglio, ecco in breve il mio problema: necessito di realizzare una classe (Con interfaccia de implementazione separate) che consentano l'uso di un menu controllato da un vettore di puntatori a funzione (Per chi conosce il libro "C++ fondamenti di programmazione" della apogeo, autori Deitel & Deitel, sto parlando dell'esercizio 8.28) In breve, quello che mi serve è riuscire a far funzionare una cosa del genere, al quale certamente mancherà della roba: Codice:
//Classe.h
class Classe
{
public:
classe();
void menuPrincipale();
void funzione0(); // stampa "funzione0"
void funzione1(); // stampa "funzione1"
void funzione2(); // termina la sessione
private:
bool continua;
};
Codice:
//Classe.cpp
#include <iostream>
using std::endl;
using std::cin;
using std::cout;
#include "Classe.h" /* ovviamente salverò header e implementazione nella
stessa directory */
Classe::Classe()
{
void (*vettore[3])() = {funzione0, funzione1, funzione2}; /* ecco, Il
problema sta qui: questa dovrebbe essere la dichiarazione di un
vettore di tre puntatori a funzioni, ma non riesco a capire DOVE va
dichiarato, ne COME!!! */
continua = true;
cout << "Speriamo funzioni! :( \n";
}
void Classe::menuPrincipale()
{
int scelta;
cout << "Inserire un numero tra zero ed uno, due per uscire: ";
cin >> scelta;
while(continua != false)
{
if((scelta >= 0) && (scelta < 3))
{
(*vettore[scelta])();
cout << "Inserire un numero tra zero ed uno, due per uscire: ";
cin >> scelta;
}
else
{
cout << scelta << " : opzione non valida\n"
<< "Inserire un numero tra zero ed uno, due per uscire: ";
cin >> scelta;
} // fine dell'if/else
} // fine del while
}
void Classe::funzione0()
{
cout << "Hai selezionato la prima funzione\n";
}
void Classe::funzione1()
{
cout << "hai selezionato la seconda funzione\n";
}
void Classe::funzione2()
{
continua = false;
}
Codice:
//main che usa il tutto
#include "Classe.h"
int main()
{
classe miaClasse;
miaClasse.menuPrincipale;
system("PAUSE");
return 0;
}
Spero possiate aiutarmi Distinti saluti, a presto. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Io direi di fare così:
Codice:
// Questo va nell'header
typedef void (*f_callback)(); // così definisci il tipo "f_callback" come puntatore a funzione
class Classe
{
public:
Classe();
~Classe();
void funzione0();
void funzione1();
void funzione2();
private:
f_callback *aFunzioni;
};
Codice:
// Questo va nel sorgente
Classe::Classe()
{
aFunzioni = new f_callback[3];
if (!aFunzioni)
{
cerr << "Allocazione fallita" << endl;
}
aFunzioni[0] = &funzione0;
aFunzioni[1] = &funzione1;
aFunzioni[2] = &funzione2;
}
Classe::~Classe()
{
if (aFunzioni)
{
delete aFunzioni;
}
}
P.S.: finisci il progetto o quello che stai studiando, e appena avrai tempo libero prova a dare un'occhiata a Code::Blocks invece che Dev-C++. È decisamente migliore.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Questa è la mia soluzione:
Codice:
#include <iostream>
using std::endl;
using std::cin;
using std::cout;
class Classe
{
public:
Classe();
void menuPrincipale();
void funzione0(); // stampa "funzione0"
void funzione1(); // stampa "funzione1"
void funzione2(); // termina la sessione
private:
bool continua;
void (Classe::*vettore[3])();
};
Classe::Classe()
{
//void (*vettore[3])() = {funzione0, funzione1, funzione2};
vettore[0] = &Classe::funzione0;
vettore[1] = &Classe::funzione1;
vettore[2] = &Classe::funzione2;
continua = true;
cout << "Speriamo funzioni! :( \n";
}
void Classe::menuPrincipale()
{
int scelta;
cout << "Inserire un numero tra zero ed uno, due per uscire: ";
cin >> scelta;
while(continua != false)
{
if((scelta >= 0) && (scelta < 3))
{
(this->*vettore[scelta])();
cout << "Inserire un numero tra zero ed uno, due per uscire: ";
cin >> scelta;
}
else
{
cout << scelta << " : opzione non valida\n"
<< "Inserire un numero tra zero ed uno, due per uscire: ";
cin >> scelta;
} // fine dell'if/else
} // fine del while
}
void Classe::funzione0()
{
cout << "Hai selezionato la prima funzione\n";
}
void Classe::funzione1()
{
cout << "hai selezionato la seconda funzione\n";
}
void Classe::funzione2()
{
continua = false;
}
int main()
{
Classe miaClasse;
miaClasse.menuPrincipale();
system("PAUSE");
return 0;
}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
In effetti sì, manca. Sono ancora troppo abituato alla malloc() del C.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 16-10-2008 alle 20:48. |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
FUNZIONA!!!
(vabè, con qualche piccolo inconveniente, mi tocca digitare due volte due per uscire, ma quelli son dettagli) Non avevo la minima idea di Come dichiadare il vettore di puntatori, adesso ho le idee un po' più chiare, grazie Ho scelto la tua soluzione perchè bene o male non fa ricorso ad istruzioni che non conosco (std::nothrow???) ma anche la soluzione col typedef era pensata bene. Io non ci sarei mai arrivato. Vi ringrazio ancora tutti, a presto! |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
Ho parlato troppo presto
Vedo che anche nella soluzone sopra c'è una istruzione che non conosco: "this->"... Come funziona? |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
int *variabile = new (nothrow) int[100]; Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Scusa ma vuoi fare un array di puntatori a metodo (che non sono esattamente dei puntatori a funzione ma qualcosa di sintatticamente e logicamente più complesso) e non sai cosa significa "this->"?
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
Conosco l'operatore freccia dal C, ma il "this" è la prima volta che lo vedo
E quel programma, senza il this, non funziona, quindi significa che occorre inserirlo. L'operatore puntatore a struttura accede ai membri di una struttura attraverso un puntatore alla stessa" ("C, corso completo di programmazione", edizioni apogeo. Autori: Deitel & Deitel, pg 352) quindi se ho ben capito "this" funziona da puntatore a quello che indica la freccia (l'operatore puntatore a struttura insomma). indipendentemente dal tipo di dato a cui punta, giusto? Nel caso sopra puntava ad un elemento di un vettore che a sua volta conteneva l'indirizzo di una funzione, che quindi viene eseguita. Ho capito bene? Cercherò di fare qualche prova comunque |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Provincia Tv
Messaggi: 1208
|
Bhe' il this e' una parola chiave del c++. E' un puntatore all'oggetto che invoca il metodo. Per comodita' molte volte viene omesso, ma e' implicito. Forse e' per questo che non l'hai visto. Scusa ma conosci qualcosa di programmazione ad oggetti?
|
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
Molto poco, lo confesso. Sto studiando il libro suddetto ("C++ fondamenti di programmazione") e anche se non devo diventare un ingegnere informatico (Ma bensì elettronico
Ma quindi, tornando alla istruzione this, la si può usare solo con gli oggetti? Qual'è esattamente la sua sintassi? E perchè nell'esempio sopra se viene omesso il compilatore mi da errore?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Provincia Tv
Messaggi: 1208
|
Bhe' dimmi cosa hai scritto di preciso... a naso credo di tratti un problema di precedenza di operatori.
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Provincia Tv
Messaggi: 1208
|
Scusa mi ero dimenticato parte della domanda. Si', il this ha senso solo con la programmazione ad oggetti.
|
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
Nel programma suggeritomi dal Sig. VIncenzo1968 nella funzione "MenuPrincipale()" della classe c'è la seguente istruzione:
(this->*vettore[scelta])(); dove compare appunto detto operatore. Togliendolo il compilatore segnala un errore, segno questo che è necessario. Comincio a capire comunque: se avessi scritto semplicemente " vettore[scelta] " non avrebbe avuto senso perchè occorreva che Qualcosa facesse quello che stava scritto nella locazione puntata dall'elemento selezionato nel vettore, e questo "Qualcosa" è appunto l'operatore this... Continuo a cercare a giro chiarimenti al riguardo ma non sto trovando molto |
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
grazie per il Sig. Vincenzo1968 Compilando col visual studio senza l'operatore this, l'errore segnalato è questo: C2171 -> A unary operator is used with an invalid operand type. Su msdn viene fornito questo esempio: Codice:
// C2171_b.cpp
// compile with: /c
class A {
public:
A() { STF( &A::D ); }
void D() {}
void DTF() {
(*TF)(); // C2171
(this->*TF)(); // OK
}
void STF(void (A::*fnc)()) {
TF = fnc;
}
private:
void (A::*TF)();
};
Prova a fare una ricerca su google inserendo il codice dell'errore(o il messaggio). Ciao |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Se ho detto qualche boiata, perdonatemi, non sono una cima già di mio, poi sono pure stanco ed ecco fatto. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#19 |
|
Junior Member
Iscritto dal: Oct 2008
Città: Prato
Messaggi: 20
|
Sono riuscito ad inserire il codice suggeritomi nell'esercizio che mi interessava, ed ho anche capito come usarlo (Posso quindi replicarlo in altri esempi diversi, con piu funzioni ad esempio) e dal punto di vista funzionale basta questo
mi basta sapere come usare detta istruzione per creare classi simili a quella in esame in maniera bovina, per il resto pazienza Grazie di Cuore a tutti, siete stati gentilissimi. Buonanotte. |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Provincia Tv
Messaggi: 1208
|
Ti ripeto: per favore posta il codice e magari il messaggio di errore del compilatore, se no si rischia di far confusione.
Per cominciare il this NON e' un operatore, ma e' una parola chiave. Poi prova a dar un'occhiata a questo link Per la cronaca credo che l'utilizzo del this sia per motivi sintattici o implementativi: se tu avessi scritto vettore[scelta](), in teoria avrebbe funzionato se non fossimo stati in un contesto di classi. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:35.













mi basta sapere come usare detta istruzione per creare classi simili a quella in esame in maniera bovina, per il resto pazienza







