PDA

Visualizza la versione completa : [C++]Funzione membro non chiamata


signoredeltempo
01-03-2013, 15:51
Salve a tutti.
Sto creando un programma in C++ per la generazione di password che utilizza due classi ed un menù. Quando inserisco il numero 5, per generare la password, la funzione della classe adibita a tale operazione non viene chiamata.
Infatti, inserendo un banale messaggio in output non viene visualizzato.
Ecco i frammenti relativi:

Menù:

void Password::menu()
{
while (true){
cout << "Quale opzione desidera?" << endl;
cout << "1. Ottieni lunghezza password" << endl
<< "2. Caratteri da utilizzare" << endl
<< "3. Mostra seme password" << endl
<< "4. Inserisci lunghezza."<< endl
<< "5. Genera" << endl
<< "6. Esci" << endl;
int scelta;
cin >> scelta;
switch (scelta)
{
case 1: cout << "Lunghezza password: "<<getLength() << endl; break;
case 3: cout << "Stringa sorgente: "<<getSource()<<endl; break;
case 6: exit(0); break;
case 5: generate(); break;
case 2: componiSource(); break;
case 4: cin >> length; break;
default: cout << "Menù inesistente!" << endl;


}
}
}


generate()

void Password::generate()
{
MPWD * mypwd = new MPWD;
mypwd->setLength(length);
mypwd->genSource(&sourcePassword);
cout << "Password generata: " << mypwd->getPassword() << endl;
delete mypwd;



}
classe MPWD

#include "makepwd.h"
#include <string>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
void MPWD::setLength(int _length)
{
length = (_length > 0 ? _length : -1);
if (length == -1)
cout << "ERRORE: la lunghezza deve essere maggiore di 1!" << endl;
exit(0);
}
string MPWD::getPassword()
{
return password;
}

void MPWD::genSource(const string *sourcePtr)
{

if (sourcePtr->length() <= 0)
{
cout << "ERRORE: sorgente invalido. " << endl;
exit(0);
}

//generazione carattere random
for (int i = 0; i < length; i++)
{
srand(time(0));
for (int j = 0; j < length*(rand()%1000); j++);
password += sourcePtr[rand() % sourcePtr->length()];

}
}
Il problema deve essere limitato a quella funzione, perché setLength funziona tranquillamente.
Chiaramente ogni suggerimento è ben accetto.

Saluti. :ciauz:

oregon
01-03-2013, 15:57
Non è ben chiara l'organizzazione del codice ...

Cosa ci fa un metodo "menu" nella classe Password ?

Qual è il main ?

Non si vedono le dichiarazioni delle classi ...

signoredeltempo
01-03-2013, 16:01
Originariamente inviato da oregon
Cosa ci fa un metodo "menu" nella classe Password ?

Il menù? Cosa vuoi dire :confused: ?

main

#include <iostream>
#include "pwd.h"
int main(void) {

Password *pwd = new Password;
pwd->menu();
delete pwd;
return 0;
}


pwd.h

#ifndef PWD_H
#define PWD_H
#include <string>
using std::string;

class Password
{
private:
int length;
string password, sourcePassword;
public:
void menu();
void generate();
void componiSource();
string getSource();
int getLength();




};

#endif

makepwd.h (mpwd)

#ifndef MAKEPWD_H
#define MAKEPWD_H
#include <string>

class MPWD
{
public:
void setLength( int );
std::string getPassword();
void genSource(const std::string *);
private:
int length;
std::string password;

};

#endif

oregon
01-03-2013, 16:07
Hai un metodo menu

void Password::menu()

in una classe che dovrebbe gestire una password ...

Forse c'è un po' di confusione ...

signoredeltempo
01-03-2013, 16:12
La classe Password gestisce la maggior parte degli aspetti dello scopo. Mentre la classe MPWD si occupa di produrre la password nello specifico.
Ma in ogni caso cambiare l'organizzazione non risolverà il problema, che è il motivo per cui stiamo discutendo.

