Консультация № 190185
29.11.2016, 08:41
0.00 руб.
0 4 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Помогите решить прооблему с ошибкой. Есть класс Time, который находится в другой папке и когда я меняю тип вектора с Vector<int>v(3) на Vector<Time>v(3), то сыпатся ошибка.
Использую DEV-C++ 4.9.9.2
файл Time.h
Код:

class Time
{
int min, sec;
public:
Time(){min=0;sec=0;};
Time(int m, int s){min=m;sec=s;}
Time(const Time&t){min=t.min;sec=t.sec;}
~Time(){};
int get_min(){return min;}
int get_sec(){return sec;}
void set_min(int m){min=m;}
void set_sec(int s){sec=s;}
//перегруженные операции
Time&operator=(const Time&);
Time operator+(const Time&);
Time operator/(const Time&);
Time operator/(const int&);
bool operator >(const Time&);
bool operator <(const Time&);
//глобальные функции ввода-вывода
friend istream& operator>>(istream&in, Time&t);
friend ostream& operator<<(ostream&out, const Time&t);
};


файл Time.cpp
Код:
#include "Time.h"
//перегрузка операции присваивания
Time&Time::operator=(const Time&t)
{
//проверка на самоприсваивание
if(&t==this) return *this;
min=t.min;
sec=t.sec;
return *this;
}
//перегрузка глобальной функции-операции ввода
istream&operator>>(istream&in, Time&t)
{
cout<<"min?"; in>>t.min;
cout<<"sec?"; in>>t.sec;
return in;
}
//перегрузка глобальной функции-операции вывода
ostream&operator<<(ostream&out, const Time&t)
{
return (out<<t.min<<" : "<<t.sec);
}

bool Time::operator <(const Time &t)
{
if(min<t.min)return true;
if(min==t.min&&sec<t.sec)return true;
return false;
}
bool Time::operator >(const Time &t)
{
if(min>t.min)return true;
if(min==t.min&&sec>t.sec)return true;
return false;
}
Time Time::operator+(const Time&t)
{
int temp1=min*60+sec;
int temp2=t.min*60+t.sec;
Time p;
p.min=(temp1+temp2)/60;
p.sec=(temp1+temp2)%60;
return p;
}
//перегрузка бинарной операции деления
Time Time::operator/(const Time&t)
{
int temp1=min*60+sec;
int temp2=t.min*60+t.sec;
Time p;
p.min=(temp1/temp2)/60;
p.sec=(temp1/temp2)%60;
return p;
}
Time Time::operator/(const int&t)
{
int temp1=min*60+sec;
Time p;
p.min=(temp1/t)/60;
p.sec=(temp1/t)%60;
return p;
}


файл zadacha3_main.cpp
Код:
//полный путь к файлу Time.h
using namespace std;
#include <iostream>
#include "Vector.h"
#include <C:\prog\11\2\Time.h>
int main(void)
{
Vector<Time>vec(5);//создать вектор из 5 элементов
vec.Print();//печать вектора
Time s=vec.Srednee();//среднее ариметическое
cout<<"Srednee="<<s<<endl;
cout<<"pos?";
int p;
cin>>p;//ввести позицию для добавления
vec.Add(s,p);//добавить элемент в вектор
vec.Print();//печать вектора
p=vec.Max();//найти максимальный элемент
vec.Del(p);//удаление
vec.Print();//печать
vec.Delenie();//деление
vec.Print();//печать
system ("pause");
}


файл Vector.h
Код:
#pragma once
#include <vector>
#include <iostream>
//шаблон класса
template<class T>
class Vector
{
vector <T> v;//последовательный контейнер для хранения элементов вектора
int len;
public:
Vector(void);//конструктор без параметра
Vector(int n);//конструктор с параметром
void Print();//печать
~Vector(void);//деструктор
T Srednee();//вычисление среднего арифметического
void Add(T el, int pos);//добавление элемента el на позицию pos
int Max();//найти номер максимальнго элемента
void Del(int pos);//удалить элемент из позиции pos
int Min();//найти номер минимальнго элемента
void Delenie();//деление на минимальный
};

