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

Przekazywanie obiektu do funcji obiektu.

VPS Starter Arubacloud
0 głosów
326 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 356 wizyt
0 głosów
1 odpowiedź 130 wizyt
pytanie zadane 12 listopada 2016 w C# przez Corazzo Obywatel (1,040 p.)
0 głosów
1 odpowiedź 1,413 wizyt
pytanie zadane 12 listopada 2016 w JavaScript przez ReksetoDev Gaduła (4,530 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...