Jest coś takiego jak zależność zmiennych od obiektu?

0

Metoda klasy A przypisuje do zmiennej prywatnej klasy B wartość, po czym inna metoda klasy A chce wyświetlić prywatną zmienną klasy B, ale tam nic nie ma, chociaż przed chwilą metoda klasy A przypisała tam wartość

Poniżej metoda przypisująca klasy A.

void A::czy_istnieje_plik_haslo_administratora()
{
    B b;
 
    fstream plik;
 
    bool czy_istnieje = fstream("haslo_administratora.txt").good();
 
    if(czy_istnieje == true)
    {
        plik.open("haslo_administratora.txt", ios::in);
 
        int nr_linii = 1;
        string linia;
 
        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
            case 1:
                {
                    b.kod = linia;
                    break;
                }
            case 2:
                {
                    b.haslo = linia;
                }
            }
 
            nr_linii++;
        }
 
        plik.close();
    } 

I potem jak chcę wyświetlić w innej metodzie klasy A zmienną prywatną klasy B, chodzi o zmienne 'kod' i 'haslo' to nic w tych zmiennych nie ma.

Dla sprawdzenia wyświetliłem w tej metodzie przypisującej klasy A te zmienne prywatne klasy B i dobrze je pokazało, ale już w innej metodzie klasy A te zmienne są puste.

2

Naginasz mocno zasadę jednej odpowiedzialności oraz generalnie ideę programowania obiektowego.
Już nawet mniejsza z tym, że metoda sprawdzająca istnienie dokonuje wczytania zawartości pliku (czyli robi coś innego niż sugeruje jej nazwa (!)) - powiedz mi proszę, dlaczego klasa A jest odpowiedzialna za coś, co ewidentnie ma wpływ na pola klasy B? To powinna być metoda klasy B.

Sam kod na oko wygląda... chciałem napisać ok, ale nie wygląda "ok"* - wygląda na działający poprawnie.

* brak obsługi błędów, w dalszym ciągu nie rozumiem, po co tam ten while oraz generalnie średnie przedstawienie problemu.

Edit: pewnie w innej metodzie znowu robisz B b; i liczysz, że ten obiekt będzie taki sam, jak ten z A::czy_istnieje_plik_haslo_administratora, prawda?

2

Oprócz tego co napisano wyżej można by jeszcze dodać:

void A::czy_istnieje_plik_haslo_administratora() // czy_istnieje* nie zwracające bool WTF?
  {
   B b;
   ifstream fs("haslo_administratora.txt");
   if(fs)
     {
      getline(fs,B.kod);
      getline(fs,B.haslo);
      fs.close();
     }

zresztą cały ten fragment powinien się znaleźć w klasie B, zaś tu jedynie:

void A::czy_istnieje_plik_haslo_administratora() // czy_istnieje* nie zwracające bool WTF?
  {
   B b("haslo_administratora.txt");

lub jakoś podobnie.

2

Na temat odpowiadaj w postach.


> Czyli wczytałem dane do zmiennych tylko na potrzeby stworzenia obiektu, a zmienne w klasie są dalej puste. Żeby wpisać jakieś wartości do zmiennych w klasie, to klasa musiałaby użyć swojej metody, tak?

Zacznijmy od poprawy Twojej terminologii - klasy nie mają zmiennych, tylko pola.

A teraz rozważmy następujący kod (przydatne słówka na potem: snippet, code snippet):
http://ideone.com/UHvImQ

Pisząc MojaKlasa klasa; w funkcjaA tworzona jest instancja klasy MojaKlasa oraz wywoływany jest jej konstruktor domyślny (tutaj akurat brak jawnego), po czym następuje przypisanie do pola x tejże instancji wartości 1024. Pod koniec tej funkcji klasa jest zwalniana (wywoływany jest jej destruktor - podobnie: tutaj brak jawnego - oraz zwalniana jest przydzielona jej pamięć).

Następnie w funkcjaB tworzona jest następna instancja klasy MojaKlasa i wydaje mi się, że już tutaj widzisz co się stało ;) - stworzyliśmy nowy, unikalny obiekt tej klasy, który w żaden sposób nie jest powiązany z tym, który był w funkcjaA. Odnoszę wrażenie, że taką właśnie sytuację masz w kodzie.

Można to rozwiązać na cztery sposoby:

  • deklarując klasa jako zmienną globalną (rzadko kiedy dobre rozwiązanie...),
  • robiąc z MojaKlasa klasę statyczną,
  • za pomocą swoistego wstrzykiwania zależności (ang. dependency injection), tutaj w następujący sposób: http://ideone.com/hEeVYz
  • reorganizując kod: u Ciebie na przykład klasa A nie powinna być odpowiedzialna za to, co przedstawiłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1