КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Синтаксис объявления класса TVectorclass TVector { private: double FX, FY, FZ; public: double X(){return FX;}; double Y(){return FY;}; double Z(){return FZ;}; double Module(); TVector(double X, double Y, double Z = 0); TVector operator +=(TVector Vector); TVector operator -=(TVector Vector); TVector operator *=(double Number); TVector operator *=(TVector Vector); double operator %(TVector Vector); }; Класс TVector содержит три поля для хранения координат вектора, три метода для вывода и конструктор для ввода их значений, метод для нахождения модуля и пять методов для выполнения арифметических операций с векторами. В модуле с данным классом можно определить класс исключительных ситуаций EVectorError для обработки ошибок, которые могут возникать при работе с векторными числами. #define EVectorError Exception Чтобы использовать этот класс, в исполняемом разделе модуля с расширением cpp необходимо подключить модуль SysUtils.hpp, в котором хранить базовый класс исключительных ситуаций Exception. После объявления класса TVector необходимо определить все его методы в исполняемом разделе модуля с расширением cpp в соответствии с ADT – форматом. TVector::TVector(double X, double Y, double Z) { FX = X; FY = Y; FZ = Z; }
TVector TVector::operator+=(TVector Vector) { FX += Vector.FX; FY += Vector.FY; FZ += Vector.FZ; return *this; }
TVector TVector::operator-=(TVector Vector) { FX -= Vector.FX; FY -= Vector.FY; FZ -= Vector.FZ; return *this; }
TVector TVector::operator*=(double Number) { FX *= Number; FY *= Number; FZ *= Number; return *this; }
TVector TVector::operator*=(TVector Vector) { double NewX, NewY; NewX = FY * Vector.FZ - Vector.FY * FZ; NewY = FZ * Vector.FX - Vector.FZ * FX; FZ = FX * Vector.FY - Vector.FX * FY; FX = NewX; FY = NewY; return *this; }
double TVector::operator%(TVector Vector) { return FX * Vector.FX + FY * Vector.FY + FZ * Vector.FZ; } После того, как определен класс TVector, его можно использовать в любом месте программы, подключив соответствующий модуль VectorClass. void __fastcall TForm1::Button1Click(TObject *Sender) { TVector a(1,2,3), b(4,5,6); a += b; Edit3->Text = a.X(); Edit4->Text = a.Y(); Edit5->Text = a.Z(); } Из примера видно, что реализация класса TVector далека от совершенства. Для расширения его функциональных возможностей можно добавить к нему дополнительные методы так, чтобы исходное число не передавалось конструктору, а методы арифметических операций выполняли бы действия без присвоения. TVector::TVector() { FX = 0; FY = 0; FZ = 0; }
TVector TVector::operator+(TVector Vector) { TVector Result(FX, FY, FZ); Result+=Vector; return Result; }
TVector TVector::operator-(TVector Vector) { TVector Result(FX, FY, FZ); Result-=Vector; return Result; }
TVector TVector::operator*(double Number) { TVector Result(FX, FY, FZ); Result*=Number; return Result; }
TVector TVector::operator*(TVector Vector) { TVector Result(FX, FY, FZ); Result*=Vector; return Result; } Заголовки этих методов, первоначально, необходимо поместить в объявление класса TVector. TVector(); TVector operator +(TVector Vector); TVector operator -(TVector Vector); TVector operator *(double Number); TVector operator *(TVector Vector); Для более эффективного ввода векторных чисел в классе TVector можно предусмотреть дополнительный конструктор так, чтобы исходное число передавалось ему в виде строки AnsiString в формате ‘(X, Y, Z)’. TVector::TVector(AnsiString Vector) { int Separator1, Separator2; Vector = Vector.Trim(); if ((Vector[1]!='(') || (Vector[Vector.Length()]=!')')) throw EVectorError("Неправильный формат вектора"); Separator1 = Vector.Pos(','); FX = Vector.SubString(2, Separator1 - 1).ToDouble(); Vector[Separator1] = ' '; Separator2 = Vector.Pos(','); if (Separator2 = 0) { FY = Vector.SubString(Separator1 + 1,Vector.Length() - Separator1 - 1).ToDouble(); FZ = 0; } Else { FY = Vector.SubString(Separator1 + 1, Separator2 – Separator1 - 1).ToDouble(); FY = Vector.SubString(Separator2 + 1,Vector.Length() - Separator2 - 1).ToDouble(); } } Для более эффективного вывода векторных чисел можно предусмотреть специальный метод преобразования типов из TVector в строку AnsiString, реализация которого имеет следующий вид: AnsiString TVector::ToStr() { return "(" + FloatToStr(FX) + ", " + FloatToStr(FY) + } Перед определением дополнительного конструктора и метода преобразования типов их заголовки необходимо объявить внутри класса TVector, первоначально подключив модуль System.hpp, в котором храниться объявление класса строк AnsiString. TVector(AnsiString Complex); AnsiString ToStr(); Использовать дополнительные методы можно следующим образом: void __fastcall TForm1:: Button1Click(TObject *Sender) { TVector a(Edit1->Text), b(Edit2->Text), c; c=a+b; Edit3->Text = c.ToStr(); }
|