Klasa w klasie - używanie nazw obiektów

0

Witam. Mam problem odnośnie klasy w klasie. Tzn. Mam jedną klasę A, która posiada, konstruktor i swoje metody publiczne. Następnie w klasie b, w konstruktorze tworzy 3 obiekty klasy A. To działa i dosyć dobrze kompilator dobrze zniósł taki zabieg. Ale już niezbyt znosi używanie nazw tych obiektów i tutaj jest mój problem. Jak to naprawić? Wg kompilatora nazwa jest nie zdefiniowana, ale tą nazwę definiuje już w konstruktorze.

0

Pokaż kod.

0

Może źle się wypowiedziałem w pierwszym poście. Ale chce zarządzać obiektem A w obiekcie B. Będąc ciągle w obiekcie B.

#include <iostream>
using namespace std;
class pojemnik
{
 unsigned int _iloscwpojemniku;
 unsigned int _maxwpojemniku;
 public:
 pojemnik(unsigned int);
 void oprocznijpojemnik(void);
 void wrzucdopojemnika(unsigned int); 
 void stanpojemnika(void);
};

class segregacjasmieci
{
 public:
 segregacjasmieci(unsigned int,unsigned int,unsigned int);
 void menuklasy(void); 
};

int poprawneliczby(void)
{ //funkcja do poprawnych liczb, wiekszych od 0. Nie dolaczona do klasy, poniewaz klasa ma tylko tworzyc i zmieniac tylko na funkcji w pociagu
 int a=-1;
 while(a<0) { cin>>a; cin.clear(); cin.ignore(1000,'\n'); }
 return a;
}

pojemnik::pojemnik(unsigned int maxpojemnik)
{ // Zakladam, ze uzytkownik tworzy pusty pojemnik 
  _iloscwpojemniku=0;
  _maxwpojemniku=maxpojemnik;
}

void pojemnik::oprocznijpojemnik(void)
{
 cout<<"\nZostanie oprozniony pojemnik.\nZnajdowalo sie w nim: "<<_iloscwpojemniku<<"\n Pojemnik zostal oprozniony\n";
 _iloscwpojemniku=0;
}

void pojemnik::wrzucdopojemnika(unsigned int dodaj)
{
 cout<<"\nZostanie zaraz sprawdzone czy zadana przez Ciebie liczbe mozna dodac do pojemnika\nBip. Sprawdzanie odbywa sie w toku.\n";
 if(_iloscwpojemniku+dodaj>_maxwpojemniku)
 cout<<"\nPrzepraszmy, ale ilosc, ktora probujesz dodac jest wieksza od liczby maksymalnej objetosci pojemnika.\n";
 else 
 cout<<"\nZadana przez Ciebie liczba zostala dodana.\nNowy stan pojemnika wynosi:"<< _iloscwpojemniku<<"\n";
}

void pojemnik::stanpojemnika(void)
{
 cout<<"\nStan pojemnika wynosi: "<<_iloscwpojemniku<<".\nMaksymalna ilosc w pojemniku wynosi: "<< _maxwpojemniku<<"\n";
}

segregacjasmieci::segregacjasmieci(unsigned int iszklo, unsigned int iplastik, unsigned int ipapier)
{
 pojemnik szklo(iszklo);
 pojemnik plastik(iplastik);
 pojemnik papier(ipapier);
}

void segregacjasmieci::menuklasy(void)
{
 int a=0,b=-1;
 while(b<-1)
 {
  cout<<"\nPodaj co chcesz zrobic.\n1- Oproznij pojemnik ze szklem\n2- Wrzuc szlo do pojemnika\n3- Oproznij pojemnik ze plastikiem\n4- Wrzuc plastik do pojemnika\n5- Oproznij pojemnik z papierem\n6- Wrzuc papier do pojemnika\n7- Stan pojemnikow\n8- Zakoncz program\n";
  a=poprawneliczby();
  if(a!=8)
  switch(a)
  {
   case 1: { szklo.oprocznijpojemnik(); break; } 
   case 2:
   {
    cout<<"\nPodaj liczbe, ktora probujesz wrzucic do pojemnika: ";
    b=poprawneliczby();
    szklo.wrzucdopojemnika(b);
    break;
   }
   case 3: { plastik.oprocznijpojemnik(); break; }
   case 4:
   {
    cout<<"\nPodaj liczbe, ktora probujesz wrzucic do pojemnika: ";
    b=poprawneliczby();
    plastik.wrzucdopojemnika(b);
    break;
   } 
   case 5: { papier.oprocznijpojemnik(); break; }
   case 6:
   {
    cout<<"\nPodaj liczbe, ktora probujesz wrzucic do pojemnika: ";
    b=poprawneliczby();
    papier.wrzucdopojemnika(b);
    break;
   }
  } 
 }
}

