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

Przekazywanie obiektu do funcji obiektu.

Object Storage Arubacloud
0 głosów
332 wizyt
pytanie zadane 30 kwietnia 2018 w C i C++ przez Damian.W Początkujący (320 p.)

Witam

Mam pytanie odnośnie przekazania obiektu do metody funkcji jak to zrobić ale nie definiując o jaki typ obiektu obiekt chodzi.

Nie wiem jak to wytłumaczyć ale może najlepiej na przykładzie.


Wyswietl (Moja_klasa  &obiekt);   //(to jest metoda funkcji)


/// Gdzieś poniżej mam

this->NAZWA.setString(obiekt.imie);
  /// dobiera sie do zmiennej imie obiektu podanego w referencji.



///i teraz jest fajnie ale ja bym chciał podawać
/// czasem inne obiekty  niż Moja_klasa
/// np Moja_klasa_dwa.
///no i oczywiście sie nie da bo mogę tylko wpisywać 
///obiekty typu moja klasa.

I teraz tar robić kilka funkcji przeciążając je z rożnymi typami obiektów? (nie bardzo mi to pasuje bo będę powielał dziesiątki linijek kodu albo i więcej)

Proszę o jakieś rady bądź odesłanie do jakiegoś wątku jeżeli było coś podobnego.

Pozdrawiam Damian

czy jakoś inaczej

1 odpowiedź

+3 głosów
odpowiedź 30 kwietnia 2018 przez Knayder Nałogowiec (37,640 p.)

Template'y.
http://coliru.stacked-crooked.com/a/416df5454267d85e
Tutaj masz przykładowe użycie.
Template'y pozwalają na dużo więcej, więc to temat warty zapoznania.

Jakby co, to używam tutaj "zgadywania typu" podczas wywoływania funkcji.
Można to też zapisać tak:
 

#include <iostream>

template<typename T>
void print(T obj) {
    std::cout << obj << '\n';
}

int main()
{
    print<int>(10);
    print<const char*>("asdasd");
    print<float>(12.34234f);
}

Mogłeś się spotkać z tym zapisać, np. podczas tworzenia wektora:
std::vector<int> vec;

komentarz 30 kwietnia 2018 przez RafalS VIP (122,820 p.)

Tutaj akurat nie trzeba jawnie podawać typu szablonu bo kompilator sam się domyśli po argumencie :P:
 

    print(10);
    print("asdasd");
    print(12.34234f);

 

1
komentarz 30 kwietnia 2018 przez Knayder Nałogowiec (37,640 p.)
Polecam przeczytać dokładnie co napisałem i wejść w link który wysłałem.
komentarz 30 kwietnia 2018 przez RafalS VIP (122,820 p.)
Zwraxam honor. Moj blad
komentarz 30 kwietnia 2018 przez Damian.W Początkujący (320 p.)

@Knayder, Czytam o tym i czacha dymi nic nie rozumiem.


Metoda_w klasie_A(Jakaś_Klasa  &obiekt)
{

 dobierz_się_do_zmiennej(obiekt.imie);

}

 

Kawałek kody jak powyżej musi mieć taka postać.

Jak mogę to zaaplikować do mojego przykładu.

Proszę o jakąś łopatologiczną odpowiedź bo nie ogarniam dopiero zacząłem z klasami i się gubię.

 

Pozdrawiam

 

komentarz 30 kwietnia 2018 przez Knayder Nałogowiec (37,640 p.)

Jak dopiero zacząłeś z obiektówką i jak mówisz "czacha ci dymi", to odpuść sobie na razie to zagadnienie. Zrozum dobrze obiektówkę najpierw.
 

template<typename T>
Metoda_w klasie_A(T  &obiekt)
{
 dobierz_się_do_zmiennej(obiekt.imie);
}

Tutaj oczywiście zakładamy, że obiekt ma w sobie takie coś jak 'imie'

komentarz 30 kwietnia 2018 przez Damian.W Początkujący (320 p.)
Myślałem właśnie żeby to tak zrobić ale niestety nie działa.

być może ja źle wytłumaczyłem o co mi chodzi.

tworzę jeden element wypisujący dane innych obiektów ale chciałbym aby obiekty były różnych klas a nie tylko jednej zdefiniowanej.

czyli np:

Klasa_wypisujaca wypisz;

stworzyłem sobie obiekt wypisz.

i teraz w tym obiekcie wypisz uruchamiam funkcję wypisz.update();

