400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.

C++ Class Metody

C++ Class Metody

Příspěvekod Gelidus » 28 prosinec 2011 15:48:15

Zdravím, rád by som sa dozvedel ako fungujú metódy u objektov a vôbec celkovo ... resp.

Kód: Vybrat vše
class MyClass {
     void Metoda();
};


Ak vytvorím napr. 4 objekty tejto triedy, ukladajú sa do pamäte aj metódy? alebo sa nejako špeciálne volajú?

Díky za odpovede :)
Gelidus
 
Příspěvky: 14
Registrován: 17 listopad 2011 11:56:47

Re: C++ Class Metody

Příspěvekod Ariczek » 28 prosinec 2011 20:42:15

Odpovim trochu otazkou :)

Mějme následující jednoduchou třídu a funkci main():

Kód: Vybrat vše
#include <iostream>
using namespace std;

class Object {
private:
  int a;
public:
  Object(int a) {
    this->a = a;
    cout << "Volam konstruktor pro Object s hodnotou = " << a << endl;
  }
  ~Object() {
    cout << "Volam destruktor pro Object hodnoty = " << a << endl;
    a=0;
  }
 
  void increment() {a++;}
  int get() { return a; }
};

int main(int argc, char* argv[]) {
  Object a(5);
  Object b = Object(6);
  Object* c = new Object(7);
 
  cout << "a:" << a.get() << " b:" << b.get() << " c:" << c->get() << endl;
 
  delete c;
}


a mejme nasledujici vystup tohoto programu:

Kód: Vybrat vše
Volam konstruktor pro Object s hodnotou = 5
Volam konstruktor pro Object s hodnotou = 6
Volam konstruktor pro Object s hodnotou = 7
a:5 b:6 c:7
Volam destruktor pro Object hodnoty = 7
Volam destruktor pro Object hodnoty = 6
Volam destruktor pro Object hodnoty = 5


Kdyžtak se ptej, čemu v tom příkladě nerozumíš :)

Jsou tam ukázány 3 možnosti jak sestrojit instanci třídy, neboli objekt.

Pro každou instanci se někde uloží obsah jejích vnitřních proměnných - v tomhle případě je to int a;

Pro celou třídu (Object) se vytvoří jedna tabulka, mapující jméno metody na něco, nazvěme to ukazatel na tělo metody.
a při vyvolání třeba: b.get(); se první nahrají vnitřní proměnné objektu b - tedy hodnota a. Pak se zjistí podle deklarace že b je typu Object, a najde se mapa funkcí pro Object.
no a nakonec se zavolá z této mapy metoda get();

A dále je v příkladu ukázáno kdy se volá konstruktor, a kdy destruktor, což jsou vlastně speciální metody třídy. :)

Doufám že jsem se do toho moc nezamotal ;)
Ariczek
 
Příspěvky: 51
Registrován: 21 říjen 2011 10:54:52

Re: C++ Class Metody

Příspěvekod Wlezley » 28 prosinec 2011 21:05:06

Na Builderu je o tom celý seriál: "Objektově orientované programování v C++".
Starý link: http://www.builder.cz/art/cpp/cpp_oop.html
Nový link: http://www.builder.cz/rubriky/c/c--/zaklady-oop-v-c-od-c-k-c--155657cz
Doporučuji začít od základu, abys to pochopil.
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C++ Class Metody

Příspěvekod Gelidus » 29 prosinec 2011 12:30:37

Díky Ari, aj tebe Wolf. Myslím že ten seriál si mi už raz posielal alebo som ho čítal (nie celý). Chcel som len vedieť či sa pre každý objekt volá samostatná funkcia :)

( To Increment si tam ani nepoužil :D )
Gelidus
 
Příspěvky: 14
Registrován: 17 listopad 2011 11:56:47

Re: C++ Class Metody

Příspěvekod Wlezley » 29 prosinec 2011 21:08:44

No, né funkce, ale metoda. Hele, zkrátka každá instance tý třídy jede nezávisle na sobě (pokud nejde o singleton). Příklad:
Kód: Vybrat vše
#include <iostream>

class MyClass
{
public:
    MyClass() // Constructor
    {
        m_a = 0;
        m_b = 0;
        m_result = 0;
    };

    ~MyClass() // Destructor
    { };

private:
    int m_a, m_b, m_result;

public:
    void SetMethodA(int a)  { m_a = a; };
    void SetMethodB(int b)  { m_b = b; };
    int GetResult() { return m_result; };

    void Calc_sum()      { m_result = m_a + m_b; };
    void Calc_subtract() { m_result = m_a - m_b; };
    void Calc_multiply() { m_result = m_a * m_b; };
    void Calc_divide()   { m_result = m_a / m_b; };
};

int main()
{
    MyClass myclass_1;
    myclass_1.SetMethodA(123);
    myclass_1.SetMethodB( 23);
    myclass_1.Calc_subtract();
    std::cout << "myclass_1: " << myclass_1.GetResult() << "\n";

    MyClass myclass_2;
    std::cout << "myclass_2: " << myclass_2.GetResult() << "\n";

    return 0;
}

Objekty myclass_1 a myclass_2 budou obsahovat jiný hodnoty proměnných, protože jde sice o jednu a tu samou třídu, ale pokaždý v jiný instanci. Představ si to jako soubor cmd.exe - spustíš ho třeba čtyřikrát ale v každým okně můžeš dělat neco úplně jinýho nezávisle na ostatních spuštěných cmd.exe.
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU


Zpět na C/C++

Kdo je online

Uživatelé procházející toto fórum: Google [Bot] a 4 návštevníků


cron