Неразрешенный внешний элемент
Всем здравствуйте,задача такая: организовать класс множество(MySet) на основе класса вектор(MyVector)и организовать корректное выполнение всего,что есть в фуннкции main().Ещё все классы должны быть шаблонными.Возникает такая ошибка
,уже сто раз все посмотрела,помогите,пожалуйста
Файл MyVector.h
#pragma once
#ifndef MYVECTOR_H
#define MYVECTOR_H
#include <iostream>
using namespace std;
const int MAX_SIZE = 5;
template<class INF>
class MyVector
{
public:
MyVector( INF el, int maxsz);//конструктор с двумя параметром
MyVector();//конструктор по умолчанию
MyVector( INF el);
MyVector(const MyVector& v);//конструктор копирования
~MyVector()// деструктор
{
delete[] pdata;//освобождаем саму память
};
void add_element( INF el);// функция добавления элемента в конец вектора
void delete_element(int i);//функция удаления элемента из произвольного места
INF& operator[](int i)const;
int Size() { return size; }
int Maxsize() { return maxsize; }
int find(INF el);
MyVector<INF>& operator=(const MyVector<INF> & v)
{
this->maxsize = v.maxsize;
this->size = v.size;
pdata = new INF[maxsize];
for (int i = 0; i < v.size; i++)
{
this->pdata[i] = v.pdata[i];
}
return *this;
}
friend ostream& operator<<(ostream& out, MyVector& v)
{
for (int i = 0; i < v.size; ++i)
out << v.pdata[i] << ' ';
out << endl;
return out;
}
protected:
int maxsize;// размер вектора
int size;// количество элементов в векторе
INF * pdata;
private:
void resize();
};
#endif
Файл MyVector.cpp
#include<vector>
#include "MyVector.h"
//создание конструктора с одним параметром (символьная строка)для создания мн-ва размером 1 и имеетзначения по умолчанию
template<class INF>
MyVector<INF>::MyVector( INF el, int maxsz)
{
maxsize = maxsz;//размер вектора равен переданному значению
pdata = new INF[maxsz];//char **pdata указатель, содержащий адрес динамического массива элементов(строк).
size = 1;//количество элементов в векторе
pdata[0] = new char[strlen(el) + 1];//выделяем динамическую память под строку
strcpy_s(pdata[0],strlen(el)+1, el);// копируем(куда,что)
}
template<class INF>
MyVector<INF>::MyVector()//конструктор по умолчанию
{
pdata = NULL;
size = 0;
maxsize = 0;
}
template<class INF>
MyVector<INF>::MyVector(INF el)//конструктор с одним параметром
{
maxsize = 5;
pdata =new INF[maxsize];
pdata[size] = el;
size++;
}
template<class INF>
MyVector<INF>::MyVector(const MyVector& v)//конструктор копирования
{
/*maxsize = v.maxsize;
size = v.size;
pdata =new INF[maxsize];//выделяем память под динамический массив
for (int i = 0; i < size; ++i)//выделяем память под каждую строчку и копируем туда
{
pdata[i] = new INF[strlen(v.pdata[i]) + 1];
strcpy_s(pdata[i], v.pdata[i]);
}*/
this->maxsize = v.maxsize;
this->size = v.size;
INF* temp = new INF[this->maxsize];
for (int i = 0; i < v.size; i++)
{
temp[i] = v.pdata[i];
}
this->pdata = temp;
}
template<class INF>
void MyVector<INF>::resize()//функция работает в при добавленни и удалении элемента
{
if (size == maxsize)//добавление элемента
maxsize = size * 15 / 10;
else
maxsize = size * 10 / 15;//удаление элемента
INF* temp =new INF[maxsize];//создаем промежуточный вектор
for (int i = 0; i < size; ++i)//копируем в него всё что есть в pdata
{
temp[i] = pdata[i];
}
delete[] pdata;
pdata = temp;//переадресация
}
template<class INF>
void MyVector<INF>::add_element(INF el)//вставка элемента в конец вектора
{
/*if (size == maxsize)
resize();// функция изменения размера вектора maxsize при его переполнении или освобождении места
pdata[size] = new INF[strlen(el) + 1];//выделяем память под строчку
strcpy_s(pdata[size], el);
size++;*/
if (size == maxsize)
{
if (maxsize == 0)
maxsize = 1;
else
maxsize *= 2;
INF* temp = new INF[maxsize];
for (int i = 0; i < size; i++)
{
temp[i] = pdata[i];
}
delete[]pdata;
pdata = temp;
}
pdata[size] = el;
size++;
}
template<class INF>
void MyVector<INF>::delete_element(int i)
{
if (size - 1 < maxsize / 2)
{
maxsize = maxsize * 10 / 15;
INF* temp = new INF[maxsize];//создаем промежуточный вектор
for (int i = 0; i < size; ++i)//копируем в него всё что есть в pdata
{
temp[i] = pdata[i];
}
for (int x = i; x < size - 1; ++x)//удаляем элементы по индексу и перенесоим остальные
{
temp[i] = temp[i + 1];
}
delete[] pdata;
pdata = temp;
}
else
for (int x = i ; x < size - 1; ++x)
{
pdata[i] = pdata[i + 1];
}
size--;
}
template<class INF>
INF& MyVector<INF>::operator[](int i)const
{
return pdata[i];
}
template<class INF>
int MyVector<INF>::find(INF el)
{
for (int i = 0; i < size; ++i)
{
if (el == pdata[i])
return i;
}
return -1;
}
Файл MySet.h
#pragma once
#ifndef MYSET_H
#define MYSET_H
#include <iostream>
#include<string>
#include<vector>
#include "MyVector.h"
#include "MyVector.cpp"
using namespace std;
template<class INF>
class MySet :public MyVector<INF>
{
public:
MySet( INF el ) :MyVector<INF>(el) {};//конструктор с одним параметром
MySet() :MyVector<INF>() {};//конструктор по умолчанию
friend MySet operator+(MySet& s1, MySet& s2)//объединение двух множеств
{
MySet<INF> sum;//создание третьего множества(область объединения)
for (int i = 0; i < sum.size; ++i)
{
sum.add_in_set(s1[i]);//добавляем в область определения элементы из множества s1
}
for (int i = 0; i < sum.size; ++i)
{
sum.add_in_set(s2[i]);//добавляем в область определения элементы из множества s2
}
return sum;
}
friend MySet operator-(MySet& s1, MySet& s2)//разность двух множеств
{
MySet<INF> d;
for (int i = 0; i < s1.size; ++i)
{
if (s2.find(s1[i]) == -1)
d.add_in_set(s1[i]);
}
return d;
}
friend MySet operator*(MySet& s1, MySet& s2)//пересечение двух множеств
{
MySet<INF> p;//создание третьего множества(область пересечения)
for (int i = 0; i < s1.size; i++)
{
if (s2.find(s1[i]) != -1)
p.add_in_set(s1[i]);
}
/*for (int i = 0; i < p.size; ++i)
{
for (int j = i + 1; j < p.size; ++j)
{
if (s1[i] == s2[j])
p.add_in_set(s1[i]);
}
}*/
return p;
}
bool operator==(MySet& s)//сравнение двух множеств
{
if (s.size != this->size)
return false;
for (int i = 0; i < s.size; ++i)
{
if (s[i] != this->pdata[i])
return 0;
}
return 1;
}
void add_in_set( INF el);
void delete_out_of_set(int i);
bool is_element( INF el);
};
#endif
Файл MySet.cpp
#include "MySet.h"
template<class INF>
void MySet<INF>::add_in_set(INF el)//добавление элемента в множество
{
if (this->find(el) == -1)
this->add_element(el);
}
template<class INF>
void MySet<INF>::delete_out_of_set(int i)//удаление элемента из множества
{
this->delete_element(i);
}
template<class INF>
bool MySet<INF>::is_element( INF el)//поиск элемента в множестве(проверка на повторение элементов)повторение элемента в мн невозможно
{
if (this->find(el) == -1)
return false;//значит такого элемента нет в множестве
else
return true;//значит такой элемент есть в множестве
}
Файл с функцией main()
#pragma once
#include<string>
#include "MyVector.h"
#include "MySet.h"
//#include "MyVector.cpp"
//#include "MySet.cpp"
using namespace std;
int main()
{
setlocale(0, "russian");
MyVector<string> v ("Hello");
cout << v;
v.add_element("Привет!");
v.add_element("Привет!");
v.add_element("Привет!");
v.add_element("Привет!");
v.add_element("Привет!");
cout << "Вектор v: " << v << endl;
v.add_element("Привет!");
v.add_element("Привет!");
v.add_element("Привет!");
cout << "Вектор v: " << v << endl;
MyVector<string> v1 = v;
cout << "Вектор v1: " << v1 << endl;
for (int i = 0; i < MAX_SIZE; i++)
v1.delete_element(0);
cout << "Вектор v1: " << v1 << endl;
MySet<string> s("Yes");
MySet<string> s1;
MySet<string> s2;
s.add_in_set("Привет!");
s.add_in_set("No");
string str ="Hello!";
s.add_in_set(str);
cout << "Множество s: " << s << endl;
s1.add_in_set("Cat");
s1.add_in_set("No");
s1.add_in_set("Привет!");
cout << "Множество s1: " << s1 << endl;
s2 = s1 - s;
cout << "Множество s2=s1-s: " << s2 << endl;
cout << "Множество s1: " << s1 << endl;
cout << "Множество s: " << s << endl;
s2 = s - s1;
cout << "Множество s2=s-s1: " << s2 << endl;
cout << "Множество s1: " << s1 << endl;
cout << "Множество s: " << s << endl;
s2 = s1 + s;
cout << "Множество s2=s1+s: " << s2 << endl;
cout << "Множество s1: " << s1 << endl;
cout << "Множество s: " << s << endl;
s2 = s1 * s;
cout << "Множество s2=s1*s: " << s2 << endl;
cout << "Множество s1: " << s1 << endl;
cout << "Множество s: " << s << endl;
MySet<string> s3;
s3 = s2;
cout << "Множество s3=s2: " << s3 << endl;
if (s3 == s2)
cout << "Множество s3=s2\n";
else
cout << "Множество s3!=s2\n";
if (s3 == s1)
cout << "Множество s3=s1\n";
else
cout << "Множество s3!=s1\n";
if (s1 == s3)
cout << "Множество s1=s3\n";
else
cout << "Множество s1!=s3\n";
system("pause");
return 0;
}