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

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

1

26.11.2013, 17:53

[C++] -> Operator überladen

Hallo Community,

ich möchte gerne den -> Operator überladen und somit einen Member einer Klasse statt mit dem Punkt-Operator mit dem Pfeil-Operator aufrufen.


Dafür habe ich eine Test-Klasse geschrieben:


TestKlasse.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef TESTKLASSE_HPP
#define TESTKLASSE_HPP

#include <iostream>

class TestKlasse 
{

public:
    TestKlasse (double Var)
    {
        this->Var = Var;
    }

    double Var;

    void show ()
    {
        std::cout << Var << std::endl; 
    }

    TestKlasse& operator++ ()
    {
    ++Var;

    return *this;
    }

    TestKlasse& operator-- ()
    {
    --Var;

    return *this;
    }

    TestKlasse& operator-> ()
    {
    return *this;
    }
};

#endif


main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "TestKlasse.hpp"

int main ()
{
    TestKlasse Test (3);

    ++Test;
    Test.show ();
    Test->show ();

std::cin.get ();

 return 0;
}



In Zeile neun bekomme ich einen Fehler (der Debugger versteht meine Operatoren-Überladung nicht (main.cpp)).
Ich habe trotzt googeln nichts vernünftiges gefunden.


Danke schon mal für eure Hilfe.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Swoerm« (26.11.2013, 18:02)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

26.11.2013, 18:10

Das geht so nicht.
Wenn du den Pfeil-Operator überladen willst musst du einen Zeiger zurückgeben oder ein Objekt, welches einen Zeiger zurück gibt (oder ein Objekt, welches einen Zeiger zurück gibt usw.).

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

3

26.11.2013, 18:55

Kannst du ein Code-Beispiel posten wie ich das lösen könnte, denn eigentlich gebe ich ja einen Zeiger auf ein Objekt zurück (*this).

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

26.11.2013, 19:05

Es macht keinen Sinn (und es ist auch keine gute Idee) hier etwas zu basteln. Warum genau willst du unbedingt den Pfeil-Operator benutzen?

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

5

26.11.2013, 19:25

In C++ für Spieleprogrammiere wurden ja oft Singletons und somit der Pfeil-Operator verwendet. Anfangs entwickelte ich mit den jeweiligen Sprite, Framework und Timer Klassen ein paar kleine Spiele. Irgendwann fing ich an SDL_ttf und SDL_mixer zu verwenden und ebenfalls Klassen dafür zu schreiben. Vor ein paar Monaten kam mir die Idee das ganze als eine Art Engine in DLLs und Libs zu verpacken und so zu verwenden statt immer diese ganzen Code Dateien in meinen Projekten einzufügen (in der zwischen Zeit bekam ich mit das Singletons keine gute Sache sind und habe viele entfernt bis auf das Framework,Timer und das Logfile bei denen Singletons noch halbwegs Sinn ergeben). Anfangs klappte das auch ganz gut und ich konnte die ganzen Code Dateien gut verwenden bis ich merkte das die Singletons nur auf sinnvolle Werte zeigen wenn sie innerhalb der DLL verwendet werden. Wenn ich jedoch einen Singleton in meinem regulären Programm benutzte kann ich zum Beispiel nicht das Logfile beschreiben. Nun will ich mich ganz von Singletons lösen aber ohne die ganzen Pfeil-Operatoren durch Punkt-Operatoren zu ersetzten. Deshalb will ich in Logfile, Timer und co. nun den Pfeil-Operator überladen um die ganze Umschreiberei zu vermeiden.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

26.11.2013, 19:35

denn eigentlich gebe ich ja einen Zeiger auf ein Objekt zurück (*this).

this ist ein Zeiger, *this nicht.
Das solltest du eigentlich wissen.

7

26.11.2013, 19:40

"Wie kann ich das am faulsten machen" heißt nicht irgendwelchen Operatoren aus Faulheit eine andere Funktion geben zu wollen. :crazy:
Bitte ersetze doch einfach -> mit ., indem du das Ersetzen-Tool aus dem Editor deines Vertrauens benutzt.

MfG
Check

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

8

26.11.2013, 19:40

Seltsamer Weise unterstreicht es mir this wenn ich * weg lasse rot. Deshalb habe ich den * getippt um diese Fehler (!?) zu beheben.
Hat VS 2012 Express ein Ersetzten-Tool?

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

26.11.2013, 19:42

Weil dein Rückgabetyp als Referenz deklariert ist.
Mein gut gemeinter Rat: Lass die Finger davon, wenn du diese Grundlagen noch nicht beherrschst (und danach auch, weil das niemand braucht!).

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

10

26.11.2013, 19:52

Ich benutzte momentan das Buch C++ lernen und professionell anwenden als Nachschlagwerk und dort steht auf S. 442

Zitat


C-/C++-Quelltext

1
2
3
4
5
6
// ...
DayTime& operator++()
{
++second;
return *this;
}// ...

Das habe ich dann mithilfe des Internets auf den -> übertragen. Und kam zu obrigem Ergebnis.
Und hat nun VS ein Ersetzten-Tool?

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Werbeanzeige