# HG changeset patch # User Markus Bröker # Date 1239878952 -7200 # Node ID cf8c1b5127b2a14db79e50181731fad6e163d02b # Parent 83b8151b966dc7652a16739a366405feee2c55b4 vector.cc Testcase -> Eine Referenz ist günstiger bei Vektoren -> move ist ohne Referenz flexibler -> Es werden weniger Objekte erzeugt und dementsprechend auch wieder zerstört. committer: Markus Bröker diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -46,7 +46,8 @@ min2time \ recursive_compiler \ getpwnam_error \ - xmlparser + xmlparser \ + vector .SUFFIXES: .c .cc .asm @@ -250,6 +251,10 @@ @echo Linking $< ... @$(CC) -o $@ $< -lexpat +vector: vector.o + @echo Linking $< ... + @$(CPP) -o $@ $< + .PHONY: clean uninstall clean: diff --git a/pmc/cube.cc b/pmc/cube.cc --- a/pmc/cube.cc +++ b/pmc/cube.cc @@ -22,10 +22,11 @@ height = 25; } -Cube::Cube (Surface * s, Vector p1, Vector p2, Vector p3, Vector p4, int h) +Cube::Cube (Surface * s, Vector& p1, Vector& p2, Vector& p3, Vector& p4, int h) { height = h; surface = s; + Vector location(h/2, h/2); P[0] = new Vector (p1); P[1] = new Vector (p2); @@ -34,13 +35,13 @@ for (int i = 0; i < 4; i++) { P[4 + i] = new Vector (*P[i]); - *P[4 + i] = *P[i] + Vector (h / 2, h / 2); + *P[4 + i] = *P[i] + location; } } Cube::~Cube () { - for (int i = 0; i < 6; i++) { + for (int i = 0; i < 8; i++) { #ifdef DEBUG fprintf (stderr, "Removing P[%d]: ", i); #endif diff --git a/pmc/include/cube.h b/pmc/include/cube.h --- a/pmc/include/cube.h +++ b/pmc/include/cube.h @@ -16,7 +16,7 @@ int height; public: - Cube (Surface *, Vector, Vector, Vector, Vector, int); + Cube (Surface *, Vector&, Vector&, Vector&, Vector&, int); Cube (Surface *); virtual ~ Cube (); diff --git a/pmc/include/drawable.h b/pmc/include/drawable.h --- a/pmc/include/drawable.h +++ b/pmc/include/drawable.h @@ -16,7 +16,7 @@ public: virtual ~ Drawable () {}; - virtual void move (Vector location) = 0; + virtual void move (Vector) = 0; virtual void show () = 0; }; #endif diff --git a/pmc/include/rectangle.h b/pmc/include/rectangle.h --- a/pmc/include/rectangle.h +++ b/pmc/include/rectangle.h @@ -15,7 +15,7 @@ Vector * P[4]; public: - Rectangle (Surface *, Vector p1, Vector p2, Vector p3, Vector p4); + Rectangle (Surface *, Vector& p1, Vector& p2, Vector& p3, Vector& p4); Rectangle (Surface *); virtual ~ Rectangle (); void move (Vector); diff --git a/pmc/include/vector.h b/pmc/include/vector.h --- a/pmc/include/vector.h +++ b/pmc/include/vector.h @@ -18,12 +18,12 @@ int X (); int Y (); - Vector operator+ (Vector); - Vector operator- (Vector); + Vector operator+ (Vector&); + Vector operator- (Vector&); double abs (); void vector (); - double angle (Vector); + double angle (Vector&); void setMode (Mode m = RAD); private: diff --git a/pmc/rectangle.cc b/pmc/rectangle.cc --- a/pmc/rectangle.cc +++ b/pmc/rectangle.cc @@ -18,7 +18,7 @@ surface = s; } -Rectangle::Rectangle (Surface * s, Vector p1, Vector p2, Vector p3, Vector p4) +Rectangle::Rectangle (Surface * s, Vector& p1, Vector& p2, Vector& p3, Vector& p4) { P[0] = new Vector (p1); P[1] = new Vector (p2); diff --git a/pmc/vector.cc b/pmc/vector.cc --- a/pmc/vector.cc +++ b/pmc/vector.cc @@ -37,12 +37,12 @@ return y; } -Vector Vector::operator+ (Vector a) +Vector Vector::operator+ (Vector& a) { return Vector (x + a.X (), y + a.Y ()); } -Vector Vector::operator- (Vector a) +Vector Vector::operator- (Vector& a) { return Vector (x - a.X (), y - a.Y ()); } @@ -57,7 +57,7 @@ fprintf (stderr, "(%.3d, %.3d)", x, y); } -double Vector::angle (Vector v) +double Vector::angle (Vector& v) { if (mode == DEG) return ((180.0 / M_PI) * std::acos ((v.X () * X () + v.Y () * Y ()) / (abs () * v.abs ()))); diff --git a/vector.cc b/vector.cc new file mode 100644 --- /dev/null +++ b/vector.cc @@ -0,0 +1,105 @@ +/** + * DEREFERNCING CLASSES + */ + +#include +#include +#include +#include + +#define GETRANDOM(max) (1+(int)((float)max*rand()/RAND_MAX+1.0)) +#define MAX 6 + +namespace algebra { + class Vector { + private: + int x; + int y; + + public: + Vector (int xx = 0, int yy = 0); + ~Vector (); + + int X () { return x; } + int Y () { return y; } + + Vector operator+ (Vector&); + Vector operator- (Vector&); + + void vector (); + double abs (); + }; + + Vector::Vector (int xx, int yy) { + x = xx; + y = yy; + } + + Vector::~Vector () { + fprintf (stderr, "Removing Vector (%.3d, %.3d)\n", x, y); + } + + Vector Vector::operator+ (Vector& v) { + return Vector (x + v.X (), y + v.Y ()); + } + + Vector Vector::operator- (Vector& v) { + return Vector (x - v.X (), y - v.Y ()); + } + + double Vector::abs () { + return sqrt (x * x + y * y); + } + + void Vector::vector () { + printf ("(%.3d, %.3d)", x, y); + } +} + +using namespace algebra; + +int main (int argc, char **argv) +{ + Vector *v[MAX]; + Vector result; + + srand (time (NULL)); + + if ((MAX % 2) != 0) { + printf ("MAX %% 2 != 0\n"); + return EXIT_FAILURE; + } + + for (int i = 0; i < MAX; i++) { + v[i] = new Vector (GETRANDOM (100), GETRANDOM (100)); + } + + for (int i = 0; i < MAX; i += 2) { + v[i + 1]->vector (); + printf ("+"); + v[i]->vector (); + printf ("="); + result = *v[i + 1] + *v[i]; + result.vector (); + printf (" = %3.2f\n", result.abs ()); + } + + printf ("\n"); + + for (int i = 0; i < MAX; i += 2) { + v[i + 1]->vector (); + printf ("-"); + v[i]->vector (); + printf ("="); + result = *v[i + 1] - *v[i]; + result.vector (); + printf (" = %3.2f\n", result.abs ()); + } + + printf ("\nCLEANUP\n"); + + for (int i = 0; i < MAX; i++) + delete v[i]; + + return EXIT_SUCCESS; +}