[SOLVED] Memberfunktion mit Parametern



  • Hallo Leute,

    ich habe eine grundlegende Frage zur Objektorientierung in C++. Und zwar frage ich mich, ob es nicht eine effizientere Weise gibt, folgendes auszudrücken:

    Ich habe eine Instanz einer Klasse.

    Texture btnTexture;
    

    Ich rufe eine Memberfunktion dieser Klasse auf, welche einen Parameter hat. Die Memberfunktion sieht wie folgt aus:

    void Texture::Update(Vector2D position);
    

    Beim Aufrufen dieser Funktion nutze ich eine andere Klasse, die als Singleton definiert ist, und welche mir den benötigten Parameter liefert.

    btnTexture.Update(SizeHandler::Instance()->centerObject(...));
    

    Nun ist es so, dass die Funktion centerObject() der SizeHandler Klasse, die Aufgabe hat, mithilfe der Höhe und der Breite der Textur/Grafik, die Position dieser zu zentrieren, also immer in die Mitte des Fensters zu packen.

    Diese Funktion centerObject() hat dann natürlich den Rückgabewert Vector2D, denn es wird eine Position mit x und y Koordinate berechnet und zurückgegeben. Dementsprechend passt dies auch zum Parameter der Memberfunktion Update der Texture Klasse, die ja als Parameter ein Vector2D Objekt erwartet.

    Nun sind zwischen den Klammern in obigen Code-Beispiel drei Punkte. Eigentlich sieht das Aufrufen der Funktion centerObject() folgendermaßen aus:

    btnTexture.Update(SizeHandler::Instance()->centerObject(btnTexture.width, btnTexture.height));
    

    denn:

    Vector2D SizeHandler::centerObject(int width, int height);
    

    Ich finde aber "doof", dass ich die Membervariablen width und height des Objekts btnTexture als Parameter übergeben muss, da ich diese dann als public definieren muss. Gut ich könnte Funktionen wie getWidth() und getHeight() definieren, aber gibt es nicht eine noch bessere Art und Weise dieses Problem zu lösen. Kann ich nicht irgendwie schlauer auf diese Membervariablen des Texture Objekts innerhalb der SizeHandler Klass bzw. in der Funktion centerObject() zugreifen, da es ja Membervariablen sind, die zu dem Objekt gehören, welches die Funktion Update überhaupt aufruft?

    Ich würde mich über Antworten freuen. Danke 🙂



  • Folgendes wäre doch genial:

    btnTexture.Update(SizeHandler::Instance()->centerObject());
    

    Und dann:

    Vector2D SizeHandler::centerObject()
    {
      return Vector2D((screenWidth - *Das-Objekt-welches-diese-Funktion-aufgerufen-hat*.width) / 2, (screenHeight - *Das-Objekt-welches-diese-Funktion-aufgerufen-hat*.height) / 2);			
    }
    


  • Kannst du nicht in der Texture-Klasse selbst eine Funktion 'centerObject' erzeugen und diese ruft dann einfach

    this.Update(SizeHandler::Instance()->centerObject(this.width, this.height));
    

    auf ('this.' habe ich nur dem Verständnis wegen geschrieben, damit klar ist welches Objekt gemeint ist)?

    PS: Zumindestens Getter für die Eigenschaften 'width' und 'height' sind aber schon sinnvoll 😉



  • huzzm schrieb:

    btnTexture.Update(SizeHandler::Instance()->centerObject(btnTexture.width, btnTexture.height));
    

    Da width und height Member von Texture sind, Update offensichtlich eine Methode von Texture, sollte doch genügen:

    btnTexture.Update(SizeHandler::Instance()->centerObject(width, height));
    

    und sollte auch funktionieren, wenn width und height privat sind ... oder hab ich hier gerade was übersehen?



  • Th69 schrieb:

    Kannst du nicht in der Texture-Klasse selbst eine Funktion 'centerObject' erzeugen und diese ruft dann einfach

    this.Update(SizeHandler::Instance()->centerObject(this.width, this.height));
    

    auf ('this.' habe ich nur dem Verständnis wegen geschrieben, damit klar ist welches Objekt gemeint ist)?

    PS: Zumindestens Getter für die Eigenschaften 'width' und 'height' sind aber schon sinnvoll 😉

    Jo, ich habe jetzt die centerObject()-Funktion (und noch ein paar ähnliche Funktionen) als Teil der Texture Klasse implementiert. Dann brauche ich gar keine Parameter, da ja width und height Membervariablen sind. Danke 🙂


Anmelden zum Antworten