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

Użycie prywatnej funkcji składowej obiektu z innej klasy niż obiekt? SFML

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
380 wizyt
pytanie zadane 11 lutego 2017 w C i C++ przez Miszo Bywalec (2,100 p.)

Kod znajduje się na stronie: http://szymonsiarkiewicz.pl/poradniki/sfml-kurs-podstawowy/rysowanie-obiektow-2d/

Dlaczego w tym przykładzie wywołujemy funkcję klasy Postac na obiekcie klasy RenderWindow (Window) ???

#include <SFMLGraphics.hpp>

class Postac : public sf::Drawable
{
public:
	sf::Sprite sprite;

	int zycie;
	int sila;
	// inne cechy

private:
	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
	{
		//rysowanie obiektow, które składają się na narysowanie naszej postaci
		target.draw(sprite);
	}
};

int main()
{
	Postac postac;

	//zaladowanie tekstury naszego sprite'a
	...

	sf::RenderWindow window(sf::VideoMode(1280,720),"Rysowanie wlasnej klasy");
	//dopóki okno jest otwarte
	while(window.isOpen())
	{
		sf::Event event;
		while(window.pollEvent(event))
		{
			...
		}

		window.clear();

		//narysowanie naszej postaci
		window.draw(postac);

		window.display();
	}
}

Przecież instrukcje wykonywane są w funkcji klasy Postac, a nie Window.

komentarz 11 lutego 2017 przez criss Mędrzec (172,590 p.)

Dlaczego w tym przykładzie wywołujemy funkcję klasy Postac na obiekcie klasy RenderWindow?

 Hem? Gdzie? I właściwie.. co to znaczy?

komentarz 11 lutego 2017 przez Miszo Bywalec (2,100 p.)

Tutaj mamy funkcje składową klasy Postac.

private:
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        //rysowanie obiektow, które składają się na narysowanie naszej postaci
        target.draw(sprite);
    }
};

A tutaj mamy wywołanie tej funkcji... no właśnie nie z obiektu klasy Postac, a Window.

window.draw(postac);

Jaki to ma sens? 

komentarz 11 lutego 2017 przez criss Mędrzec (172,590 p.)

To nie jest wywołanie tej funkcji. To niemożliwe. Wywoływana jest sf::RenderWindow::draw (nawiasem mówiąc dziedziczona z sf::RenderTarget). W odpowiedzi masz link do kodu.

komentarz 11 lutego 2017 przez Miszo Bywalec (2,100 p.)
To na co mi ta prywatna funkcji w klasie Postac? Skoro nie jest nawet wykonywana?
komentarz 11 lutego 2017 przez criss Mędrzec (172,590 p.)
Wrzuciłem ci link do kodu sf::RenderTarget::draw. Jak widzisz, wywołuje ona metode draw przekazanego obiektu. A więc jest wykonywana..
1
komentarz 11 lutego 2017 przez Munvik Dyskutant (9,350 p.)
Jeżeli odziedziczy po sf::Drawable musisz nadpisać wirtualkę sf::RenderTarget::draw i definiujesz w niej co ma byc rysowane. A jest tak dlatego, że sf::RenderTarget::draw przyjmuje sf::Drawable* czyli te wszystkie obiekty co są dziedziczone po sf::Drawable.

1 odpowiedź

+1 głos
odpowiedź 11 lutego 2017 przez criss Mędrzec (172,590 p.)

Chodzi ci o

window.draw(postac);

?

Tu masz odpowiedź: https://github.com/SFML/SFML/blob/master/src/SFML/Graphics/RenderTarget.cpp#L193

Podobne pytania

0 głosów
1 odpowiedź 378 wizyt
pytanie zadane 12 października 2018 w C i C++ przez oliwzcak12 Użytkownik (550 p.)

93,096 zapytań

142,059 odpowiedzi

321,514 komentarzy

62,441 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...