• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

teoria C++ klasy

0 głosów
183 wizyt
pytanie zadane 16 października 2018 w C i C++ przez Zayebisty Bywalec (2,450 p.)
witam

chcialbym sie zapytac o kilka rzeczy zwiazanych z teoria pisania w C++

1. mam funkcje ktora chce czesto wykorzystywac w roznych kasach co mam zrobic.. dodac ta funkce do kazdej klasy czy utorzyc klase dla tej funkcji i w kazdej innej klasie tworzyc obiekt i wywolywac ta potrzebna funkcje..czy moze utworzyc klase dla tej funkcji i zrobic tak zeby kazda klasa dziedziczyla po tamtej

2. mam klase A kora tworzy obiekt klasy B jak wewnatrz klasy B moge odniesc sie do obiektu klasy A jego zmiennych itp.

3.klasa A utworzyla przykladowo obiekty klasy B i C a klasa B utworzyla obiekt klasy D jak z obiektu klasy D moge dostac sie do zmiennych obiektu klasy C ktory utworzyla klasa A... i ogolem jak mozna zrobic wymiane danych miedzy obiektami roznych klas w optymalny sposob

4. jesli ktos moze prosil bym o linki gdzie w ciekawy sposob jest wytlumaczone jak dobrze projektowac programy zaleznosci miedzy klasami i obiektami itp

4 odpowiedzi

+1 głos
odpowiedź 16 października 2018 przez adrian17 Mędrzec (174,260 p.)
1. Jeśli to jakiś uniwersalny kod nie mający związku z żadną konkretną klasą... nie umieszczaj go w klasie. Jeśli wszystkie klasy są powiązane, może powinny mieć klasę bazową.

2. Nie możesz tak po prostu - musiałbyś przekazać referencję do obiektu klasy A jako parametr lub pole B.

3. Słabo rozumiem "klasa A tworzy coś"... może dasz przykład?
komentarz 16 października 2018 przez Zayebisty Bywalec (2,450 p.)

1. nie sa powiazane ale wiekszosc potrzebuje tej jednej konkretnej fukkcji

2. skoro tak to jak przez referencje przekazac samego siebie.. nie da sie przes wskaznik this? przeciez pokazuje na obiekt ktory utworzyl obiekt

3. robione na szybko jest pokazane jaki obiekt tworzy jaki obiekt (taka chierarchia) i jak z obiektu D moge sotac sie do C

+1 głos
odpowiedź 16 października 2018 przez PanRik Gaduła (4,630 p.)

4. Nie musisz sam projektować zależności między klasami, już zostało to zrobione: >Wzorce Projektowe<.

Otóż te pytania, które tutaj zadajesz "zależności" opisują właśnie wzorce projektowe. Jest jest jeszcze coś takiego jak: >Dependency Injection<. Czyli właśnie "wstrzykiwanie zależności" do klasy, aby można było za pomocą innej klasy operować na innej.

komentarz 16 października 2018 przez Zayebisty Bywalec (2,450 p.)
no otarlem sie cos o wzorce ale nie potrafilem tego zastosowac w wkiekszym projekcie... jak bys znal jakies ciekawe materialy na ten temat to podeslij poczytam
1
komentarz 16 października 2018 przez PanRik Gaduła (4,630 p.)

>Rusz głową wzorce projektowe< dużo osób poleca. Najlepiej to by było dorwać kogoś kto kiedyś taki wzorzec zastosował i by o tym odpowiedział :)

+1 głos
odpowiedź 16 października 2018 przez Aisekai Nałogowiec (31,910 p.)
1. Zależy od przypadku. Możesz np wyodrębnić metodę dodającą ofertę na giełdę, do jakiejś klasy OfferAdder. Korzystanie z dziedziczenia tylko po to, żeby dane klasy miały jakąś metodę to słaby pomysł. Jeżeli uważasz, że klasy pochodne mogą mieć jakąś klasę bazową/implementowany interfejs z tą metodą i ma to logiczne uzasadnienie (np interfejs pełniący rolę Środka Transportu i klasy Auto, Hulajnoga, Metro itd) - jeżeli zmienisz obiekty (np  z Hulajnogi na Rower) będące polami innych obiektów i będzie to miało sens to wg mnie możesz stworzyć taki interfejs/klasę. Możesz też stworzyć klasę i tworzyć obiekty tej klasy, tylko pytanie jest jedno: czy w takim wypadku architektura aplikacji nie jest na tyle zła, że powinieneś pomyśleć jak to zrefaktoryzować, zamiast łatać dziury i rzeźbić w gó... znaczy brązie?

