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

[C++] Komunikacja pomiędzy klasami

Ostatnio zmodyfikowano 2013-07-10 22:34
Autor Wiadomość
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:
C/C++
#include <iostream>
#include "oop.h"

using namespace std;

int main()
{
    cHuman * Patryk = new cHuman;
    Patryk->ChangeHair( H_2 );
    delete Patryk;
    return 0;
}

opp.h:
C/C++
#ifndef OOP_H_INCLUDED
#define OOP_H_INCLUDED

enum HAIR { H_1, H_2, H_3, H_4 }; // Prototyp

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 // OOP_H_INCLUDED

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.
P-87380
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.
P-87382
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?
P-87408
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.
P-87416
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ź.
P-87418
unimator
» 2013-07-10 21:23:38
Zakomentowane oznacza, że nie potrzebne
2.
C/C++
//oop.h

//tu gdzies reszta rzeczy jest

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; // <- tworzony jest obiekt globalny


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 ); //! Rownie dobrze Hair mogloby byc wskaznikiem
    }
};

// main.cpp

int main()
{
    cHuman * Patryk = new cHuman;
    Patryk->ChangeHair( H_2 );
    delete Patryk;
    return 0;
}

3.
C/C++
//oop.h

class cHuman
{
private:
    cHair * Hair;
    cHairColor * CHair;
public:
    cHuman( cHair * HairParam )
    {
        Hair = HairParam;
        CHair = new cHairColor;
    }
    virtual ~cHuman()
    {
        //        delete Hair;
        delete CHair;
    }
    HAIR ChangeHair( HAIR id )
    {
        Hair->ChangeHair( H_2 );
    }
    //lub dodajesz parametr do funkcji ChangeHair by za kazdym razem trzeba bylo podawac adres obiektu cHair
    HAIR ChangeHair( HAIR id, cHair * HairParam )
    {
        HairParam->ChangeHair( H_2 );
    }
};
// main.cpp
int main()
{
    cHair HairA;
    cHair * HairB = & HairA;
    cHuman * Patryk = new cHuman( & HairA ); //lub jak Ci wygodniej to przez wskaznik
    cHuman * Michal = new cHuman( HairB );
    Patryk->ChangeHair( H_2 );
    delete Patryk;
    return 0;
}

4.
C/C++
//oop.h

//tu gdzies reszta rzeczy jest

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; // to musi byc

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 )
    {
        cHair::ChangeHair( H_2 );
    }
};

// main.cpp
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.
P-87433
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.
P-87458
« 1 »
  Strona 1 z 1