Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TigerClaw25

unregistriert

1

07.07.2017, 09:02

Klassen in SFML

Guten Morgen,
ich hätte eine Frage zum Thema Klassen.

Folgende Schreibweise kenne ich so nicht:

C-/C++-Quelltext

1
2
3
4
5
6
int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
...


Den "::" Operator kenne ich bisher nur in Verbindung mit einer statischen Variablen oder aber bei der globalen Deklaration von Memberfunktionen außerhalb der main-Funktion. Ich gehe mal davon aus, dass "sf::RenderWindow" die Klasse an sich ist und "window" die Instanz. Aber wieso besteht der Klassenname aus zwei Teilen mit dem "::"-Operator dazwischen?

"sf" ist nach meiner Recherche ein namespace ähnlich "std". Aber hier hört das VErständnis auch auf. Dachte "::" kommt nur in Verbindung mit Klassendefinitionen vor.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

07.07.2017, 09:28

Guck mal hier.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

07.07.2017, 10:20

"sf" ist nach meiner Recherche ein namespace ähnlich "std".

Genau!

Dachte "::" kommt nur in Verbindung mit Klassendefinitionen vor.

Falsch gedacht ;)

TigerClaw25

unregistriert

4

07.07.2017, 11:04

Ah, das bedeutet, dass die Klasse "RenderWindow" auch in anderen Headern implementiert sein kann und dann unklar ist, welche der gleichnamigen Klassen nun aufgerufen werden soll. Daher der Namensraum. Danke. Je mehr ich lerne, desto schneller vergesse ich, was ich die letzten Tage erarbeitet habe. In zwei Wochen stelle ich mir wieder die selben Fragen. :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

07.07.2017, 11:07

Genau, stell dir vor, du möchtest neben SFML noch eine andere Bibliothek nutzen, und dummerweise gibt es gleichnamige Klassen in beiden Bibliotheken. Bei Namen wie Vector2D ist das gar nicht so unwahrscheinlich. Dann hättest du ein Problem, wenn die Bibliotheken nicht ihre eigenen Namensräume nutzen würden.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

07.07.2017, 11:16

Ah, das bedeutet, dass die Klasse "RenderWindow" auch in anderen Headern implementiert sein kann und dann unklar ist, welche der gleichnamigen Klassen nun aufgerufen werden soll. Daher der Namensraum.

Genau. Im Fall vom RenderWindow ist das vielleicht erst mal nicht so offensichtlich aber möglicherweise hast du ein FGrafikfamework welches eine Klasse vector für Positionen in der Spielwelt hat. Jetzt gibt es zusätzlich std::vector was hier störend sein kann. Hinzu kommt deine Physikengine die unter Umständen auch eine Klasse mit dem Namen vector hat. Die alle können sich in die Quere kommen und das ist schlecht. Der Fall ist vielleicht offensichtlich, jetzt kann es aber auch passieren dass du tatsächlich eine weitere Klasse mit dem Namen RenderWindow hast. Vielleicht nutzt du zwei unterschiedliche Bibliotheken die beide so eine Klasse besitzen. Das ist wieder Mist, also schiebt man den ganzen Kram in einen Namensraum. Bei vielen C++ Projekten ist es so dass es einen Namensraum für das gesamte Projekt gibt. Manche Projekte gehen etwas weiter und unterteilen in mehr Namensräume. SFML 1 ist da so ein Beispiel für. Es gibt den übergeordneten Namensraum sf, welcher wiederum in mehrere unterschiedliche Namensräume unterteilt ist. Bei SFML 2 ist man mehr zu nested classes übergegangen. Was das ist kann dir Google verraten.
Halten wir einfach fest, du hast verstanden was Namespaces sind und kannst sie benutzen. Viel mehr ist für den Anfang erst mal nicht wichtig.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

ugoessner

Frischling

Beiträge: 52

Wohnort: Wedemark OT-Mellendorf

Beruf: Systeminformatiker

  • Private Nachricht senden

7

12.07.2017, 19:10

Je mehr ich lerne, desto schneller vergesse ich, was ich die letzten Tage erarbeitet habe. In zwei Wochen stelle ich mir wieder die selben Fragen.


Bei Programmiersprachen geht es wie in der Mathematik nicht auswendig lernen sondern versuchen zu verstehen.
Denn nur, wenn du etwas verstanden hast kannst du es dir bei anderen Stellen herleiten.
#define __miniMAL 0x00

Werbeanzeige