Objekt von Struktur in fremder Klasse definieren?



  • Du kannst Member nur im Konstruktor initialisieren, nicht in der Klasse selbst.

    Was Titel_N meinte: Erstelle einen Konstruktor für Vector_3, der drei Parameter übernimmt, und initialisiere Objekte davon über diesen Konstruktor.



  • Ah ok, alles klar. Und wie lege ich dann ein neues Objekt an?

    Vector start_Point(1,3,2);
    

    oder wie?



  • way schrieb:

    Ah ok, alles klar. Und wie lege ich dann ein neues Objekt an?

    Vector start_Point(1,3,2);
    

    oder wie?

    Nach deiner Klassenbenennung:

    Vector_3 objektname(1,3,2);
    

    Wobei ich eher glaube, das du ein anderes Verständnisproblem (nämlich Memberinitialisierung) hast.

    Eine Membervariable initialisiert man entweder in der Initialisierungsliste über den Namen, und anschließend den Konstruktoraufruf:

    Bezier()
    :   start_Point(1,2,3),
        step_Point(2,3,4)//...
    {
    }
    

    Oder später durch Zuweisung (Zuweisungsoperator) über den Namen:

    // Rumpf irgendeiner Memberfunktion...
    start_Point = Vector_3(1,2,3);
    

    In beiden Fällen steht "Vector_3" nicht davor, sonst hättest du eine lokale Variable.



  • Ok, hab's mal so gemacht wie du meintest.
    In der Methode hab ich:

    Vector start_Point(2,3,4);
    

    Funzt auch soweit alles. Nur hab ich jetzt ein Problem, er sagt mir direkt es wäre eine typenneudefinition.

    error C2011: 'Vector': 'class' Typneudefinition
    

    Hm, ich definiere aber garnichts, was tun?

    Danke im Voraus!



  • way schrieb:

    Ok, hab's mal so gemacht wie du meintest.
    In der Methode hab ich:

    Vector start_Point(2,3,4);
    

    Funzt auch soweit alles. Nur hab ich jetzt ein Problem, er sagt mir direkt es wäre eine typenneudefinition.

    error C2011: 'Vector': 'class' Typneudefinition
    

    Hm, ich definiere aber garnichts, was tun?

    Hieß die Klasse bei dir nicht Vector_3 ?
    Gib ma bissl mehr Code... (Die Klasse + CTor)

    bb



  • Ok ok, ich rück ja schon raus:
    Vektor: (Auch Vektor_3)

    class Vector
    {
     public:
    	 Vector() {};
    
    	 float x, y, z;
    
    		Vector(float new_x, float new_y, float new_z);
    
    		Vector operator+(const Vector &vector)
    		{
    			return Vector(vector.x+x, vector.y+y, vector.z+z);
    		}
    
    		Vector operator-(const Vector &vector)
    		{
    			return Vector(x-vector.x, y-vector.y, z-vector.z);
    		}
    
    		Vector operator*(const float number)
    		{
    			return Vector(x*number, y*number, z*number);
    		}
    
    		Vector operator/(const float number)
    		{
    			return Vector(x/number, y/number, z/number);
    		}
    	};
    

    Bezier-Klasse.h:

    #include "Vector.h"
    
    class Bezier
    {
    private:
    	float var1;
    	float var2;
    	float var3;
    
    public:
    	Bezier();
    	~Bezier();
    
    	Vector Curve(Vector P_0, Vector P_1, Vector P_2, float t);
    	void DrawBezier(float lineWidth, float max_step);
    };
    

    Bezier-Klasse.cpp:

    void Bezier::DrawBezier(float lineWidth, float max_step)
    {
    	Vector start_Point(-4,0,0);
    	Vector step_Point(-2,0,0);
    	Vector end_Point(4,0,0);
    	glPushMatrix();
    
    	glBegin(GL_LINE_STRIP);
    	glLineWidth(lineWidth);
    	glColor3f(0.0f,1.0f,0.0f);
    
    	for(float s=0; s < 1+(1.0f/max_step); s+=1.0f/max_step)
    	{
    		Vector vPoint = Curve(start_Point,step_Point,end_Point,s);
    		glVertex3f(vPoint.x,vPoint.y,vPoint.z);
    	}
    };
    

    Danke im Voraus!



  • Vector(float new_x, float new_y, float new_z);
    

    hab ich keine definition zu gesehen!?

    Vector operator+(const Vector &vector)
            {
                return Vector(vector.x+x, vector.y+y, vector.z+z);
            }
    
            Vector operator-(const Vector &vector)
            {
                return Vector(x-vector.x, y-vector.y, z-vector.z);
            }
    
            Vector operator*(const float number)
            {
                return Vector(x*number, y*number, z*number);
            }
    
            Vector operator/(const float number)
            {
                return Vector(x/number, y/number, z/number);
            }
    

    Üblicherweise deklariert man die Operatoren global und nutzt dabei +=, -=, ... (die als memberfunktionen deklariert wurden)
    -= implementiert man dann auch oft als += -rhs (also noch das unary minus (als member) hinzufügen)...

    Vector Curve(Vector P_0, Vector P_1, Vector P_2, float t);
    //=>
    Vector Curve(const Vector &P_0, const Vector &P_1, const Vector &P_2, float t);
    
    #include "Vector.h"
    
    class Bezier /*...*/
    

    Reicht hier kein class Vector; ?

    /*Bezier-Klasse.cpp*/
    #include "Bezier.h"
    #include "Vector.h"
    
    void Bezier::DrawBezier(float lineWidth, float max_step)
    {
        Vector start_Point(-4,0,0); //sollte eigtl gehen
    /*...*/
    }
    

    btw: Ich hoffe, du hast die include-guards nicht vergessen, sonst bekommst du dann haufen fehlermeldungen vom linker...

    bb



  • way schrieb:

    Ok ok, ich rück ja schon raus:

    1. Ich hoffe deine Header besitzen Includeguards

    2. Solltest du Deklaration/Implementierung sauber trennen (Header/Source)
    Und dies ist auch inkonsequent umgesetzt; So implementierst du nahezu alle Memberfunktionen in der Klasse, aber "Vector(float new_x, float new_y, float new_z)" z.B. nicht.
    Dies erhöht auch die Lesbarkeit.

    3. Die Operatoren die du im Vektor deklarierst, sind unvollständig. Wenn du den Operator "+" deklarierst, solltest du immer auch einen Operator "+=" deklarieren. Ersterer wird eigentlich immer extern als Funktion deklariert, und verwendet dann intern den += Operator.

    z.B:

    // Header
    #ifndef VECTOR_HEADER
    #define VECTOR_HEADER
    
    class Vector
    {
        public:
            //...
            Vector& operator+=(const Vector &vector);
            //...
    };
    
    Vector operator+(const Vector &vector1, const Vector &vector2);
    //...
    
    #endif VECTOR_HEADER
    
    // Soruce
    #include "Vector.h"
    
    Vector& Vector::operator+=(const Vector &vector)
    {
        x += vector.x;
        y += vector.x;
        z += vector.x;
        return *this;
    }
    
    Vector operator+(const Vector &vector1, const Vector &vector2)
    {
        Vector result(vector1); // Aufruf Kopierkonstruktor
        result += vector2;      // Aufruf "+="-Operator
        return result;
    }
    

    cu André



  • EDIT:
    Ok, danke.



  • Vielleicht noch was zu Aggregat-Initialisierungsliste vs. Konstruktor: Hier habe ich in meinem zweiten Beitrag was dazu geschrieben.


Anmelden zum Antworten