ИЗГОТОВЛЕНИЕ НЕСТАНДАРТНЫХ БИБЛИОТЕК С++ Выполнил студент Ляжков Сергей. Группа 13604/1 ПРЕДПОСЫЛКА • Когда мы пишем программу на языке C++, мы в самом начале используем встроенные библиотеки, чтобы программа работала. В традиционном процедурно-ориентированном программировании долгое время среди разработчиков программного обеспечения было принято предоставлять программистам библиотеки функций. С помощью их комбинирования и добавления собственных процедур и функций получалась программа. Библиотеки обычно содержат очень широкий спектр готовых функций, пригодных для различного применения. • Поскольку язык C++ построен на классах, неудивительно, что библиотеки этих программ на этом языке также состоят из классов. Они представляют собой совокупность данных и функций для их обработки, а также они лучше моделируют реальную жизнь. • При разработке приложений оказывается, что если доступны необходимые библиотеки, то для создания полнофункционального продукта необходим минимум ручной работы по программированию. К тому же необходимо учитывать, что создается все больше и больше библиотек, а значит, больший спектр различного программного обеспечения можно создавать без лишних проблем. Крайне важный пример библиотеки классов – Стандартная библиотека C++. Интерфейс и реализация • Обычно библиотека классов состоит из интерфейса и реализации. Для того, чтобы библиотеку можно было использовать, программисту необходим доступ к различным определениям, включая определение классов. Они представляют собой общедоступную часть библиотеки и обычно представляются в виде заголовочного файла с расширением .h. Объявления в заголовочных файлах должны быть общедоступными. Только с помощью объявлений классов в виде исходного кода возможно создавать объекты библиотечных классов. Речь идет об интерфейсе. • Реализация – это содержимое библиотечных классов. Цель СОЗДАНИЯ БИБЛИОТЕК • Любой огромный проект разрабатывается группой программистов. Разграничив круг задач, поставленных перед каждым, можно решение каждой проблемы выделить в виде отдельного файла. Такой подход позволяет лучше организовывать работу команды и более четко определять взаимодействие частей программы. • • Примеры кодов #pragma once #include <iostream> • #include<math.h> • using namespace std; • • • • • • • • • • • class Complex { private: double re; - действительная часть double im; = мнимая часть public: Complex(double r) { re = r; im = 0; } • Complex(double r, double i) { re = r; - действительная часть im = i; - мнимая часть } Complex(const Complex &C) { re = C.re; экземпляр Complex с именем C im = C.im; } ~Complex() {};-уничтожение копии конструктора • double count() { return sqrt(re*re + im*im);-модуль комплексного числа } • Complex& operator=(const Complex &C) – оператор присваивания { re = C.re; im = C.im; return(*this); } Complex& operator+(const Complex &C) { return Complex(re + C.re, im + C.im); (правило сложения точек) } • • • • • • Complex& operator*(const Complex &C) { return Complex(re*C.re - im*C.im, re*C.im + im*C.re);-новое комплексное число , полученное путем умножения.(правило умножения точек) } Complex& operator / (const Complex &C) { Complex n; double f = (C.re*C.re + C.im*C.im); n.re = (re*C.re + im*C.im) / f; n.im = (im*C.re - re*C.im) / f; return n; } ostream & operator<< (ostream &, const Complex &); istream & operator>> (istream &, Complex &); }; ostream& operator<< (ostream &out, const Complex &C)-вывод комплексного числа на экран { out << "(" << C.re << "+ " << C.im << "i"<<")"; return out; } istream& operator>> (istream &in, Complex &C) –ввод действительного и мнимого значения. { in >> C.re >> C.im; return in; } Использование данной библиотеки • • • • • • #include"stdafx.h" #include<iostream> #include<math.h> #include"Complex.h – включение библиотеку комплексных чисел в программу using namespace std; int main() { Complex a(5, 2); Complex b(-1, 3); Complex c1 = a + b; сложение комплексных чисел Complex c2 = a - b; вычитание комплексных чисел Complex c3 = a*b; умножение комплексных чисел Complex c4 = a / 2 * b; cout << c1 << "\n"; cout << c2 << "\n"; cout << c3 << "\n"; cout << c1*c1 + c2*c2 << "\n"; system("pause"); return 0; } ВЫВОД • С помощью класса «Complex» была создана библиотека комплексных чисел(она находится в стандарте С99). Ее можно спокойно использовать при работе с этими числами. Именно так можно создать нестандартную библиотеку в отдельном файле, чтобы в другом файле, используя ее, написать отдельную программу. Это может иметь недостаток: целая программа может нескомпилироваться в результате ошибки в создании библиотеки. Зато одну работу можно распределить среди нескольких программистов. СВОЙ ПРИМЕР • • • • #pragma once #include <iostream> #include <math.h> using namespace std; • • • • • • • • • • class Vector { private: int x; int y; int z; public: Vector(int xx = 0, int yy = 0, int zz = 0)-конструктор по умолчанию { x = xx;-присваивание значениям координаты вектора переменными из private y = yy; z = zz; } • • • • • • • • • int getx() const { return x; } int gety() const { return y; }-функция, возвращающая постоянные значения координат вектора int getz() const { return z; } • void setx(int xx) { x = xx; } void sety(int yy) { y = yy; } – функция, позволяющая действовать с координатами вектора void setz(int zz) { z = zz; } • }; • • • • • • ostream & operator << (ostream & os, const Vector &ob) { os << "{ "; os << ob.getx() << ", "; - вывод копии значения х os << ob.gety() << ", "; - вывод копии значения у os << ob.getz() << " }"; - вывод копии значения z • • return os; } • Vector operator+(const Vector & a, const Vector & b) • { • Vector c; • c.setx(a.getx() + b.getx());-сложение векторов • c.sety(a.gety() + b.gety()); • c.setz(a.getz() + b.getz()); • return c; • } • Vector operator*(const Vector & a, const Vector & b) • { • Vector c; • c.setx(a.gety()*b.getz() - a.getz()*b.gety()); • c.sety(a.getz()*b.getx() - a.getx()*b.getz()); • c.setz(a.getx()*b.gety() - a.gety()*b.getx()); • return c; • } • • • • • • • . #include<iostream> #include”Vector.h”- включение библиотеку векторов для main Using namespace std; int main() { Vector a(1, 2); Vector b(1, 5, 7); • • • • cout << a << endl; cout << b << endl; cout << a + b << endl; cout << a*b << endl; • system("pause"); • • } return 0; Список литературы • Р.Лафоре • «Объектно-ориентированное программирование», 4-е издание