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' TypneudefinitionHm, 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' TypneudefinitionHm, 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.