//конструктор без параметра
template <class T>
Vector<T>::Vector()
{
len=0;
}
//деструктор
template <class T>
Vector<T>::~Vector(void)
{
}
//конструктор с параметром
template <class T>
Vector<T>::Vector(int n)
{
T a;
for(int i=0;i<n;i++)
{
cin>>a;
v.push_back(a);
}
len=v.size();
}
//печать
template <class T>
void Vector<T>::Print()
{
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<endl;
}
//вычислить среднее арифметическое
template<class T>
T Vector<T>::Srednee()
{
T s=v[0];
for(int i=1;i<v.size();i++)
s=s+v[i];
int n=v.size();
return s/n;
}
//добавление элемента
template<class T>
void Vector<T>::Add(T el, int pos)
{
v.insert(v.begin()+pos,el);
}
//поиск максимального элемента
template <class T>
int Vector<T>::Max()
{
T m=v[0];
int n=0;
for(int i=1;i<v.size();i++)
if(v[i]>m)
{
m=v[i];
n=i;
}
return n;
}
//удаление элемента из позиции pos
template<class T>
void Vector<T>::Del(int pos)
{
v.erase(v.begin()+pos);
}
//поиск минимального элемента
template<class T>
int Vector<T>::Min()
{
T m=v[0];
int n=0;
for(int i=1;i<v.size();i++)
if(v[i]<m)
{
m=v[i];
n=i;
}
return n;
}
//деление всех элементов вектора на минимальный элемент
template<class T>
void Vector<T>::Delenie()
{
int m=Min();T min=v[m];
for(int i=0;i<v.size();i++)
v[i]=v[i]/min;
};
//поиск минимального элемента
template <class T>
int Vector<T>::Min()
{
T m=s.top();
vector<T> v=copy_stack_to_vector(s);
while(!s.empty())
{
if(s.top()<m)m=s.top();
s.pop();
}
s=copy_vector_to_stack(v);
return m;
}
//деление всех элементов на минимальный
template <class T>
void Vector<T>::Delenie()
{
T m=Min();
vector<T> v;
T t;
while(!s.empty())
{
t=s.top();
v.push_back(t/m);
s.pop();
}
s=copy_vector_to_stack(v);
}

Обсуждение

давно
Посетитель
400153
18
29.11.2016, 08:42
общий
Условие было такое:
Задача 3
1. Создать параметризированный класс, используя в качестве контейнера
последовательный контейнер.
2. Заполнить его элементами.
3. Добавить элементы в соответствии с заданием
4. Удалить элементы в соответствии с заданием.
5. Выполнить задание варианта для полученного контейнера.
6. Выполнение всех заданий оформить в виде методов параметризированного
класса.
давно
Советник
400484
472
29.11.2016, 17:26
общий
29.11.2016, 17:27
Добрый день,

могу посоветовать следующее:
1. в файле Vector.h разберитесь почему дублируются методы template <class T> int Vector<T>::Min() и template <class T> void Vector<T>::Delenie(). Это точно не даст собраться проекту. Так же в файл добавьте доступ к пространству имен std -
Код:
using namespace std;

2. в начало файла Time.h добавьте:
Код:
#include <istream>
#include <iostream>
using namespace std;

3. в файлe zadacha3_main.cpp укажите корректный путь к файлу Time.h. Обычно в угловых скобках (<>) указываются файлы идущие с компилятором. Файлы создаваемые пользователем указывают в кавычках ("").
Код:
#include "Time.h"

Так я бы перенес using namespace std после всех заголовочных файлов.

Пробуйте должно все собраться.
давно
Старший Модератор
17042
808
03.12.2016, 09:18
общий
Адресаты:
Оформите Ваш пост как ответ?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Советник
400484
472
04.12.2016, 09:24
общий
это ответ
Здравствуйте, User194586!

могу посоветовать следующее:
1. в файле Vector.h разберитесь почему дублируются методы template <class T> int Vector<T>::Min() и template <class T> void Vector<T>::Delenie(). Это точно не даст собраться проекту. Так же в файл добавьте доступ к пространству имен std -
Код:
using namespace std;


2. в начало файла Time.h добавьте:
Код:
#include <istream>
#include <iostream>
using namespace std;


3. в файлe zadacha3_main.cpp укажите корректный путь к файлу Time.h. Обычно в угловых скобках (<>) указываются файлы идущие с компилятором. Файлы создаваемые пользователем указывают в кавычках ("").
Код:
#include "Time.h"


Так я бы перенес using namespace std после всех заголовочных файлов.

Пробуйте должно все собраться.
5
Форма ответа