[C++] Problema con le classi
Ciao a tutti
sono alle prime armi con il C++ per questo vi chiedo un aiuto su questo problema. Ho creato una classe Book che ha come dato membro privato
Io ho scritto questo codice:
Dove ho usato la funzione find() della standard library per le stringhe.
So che è un brutto codice e ci sono mille altri metodi per arrivare alla soluzione, ma in questo particolare caso ho il problema che la funzione find() non viene riconosciuta come membro di Book e viene il seguente errore:
Io voglio capire come poter usare comunque la funzione find e se non si può quale sia il problema, quindi non voglio che mi consigliate altre possibili soluzioni. Grazie!
(Suppongo che il problema sia che sto cercando di usare un dato membro con una funzione che non fa parte della classe Book)

string code_;Io voglio fare un controllo sul codice del libro e voglio che sia composto solo da 4 numeri interi.
Io ho scritto questo codice:
#include "Book.h" #include <iostream> #include <string> using namespace std; using std::string; Book::Book(string code) :code_{code} { for(int i=0; i<4; ++i) if( code_[i].find("0")== string::npos || code_[i].find("1")== string::npos || code_[i].find("2")== string::npos|| code_[i].find("3")==string::npos || code_[i].find("4")== string::npos || code_[i].find("5")== string::npos ||code_[i].find("6")== string::npos ||code_[i].find("7")==string::npos || code_[i].find("8")== string::npos || code_[i].find("9")== string::npos) cerr<< "Invalid code" << endl; }
Dove ho usato la funzione find() della standard library per le stringhe.
So che è un brutto codice e ci sono mille altri metodi per arrivare alla soluzione, ma in questo particolare caso ho il problema che la funzione find() non viene riconosciuta come membro di Book e viene il seguente errore:
error: request for member ‘find’ in ‘((Book*)this)->Book:...
Io voglio capire come poter usare comunque la funzione find e se non si può quale sia il problema, quindi non voglio che mi consigliate altre possibili soluzioni. Grazie!
(Suppongo che il problema sia che sto cercando di usare un dato membro con una funzione che non fa parte della classe Book)
Risposte
Ciao saggio,
hai provato a includere ?
Inoltre, credo che il problema sia perché stai chiamando find() sull'i-esimo elemento della stringa, non sulla stringa intera.
hai provato a includere
Inoltre, credo che il problema sia perché stai chiamando find() sull'i-esimo elemento della stringa, non sulla stringa intera.
code_ e' un carattere, non ha come funzione membro una "find".
Ti basta fare code_ == '1' ad esempio.
Ti basta fare code_ == '1' ad esempio.
Grazie ad entrambi, era semplicemente quello il problema, ma pensandoci find() non va bene per il mio problema, perché non riconoscerebbe ad esempio un errore di questo tipo 12a4
Prego
Non andrebbe bene perché il tuo obiettivo è di avere un codice con solo 4 interi, giusto?

Esattamente, domani provo a sistemare il codice
Ma qualcosa tipo:
non sarebbe meglio? Tu stai verificando se almeno una cifra è tra i caratteri della stringa, ma la condizione che vuoi testare è che tutti i caratteri siano cifre e che queste cifre sono solo 4.
if (code_.size() != 4 || !isdigit(code_[0]) || !isdigit(code_[1]) || !isdigit(code_[2]) || !isdigit(code_[3]) std::cerr << "Invalid code\n";
non sarebbe meglio? Tu stai verificando se almeno una cifra è tra i caratteri della stringa, ma la condizione che vuoi testare è che tutti i caratteri siano cifre e che queste cifre sono solo 4.
Non sapevo dell'esistenza della funzione isdigit della Standard library, era proprio quello che cercavo! Grazie

E' abbastanza semplice da implementare perché tutte le cifre sono valori consecutivi in credo tutte le codifiche di caratteri esistenti e in particolare in ASCII che è quella molto probabilmente utilizzata nel tuo caso. La funzione può quindi essere implementata come segue:
int isdigit(int c) { return '0' <= c && c <= '9'; }