Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

08.02.2011, 22:00

danke ich schaus mir gleich mal an
direkt nachdem ich nachgeschlagen hab was stringet heisst :D

22

09.02.2011, 00:18

Ok ich habe es nochmal mit den hinweisen überarbeitet. Sub Add usw ist raus

und sowohl skalar als auch vektorprodukt können nun so aufgerufen werden

Vector3D.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef VECTOR3D
#define VECTOR3D

class Vector3D
{
    public:
        double x,y,z; // dimensions of R3
        
        //constructors and destructor
        Vector3D();
        Vector3D(double x, double y, double z);
        ~Vector3D();

        //Memberfunctions
        void Set(double x, double y, double z); 
        void Add(Vector3D& vec); 
        void Sub(Vector3D& vec);
        void Scale(double value);

        Vector3D& operator +=(const Vector3D& vec);
        Vector3D& operator -=(const Vector3D& vec);
        Vector3D operator *=(Vector3D& vec);

};

Vector3D CrossProduct(Vector3D& v1, Vector3D& v2);
double DotProduct(Vector3D& v1, Vector3D& v2);

//overloaded Operators
Vector3D operator +(const Vector3D& left, const Vector3D& right);
Vector3D operator -(const Vector3D& left, const Vector3D& right);
Vector3D operator *(const Vector3D& left, const Vector3D& right);

#endif


Vector3D.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "stdafx.h"
#include "Vector3D.h"

// ------------------- Constructor -------------------------
Vector3D::Vector3D()
  : x(0.0), y(0.0), z(0.0)
{
}

Vector3D::Vector3D(double x, double y, double z)
  : x(x), y(y), z(z)
{
}

// ------------------- Destructor ----------------------------
Vector3D::~Vector3D(){
}

// ------------------- Memberfunctions-----------------------
void Vector3D::Set(double x, double y, double z){
    this->x+=x; this->y+=y; this->z+=z;
}

void Vector3D::Scale(double value){
    x *= value; y *= value; z *= value;
}

Vector3D& Vector3D::operator +=(const Vector3D& vec) 
{
  x += vec.x; y += vec.y; z += vec.z;
  return *this;
}

Vector3D& Vector3D::operator -=(const Vector3D& vec) 
{
  x -= vec.x; y -= vec.y; z -= vec.z;
  return *this;
}

Vector3D Vector3D::operator *=(Vector3D& vec) 
{
    return *this = CrossProduct(*this, vec); 
    
}

//-------------------- no Memberfunctions-----------------------------
Vector3D CrossProduct(Vector3D& v1, Vector3D& v2){
    return Vector3D(v1.y*v2.z-v1.z*v2.y,
                    v1.z*v2.x-v1.x*v2.z,
                    v1.x*v2.y-v1.y*v2.x);
}

double DotProduct(Vector3D& v1, Vector3D& v2){
    return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ;
}
// ------------------- more Overlaoded operators -----------------------

Vector3D operator +(const Vector3D& left, const Vector3D& right)
{
    return Vector3D(left.x + right.x, left.y + right.y, left.z + right.z);
}

Vector3D operator -(const Vector3D& left, const Vector3D& right)
{
    return Vector3D(left.x - right.x, left.y - right.y, left.z - right.z);
}

Vector3D operator *(const Vector3D& left, const Vector3D& right) 
{
    Vector3D tmp1 = left, tmp2 = right;
    return CrossProduct(tmp1, tmp2);
}


Die Testklasse bleibt wie zuvor.

23

09.02.2011, 22:09

(1) struct statt class
(2) const-correctness !!!
(3) explicit
(4) d-tor weg, default c-tor weg, dafür default-parameter an c-tor
(5) wie schon korrekt angemerkt ... das sollen die Funktionen, wenn du operatoren überlädst?!
(6) stdafx.h ... muss so nen quatsch? ;)
(7) tmp1/2 unnötig (vgl. 2)
....

;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

24

09.02.2011, 22:21

(1) struct statt class

Warum denn?

(3) explicit

Könntest du mir das auch erläutern? :)


Warum sollen/dürfendie Methoden wie DotProduct und CrossProduct nicht als Klassenmethode implementiert werden?
Habe ich nämlich bis jetzt immer so gemacht.

Danke :)

25

09.02.2011, 22:31

Zitat

Zitat

(1) struct statt class
Warum denn?
Letzendlich eine Geschmacksfrage, da in C++ beide sich nur durch die Sichtbarkeit unterscheiden, hier bietet es sich an, da struct standardmäßig public ist.

Zitat

Zitat

(3) explicit

Könntest du mir das auch erläutern?
Warum explicit oder was explicit ist? Verhindert die implizite Typumwandlung :p Wobei hab grad nicht nachgedacht, ist eigtl nur bei Konstruktoren, die nur einen Parameter übergeben bekommen. Kann also auch wegbleiben.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

26

09.02.2011, 23:08

explicit verhindert, dass (bei sinnvoll formuliertem Konstruktor, hier mit default-Parameter) solche Sachen möglich sind:

C-/C++-Quelltext

1
Vector3D v = 2;


Wie Deviloper schon anmerkte, es verhindert die implizite Typumwandlung. Allerdings auch bei Kontruktoren mit mehr als einem Parameter, wenn der Rest mit default-Werten versehen ist.

Das ist zwar im Grunde nicht wirklich verwerflich, fördert (hier) aber nicht gerade die Lesbarkeit und kann dazu führen, dass sich (schwer zu findende, semantische) Fehler einschleichen.

Soviel dazu :D

struct zöge ich auch hier vor. Ich verfahre so immer, wenn die Attribute einer Klasse Teil des Interfaces sind - auch mehr aus ästhetischen Gründen.

Soviel auch hierzu.

Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Werbeanzeige