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

Odwoływanie się do metody klasy

Ostatnio zmodyfikowano 2017-11-11 09:33
Autor Wiadomość
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ę?

C/C++
#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; //nadawanie numeru klientowi
                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 ); // trzeba dac obiekt np: obiekt.usuwanie_spacji()
                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
C/C++
#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 );
        //cin.clear();
        //cin.sync();
    }
    return napis;
}
P-166668
mateczek
» 2017-11-10 14:47:10
daj wywołanie w konstruktorze a metoda może być w sekcji private
C/C++
Czlowiek::Czlowiek( int xnumer, string ximie, string xnazwisko, string xtelefon )
{
    numer = xnumer;
    imie = ximie;
    nazwisko = xnazwisko;
    telefon = usuwanie_spacji( xtelefon );
   
    licznik++;
}
P-166670
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ą"?
P-166676
pekfos
» 2017-11-10 18:09:30
Niezgodna ze sztuką jest twoja implementacja usuwanie_spacji().
P-166680
smg
Temat założony przez niniejszego użytkownika
» 2017-11-10 21:21:47
A jaka była by zgodna ze sztuką?
P-166702
pekfos
» 2017-11-10 21:30:41
C/C++
// tak
string & Czlowiek::usuwanie_spacji( string & napis )
{
    //..
    return napis;
}
// lub tak
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.
P-166704
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ć :)
P-166712
« 1 »
  Strona 1 z 1