Agregacja - Czy dobrze to rozumiem ?

0

Witam serdecznie!

Otrzymałem takie to polecenie :
Proszę zdefiniować klasę do przechowywania daty (rok, miesiąc, dzień), następnie proszę zdefiniować klasę A w taki sposób aby pokazać agregację klasy do przechowywania daty w klasie A.

A wykonałem to wstępnie w taki sposób..

Uprzejmię proszę o sugestie, czy dobrze zrozumiałem oraz wykonałem powyższe polecenie i ewentualne wskazówki.
Pozdrawiam !!

 #include <windows.h>
#include <iostream>
#include <cstdlib>

using namespace std;

class A
{
    int day;
    int month;
    int year;
public:
    A(int da, int mo, int ye):day(da),month(mo),year(ye){}
    void print()
    {
        cout<<day<<"."<<month<<"."<<year<<endl;
    }
};

class Czas
{
    int dzien;
    int miesiac;
    int rok;
public:
    Czas(int d, int m, int r):dzien(d),miesiac(m),rok(r){}
    A*objA;
    A* Kopiowanie()
    {
        objA = new A(dzien,miesiac,rok);
        return objA;
    }


};

int main()
{
    Czas Ttime(16,01,1993);
    A *xd = Ttime.Kopiowanie();
    xd->print();


    return 0;
}

0

Ten kod nie ma nic wspólnego z poleceniem i w zasadzie nic w nim nie jest dobrze. Zrobiłeś tu jakieś dzikie copy-paste bez ładu i składu. Miałeś napisać dwie klasy, klasę Date która powinna wyglądać mniej więcej jak to twoje A, oraz klasę A która ma w sobie pole typu Date.

0

agregację klasy. Nie jej pól.

0

Dziękuje za odpowiedzi.

Generalnie ciężko znalezc mi dobry materiał, aby dowiedzieć się dokładnie, jak ma wyglądać agregacja.
Sugerowałęm się do tej pory tym : http://xiaochongzhang.me/blog/?p=323

Zmodyfikowałem mój wcześniejszy kod, uprzejmię proszę o dalsze
wskazówki, oraz bardziej dogłębne wyjaśnienie, bo zdaje sobię sprawę że nadal może nie być
dobrze.

 #include <windows.h>
#include <iostream>
#include <cstdlib>

using namespace std;
class DATA
{
    int day;
    int month;
    int year;
public:
    DATA(int da, int mo, int ye):day(da),month(mo),year(ye){}
    void print()
    {
        cout<<day<<"."<<month<<"."<<year<<endl;
    }
};

class A
{
    DATA * PTR;
public:
    void Create()
    {
        PTR = new DATA(16,01,1993);
    }

};


int main()
{
    

    return 0;
}

0
  1. A mozesz wyjaśnić czemu robisz to przez new?
  2. Ja bym powiedział że to jest kompozycja a nie agregacja ;) Agregacja jest kiedy ten wenwętrzny obiekt jest niezależny od zewnętrznego.
0
Shalom napisał(a):
  1. A mozesz wyjaśnić czemu robisz to przez new?
  2. Ja bym powiedział że to jest kompozycja a nie agregacja ;) Agregacja jest kiedy ten wenwętrzny obiekt jest niezależny od zewnętrznego.

Oczywiście, już mówie.
Kierowałem się tym artykułem, z linka powyżej.

Widocznie jest to tam źle przedstawione, lub umysł mnie zawodzi :)

0

Jeżeli ktoś byłby miły to proszę o jakąs namiastkę informacji, lub po prostu poprawienie częsci mojego kodu, aby
było to dobrze i wtedy jestem pewien że zrozumiem, bo mam informacje z kilku źródeł i wszędzie jest inaczej opisana
ta agregacja :(

Pozdrawiam!

0

Jeśli jakość tego bloga jest taka jak na załączonym przykładzie to broń Boże tego nie czytaj bo to WTF jakis. Ziomek robi wyciek pamięci i twierdzi ze dzieki temu ma agregacje a nie kompozycje. Przykład agregacji masz opisany tutaj: http://beginnersbook.com/2013/05/aggregation/

Ważne jest to że Student nie tworzy sobie Adresu tylko dostaje ten adres. W efekcie niby Adres jest jednym z pól studenta, ale nic nie stoi na przeszkodzie żeby dwóch studentów współdzieliło ten sam adres (rodzeństwo na przykład ;) )

0

Ten przykład z blogu byłby dobry, jeżeli założyć, że ta klasa nie będzie już potem odpowiedzialna za ten dynamicznie zaalokowany obiekt. (Co raczej nie powinno mieć miejsca w takiej sytuacji - jeżeli klasa alokuje obiekt, to powinna być odpowiedzialna również za jego zwolnienie... chyba że projekt zakłada inaczej)

Ale ten przykład jest bardzo ogólnikowy i nic właściwie ci nie powie. No i jeszcze z błędem tak jak Shalom napisał.
Edit: Jak doczytałem ten ostatni przykład to spadłem z krzesła

0

Bardzo dziękuje za odpowiedz.

W końcu jest to jasne i zrozumiałe :)

Jeszcze jedno pytanie - Jak powinny wyglądać relacje : Student - Adres.
Powinna być utworzona przyjaźń, czy raczej metody wewnątrz studenta, które uruchamiają odpowiednie metody klasy
Adres ?

Aktualnie wyszło mi coś takiego..

 #include <windows.h>
#include <iostream>
#include <cstdlib>

using namespace std;
class DATA
{
    int day;
    int month;
    int year;
public:
    DATA(int da=0, int mo=0, int ye=0):day(da),month(mo),year(ye){}
    void print()
    {
        cout<<day<<"."<<month<<"."<<year<<endl;
    }

    ~DATA(){}
};

class A
{
    DATA d1;
public:
    A(DATA);


    void print()
    {
        d1.print();
    }

};
A::A(DATA dt)
{
    d1 = dt;
}

int main()
{
    DATA D1(25,03,1998);
    A obj(D1);
    obj.print();






    return 0;
}

0
  1. NAZWY Z WIELKICH LITER nie pasują do nazw klas, prędzej do makr...
  2. NAZWY Z WIELKICH LITER nie pasują również do nazw zmiennych.
DATA(int da=0, int mo=0, int ye=0):day(da),month(mo),year(ye){} 
A::A(DATA dt)
{
    d1 = dt;
} 

Nie musisz w konstruktorze DATA robić takiej sieczki z domyslnymi wartościami, wystarczy że oba te wycinki z kodem napiszesz tak:

DATA(int da, int mo, int ye) : day(da), month(mo), year(ye) {} 
A::A(DATA dt) : d1(dt)
{
    
} 
  1. Ogarnij te nazwy, d1, dt... nie lepiej po prostu data?
0

Dziękuje za rady, wezmę je sobie do serca.

Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1