• 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
330 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 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 368 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,419 wizyt
pytanie zadane 12 listopada 2016 w JavaScript przez ReksetoDev Gaduła (4,530 p.)

92,596 zapytań

141,445 odpowiedzi

319,717 komentarzy

61,980 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!

...