Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Przeładowany operator>> - zabezpieczanie przed niepoprawnymi danymi

Ostatnio zmodyfikowano 2015-09-29 08:51
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[c++] Przeładowany operator>> - zabezpieczanie przed niepoprawnymi danymi
» 2015-09-29 01:12:22
C/C++
class Foo {
    int m_num1;
    int m_num2;
public:
    //......
   
    std::istream & operator >>( std::istream & is, Foo & f ) {
        std::cout << "Podaj dwie liczby: " << std::endl;
        return is >> f.m_num1 >> f.m_num2;
    }

Nie wiem jak zabezpieczyć wczytywanie z klawiatury, aby wczytywało tylko int'y.

Napisałem taką funkcję, która wczytuje tylko int'y
C/C++
int GetNum() {
    using std::cin;
    using std::cout;
    int a;
    char ch;
    do {
        while( !( cin >> a ) ) {
            cin.clear();
            cin.ignore( 100, '\n' );
            cout << "Jeszce raz: ";
        }
        cin.get( ch );
        if( ch == '.' ) {
            while( ch != '\n' )
                 cin.get( ch );
           
            cout << "Nie calkowita: ";
            ch = 'a';
            continue;
        }
        if( ch != '\n' )
        {
            while( ch != '\n' )
                 cin.get( ch );
           
            cout << "Sa litery: ";
            ch = 'a';
            continue;
        }
    } while( cin.fail() || ch == 'a' );
   
    return a;
}

C/C++
int n = GetNum();
 w main() do zwykłej zmiennej jest ok.

Czy można wczytywać dane z pomocą np. takiej funkcji, do składowych klasy za pomocą przeładowanego operatora>>
is >> f.m_num1 >> f.m_num2;
 ?
P-138013
mateczek
jeśli już to
» 2015-09-29 06:16:44
C/C++
class Foo {
    int m_num1;
    int m_num2;
public:
    friend std::istream & operator >>( std::istream & is, Foo & f ) //deklaracja przyjaźni bo chcesz isę dorwać do składowych prywatnych
    //......
}
std::istream & operator >>( std::istream & is, Foo & f ) {
    std::cout << "Podaj dwie liczby: " << std::endl;
    f.m_num1 = getnum();
    f.m_num1 = getnum();
    return is;
}
P-138014
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-09-29 08:51:06
Nie wiedziałem, że tak można.
Myślałem, że to działa jak
cin >> a >> b;
 , nawet nie próbowałem osobno wczytywać.

is >>( f.m_num1 = GetNum() ) >>( f.m_num2 = GetNum() );
Tak kombinowałem, ale wczytywało każdą liczbę dwa razy.

C/C++
//deklaracja przyjaźni bo chcesz isę dorwać do składowych prywatnych
 
 jest, nie załapała się na kopiowanie.

Dzięki @mateczek.
P-138015
« 1 »
  Strona 1 z 1