Доброго дня
Есть задача: написать шаблон функции, выполняющую сортировку методом подсчета. Для проверки отправить в функцию int,double и пользовательский класс(для манипуляций выберите одно из полей класса).
Функция работает с int и double, но с классом есть проблемы. И появилось два вопроса:
1) Есть класс для работы с массивами. Можно ли отправить в функцию объект этого класса? Я попытался сделать, но на этапе сборки пишет ошибку "error C2106: =: левый операнд должен быть левосторонним значением d:\учеба\2 курс\oop\lr7-8\consoleapplication1\consoleapplic ation1\templatesort.h 19 1 ConsoleApplication1"
2) Или по условию корректнее создать класс, в котором одним из полей является массив? Если да,как в таком случае отправить в функцию этот массив?
Array.h
Код:
#pragma once
int i = 0,j=0;
template <typename t>
class Array
{
private:
t *ptr;
int size;
public:
Array()
{
size = 5;
ptr = new t[size];
for (int i = 0; i < size; i++)
{
ptr[i] = 0;
}
};
Array(int arrSize)
{
if (arrSize > 0)
{
size = arrSize;
}
else
{
size = 10;
}
ptr = new t[size];
for (int i = 0; i < size; i++)
{
ptr[i] = 0;
}
};
int getSize()
{
return size;
};
void Get()
{
for (int i = 0; i < size; i++)
{
cout << ptr[i] << " ";
}
cout << endl;
};
t getPtr()
{
return *ptr;
}
void Set()
{
for (int i = 0; i < size; i++)
{
cin >> ptr[i];
}
};
t operator [](int index)
{
if (index < 0 || index >= size)
{
cout << "Error index" << endl;
return -1;
}
return ptr[index];
};
bool operator < (t key)
{
for (int i = 0; i < size; i++)
{
if (ptr[i] == key)
{
cout << "True" << endl;
return true;
}
}
return false;
};
bool operator >(Array &oldArr)
{
for (i; i < size; i++)
{
for (j; i < oldArr.size; j++)
{
if (oldArr.ptr[i] > oldArr.ptr[j])
{
return true;
}
else
{
return false;
}
}
}
};
bool operator !=(const Array &rgt)
{
if (size != rgt.size)
{
cout << "different size" << endl;
return true;
}
for (int i = 0; i < size; i++)
{
if (ptr[i] != rgt.ptr[i])
{
cout << "different " << i + 1 << " element" << endl;
return true;
}
}
cout << "same" << endl;
return false;
};
bool operator =(Array &oldArr)
{
cout << "Go!" << endl;
};
Array operator +(Array &ar)
{
Array newAr(size + ar.size);
int i = 0, y = 0;
for (i; i < size; i++)
{
newAr.ptr[i] = ptr[i];
}
for (i, y; i < size + ar.size, y<ar.size; i++, y++)
{
newAr.ptr[i] = ar.ptr[y];
}
return newAr;
};
};
Templatesort.h
Код:
#pragma once
#include"stdafx.h"
#include"array.h"
template<class type> void Sort(type oldArr,type sortArr, int size)
{
int k;
for (int i = 0; i < size; i++)
{
k = 0;
for (int j = 0; j < size; j++)
{
if (oldArr[i]>oldArr[j])
{
k++;
}
}
sortArr[k] = oldArr[i];
}
}
ConsoleApplication1.cpp
Код:
#include "stdafx.h"
#include <iostream>
#include "array.h"
#include "TemplateSort.h"
using namespace std;
const int sz = 5;
int _tmain(int argc, _TCHAR* argv[])
{
int size = 0;
cout << "Enter size of Array: ";
cin >> size;
int *oldArr = new int [size];
int *sortArr = new int[size];
cout << "Enter Array(size " << size << " ): " << endl;
for (int i = 0; i < size; i++)
{
cin >> oldArr[i];
}
Sort(oldArr, sortArr, size);
cout << "Sort Array: " << endl;
for (int i = 0; i < size; i++)
{
cout << " " << sortArr[i] << " ";
}
cout << endl;
double *oldArr1 = new double[size];
double *sortArr1 = new double[size];
cout << "Enter Array(size " << size << " ): " << endl;
for (int i = 0; i < size; i++)
{
cin >> oldArr1[i];
}
Sort(oldArr1, sortArr1, size);
cout << "Sort Array: " << endl;
for (int i = 0; i < size; i++)
{
cout << " " << sortArr1[i] << " ";
}
cout << endl;
Array<int> oldArr2;
Array<int> sortArr2;
cout << "Enter Array(size " << size << " ): " << endl;
oldArr2.Set();
Sort(oldArr2, sortArr2, size);
cout << "Sort Array: " << endl;
for (int i = 0; i < size; i++)
{
sortArr2.Get();
}
cout << endl;
return 0;
}