Klassenkonstruktor/Vektor - Konstruktor



  • Folgende Klasse exisitiert und setzt einen Vektor von Class2.

    public __gc class Class1{
    
    		private:
    			Double v_y, v_x, v_z;		// Velocity
    			Vektor* velocity;
    
    		public:
    			Class1()() :
    
    		v_x(0), v_y(0), v_z(0)
    	}
    
    			// get-, set-Methoden
    			__property Vektor* get_Velocity(){
    		return velocity;
    	}
    			__property void set_Velocity(Double vy, Double vx, Double vz){
    		velocity = new Vektor(vy, vx, vz);
    }
    };
    
    public __gc class Class2{
    
    		private:
    			Double y, x, z;
    
    		public:
    			Class2() :
    		y(0),
    		x(0),
    		z(0)
    	{
    	}
    			Class2(Double x1, Double x2, Double x3) {
    		y = x1;
    		x = x2;
    		z = x3;
    	}
    	};
    

    Jetzt Initialisierung eines Objekts

    Class1* test= new Class1();
    // test->set_Velocity(v_y, v_x, v_z);
    

    Normalerweise sollte der Konstruktor doch die Member auf 0 setzen?
    Sobald ich aber "test->set..." auskommentiere: Error System.NullReferenceException: Object reference not set to an instance of an object.

    Ich hab wohl in Class2 was nicht bedacht. Bei anderen Class1-Member, die nicht Vektor zurueckgeben, sondern nur int... werden sie aber auf 0 gesetzt.
    Also wo liegt das Problem?



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich verstehe Dein Problem nicht, ganz, weil vermutlich Dein Beispiel nicht ganz korrekt ist. Anbei mal (das aus meiner Sicht) korrektes Beispiel:

    #using <mscorlib.dll>
    using namespace System;
    #include <tchar.h>
    
    namespace MyNamespace
    {
      public __gc class Vektor { 
    
      private: 
        Double y, x, z; 
    
      public: 
        Vektor() : y(0), x(0), z(0) 
        { 
        } 
            Vektor(Double x1, Double x2, Double x3) 
            { 
              y = x1; 
              x = x2; 
              z = x3; 
            } 
      };  
    
      public __gc class Class1{ 
    
      private: 
        Double v_y, v_x, v_z;        // Velocity 
        Vektor* velocity; 
    
      public: 
        Class1() : v_x(0), v_y(0), v_z(0) 
        {
        }
        // get-, set-Methoden 
        __property Vektor* get_Velocity(){ 
          return velocity; 
        } 
        __property void set_Velocity(Double vy, Double vx, Double vz){ 
          velocity = new Vektor(vy, vx, vz); 
        } 
      };  
    }
    
    int _tmain()
    {
      MyNamespace::Class1 *c = new MyNamespace::Class1();
      c->set_Velocity(0, 0, 0);
    }
    

    Was auch Wunderbar funktioniert.



  • Anderes Beispiel:

    #using <mscorlib.dll>
    using namespace System;
    #include <tchar.h>
    
    namespace MyNamespace
    {
    
      public __gc class Class1{
    
      private:
        Int16 extra;
    
      public:
        Class1() : extra(0)
        {
        }
        // get-, set-Methoden
        Int16 get_Extra(){
    		return extra;
    	}
    	void set_Extra(Int16 xtra){
    		extra = xtra;
    	}
      };  
    }
    
    int _tmain()
    {
      MyNamespace::Class1 *c = new MyNamespace::Class1();
      // c->set_Extra(0); // ueberfluessig, da Konstruktor Wert auf Null setzt
    }
    

    Der Wert soll einfach bei Erzeugung eines Objekts auf 0 gesetzt werden.
    Bei der Vektorgeschichte muss ich erst selber über die Methode die Werte nullsetzen. Das will ich gerade vermeiden.



  • Dann nimm doch einfach die Zeile aus der Set-Methode noch in den Kontruktor auf. Oder hab ich das jetzt völlig falsch verstanden?

    public __gc class Class1
    {
       private:
       Double v_y, v_x, v_z;        // Velocity
       Vektor* velocity;
    
       public:
       Class1() :
       v_x(0), v_y(0), v_z(0)
       {
          velocity = new Vektor(v_y, v_x, v_z); // Oder in die Initialisierungsliste
       }
    
       // get-, set-Methoden
       __property Vektor* get_Velocity()
       {
          return velocity;
       }
       __property void set_Velocity(Double vy, Double vx, Double vz)
       {
          velocity = new Vektor(vy, vx, vz);
       }
    };
    


  • Zickedi schrieb:

    Der Wert soll einfach bei Erzeugung eines Objekts auf 0 gesetzt werden.

    Kannst Du Dich mal bitte etwas deutlicher Ausdrücken!? Der Wert wird doch auf "nullptr" gesetzt, was ist denn Dein Problem???

    Oder willst Du, dass der Vektor auf eine Instance von Vektor, welche auf 0,0,0 gesetzt ist, machen?
    Dann ändern halt:

    Class1() : v_x(0), v_y(0), v_z(0)
    

    nach

    Class1() : v_x(0), v_y(0), v_z(0), velocity(new Vektor())
    


  • Class1() : v_x(0), v_y(0), v_z(0), velocity(new Vektor())

    Danke, das war's. Es sollte auf ne Instanz von Vektor gezeigt werden.
    Sorry, wenn's etwas unverständlich war. 🙄


Anmelden zum Antworten