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

[C++] Korzystanie ze zmiennych prywatnych

Ostatnio zmodyfikowano 2014-02-17 19:40
Autor Wiadomość
Highlander
Temat założony przez niniejszego użytkownika
[C++] Korzystanie ze zmiennych prywatnych
» 2014-02-17 16:23:05
Witam,
próbuje skorzystać ze zmiennej prywatnej "int pinKlient" z klasy Klient w klasie KartaBankomatowa, lecz wywali mi błąd, że zmienna ta nie jest zadeklarowana w klasie KartaBankomatowa, mimo, iż je zaprzyjaźniłem, próbowałem różnych wskazówek i tematów lecz nie mogę sobie z tym poradzić.
Proszę o pomoc.
C/C++
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;

class Klient
{
    friend class KartaBankomatowa;
private:
    double ileWybiera;
    int pinKlient = 1111;
public:
    Klient( double _ileWybiera, int _pinKlient )
    {
        ileWybiera = _ileWybiera;
        pinKlient = 1111;
    }
};
class KartaBankomatowa
{
private:
    string rodzajKarta;
    long long int numerKarta;
    int pinKarta = 0;
    double stanKonto;
public:
    void wpiszPin()
    {
        cin >> pinKarta;
    }
    KartaBankomatowa( string _rodzajKarta, long long int _numerKarta, double _stanKonto )
    {
        rodzajKarta = _rodzajKarta;
        numerKarta = _numerKarta;
        stanKonto = _stanKonto;
        pinKarta;
    }
    void pokazKarta()
    {
        cout << rodzajKarta << endl;
        cout << numerKarta << endl;
        cout << stanKonto << endl;
        if( pinKarta == pinKlient )
             cout << pinKarta << endl;
        else
             cout << "Nieprawidlowy PIN" << endl;
       
    }
};
P-104781
Adik80
» 2014-02-17 17:52:58
pinKlienta powinien byc wywolany na rzecz obiektu typu Klient, inaczej kompilator uzna ze chcesz uzyc zmiennej z klasy Karta. Najprosciej, jesli chesz zweryfikowac Karte, przekaz do funkcji referencje do klasy Klient:
C/C++
void pokazKarta( const Klient & kli )
{
    if( pinKarta == kli.pinKlient )
    ...
         }
P-104789
Highlander
Temat założony przez niniejszego użytkownika
» 2014-02-17 18:51:37
Rozumiem, wiele mi pomogłeś bo przy okazji zaczynam kumać do czego może służyć referencja.
Mam dalej pytania.
Jak w main, po tej modyfikacji kodu wywołuje obiekt, to jak ma to wyglądać ? u mnie jest to tak:
C/C++
int main()
{
    KartaBankomatowa k1( "Visa", 872347234234, 3650 );
    k1.wpiszPin();
    k1.pokazKarta();
    return 0;
}
wywala bład "no matching function..." przy k1.pokazKarta();
I drugie pytanie, czy jest możliwość zrobienia tego tak jak ja miałem na początku w zamyśle ? czyli po prostu bezpośrednio użyć tej zmiennej z klasy Klient w klasie KartaBankomatowa poprzez zaprzyjaźnienie ich?
Dziękuje i pozdrawiam
P-104804
Adik80
» 2014-02-17 19:02:00
Moze jakos tak:
C/C++
Klient klient( 1, 1234 );
KartaBankomatowa k1( "Visa", 872347234234, 3650 );
kl.pokazKarta( klient );
P-104806
alixir
» 2014-02-17 19:40:48
Jeśli nie chcesz deklarować pierwszej klasy w funkcji main(), bądź nie chcesz przekazywać jej jako argument funkcji, możesz to zrobić to np. tak: (oczywiście to będzie działało tylko dla obiektu cKlient, a chyba nie o to ci chodzi)

C/C++
#include <iostream>

class Klient {
private:
    int pinKlient;
public:
    Klient() { // domyślny konstruktor
        pinKlient = 1010;
    }
    Klient( int nr_pin ) {
        pinKlient = nr_pin;
    }
    friend class KartaBankomatowa;
} cKlient;

class KartaBankomatowa {
private:
    int pinKarta;
public:
    KartaBankomatowa() { // domyślny konstruktor
        pinKarta = 2020;
    }
    KartaBankomatowa( int nr_pin ) { // domyślny konstruktor
        pinKarta = nr_pin;
    }
    void pokazKarta() {
        if( cKlient.pinKlient == pinKarta )
             std::cout << "Pin OK" << std::endl;
        else
             std::cout << "Nieprawidlowy PIN" << std::endl;
       
    }
};

int main() {
   
    KartaBankomatowa nowa_karta( 1020 );
    nowa_karta.pokazKarta();
   
    return 0;
}
P-104809
« 1 »
  Strona 1 z 1