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
|
#include <stdio.h>
// --------------------------- Aspect code -----------------------------
aspect FigureObserver
{
pointcut move () =
execution ("void FigureElement::setXY(int,int)") ||
execution ("void Point::set%(int)") ||
execution ("void Line::setP%(Point &)");
public:
advice move () : after () {
printf ("moved\n");
}
};
// ------------------------------- normal C++ ----------------------------
class FigureElement
{
public:
virtual void setXY (int, int) = 0;
};
class Point : public FigureElement
{
int _x;
int _y;
public:
Point (int x, int y) : _x (x), _y (y) {}
void setXY (int x, int y) { _x = x; _y = y; }
void setX (int x) { _x = x; }
void setY (int y) { _y = y; }
int x () { return _x; }
int y () { return _y; }
};
class Line : public FigureElement
{
Point p1;
Point p2;
public:
void setXY (int x, int y);
void setP1 (const Point &p) { p1 = p; }
void setP2 (const Point &p) { p2 = p; }
};
void Line::setXY (int x, int y)
{
int dx = p2.x () - p1.x ();
int dy = p2.y () - p1.y ();
setP1 ((const Point&)Point (x, y));
setP2 ((const Point&)Point (x + dx, y + dy));
}
int main ()
{
Point p (0, 0);
p.setXY (3, 2);
p.setX (10);
return 0;
}
|