Bimbol Temat założony przez niniejszego użytkownika |
[C++] Komunikacja pomiędzy klasami » 2013-07-10 15:28:57 Witam, otóż aktualnie jestem w 7 części Kursu C++, autorstwa Karola Kuczmarskiego (Xion). Zanim przejdę do następnego chcę mieć pewność, że dobrze się obsługuje w OOPie. Testuje aktualnie komunikację pomiędzy klasami. main.cpp: #include <iostream> #include "oop.h"
using namespace std;
int main() { cHuman * Patryk = new cHuman; Patryk->ChangeHair( H_2 ); delete Patryk; return 0; }
opp.h: #ifndef OOP_H_INCLUDED #define OOP_H_INCLUDED
enum HAIR { H_1, H_2, H_3, H_4 };
class cHairColor; class cHuman; class cHair;
class cHairColor { private: std::string m_Color; public: cHairColor() { m_Color = "Braz"; std::cout << "Ustawiam kolor" << std::endl; } };
class cHair { private: HAIR m_ID; public: cHair() { m_ID = H_1; std::cout << "Tworze wlosy" << std::endl; } HAIR ChangeHair( HAIR id ) { m_ID = id; std::cout << "Pomyslnie zmieniono model" << std::endl; } };
class cHuman { private: cHair * Hair; cHairColor * CHair; public: cHuman() { Hair = new cHair; CHair = new cHairColor; } virtual ~cHuman() { delete Hair; delete CHair; } HAIR ChangeHair( HAIR id ) { Hair->ChangeHair( H_2 ); } };
#endif
Jako, że nie ma w kursie zbyt dużo przykładów z tym związanych. Chcę się zapytać czy na takiej zasadzie klasy komunikują się? Jeśli nie prosił bym o jakiś przykład. |
|
Monika90 |
» 2013-07-10 15:47:39 Chcę się zapytać czy na takiej zasadzie klasy komunikują się?
|
Nie rozumiem pytania. Jak przebiega komunikacja między obiektami klas zależy od konkretnego przypadku. W każdym bądź razie, u ciebie w obydwu funkcjach ChangeHair brakuje instrukcji return. A klasa cHuman nie ma zdefiniowanego przez użytkownika konstruktora kopiującego, ani operatora przypisania, to doprowadzi do problemów wcześniej czy później. |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-07-10 20:09:51 Nazwałem to tak, bo widziałem gdzieś taką nazwę w projekcie.
Nie chodzi teraz by konkretna funkcja coś zwracała. To tylko i wyłącznie przykładowy kod. Klasa cHuman, w jakiś sposób współpracuje z cHair, cHairColor. Obkiety z tych klas są tworzone w momencie tworzenia samej klasy cHuman.
Pytanie brzmi: Czy tworząc obiekt klasy cHuman, jest jakiś inny sposób na korzystanie z metod klass np. cHair, od tego jaki został użyty w tym przykładzie?
|
|
unimator |
» 2013-07-10 20:55:18 1. Metoda klasy cHuman może przyjmować w parametrze obiekt innej klasy. 2. Inna klasa może być zadeklarowana jako globalna. 3. Tak jak w Twoim przypadku, masz wskaźnik do danego obiektu, tylko zamiast za każdym razem tworzyć obiekt po prostu pobierasz adres istniejącego (jeśli np. cHair jest singletonem). 4. Inna klasa ma metody statyczne. |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-07-10 20:59:39 2. Mógł byś podać przykład? 3. Tutaj, też poproszę o przykład dla mojego kodu, oczywiście jeśli można. 4. Ogółem nie rozumiem na jakiej zasadzie działają metody statyczne.
Dziękuje za wypowiedź. |
|
unimator |
» 2013-07-10 21:23:38 Zakomentowane oznacza, że nie potrzebne 2.
class cHair { private: HAIR m_ID; public: cHair() { m_ID = H_1; std::cout << "Tworze wlosy" << std::endl; } HAIR ChangeHair( HAIR id ) { m_ID = id; std::cout << "Pomyslnie zmieniono model" << std::endl; } } Hair;
class cHuman { private: cHairColor * CHair; public: cHuman() { CHair = new cHairColor; } virtual ~cHuman() { delete CHair; } HAIR ChangeHair( HAIR id ) { Hair.ChangeHair( H_2 ); } };
int main() { cHuman * Patryk = new cHuman; Patryk->ChangeHair( H_2 ); delete Patryk; return 0; }
3.
class cHuman { private: cHair * Hair; cHairColor * CHair; public: cHuman( cHair * HairParam ) { Hair = HairParam; CHair = new cHairColor; } virtual ~cHuman() { delete CHair; } HAIR ChangeHair( HAIR id ) { Hair->ChangeHair( H_2 ); } HAIR ChangeHair( HAIR id, cHair * HairParam ) { HairParam->ChangeHair( H_2 ); } };
int main() { cHair HairA; cHair * HairB = & HairA; cHuman * Patryk = new cHuman( & HairA ); cHuman * Michal = new cHuman( HairB ); Patryk->ChangeHair( H_2 ); delete Patryk; return 0; }
4.
class cHair { private: static HAIR m_ID; public: cHair() { m_ID = H_1; std::cout << "Tworze wlosy" << std::endl; } static HAIR ChangeHair( HAIR id ) { m_ID = id; std::cout << "Pomyslnie zmieniono model" << std::endl; } };
HAIR cHair::m_ID = H_1;
class cHuman { private: cHairColor * CHair; public: cHuman() { CHair = new cHairColor; } virtual ~cHuman() { delete CHair; } HAIR ChangeHair( HAIR id ) { cHair::ChangeHair( H_2 ); } };
int main() { cHuman * Patryk = new cHuman; Patryk->ChangeHair( H_2 ); delete Patryk; return 0; }
Oczywiście w przypadku Twojej klasy cHuman jedynym słusznym rozwiązanie jest to, które sam nam podałeś. Jednak jak piszesz np. moduł graficzny, to wywołanie funkcji rysującej odbywa się za pomocą którejś z tych metod, bo nie tworzysz takiego obiektu dla każdego innego obiektu z osobna. |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-07-10 22:34:00 Dzięki, rozjaśniłeś mi niektóre moje wątpliwości. |
|
« 1 » |