Operator überladen, POINTER übergeben ?

MFC openGL

Erfahrenes Mitglied
Hallo,

ich habe ein Problem das ich einen POINTER des aufgerufenen objektes brauche.


also

Code:
int main()
{
  classex * help;
help++;
}
 
 
operator++(test  *help)
{
  help->weiter();
}


In der Methode weiter() wird dann per virtual weiterentschieden welchen "Weg" das ganze nehmen soll, daher kommt ein normales Objekt nicht in Frage.

Kann mir einer sagen wie ich den Pointer von der Main in die Methode des Operators bekomme, ohne static oder eine setzen Funktion für die Klasse ?



Danke, Gruss

MFC OpenGL
 
Ich würde es mit Referenzen machen. Sollte genauso oder besser gehen. Vorausgesetzt, dass die help-Klasse irgendwie von test abgeleitet ist. Das da unten funktioniert, obwohl der Compiler etwas verwirrt ist zwischen Postfix- und Präfixform des Operators (i++ gegenüber ++i), was daran liegt, dass ich den Operator ausserhalb der Klasse definiert habe. Günstiger wäre es, ihn innerhalb der test-Klasse NICHT-virtuell zu definieren und in abgeleiteten Klassen dann ganz links liegen zu lassen.

Code:
#include "stdafx.h"
#include <windows.h>
#include <iostream>

class test
{
public:
  virtual void weiter()
  {
    std::cout << "weiter() von test aufgerufen" << std::endl;
  }
};

class classex : public test
{
public:
  virtual void weiter()
  {
    std::cout << "weiter() von classex aufgerufen" << std::endl;
  }
};

test& operator++(test& help)
{
  help.weiter();
  return help; // üblicherweise gibt der ++-Operator eine Referenz auf den Operanden zurück.
}

int _tmain(int argc, _TCHAR* argv[])
{
  classex help; // ein tatsächliches classex-Objekt
  help++;

  char c;
  std::cin >> c;
  return 0;
}
 
Zuletzt bearbeitet:
Hallo verwende doch einfach Referenzen, mit denen Funktioniert der Mechanismus
zum Aufruf virtueller Methoden auch.

Übrigens um den Postfix operator++ zu verwenden musst du dem Compiler das
sagen, es gibt ja im übrigen auch einen Prefix operator++.
Sagen kannst du ihm das in dem du einen int Parameter übergibst, der aber nichts
weiter macht.
Ungefähr so:

Code:
#include <iostream>

using namespace std;

class Liste{
        
        public:
                virtual void weiter() = 0;
};

class IntListe : public Liste{

        public:
                void weiter(){ cout << "Schalte int Liste um eins weiter!" << endl;}
};

class DoubleListe : public Liste{

        public:
                void weiter(){ cout << "Schalte double Liste um eins weiter!" << endl;}
};

Liste& operator++(Liste& l, int){

        l.weiter();
        return l;
}

int main(){
        Liste* intL = new IntListe();
        Liste* doubleL = new DoubleListe(); 
        
        (*intL)++;
        (*doubleL)++;

        delete intL;
        delete doubleL;
}

Gruß

RedWing
 
RedWing hat gesagt.:
Uups da war wohl jemand schneller :)

Jau, aber trotzdem gut, dass du dich auch gemeldet hast:

Code:
Liste& operator++(Liste& l, int)

Dass das mit dem Dummy-int zur Kennzeichnung des Postfix-Operators auf diese Weise auch für ausserhalb der Klasse definierte Operatoren geht, habe ich bisher noch nicht gewusst. Schönen Dank!
 
Kachelator hat gesagt.:
Jau, aber trotzdem gut, dass du dich auch gemeldet hast:

Code:
Liste& operator++(Liste& l, int)

Dass das mit dem Dummy-int zur Kennzeichnung des Postfix-Operators auf diese Weise auch für ausserhalb der Klasse definierte Operatoren geht, habe ich bisher noch nicht gewusst. Schönen Dank!

Also normalerweise dürfte es anders gar nicht erst kompilieren:

Code:
redwing@matrix:~> g++ versuch.cpp 
versuch.cpp: In function `int main()':
versuch.cpp:33: error: no `operator++(int)' declared for postfix `++', trying 
   prefix operator instead
versuch.cpp:34: error: no `operator++(int)' declared for postfix `++', trying 
   prefix operator instead

Der Fehler kommt bei folgender Deklaration:

Code:
Liste& operator++(Liste& l);
und Anwendung dieser via
Code:
        (*intL)++;
        (*doubleL)++;

Aber da scheint sich wohl dann jeder Compiler anders zu verhalten? :confused:

Gruß

RedWing
 
Thx für die Antworten, aber das wird mir nichts bringen, da die weiter() Funktion virtual ist, und die Referenz das ja nicht kann.


Also genauer gesagt, ich habe das Entwurfsmuster Zustand programmiert, in der Basisklasse ist die Methode weiter(), welche auch in allen Zustandsklassen vorhanden ist.

Nun will ich aus der Main mit einem Pointer vom Typ der Basisklasse

p_basisklasse++;

machen können(ist eben so in der aufgabe verlangt, kann ich nicht ändern oder umgehen).

Dann will ich das der überladene Operator++ den Pointer p_basisklasse bekommt, um dann die virtuelle Methode weiter() aufzurufen, welche dann, weil der p_basisklassen Pointer auf eine der Zustandsklassen vorher umgelegt wurde, die entsprechene weiter() Methode in dem jeweiligen Zustand aufruft.


Ich denke das es mit der Referenz daher nicht geht, weil ja eine Referenz nicht = einem Pointer ist, und ich damit keine virtuellen Methoden aufrufen kann.


Daher nochmal meine Frage, wie kann ich den Pointer statt der Referenz übergeben
 
MFC Open GL hat gesagt.:
Ich denke das es mit der Referenz daher nicht geht, weil ja eine Referenz nicht = einem Pointer ist, und ich damit keine virtuellen Methoden aufrufen kann.
RedWing hat gesagt.:
Hallo verwende doch einfach Referenzen, mit denen Funktioniert der Mechanismus
zum Aufruf virtueller Methoden auch.
Kachelator hat gesagt.:
Ich würde es mit Referenzen machen. Sollte genauso oder besser gehen.

Glaub mir dat geht;)

Wenn du ein Ungläubiger bist probiers halt aus ;)

Gruß

RedWing
 
RedWing hat gesagt.:
Glaub mir dat geht;)

Wenn du ein Ungläubiger bist probiers halt aus ;)

Gruß

RedWing

Ich stimme zu, ich stimme zu, ich stimme zu! :)

(Nebenbei: Referenzen sind einfach nur Pointer mit anderer Syntax und ein paar eingebauten Sicherheiten. Sollten aber immer verwendet werden, wenn man die Wahl zwischen Pointer und Referenz hat. Finde ich jedenfalls.)
 
Also ihr zwei, entweder ich habe einen MEGA Bug in meinem Code (und das hoffe ich ja mal nicht :rolleyes: ), oder das bingt von sich aus einen richtig geilen Access Violation Error....

Bin aber jetzt zu müde um das noch zu hacken, werde da morgen nochmal schaun und wenns nicht klappt poste ich mal den ganzen Code hier rein.


Danke nochmal an euch zwei !
 
Zurück