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

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

29.01.2011, 15:18

Funktion definieren - 8 mal mit unterschiedlichen Parametern - oder gehts einfacher?

Sehr geehrtes Forum,
Ich wollte etwas erfragen, und zwar schreibe ich mir ja gerade
die X-Games-Library, und wollte wissen, ob ich funktionen, mit kleinen
Unterschieden immer so deklarieren muss oder nicht, ihr werdet die Frage sicherlich an diesem
Beispiel verstehen :

Ich habe eine Funktion die mir eine LaserLinie zeichnet, doch diese Funktion, soll
auf jeden Fall die Position der Beiden Linienpunkte haben + die Mantel-Farbe (was das ist braucht ihr eig. nicht zu wissen) des Lasers,
und optional noch eine Farbe, nämlich die des Lasers, doch wie kann ich das anstellen ?

C-/C++-Quelltext

1
void drawLaserLine(sf::RenderWindow* window,int x1,int y1,int x2,int y2,int width,sf::Color& c,sf::Color& c = sf::Color::White);

Ihr seht hier ja, dass ich dem letzten Parameter schon einmal ein Default gesetzt habe, nämlich sf::Color::White.

Ich möchte die Funktion manchmal aufrufen, und zwar nachfolgendem Muster :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
sf::Color laser = sf::Color::Blue;
sf::Color laser2 = sf::Color::Red;

// Mal so
drawLaser(....,laser);

// Mal so
drawLaser(...,laser,laser2);


Das geht auch, doch wenn ich beim Funktionsaufruf eine Farbe definiere, also so :

C-/C++-Quelltext

1
drawLaser(...,sf::Color::Blue);

Dann meckert der Compiler, dass die Funktion keine const sf::Color& haben will, sondern einfach nur sf::Color&.
Muss ich da jetzt für jedes Muster extra ein Funktionsrumpf anlegen? Was ist denn eigentlich auch noch mit dem Default, das ist gesetzt habe, ich kann ja keiner const sf::Color& im Funktionskopf ein Default Wert geben, was soll ich also machen, muss ich da extra viele Funktionsrumpfe angeben, oder hättet ihr da ne idee, was ich machen kann?

M.f.G: Developer_X

PS: Ihr werdet euch wundern warum ich oben im Titel 8 geschrieben habe, das liegt daran, dass ich es die Funktion auch einmal gibt, die aber keine Koordinaten in Integern bekommen will, sondern in Points, eine Struktur die ich auch noch definiere.
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

2

29.01.2011, 15:34

Ach und ist es möglich Funktionen eines namespaces zu überschreiben?

Denn wenn man jetzt eine HPP Datei schreibt, in der Funktionen eines Namespaces enthalten sind, dann ist das doch haufig Arbeit, so viel Code in die HPP zu packen, anstatt diese HPP in eine CPP zu includen und dann diese Funktionen dort zu definieren.
Ist das möglich?

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

3

29.01.2011, 15:40

Mach doch aus deinem Parameter-Wust eine Klasse oder ein struct, das du dann übergibst!?
fka tm

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

4

29.01.2011, 15:43

Aber es soll ja gerade so übergeben werden, damit es einfacher ist, glaub mir,
wenn man die Methode mal in Aktion sieht, ist die gar nicht mehr so breit.

Auf jeden Fall hat jemand antworten auf meine Fragen?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

5

29.01.2011, 17:18

Also ich habe gerade folgendes Problem :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
        void drawLaserLine(sf::RenderWindow* window,int x1,int y1,int x2,int y2,int width,sf::Color& c)
        {
            //
        }
        void drawLaserLine(sf::RenderWindow* window,int x1,int y1,int x2,int y2,int width,const sf::Color& c)
        {
            //
        }


Der gibt folgende Fehlermeldung aus :

Quellcode

1
|multiple definition of `X_System::Graphics::drawLaserLine(sf::RenderWindow*, int, int, int, int, int, sf::Color&)'|


Aber warum ?
einmal ist die Farbe const, und einmal nicht, wo ist da der Unterschied ?

M.f.G. Developer:_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

6

29.01.2011, 17:36

Der Compiler meint, dass beide Funktionen gleich sind, weil nur nach Variablentypen und nicht nach "const" oder Ähnlichem unterschieden wird. Außerdem kommt mir so etwas ein bisschen sinnlos vor. Ich weiß nicht, was du erreichen willst, wenn die Variable einmal const ist und das andere Mal nicht? Lasse das "const" doch einfach weg.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

7

29.01.2011, 17:46

was ist wenn ich die methode einmal so :
drawLaserLine(...,sf::Color::White);
aufrufen will, und einmal so :
sf::Color c;
drawLaserLine(....,c);

???
Verstehst du, deswegen mache ich das,
muss ich denn die Variable nicht const haben?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

8

29.01.2011, 17:49

Nein, die Variable muss nicht const sein ;)

Der übergebene Wert initialisiert die neue Variable nur. Diese kann so oder so in der Funktion nach Belieben verändert werden.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

9

29.01.2011, 17:54

Gut, ich habe echt richtige Probleme das hinzubekommen, ich zeig dir mal was:

C-/C++-Quelltext

1
2
3
4
5
6
7
        // Den Inhalt der Methoden spielt hier keine Rolle
        void drawLaserLine(sf::RenderWindow* window,int x1,int y1,int x2,int y2,int width,sf::Color& c,sf::Color& c2 = sf::Color::White)
        {
        }
        void drawLaserLine(sf::RenderWindow* window,Point &p1,Point &p2,int width,sf::Color& c,sf::Color& c2 = sf::Color::White)
        {
        }


Wie kann ich denn jetzt Standard Werte festlegen, bei Referenzen?
Ich möchte nämlich dass der Standardwert von c2 sf::Color::White ist,
verstehst du?

Wie kann ich das machen?

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

29.01.2011, 18:02

Referenzen können so nicht initalisiert werden. Man muss ihnen eine Adresse zuweisen. sf::Color::White ist eine Konstante. Lasse einfach bei sf::Color& das & weg und benutze eine normale Variable. Eine Referenz ist hier unnötig.

Deine Funktionsüberladung mit 2 Integern für einen Point (Referenz ist auch hier unnötig) ist nicht erforderlich. Du kannst beim Aufruf der Funktion einfach das schreiben, um die 2 Integer in einen Point umzuwandeln:
drawLaserLine(window, Point(x1, y1), Point(x2, y2), width, c);

P.S. Danke für deinen Kommentar auf meiner Seite ^^

Werbeanzeige