Przypisywanie obiektu obiektowi [C++]

Siema, otóż mam klasę Postać w mojej mini grze.

Jest też klasa broń.

Każda postać ma swoją broń i chodzi tutaj o przypisanie każdemu obiektowi broni.

Piszę obiektowo.

Zarówno Postacie jak i Bronie są umieszczone w tablicach.

Wymyśliłem takie coś że przecież każda broń ma w swojej tablicy takie jakby “ID” , bo przecież każda jest w tablicy i to “ID” to numer tej tablicy. :slight_smile:

 

Ale czy to dobry sposób, na innych kodach źródłowych było to robione troszkę inaczej, ale za nic nie mogłem zrozumieć jak…

Może wy mi powiedzie jaki jest jeszcze sposób?

Z góry dziękuję za odpowiedzi. :slight_smile:

https://pl.wikipedia.org/wiki/Asocjacja_(programowanie_obiektowe)

Wszystko zależy od tego, co chcesz uzyskać, i  w czym będziesz chciał wprowadzać zmiany(wzorce projektowe). Ja bym się zastanowił czy jest sens trzymania broni w tablicach, a nie w postaciach, jednak twojego kodu nie widziałem, więc odpowiedzi Ci nie udzielę.

Kodu nie wrzucę bo jest już bardzo duży.

Chodzi o to że ja chcę mieć porządek w kodzie i jak będę to wszystko trzymał w postaciach to zrobi się bałagan, dlatego najlepiej jest zrobię klasę nazwaną np. Bronie, Tarcze, Zbroje itd.

Ale nie wiem jak się to dokładnie robi bo to już wyższa abstrakcja. :slight_smile:

class Bron
{
    //...
};

class Postac
{
    Bron bron;
};

int main()
{
    std::vector<Postac> postaci; //...
}

I na jakiej zasadzie to działa? :slight_smile:

A na jakiej zasadzie masz zmienne wewnątrz klasy?

Bo obiekt wewnątrz klasy zachowuje się tak samo jak zmienne.

Zmienne wewnątrz klasy to np.

class Postac
{
    int zdrowie;
    int sila;
    int magia;
};

Ehh.

To było pytanie retoryczne.

class Postac
{
    int zdrowie;
    int sila;
    int magia;
    Bron bron;
};

Ogarnę sobie vectory i wtedy to zrozumiem lepiej.

A na jakiej zasadzie działa konstruktor takiego obiektu z obiektem?

Z tego, co pamiętam(programuję w C, a nie w C++), to wywoływany jest konstruktor domyślny obiektu składowego.

Najpierw działa konstruktor domyślny pól klasy (więc Broni) tak jak napisał @nintyfan, a dopiero potem uruchamiany jest konstruktor klasy głównej (Postac). Jakbyś chciał uruchamiać inny konstruktor to sprawa się komplikuje bo wtedy musiałbyś mieć pole wskaźnika do Broni, tworzyć w konstruktorze Postaci operatorem new Bron z parametrami, a w destruktorze go niszczyć.

Nie.

Jak chcesz użyć dla pola innego konstruktora niż domyślny to używasz listy inicjalizacyjnej.

class Postac
{
    int zdrowie;
    int sila;
    int magia;
    Bron bron;

    Postac() : bron("dzida", 42)
    {
    }
};

No tak, nie pomyślałem o liście.