oregon
01-03-2013, 16:28
Ma in ogni caso cambiare l'organizzazione non risolverà il problema

Questo è certo, ma quando esamino un problema cerco sempre prima di capire come è organizzato un programma. Era un commento sull'organizzazione del codice, non una soluzione al problema.

Il fatto è che, comunque, ancora il codice non è compilabile perché manca il codice di alcuni metodi quindi non si può fare un test completo.

signoredeltempo
01-03-2013, 21:55
Ecco l'intera codifica della classe Password:

#include "pwd.h"
#include <iostream>
#include <string>
#include <new>
#include "makepwd.h"
#include <cstdlib>
using namespace std;

void Password::menu()
{
while (true){
cout << "Quale opzione desidera?" << endl;
cout << "1. Ottieni lunghezza password" << endl
<< "2. Caratteri da utilizzare" << endl
<< "3. Mostra seme password" << endl
<< "4. Inserisci lunghezza."<< endl
<< "5. Genera" << endl
<< "6. Esci" << endl;
int scelta;
cin >> scelta;
switch (scelta)
{
case 1: cout << "Lunghezza password: "<<getLength() << endl; break;
case 3: cout << "Stringa sorgente: "<<getSource()<<endl; break;
case 6: exit(0); break;
case 5: generate(); break;
case 2: componiSource(); break;
case 4: cin >> length; break;
default: cout << "Menù inesistente!" << endl;


}
}
}

string Password::getSource()
{
return sourcePassword;
}

int Password::getLength()
{
return length;
}

void Password::componiSource()
{

cout << "\tSeme password attuale: " << getSource() << endl;
cout << "\tCosa aggiungere?" << endl
<< "\t1. Numeri 0-9" << endl
<< "\t2. Caratteri a-z" << endl
<< "\t3. Caratteri A-Z" << endl
<< "\t4. Personalizzato" << endl
<< "\t5. Torna al menù principale" << endl;
int scelta;
cin >> scelta;
string _tmp;
switch (scelta)
{
case 1: sourcePassword += "0123456789"; cout << "::Caratteri aggiunti" << endl; break;
case 2: for (char i = 'a'; i <= 'z'; i++){ sourcePassword += i; }
break;
case 3: for (char i = 'A'; i <= 'Z'; i++){ sourcePassword += i; }
break;
case 4: cin >> _tmp; sourcePassword += _tmp; break;
case 5: menu();
default: cout <<"--Numero errato." << endl;


}

}




void Password::generate()
{
MPWD * mypwd = new MPWD;
mypwd->setLength(length);
mypwd->genSource(&sourcePassword);
cout << "Password generata: " << mypwd->getPassword() << endl;
delete mypwd;



}

oregon
01-03-2013, 22:31
Nella setLength la exit è fuori dalla if ... mancano le { }

signoredeltempo
02-03-2013, 12:08
Corretto: c'è però un problema che mi affligge nella funzione MPWD::genSource(const string *).
In pratica non riesco a dereferenziare il puntatore con un offset/indice.
Ad esempio:


cout<< *sourcePtr << endl; //funge
cout << *(sourcePtr + 5) << endl; //non funge
cout << sourcePtr[5] << endl //non funge

perché?

Rising1
02-03-2013, 13:54
Originariamente inviato da signoredeltempo
Corretto: c'è però un problema che mi affligge nella funzione MPWD::genSource(const string *).
In pratica non riesco a dereferenziare il puntatore con un offset/indice.
Ad esempio:


cout<< *sourcePtr << endl; //funge
cout << *(sourcePtr + 5) << endl; //non funge
cout << sourcePtr[5] << endl //non funge

perché?

sourcePtr è un puntatore ad oggetto string?
in quel caso per ottenere il carattere nella posizione i devi usare

sourcePtr->at(i)

altrimenti facendo sourcePtr[i] ottieni l'iesimo elemento di un vettore di stringhe (che tra l'altro non hai inizializzato)

Loading