2. W klasie B tworzysz pole, które jest typu klasy A i wstrzykujesz seterem czy inną metodą. Nie można zrobić tak, że w konstruktorze klasy A jest wymagany obiekt klasy B, a w konstruktorze klasy B obiekt klasy A.

3. Podobnie jak w 2 podpunkcie tylko jakimiś geterami odwoływać się wyżej w hierarchii. Coś w stylu d.getB().getA().getC().getCostam() Tylko tutaj kolejny raz pytanie zadam. Czy nie powinieneś pomyśleć nad refaktoryzacją i starać się unikać czegoś takiego? Takie zagłębianie, gdzie obiekt nisko w hierarchii odwołuje się do obiektu wysoko nie jest dobrym pomysłem.

4. Tutaj to wzorce projektowe mógłbym polecić. Materiałów nie znam, bo na uczelni przerabiamy.

Edit: 4) Jakaś fasada, DI, czy nawet Singleton (jeżeli klasa spełnia kryteria singletonu, czyli jest bezstanowa) dużo mogą Ci pomóc.
komentarz 16 października 2018 przez Zayebisty Bywalec (2,450 p.)
1. no skoro tak to dziedziczenie i tworzenie obiektow odpadaja a o tym pierwszym nie szlyszalem

2. moge prosic o jakis prosty przyklad

3. no rozumiem na przyszlosc postaram sie lepiej planowac
komentarz 16 października 2018 przez Aisekai Nałogowiec (31,910 p.)
Przykładu Ci niestety nie podam, bo C++ nie znam. W javie, wystarczyłoby żebyś dodał pole w klasie B typu A, jakiś setter który przyjmowałby parametr typu A i zapisywał do tego pola ten parametr, a w klasie A wywołał na obiekcie B tego settera przekazując this jako parametr.

Odnośnie 3, to zastanowiłbym się czy w takim przypadku, to w klasie A byś "łączył" wywołania metod klas C i D. Albo  przerobić klasę A tak, żeby pełniła taką rolę. Bez kodu, ciężko cokolwiek powiedzieć.
komentarz 16 października 2018 przez Zayebisty Bywalec (2,450 p.)
to jesli to nie problem napisz cos przykladowego w javie (tez troche jej liznalem) tak zebym mogl zobrazowac sobie co masz na mysli

3.co masz na mysli piszac "laczyl" wywolania
komentarz 16 października 2018 przez Aisekai Nałogowiec (31,910 p.)

Na szybko pisane, bez getterów/setterów - dostęp publiczny, choć nie powinien taki być (ale jak mówiłem na szybko pisane):

class Foo {
    public Boo boo;
    
    public Foo(Boo boo){
        this.boo=boo;
        boo.foo=this;
    }
    // lub
    public Foo(){
        this.boo = new Boo();
        boo.foo=this;
    }
}

class Boo{
    public Foo foo;
    
}

A odnośnie 3:

class Foo {
    String method(){
        return "String z Foo class";
    }
}

class Boo{
    String method(String arg){
        return arg + " i dodany jakis przykladowy String";
    }
}

class Woo{
    Foo foo = new Foo();
    Boo boo = new Boo();
    
    void method(){
        System.out.println(foo.method());
        System.out.println(boo.method(foo.method()));
    }
}

Nie masz czegoś takiego, że musisz się odwoływać do obiektu D z obiektu C. W twoim przypadku, w klasie A zostałaby wywołana metoda z klasy B, która coś tam by zrobiła i wywołała metodę z klasy D, która też by coś zrobiła i zwróciła/zrobiła coś, Potem w klasie A zostałaby wywołana funkcja z klasy B, która też by coś zwróciła/zrobiła. Tylko jeżeli metoda klasy B, nie robiła nic innego tylko wywoływała/zwracała rezultat z metody klasy D to imo też nie jest zbyt dobrze.

komentarz 17 października 2018 przez Zayebisty Bywalec (2,450 p.)
aa dobra troche mi rozjasniles wielkie dzieki
+1 głos
odpowiedź 16 października 2018 przez mokrowski VIP (101,860 p.)

