Objekt von Struktur in fremder Klasse definieren?
-
Hey Leute,
ich hab ein kleines Problem. Und zwar habe ich einen stinknormalen Vektor. Davon lege ich ein neues Objekt in einer anderen, fremnden Klasse an. Soweit so gut, nun zickt er nun mit Syntaxfehler etc. rum, sprich:struct Vector_3 { public: float x; float y; float z; }; class Bezier { private: float var1; float var2; float var3; public: Bezier(); ~Bezier(); Vector_3 start_Point; Vector_3 step_Point; Vector_3 end_Point; Vector_3 test; Vector_3 Curve(Vector_3 P_0, Vector_3 P_1, Vector_3 P_2, float t); void DrawBezier(float lineWidth, float max_step); };So geht's, nur möchte ich start_Point jetzt die Werte zuweisen, und zwar so:
Vector_3 start_Point={4,2,6};Angeblich Syntaxfehler.
Komisch nur, dass wenn ich die Objekte außerhalb der Klasse deklariere, es wunderbar funktioniert, ich allerdings wieder Probleme bekomme, diese Objekte in Methoden von anderen Klassen zu integrieren. Bin noch etwsas verwirrtk, hoffe es hat trotzdem einer verstanden, ich danke vielmals im Voraus!
-
mach halt n konstruktod
-
Hab ich auch schon ausprobiert, aber wenn ich dann im Konstruktor "start_Point={4,5,3};" stehen hab, meckert er auch rum, dass ist das Problem.
-
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.