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.
Pokaż kod.
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;
}
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)
{
}
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ę?
_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 klasiesegregacjasmieci
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?
Lekcja na dziś: zasada jednej odpowiedzialności.