Odwoływanie się do metody klasy
Ostatnio zmodyfikowano 2017-11-11 09:33
smg Temat założony przez niniejszego użytkownika |
Odwoływanie się do metody klasy » 2017-11-10 14:06:08 Próbuję zrobić prostą bazę danych. Chciałbym aby w pewnym momencie użytkownik musiał podać numer telefonu, który zostanie przesłany do funkcji usuwającej spację. Problem polega na tym, że nie potrafię wywołać tej funkcji z wnętrza main. Czy da się w jakiś sposób wywołać tę funkcję czy też muszę stworzyć jakiś obiekt klasy Czlowiek i przy jego pomocy wywołać funkcję? #include <iostream> #include <vector> #include <string> #include <conio.h> #include "baza.h" #include <windows.h> using namespace std; int Czlowiek::licznik = 1; int odp_numer;
int main() { vector < Czlowiek > osoba; char odp; do { cout << "************MENU************" << endl; cout << "1. Dodaj klienta" << endl; cout << "2. Wyswietl liste klientow" << endl; cout << "3. Zakoncz program" << endl; cout << "****************************" << endl; cout << endl; odp = getch(); switch( odp ) { case '1': { odp_numer = Czlowiek::licznik; cout << "Imie: "; string odp_imie; cin >> odp_imie; cout << "Nazwisko: "; string odp_nazwisko; cin >> odp_nazwisko; cin.clear(); cin.sync(); cout << "Numer telefonu: "; string odp_tel; getline( cin, odp_tel ); usuwanie_spacji( odp_tel ); osoba.push_back( Czlowiek( odp_numer, odp_imie, odp_nazwisko, odp_tel ) ); cout << endl; cout << "Poprawnie dodano klienta" << endl; Sleep( 3000 ); system( "cls" ); break; } case '2': if( odp_numer == 0 ) { cout << "Lista osob jest pusta ! Wybierz 1, aby dodac nowego klienta." << endl; Sleep( 3000 ); system( "cls" ); } else { cout << "******LISTA OSOB******" << endl; for( int i = 0; i < osoba.size(); i++ ) { cout << endl; cout << "Klient nr: " << osoba[ i ].numer << endl; cout << "Imie: " << osoba[ i ].imie << endl; cout << "Nazwisko: " << osoba[ i ].nazwisko << endl; cout << "Numer telefonu: " << osoba[ i ].telefon << endl; cout << endl; } break; } } } while( odp != '3' ); return 0; }
Plik cpp #include <iostream> #include <vector> #include <string> #include <conio.h> #include "baza.h" using namespace std;
Czlowiek::Czlowiek( int xnumer, string ximie, string xnazwisko, string xtelefon ) { numer = xnumer; imie = ximie; nazwisko = xnazwisko; telefon = xtelefon; licznik++; }
string Czlowiek::usuwanie_spacji( string & napis ) { while( napis.find( " " ) != string::npos ) { napis.erase( napis.find( " " ), 1 ); } return napis; }
|
|
mateczek |
» 2017-11-10 14:47:10 daj wywołanie w konstruktorze a metoda może być w sekcji private Czlowiek::Czlowiek( int xnumer, string ximie, string xnazwisko, string xtelefon ) { numer = xnumer; imie = ximie; nazwisko = xnazwisko; telefon = usuwanie_spacji( xtelefon ); licznik++; } |
|
smg Temat założony przez niniejszego użytkownika |
» 2017-11-10 17:32:44 Działa ! dzięki wielkie. I tego typu praktyki są "zgodne ze sztuką"? |
|
pekfos |
» 2017-11-10 18:09:30 Niezgodna ze sztuką jest twoja implementacja usuwanie_spacji(). |
|
smg Temat założony przez niniejszego użytkownika |
» 2017-11-10 21:21:47 A jaka była by zgodna ze sztuką? |
|
pekfos |
» 2017-11-10 21:30:41 string & Czlowiek::usuwanie_spacji( string & napis ) { return napis; }
string Czlowiek::usuwanie_spacji( const string & napis ) { return tmp; }
W twojej wersji, niszczysz zmienną, która została przekazana i zwracasz jej kopię. Powinieneś albo pracować na kopii i ją zwrócić bez zmieniania argumentu (2), albo zwracać referencję na przekazaną zmienną (1). Generalnie lepsza jest wersja 2, bo i tak normalnie nie chcesz czegoś takiego implementować z użyciem erase(), bo to bardzo nieoptymalne. A zwłaszcza sposób, w jaki Ty to zaimplementowałeś - 2 wyszukiwania dla każdej spacji do usunięcia. |
|
smg Temat założony przez niniejszego użytkownika |
» 2017-11-11 09:33:54 Kurde widzę, że przede mną jeszcze kuuuupa roboty, zanim nauczę się używać nawet tych prostych rzeczy. W każdym razie dzięki za zwrócenie uwagi, postaram się poprawić :) |
|
« 1 » |