1. mam funkcje ktora chce czesto wykorzystywac w roznych kasach co mam zrobic.. dodac ta funkce do kazdej klasy czy utorzyc klase dla tej funkcji i w kazdej innej klasie tworzyc obiekt i wywolywac ta potrzebna funkcje..czy moze utworzyc klase dla tej funkcji i zrobic tak zeby kazda klasa dziedziczyla po tamtej

Oczywiście że wydzielić funkcję do oddzielnego pliku *.cpp i *.hpp oraz włączyć nagłówki do klas używających tejże funkcji. Pamiętaj że programowanie obiektowe to nie jest "fanatyzm obiektowy". Zwykłe swobodne funkcje są ok.

2. mam klase A kora tworzy obiekt klasy B jak wewnatrz klasy B moge odniesc sie do obiektu klasy A jego zmiennych itp.

W trakcie tworzenia obiektu klasy B w klasie A, przekaż do obiektu klasy B referencję lub wskaźnik do obiektu klasy A.

3.klasa A utworzyla przykladowo obiekty klasy B i C a klasa B utworzyla obiekt klasy D jak z obiektu klasy D moge dostac sie do zmiennych obiektu klasy C ktory utworzyla klasa A... i ogolem jak mozna zrobic wymiane danych miedzy obiektami roznych klas w optymalny sposob

W trakcie tworzenia obiektu typu C w klasie A, może ona zachować referencję lub wskaźnik do obiektu klasy C. Wystarczy wtedy z obiektu klasy D, poprosić klasę A o zwrócenie tej referencji.

Twoje problemy w mojej ocenie są nieco teoretyczne. Jeśli podasz choćby jakiś prosty przykład problemu, będę mógł się do tego odnieść. W projektowaniu obiektowym jest wiele "to zależy". Nawet rady powyżej są "zawieszone w teoretycznej przestrzeni" i mogą wziąć w łeb jeśli chodzi o konkretne zastosowanie.

Proponuję Ci abyś napisał prostą grę (np. warcaby) pracującą wyłącznie na konsoli ale zaprojektowaną obiektowo. Możesz później podać tu link do źródeł a dostaniesz informację zwrotną.

komentarz 16 października 2018 przez Zayebisty Bywalec (2,450 p.)
wiem ze sa teoretyczne i takie maily byc nie mam konkretnego kodu poprostu zebralem wszystkie problemy jakie napotkalem do tej pory i chcialem zeby ktos podal mi chociaz przyklad jak mozna to rozwiazac

1. rozumiem wsumie nie potrzenie kurczowo trzymalem sie klas

2.rozumiem to pisali poprzednicy tylko nie moge znalezc jak wyslac przez referencje samego siebie

3.rozumiem ale zeby klada D mogla o niego poprosic jakos dostac sie do klasy A... rozumiem ze moge to zrobic tak jak w punkcie drugim tlumaczyles.. klasa A wysle siebie do klasy B a klasa B wysle A do D wtedy klasa D bd mogla sie odniesc do klasy A i odebrac od niej referencje klasy C.. dobrze rozumiem?
komentarz 16 października 2018 przez mokrowski VIP (101,860 p.)
No tak. Bez konkretnego przykładu jednak jakość jakichkolwiek rad jest dyskusyjna.
komentarz 16 października 2018 przez Zayebisty Bywalec (2,450 p.)
rozumiem.. a wracajac do 2 punktu jak klasa moze wyslac sama siebie przez referencje
komentarz 16 października 2018 przez mokrowski VIP (101,860 p.)
*this

Podobne pytania

+1 głos
3 odpowiedzi 444 wizyt
pytanie zadane 18 kwietnia 2015 w C# i .NET przez Surykat Pasjonat (15,000 p.)
+5 głosów
12 odpowiedzi 250 wizyt
pytanie zadane 6 września 2015 w Nasze projekty przez MatexQ Bywalec (2,260 p.)
+1 głos
3 odpowiedzi 174 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez 4nt0n Nowicjusz (130 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

62,361 zapytań

108,494 odpowiedzi

226,498 komentarzy

35,434 pasjonatów

Przeglądających: 193
Pasjonatów: 12 Gości: 181

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...