[C++] Problema con le classi

mirko.saggioro
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
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
feddy
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.

Quinzio
code_ e' un carattere, non ha come funzione membro una "find".
Ti basta fare code_ == '1' ad esempio.

mirko.saggioro
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

feddy
Prego :-) Non andrebbe bene perché il tuo obiettivo è di avere un codice con solo 4 interi, giusto?

mirko.saggioro
Esattamente, domani provo a sistemare il codice

apatriarca
Ma qualcosa tipo:
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.

mirko.saggioro
Non sapevo dell'esistenza della funzione isdigit della Standard library, era proprio quello che cercavo! Grazie ;)

apatriarca
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';
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.