Шаблон Vectro с исключениями Range и Size.

Рубрика: C++, Дата: 14 April, 2013, Автор:

Напишите полный шаблон Vector с исключениями типа Range и Size.

Сделал я шаблон класса Vector, то есть я его доделал, сам класс как бы был уже сделан, конечно там есть и ошибки, я не стал их исправлять так, что так, да лень мне их исправлять, там просто ошибки по неоднозначному вызову конструкторов, а так все вроде норм работает. От файл Vector.h:

//ob69vlenie klacca Vector
#ifndef VECTOR_H
#define VECTOR_H
#include <vector>
using std::vector;

template<class T>
class Vector
{
	vector<T> vec;//predctavlenie
	int SIZE;//razmer
public:
	class Range{};
	class Size{};
	//konctryktor po ymolchaniyu
	Vector();
	
	//konctryktor kopii
	Vector(const Vector& a);
	
	//konctryktor preobrazovani9
	Vector(T a);
	
	//konctryktor preobrazovani9 mojno ykazat6 razmer
	Vector(int a,int=0);
	
	//dl9 ne const
	T& operator[](int i);
	
	//dl9 const ob6ektov
	T operator[](int i) const;
	
	Vector& operator=(const Vector& a);
	
	//pechat6
	void print();
	
	
	Vector& operator+=(const Vector& a);
	Vector& operator-=(const Vector& a);
	Vector& operator*=(const Vector& a);
	Vector& operator/=(const Vector& a);
	
	template<class R>
	friend Vector<R> operator+(const Vector<R> a, const Vector<R> b);
	template<class R>
	friend Vector<R> operator-(const Vector<R> a, const Vector<R> b);
	template<class R>
	friend Vector<R> operator*(const Vector<R> a, const Vector<R> b);
	template<class R>
	friend Vector<R> operator/(const Vector<R> a, const Vector<R> b);

	template<class R>
	friend Vector<R> operator+(const Vector<R> a, const R b);
	template<class R>
	friend Vector<R> operator-(const Vector<R> a, const R b);
	template<class R>
	friend Vector<R> operator*(const Vector<R> a, const R b);
	template<class R>
	friend Vector<R> operator/(const Vector<R> a, const R b);
};

#endif

 

Файл Vector.cpp:

//opredelenie klacca Vector
#include <iostream>
using std::cout;
using std::endl;

#include "Vector.h"
//konctryktor po ymolchaniyu
template<class T>
Vector<T>::Vector()
:SIZE(4)
{
	for(int i=0;i<SIZE;i++)
		vec.push_back(0);
}

//konctryktor dl9 konctantnux kopii
template<class T>
Vector<T>::Vector(const Vector<T>& a)
:SIZE(a.SIZE)
{
	for(int i=0;i<SIZE;i++)
		vec.push_back(a.vec[i]);
}

//konctryktor preobrazovani9
template<class T>
Vector<T>::Vector(T a)
:SIZE(4)
{
	for(int i=0;i<SIZE;i++)
		vec.push_back(a);
}

//konctryktor preobrazovani9
template<class T>
Vector<T>::Vector(int a,int c)
:SIZE(a)
{
	for(int i=0;i<SIZE;i++)
		vec.push_back(0);
}

//dl9 ne const
template<class T>
T& Vector<T>::operator[](int i)
{
	if(i>=0&&i<SIZE)
		return vec[i];
	else
		throw Range();
}

//dl9 const ob6ektov
template<class T>
T Vector<T>::operator[](int i) const
{
	if(i>=0&&i<SIZE)
		return vec[i];
	else
		throw Range();
}

template<class T>
Vector<T>& Vector<T>::operator=(const Vector<T>& a)
{
	for(int i=0;i<SIZE;i++)
	{
		vec[i]=a.vec[i];
	}
	
	return *this;
}

template<class T>
void Vector<T>::print()
{
	for(int i=0;i<SIZE;i++)
	{
		cout <<vec[i]<<' ';
	}
	cout <<endl;
}

template<class T>
Vector<T>& Vector<T>::operator+=(const Vector<T>& a)
{
	for(int i=0;i<SIZE;i++)
	{
		vec[i]+=a.vec[i];
	}
	
	return *this;
}

template<class T>
Vector<T>& Vector<T>::operator-=(const Vector<T>& a)
{
	for(int i=0;i<SIZE;i++)
	{
		vec[i]-=a.vec[i];
	}
	
	return *this;
}

template<class T>
Vector<T>& Vector<T>::operator*=(const Vector<T>& a)
{
	for(int i=0;i<SIZE;i++)
	{
		vec[i]*=a.vec[i];
	}
	
	return *this;
}

template<class T>
Vector<T>& Vector<T>::operator/=(const Vector<T>& a)
{
	for(int i=0;i<SIZE;i++)
	{
		vec[i]/=a.vec[i];
	}
	
	return *this;
}

template<class T>
Vector<T> operator+(const Vector<T> a, const Vector<T> b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]+b[i];
	}
	
	return c;
}

template<class T>
Vector<T> operator+(const Vector<T> a, const T b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]+b;
	}
	
	return c;
}

template<class T>
Vector<T> operator-(const Vector<T> a, const Vector<T> b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]-b[i];
	}
}

template<class T>
Vector<T> operator-(const Vector<T> a, const T b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]-b;
	}
}

template<class T>
Vector<T> operator*(const Vector<T> a, const Vector<T> b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]*b[i];
	}
}

template<class T>
Vector<T> operator*(const Vector<T> a, const T b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]*b;
	}
}

template<class T>
Vector<T> operator/(const Vector<T> a, const Vector<T> b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]/b[i];
	}
}

template<class T>
Vector<T> operator/(const Vector<T> a, const T b)
{
	Vector<T> c;
	for(int i=0;i<a.SIZE;i++)
	{
		c[i]=a[i]/b;
	}
}

 

И сам файл main.cpp:

//polnui wablon Vector
#include <iostream>
using std::cout;
using std::endl;

#include "Vector.cpp"

int main()
{
	try
	{
		Vector<float> a;
		a.print();
		Vector<float> b(6);
		b.print();
		b[7];//gen icklyucheni9
	}
	catch(Vector<float>::Range& a)
	{
		cout <<"Vuxod za predelu "<<endl;
	}
	
	return 0;
}

За исключения чуточку скажу я как бы создал два вложенных класса Size и Range. Использую токо Range для генерации исключения в операции взятия индекса [], или как ее правильно называют не помню, вообщем в operator[](), опять же ловим исключение в int main(). Да и все пожалуй.

[youtube]http://www.youtube.com/watch?v=199SbZCxS04[/youtube]

rss