Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C++]Funzione membro non chiamata

    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ù:
    codice:
    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()
    codice:
    void Password::generate()
    {
       MPWD * mypwd = new MPWD;
       mypwd->setLength(length);
       mypwd->genSource(&sourcePassword);
       cout << "Password generata: " << mypwd->getPassword() << endl;
      delete mypwd;
      
      
      
    }
    classe MPWD
    codice:
    #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.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Cosa ci fa un metodo "menu" nella classe Password ?
    Il menù? Cosa vuoi dire ?

    main
    codice:
    #include <iostream>
    #include "pwd.h"
    int main(void) {
      
      Password *pwd = new Password;
        pwd->menu();
        delete pwd;
        return 0;
    }
    pwd.h
    codice:
    #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)
    codice:
    #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

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai un metodo menu

    void Password::menu()

    in una classe che dovrebbe gestire una password ...

    Forse c'è un po' di confusione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    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.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ecco l'intera codifica della classe Password:
    codice:
    #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;
      
      
      
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nella setLength la exit è fuori dalla if ... mancano le { }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    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:
    codice:
    cout<< *sourcePtr << endl; //funge
    cout << *(sourcePtr + 5) << endl; //non funge
    cout << sourcePtr[5] << endl //non funge
    perché?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    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:
    codice:
    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)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.