ale update ( powinno_mieć typ i argument);

ja chce do tej funkcji wysłać obiekt i teraz bym chciałbym aby nie chciał ode mnie typu czyli w tym wypadu klasy.

albo żeby akceptował wszystkie typy które gdzieś zdefiniuje.

np.

mam: KLASA1     KLASA2,   KLASA3   i po 100 obiektów do każdej klasy.

wypisz.update(  &obiekt );  (np wskaźnik wskazuje na obiekt 34 KLASY1)

ale za chwile  .

wypisz.update(&obiekt) ;  teraz wskaźnik wskazuje na 65 KLASY3.

tylko problem bo muszę podać typ a to mi komplikuje.

to tylko przykład bo klas może być np 100 a elementów danej klasy 200.

Nie bardzo ogarniam jak Template może mi pomóc.

Pozdrawiam
komentarz 30 kwietnia 2018 przez Knayder Nałogowiec (37,640 p.)
template<typename T>
void update(T& object) {

}

 

komentarz 30 kwietnia 2018 przez Damian.W Początkujący (320 p.)

Witam

Problem w tym że cały czas tak próbuje robić i mam błąd w kompilacji.

Plik main.cpp

      Baza baza[5];

     Menu wypisz;
     wypisz.aktualizuj( baza[2]);

Plik Menu.h

class Menu : public Drawable
{
public:

	Menu();
	~Menu();
	template<typename T>
	void aktualizuj(T& obiekt);

private:
	virtual void draw(RenderTarget & target, RenderStates states) const;
	vector <Text> napis=vector<Text>(8);

    Texture texture;
    Sprite sprite;
	Font font;

};

Plik Menu.cpp

  template<typename T>
void Menu::aktualizuj(T& obiekt)
{
    this->napis[0].setString( obiekt.imie);
   
}

i błąd

|16|undefined reference to `void Menu::aktualizuj<Baza>(Baza&)'|

Nie wiem czy dobrze rozumiem ale dalej brakuje mi gdzieś deklaracji czy coś?

komentarz 30 kwietnia 2018 przez Knayder Nałogowiec (37,640 p.)

Generalnie jeżeli chodzi o funkcje template'owe w c++, to niestety ich ciało musi być znane w headerze.
Nie możesz umieścić ciała funkcji w pliku cpp (Na normalny sposób). Umieść ciało w pliku hpp.
 

class Menu : public Drawable
{
public:
 
    Menu();
    ~Menu();
    template<typename T>
    void aktualizuj(T& obiekt) {
        this->napis[0].setString( obiekt.imie);
    }
 
private:
    virtual void draw(RenderTarget & target, RenderStates states) const;
    vector <Text> napis=vector<Text>(8);
 
    Texture texture;
    Sprite sprite;
    Font font;
 
};

Jakbyś się zastanawiał dlaczego tak jest:
https://stackoverflow.com/questions/115703/storing-c-template-function-definitions-in-a-cpp-file

komentarz 30 kwietnia 2018 przez Damian.W Początkujący (320 p.)
Zadziałało.

Czyli od samego początku od 1 przykładu dobrze robiłem.

Tylko nie wiedziałem że to musi być w pliku nagłówkowym cała funkcja a nie tylko deklaracja.

Taki new-ans.

Dziękuję za cierpliwość bo w zasadzie stawiając się z twojej strony to można mieć odczucie że ty do mnie gotowym rozwiązaniem jak grochem o scanię. (ja jak ściana wszystko odbijam nic nie przyjmuje)

Z skąd miałeś wiedzieć że nie wiem że to musi być w pliku h.

Postaram się poczytać co w tym linku jest ale jak nie zrozumiem to pozwolę sobie zapytać dlaczego tak musi być.

Pozdrawiam i dziękuję.
komentarz 30 kwietnia 2018 przez Knayder Nałogowiec (37,640 p.)
Nie no, mogłem od razu wspomnieć, moja wina ;/

Podobne pytania

0 głosów
2 odpowiedzi 379 wizyt
0 głosów
1 odpowiedź 134 wizyt
pytanie zadane 12 listopada 2016 w C# przez Corazzo Obywatel (1,040 p.)
0 głosów
1 odpowiedź 1,420 wizyt
pytanie zadane 12 listopada 2016 w JavaScript przez ReksetoDev Gaduła (4,530 p.)

92,641 zapytań

141,521 odpowiedzi

319,909 komentarzy

62,019 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...