ole1991 Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 Hei og god morgen! Jobber med en oppgave nå som omhandler vektor- og matrisesamhandling. Jeg har aldri vært borti vektorer i c++ før, og har litt problemer med å forstå hvordan jeg skal gjøre oppgaven, så tenkte jeg skulle spørre om hjelp her. Oppgaven går som følger: Lag ei klasse Vector2 som held ein to-dimensjonal vektor. Forsikre deg om at designet ditt følgjar OOP-konvensjonane angåande innkapsling (encapsulation), og skriv nødvendige/passande get- og set-funksjonane. Blir det riktig å skrive en todimensjonal vektor som vector< vector<int> > name? Isåfall vil klassen se slik ut? #include <vector> class Vector2{ private: vector < vector<int> > name public: Vector2(); double setValue(); void getValue(); .. .. .. }; Hvordan vil isåfall get- og set-funksjonene se ut for en slik vektor? Oppgaven fortsetter så slik: Implementer følgjande medlemsfunksjonar:- Returnerer dot-produktet mellom this og rightHandSide double dot(const Vector2 &rightHandSide) const; - Returnerer den kvadrerte lengden av vektoren double lengthSquared() const; - Returnerer lengden av vektoren. Kvadratrota av verdien kan reknast ut med funksjonen sqrt(double) som finst i <cmath> headeren. double length() const; Hint: Du kan gjenbruke dot-funksjonen for å rekne ut lengthSquared, og gjenbruke lengthSquared for å rekne ut length(). Hva menes med "this" og "rightHandSide", hvor kommer disse verdiene fra? Noen som kan hjelpe meg med å sette opp disse funksjonene? Lenke til kommentar
Han Far Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 #include <vector> class Vector2{ private: double elements [2]; public: Vector2(); double setValue(); void getValue(); Prøv det. Slik jeg skjønte det er det ingen grunn til å bruke vector til vektoren. Da skal get og set bare jobbe på arrayet elements. Lenke til kommentar
Han Far Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 Hva menes med "this" og "rightHandSide", hvor kommer disse verdiene fra? Noen som kan hjelpe meg med å sette opp disse funksjonene? dot er en medlemsfunksjon til Vector2, som tar ett argument. At det er en medlemsfunksjon betyr at du kan kalle den som a.dot(b), hvor a og b er Vektor2. Da tar "this" automatisk verdien a. b er da det som i prototypen heter righthandside. Lenke til kommentar
ole1991 Skrevet 5. mars 2013 Forfatter Del Skrevet 5. mars 2013 dot er en medlemsfunksjon til Vector2, som tar ett argument. At det er en medlemsfunksjon betyr at du kan kalle den som a.dot(b), hvor a og b er Vektor2. Da tar "this" automatisk verdien a. b er da det som i prototypen heter righthandside. Betyr det at jeg kan skrive double Vector2::dot(const Vector2 &rightHandSide) const{ return (this[0]*rightHandSide[0] + this[1]*rightHandSide[1]); } for et skalarprodukt mellom 2 todimensjonale vektorer? Lenke til kommentar
GeirGrusom Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 (endret) lhs.dot(rhs) Du må bruke elements hvis du ikke har overloadet [] Endret 5. mars 2013 av GeirGrusom Lenke til kommentar
Han Far Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 Det ser korrekt ut for meg. Lenke til kommentar
GeirGrusom Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 this[0] gir ingen mening fordi operator[] er ikke overloadet for Vector2. 1 Lenke til kommentar
ole1991 Skrevet 5. mars 2013 Forfatter Del Skrevet 5. mars 2013 (endret) Ok her er koden jeg har så langt: Headeren: class Vector2{ private: double vector[2]; public: Vector2(); Vector2(double A, double B); void setValue(int index, double value); double getValue(int index) const; double dot(const Vector2 &rightHandSide) const; double lengthSquared() const; double length() const; }; Medlemsfunksjonene: Vector2::Vector2(){} Vector2::Vector2(double A, double B){ vector[0] = A; vector[1] = B; } double Vector2::getValue(int index) const{ return vector[index]; } void Vector2::setValue(int index, double value){ vector[index] = value; } double Vector2::dot(const Vector2 &rightHandSide) const{ return (this[0]*rightHandSide[0] + this[1]*rightHandSide[1]); Prøver så å lage to vektorer og regne ut skalarproduktet av dem på følgende måte: void part3(){ Vector2 vector1; vector1.setValue(0,1); vector1.setValue(1,2); Vector2 vector2; vector2.setValue(0,2); vector2.setValue(1,4); cout << vector1.dot(vector2); } Får følgende feilmelding: error C2676: binary '[' : 'const Vector2' does not define this operator or a conversion to a type acceptable to the predefined operator error C2676: binary '[' : 'const Vector2' does not define this operator or a conversion to a type acceptable to the predefined operator ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Følgende linje får feilmeldingen: return (this[0]*rightHandSide[0] + this[1]*rightHandSide[1]); Feilmeldingen peker på hakeparantesene [ rett etter rightHandSide Hva gjør jeg feil? Ser det andre greit ut? Har ikke overlagret noe. Endret 5. mars 2013 av ole1991 Lenke til kommentar
GeirGrusom Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 (endret) template<typename TScalar>struct vector2 { private: TScalar x; TScalar y; public: vector2() : x(0), y(0) { } vector2(const TScalar x, const TScalar y) : x(x), y(y) { } const TScalar getX() const { return x; } const TScalar getY() const { return y; } void setX(const TScalar value) { x = value; } void setY(const TScalar value) { y = value; } TScalar& operator [](const int index) { if(~(index | 1)) // Kun 0 og 1 er gylidge indekser. Gi exception dersom noen andre bit er satt. throw "Index out of bounds."; return ((TScalar*)&x)[index]; } const vector2<TScalar> operator + (const vector2<TScalar>& rhs) const { return vector2<TScalar>(x + rhs.x, y + rhs.y); } const vector2<TScalar> operator - (const vector2<TScalar>& rhs) const { return vector2<TScalar>(x - rhs.x, y - rhs.y); } const vector2<TScalar> operator * (const vector2<TScalar>& rhs) const { return vector2<TScalar>(x * rhs.x, y * rhs.y); } const vector2<TScalar> operator / (const vector2<TScalar>& rhs) const { return vector2<TScalar>(x / rhs.x, y / rhs.y); } const double magnitude() const { return sqrt((double)(x * x + y * y)); } operator vector2<double>() const { return vector2<double>((double)x, (double)y); } operator vector2<float>() const { return vector2<float>((float)x, (float)y); } double dot(const vector2<TScalar>& rhs) const { return x * rhs.x + y * rhs.y; } static const double distance(const vector2<TScalar>& lhs, const vector2<TScalar>& rhs) { return (rhs - lhs).magnitude(); } }; edit forumet herpa formateringen Endret 5. mars 2013 av GeirGrusom 1 Lenke til kommentar
ole1991 Skrevet 5. mars 2013 Forfatter Del Skrevet 5. mars 2013 Er det ikke en måte å løse oppgaven uten å overlagre operatorene? Akkurat det står som en valgfri del av oppgaven. Men takk for hjelpen, ting gir litt mer mening nå ihvertfall Lenke til kommentar
GeirGrusom Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 Ja. Istedet for this[0] skriver du elements[0]. Lenke til kommentar
ole1991 Skrevet 5. mars 2013 Forfatter Del Skrevet 5. mars 2013 double Vector2::dot(const Vector2 &rightHandSide) const{ return (vector[0]*rightHandSide[0] + vector[1]*rightHandSide[1]); } void part3(){ Vector2 vector; vector.setValue(0,1); vector.setValue(1,2); Vector2 vector2; vector2.setValue(0,2); vector2.setValue(1,4); cout << vector.dot(vector2); } Merk at jeg har kalt arrayet vector og ikke elements. Dette gir fortsatt samme feilmelding: error C2676: binary '[' : 'Vector2' does not define this operator or a conversion to a type acceptable to the predefined operator Noen forslag? Lenke til kommentar
ole1991 Skrevet 5. mars 2013 Forfatter Del Skrevet 5. mars 2013 (endret) double Vector2::dot(const Vector2 &rightHandSide) const{ return (this->vector[0]*rightHandSide.vector[0] + this->vector[1]*rightHandSide.vector[1]); } Løste seg når jeg gjorde dette. Takk for hjelpen Endret 5. mars 2013 av ole1991 Lenke til kommentar
GeirGrusom Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 Så bruk vector dat class Vector2 { double vector[2]; const double dot(const Vector2& rhs) const { return vector[0] * rhs.vector[0] + vector[1] * rhs.vector[1]; } } 1 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå