Írjunk egy kétdimenziós vektor osztályt!
-
Az osztály gondoskodjon róla, hogy a vektor koordinátái csak nemnegatív számok legyenek!
-
Inicializáláskor a vektort meg lehessen adni 0, 1 vagy 2 értékkel is (ha nem adjuk meg egy koordináta kezdőértékét, akkor az nulla legyen!
-
A vektorhoz lehessen hozzáadni, belőle kivonni más kétdimenziós vektorokat! Továbbá más vektorral lehessen összeszorozni (skaláris szorzat)!
-
A program tagolása (.h: osztálydeklaráció, .cpp: hosszabb implementációjú függvények törzse) a C++ programozók körében elterjedt konvenciók alapján történjen, és védjük le a többszörös beépítésből eredő újradefinicióról szóló hibaüzeneteket. A tesztelő függvény is külön állományba kerüljön.
-
Írjunk egy diagnosztikai függvényt, amely kiírja a tagváltozók értékét, és egy tesztelő függvényt (main), amely teszteli a konstruktorokat és a többi tagfüggvényt.
Mivel az x és y tagváltozó értéke negatívra állitható, ami az objektum inkonzisztens állapotát jelentené, ezért azok privát tagváltozók lesznek. Mivel kívülről nem hozzáférhetők, lekérdező- és beállítófüggvényeket kell írnunk. A beállítófüggvényeknek ellenőrizniük kell, hogy csak nemnegatív számokat állítunk be.
Ha nem lenne a nemnegatív korlátozás, akkor a tagváltozók publikusak is lehetnének. Általában is igaz, hogy ha egy változó értelmezési tartományának bizonyos értékei nem megengedettek, akkor a változó privát lesz, valamint egy beállító és egy lekérdezőfüggvényt írunk. A beállítófüggvényben fellenőrizzük, hogy csak helyes értéked adjunk a tagváltozónak. Haladóbb technika, hogy a helyelen érték esetén a beállítófüggvény kivételt dob. Ezt ebben a megoldásban nem mutatjuk be. Erre a konstruktorban is figyeljünk oda, például a beállítófüggvény segítségével inicializáljuk a változókat.
A TwoDimVector.h állomány tartalma:
#ifndef TWO_DIM_VECTOR_H
#define TWO_DIM_VECTOR_H // A többszörös beépítés elkerülése
class TwoDimVector
{
double x,y; // private
public:
// Elegánsabb default értékkel megoldani, mint 3 konstruktorral
TwoDimVector(double x=0, double y=0){SetX(x); SetY(y);};
void SetX(double x); // Értékbeállítás ellenorzéssel
void SetY(double y); // Értékbeállítás ellenorzéssel
double GetX(){return x;}; // Érték lekérdezése privát tagváltozóból
double GetY(){return y;}; // Érték lekérdezése privát tagváltozóból
void Add(TwoDimVector tdv); // Összeadás
void Subtract(TwoDimVector tdv); // Kivonás
double Multiply(TwoDimVector tdv); // Szorzás
void Print()const; // Publikus kiírófüggvény
};
#endif /* TWO_DIM_VECTOR_H */ // A többszörös beépítés elkerülése
A TwoDimVector.cpp állomány:
#include "TwoDimVector.h"
#include <iostream>
using namespace std;
// Értékbeállítás ellenorzéssel
void TwoDimVector::SetX(double x)
{
if(x>=0) this->x=x;
}
void TwoDimVector::SetY(double y)
{
if(y>=0) this->y=y;
}
// Összeadás
void TwoDimVector::Add(TwoDimVector tdv)
{
x+=tdv.GetX();
y+=tdv.GetY();
}
// Kivonás
void TwoDimVector::Subtract(TwoDimVector tdv)
{
x-=tdv.GetX();
y-=tdv.GetY();
}
// Szorzás
double TwoDimVector::Multiply(TwoDimVector tdv)
{
return x*tdv.GetX() + y*tdv.GetY();
}
// Publikus kiírófüggvény
void TwoDimVector::Print()const
{
cout << x << y << endl;
}
Egy lehetséges tesztprogram:
#include "TwoDimVector.h"
#include <iostream>
using namespace std;
int main()
{
// Létrehozzuk az objektumokat
TwoDimVector tdv1;
TwoDimVector tdv2(4);
TwoDimVector tdv3(2,3);
TwoDimVector tdv4(4,5);
// Kiiratjuk a tagváltozókat
tdv1.Print();
tdv2.Print();
tdv3.Print();
tdv4.Print();
// Műveletek végzése
tdv2.Add(tdv3);
tdv4.Subtract(tdv3);
// Kiiratjuk a tagváltozókat
tdv1.Print();
tdv2.Print();
tdv3.Print();
tdv4.Print();
cout << tdv3.Multiply(tdv4) << endl;
}