Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

[C++] Problema con le classi

05/11/2021, 18:07

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
Codice:
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:
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)

Re: [C++] Problema con le classi

05/11/2021, 19:33

Ciao saggio,

hai provato a includere <string> ?

Inoltre, credo che il problema sia perché stai chiamando find() sull'i-esimo elemento della stringa, non sulla stringa intera.

Re: [C++] Problema con le classi

05/11/2021, 21:00

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

Re: [C++] Problema con le classi

05/11/2021, 23:40

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

Re: [C++] Problema con le classi

05/11/2021, 23:45

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

Re: [C++] Problema con le classi

06/11/2021, 00:39

Esattamente, domani provo a sistemare il codice

Re: [C++] Problema con le classi

06/11/2021, 18:43

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

Re: [C++] Problema con le classi

06/11/2021, 21:20

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

Re: [C++] Problema con le classi

06/11/2021, 21:41

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:
Codice:
int isdigit(int c)
{
    return '0' <= c && c <= '9';
}
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.