[C++] operator *()

TiKu

Administrator
Teammitglied
Mitglied seit
16.11.2001
Beiträge
21.665
Renomée
1.249
Standort
München
  • SIMAP Race
  • QMC Race
  • Spinhenge ESL
  • Docking@Home
  • BOINC Pentathlon 2021
Hi,

ich stehe hier grad irgendwie auf dem Schlauch. Ich habe eine Klasse SimpleIterator. Diese enthält einen operator:
Code:
	TransformNode* SimpleIterator::operator*()
	{
		return nodeStack.top().node; //return the top elements node
	}
Desweiteren habe ich eine Klasse GlMatrixStackIterator, welche von SimpleIterator erbt. In einer Methode von GlMatrixStackIterator möchte ich nun obigen Operator nutzen. Wenn ich mich nicht irre, müsste das ja so gehen:
Code:
TransformNode* n = *this;
Nur leider mault da der Compiler rum, er könne GlMatrixStackIterator nicht zu TransformNode* konvertieren (eigentlich verständlich). Gibt es außer der folgenden Triviallösung noch einen anderen Weg?
Code:
TransformNode* n = this->operator *();

TiKu
 
this ist immer ein Zeiger, mit *this nimmst du den Zeiger auf den Zeiger auf die Instanz.

E: Blödsinn

Du inizialisierst den Zeiger auf eine Klasse ja mit einer Instanz einer Klasse, kann auch net gehen. Versuch mal TransformNode* n=this;
 
Hmm, geht leider auch nicht:
error C2440: 'Initialisierung': 'SceneGraph::GlMatrixStackIterator *const ' kann nicht in 'SceneGraph::TransformNode *' konvertiert werden
Und wenn ich nen Typecast mache, schluckt er den Code zwar, aber das Programm stürzt dann ab (was es mit der Triviallösung nicht tut).
 
Poste mal ein paar Header wo das Zeugs deklariert wird, kann mich da gerade net reindenken.
 
TransformIterator.h:
Code:
#ifndef TRANSFORMITERATOR_H
#define TRANSFORMITERATOR_H

#include "TransformNode.h"

namespace SceneGraph
{

	/** Iterator class for traversing a scengraph */
	class SimpleIterator 
	{
	public:

		/// initializes the Iterator by loading the TransformNode* n as the actual element
		SimpleIterator(TransformNode* n);

		/// returns the actual element (the node on top of the stack)
		TransformNode* operator*();

		/// true if elements left in the scenegraph
		bool hasMoreElements() const;

		/// selects the next element in the scenegraph as active 
		void next();

	protected:
	
		/// is called after each push operation to the local stack
		virtual void afterPush() {}
		/// is called before each pop operation from the local stack
		virtual void beforePop() {}

		/** stores information to point to a special node in the scenegraph*/
		struct StackEntry
		{
			/// actual element that is returned by the * operator
			TransformNode *node; 
			/// number [0..x] of the childelement that will be active after a call of next()
			unsigned int nextChild; 
		};

		/// stores the local stack of StackEntry elements
		std::stack<StackEntry> nodeStack;
	};

	/** Iterator class for traversing a scengraph setting OpenGL Matrices during traversal*/
	class GlMatrixStackIterator : public SimpleIterator
	{
	public:
		/// initializes the Iterator by loading the TransformNode* n as the actual element
		GlMatrixStackIterator(TransformNode* n);
	protected:
		virtual void afterPush();
		virtual void beforePop();
	};
}
#endif
Hintergrundinfo:
Ich mache ein vorlesungsbegleitendes Praktikum, bei dem man alle 2 Wochen ein Programm bekommt, welches um diverse Funktionen erweitert werden muss. Für die Lösung eines Teils der aktuellen Aufgabe bietet es sich meinen Informationen zufolge an, an besagter Stelle besagten (bereits vorgegebenen) Operator zu nutzen. Der Code tut ja auch was er soll, nur kapier ich nicht wie man den Operator aufrufen muss. Ruft man ihn als Funktion auf, geht's - aber das ist ja nicht Sinn und Zweck eines Operators.
Die Aufgabe hätte ich so zwar auch gelöst, nur interessant fände ich es trotzdem mal wie die Praktikumsleitung sich das eigentlich gedacht hat.*kopfkratz
 
Ach jetzt hab ich glaub ich verstanden worum es eigentlich geht.

Es müsste so funktionieren:

TransformNode* n = this*;

oder (bin mir gerade net sicher) so:

TransformNode* n = this*();

In jedem Fall ist es ungewöhnlich einen Operator zu definieren, der nur auf einen Wert angewendet wird. Normal wäre ja operator*(xyz abc);
 
Nee, geht auch nicht. Ich frag den Kollegen bei der Abgabe mal wie das funktionieren soll.

In jedem Fall ist es ungew&#246;hnlich einen Operator zu definieren, der nur auf einen Wert angewendet wird. Normal w&#228;re ja operator*(xyz abc);
W&#252;rd ich so nicht sagen. Angenommen Du baust Dir Deinen eigenen Integer-Zahlentyp (oder irgendwas anderes wo eine Iteration sinnvoll ist), dann macht ein un&#228;res ++ oder -- sehr wohl Sinn.
 
Narf, nen Kommilitone hat soeben rausgefunden, dass *(*this) geht.

Irgendwie auch logisch (wenn ich mir das so anschaue): this ist ja nen Zeiger, also muss man erstmal dereferenzieren, bevor man den Operator anwendet.*chatt*

Danke für Deine Hilfe, i_hasser.:)
 
Zurück
Oben Unten