Referenz auf Array mit eigenem Datentyp, Objektmethode liefert falschen Wert



  • Hallo,

    ich habe einen eigenen Datentyp erstellt "eigenerTyp". Dieser hat eine Methode, welche den Wert einer Instanzvariable zurückliefert ("GetValue"). Die Methode greift eigentlich immer auf die Variable c zu.

    Wenn ich jedoch ein Array mit dem eigenen Datentyp fülle und dieses einer Funktion übergebe (nur die Referenz wird übergeben) greift die Funktion plötzlich auf die Variable a zu und nicht auf c. Ich kann mir dies leider nicht erklären.

    Hier ist ein Beispielcode, alle Sachen die nichts mit dem Problem zu tun haben, habe ich, der Übersichtlichkeit halber, weggelassen.

    Kann mir das bitte jemand erklären.

    Gruß
    Attila009

    class eigenerTyp
    {
    
    	private:                            
    		std::string Name;		
    		float a;	
    		float b;		
    		float c;		
    
    	  public:    
    
       	eigenerTyp();
    	float GetValue(); //returns value of c
    	std::string GetName(); //returns Name
    
    };
    
    std::string GetVariableName(eigenerTyp eigenVector[], int arraySize)
    {
    	std::ostringstream namestream;
    
    	for(int i=0; i<arraySize;i++)
    	{
    
    		namestream << eigenVector[i].GetValue(); 
    
    	}
    
    	return namestream.str();
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	eigenerTyp var1(baum,3.0,6.0,7.0);
    	eigenerTyp var2(blume,1.0,8.0,7.4);
    
    	eigenerTyp eigenVector[]={var1,var2};
    
    	std::cout << eigenVector[0].GetValue(); //writes value of c
    
    	std::cout << GetVariableName(eigenVector,2) //writes value of a
    
    	return 0;
    }
    

  • Mod

    Bitte lies den dritten Link in meiner Signatur und halte dich daran. Wenn man nach vielen Mühen dein Programm so weit hat, dass es compilierbar ist, dann funktioniert es einwandfrei:
    http://ideone.com/rR0ZX4

    Daraus folgt, dass dein Fehler wohl in einem der vielen Teile steckt, die du uns nicht gezeigt hast und die ergänzt werden mussten. Oder dass möglicherweise sogar der Fehler in einem der gekürzten Teile steckt und auch bei dir in dem Beispiel gar nicht mehr auftritt.

    Allgemein ist es in C++ ziemlich unüblich, Arrays an Funktionen zu übergeben (oder überhaupt mit rohen Arrays zu arbeiten). Normalerweise übergibt man an Funktionen den Anfang und den Ende eines Bereiches (als Template). Denn dann funktioniert die Funktion plötzlich ohne jeden Mehraufwand für beliebige Arten von Containern. Außerdem entfallen die vielen möglichen Anfängerfehler die man bei rohen Arrays hat.



  • @SeppJ: Danke für den Hinweis, das nächste mal stelle ich kompilierbaren Code ein. Bzgl. der Übergabe eines Bereichs werde ich mich mal einlesen.

    Ich habe meinen Fehler nun gefunden!

    eigenerTyp var1(baum,3.0,6.0,7.0);
        eigenerTyp var2(blume,1.0,8.0,7.4);
    
        eigenerTyp eigenVector[]={var1,var2};
    

    Hier erstelle ich im Array eine Kopie von var1 und var2. Wenn die Referenz auf dieses Array an die Funktion übergeben wird kann sie nur diese Kopie auslesen. Die Funktion, welche die Werte von a,b und c ändert hat jedoch direkt auf var1 und var2 gearbeitet.


Log in to reply