int main()
{
 
 return 0;
}
2
class segregacjasmieci
  {
   private:
   pojemnik szklo,plastik,papier;
   public:
   segregacjasmieci(unsigned int,unsigned int,unsigned int);
   void menuklasy(void); 
  };

segregacjasmieci::segregacjasmieci(unsigned int iszklo, unsigned int iplastik, unsigned int ipapier):szklo(iszklo),plastik(iplastik),papier(ipapier)
  {
  }
1

Ech szkoda mi słów do takiego kodu. Stworzyłeś sobie LOKALNE ZMIENNE w kontruktorze, więc nie dziwota że ZNIKAJĄ po wyjściu z konstruktora. Jak ty chcesz cokolwiek napisać skoro nie rozumiesz tak podstawowej kwestii jak ZASIĘG zmiennych.

//tutaj nie ma zmiennej
{
    int zmienna; //tutaj jest!
}
//a tu znów nie ma

Co ciekawe w klasie pojemnik jakimś cudem umiałeś skorzystać z czegoś takiego jak POLA KLASY, a już w klasie segregacjasmieci nie. Potrafisz to wyjaśnić? Pisząc pierwszą klasę wiedziałeś co robisz a potem dostałeś pomroczności jasnej?
Porównaj swoje dwa kody:

class pojemnik
{
   unsigned int _iloscwpojemniku;
   unsigned int _maxwpojemniku;
 public:
   pojemnik(unsigned int)
   {
         _iloscwpojemniku=0;
         _maxwpojemniku=maxpojemnik;
   }
};

oraz:

class segregacjasmieci
{
 public:
     segregacjasmieci(unsigned int,unsigned int,unsigned int)
     {
         pojemnik szklo(iszklo);
         pojemnik plastik(iplastik);
         pojemnik papier(ipapier);
     }
};

Widzisz tu różnicę?

0
_13th_Dragon napisał(a):
class segregacjasmieci
  {
   private:
   pojemnik szklo,plastik,papier;
   public:
   segregacjasmieci(unsigned int,unsigned int,unsigned int);
   void menuklasy(void); 
  };

segregacjasmieci::segregacjasmieci(unsigned int iszklo, unsigned int iplastik, unsigned int ipapier):szklo(iszklo),plastik(iplastik),papier(ipapier)
  {
  }

Dziękuje, za przykład pięknie działa. : )

Shalom napisał(a):

Ech szkoda mi słów do takiego kodu. Stworzyłeś sobie LOKALNE ZMIENNE w kontruktorze, więc nie dziwota że ZNIKAJĄ po wyjściu z konstruktora. Jak ty chcesz cokolwiek napisać skoro nie rozumiesz tak podstawowej kwestii jak ZASIĘG zmiennych.

//tutaj nie ma zmiennej
{
    int zmienna; //tutaj jest!
}
//a tu znów nie ma

Co ciekawe w klasie pojemnik jakimś cudem umiałeś skorzystać z czegoś takiego jak POLA KLASY, a już w klasie segregacjasmieci nie. Potrafisz to wyjaśnić? Pisząc pierwszą klasę wiedziałeś co robisz a potem dostałeś pomroczności jasnej?
Porównaj swoje dwa kody:

class pojemnik
{
   unsigned int _iloscwpojemniku;
   unsigned int _maxwpojemniku;
 public:
   pojemnik(unsigned int)
   {
         _iloscwpojemniku=0;
         _maxwpojemniku=maxpojemnik;
   }
};

oraz:

class segregacjasmieci
{
 public:
     segregacjasmieci(unsigned int,unsigned int,unsigned int)
     {
         pojemnik szklo(iszklo);
         pojemnik plastik(iplastik);
         pojemnik papier(ipapier);
     }
};

Widzisz tu różnicę?

Widzę. Jakby to powiedzieć. Przy pojemniku programowałem z myślą o hermetyzacji. Czyli dlatego definiowałem pola klasy, etc. A w segregacji śmieci byłem prawie przekonany, że pisząc w private w clasie wywołam konstruktor bezparametrowy i to będzie mi generowało następne błędy.
A mam takie do was pytanie. Jakie klasa powinna mieć zadanie? Jak najmniejsze zadania czy ma zarządzać prawie całymi projektami jak ja zrobiłem np tutaj w tym kodzie?

1

Lekcja na dziś: zasada jednej odpowiedzialności.

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