Ошибка error C2512: arrayob: нет подходящего конструктора по умолчанию
Написал код программы. Но выдает данную ошибку. Помогите исправить. Только другое ничего не меняйте, код выполнен по заданию, но во многих местах конечно можно было сделать проще! Код:
#include <string.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
template <class type> // объявление шаблона класса
class arrayob // класс Динамический массив
{
public:
type **contents; // массив указателей на объекты типа type
int size; // максимальное количество объектов в массиве
int n; // реальное количество объектов в массиве
arrayob(int number)
{
contents = new type *[size = number];
}
~arrayob();
void add(type *p)
{
if (n == size)cerr << "Выход за пределы";
else { contents[n] = p; n++; }
}
void del(int pos) {
if (n <= pos)
return;
for (int i = pos; i < n - 1; ++i) {
contents[i] = contents[i + 1];
}
--n;
}
type & operator [] (int x) // итератор массива объектов
{
if ((x < 0) || (x >= size))
{
cerr << "Ошибочный индекс " << x << endl; x = 0;
}
return *contents[x];
}
int sizeofmas() { return n; } // реальный размер массива
};
template <class type>
class sor : public arrayob<type> {
public:
using arrayob<type>::contents;
using arrayob<type>::size;
using arrayob<type>::n;
using arrayob<type>::add;
using arrayob<type>::del;
using arrayob<type>::sizeofmas;
sor(int number)
{
contents = new type *[size = number];
}
~sor();
void sortirovka() {
int i, j;
type *tmp;
for (int i = 0; i < n - 1; ++i) // i - номер прохода
{
for (int j = 0; j < size - 1; ++j) // внутренний цикл прохода
{
if (contents[j + 1] < contents[j])
{
tmp = contents[j + 1];
contents[j + 1] = contents[j];
contents[j] = tmp;
}
}
}
}
};
template <class type> arrayob<type>::~arrayob()
{
for (int i = 0; i < n; i++) delete contents[i];
delete[]contents;
}
class TNum // класс Число
{
public: int num;
virtual void Print(void) { cout << num << " "; }
TNum() { cout << "Введите число" << endl; cin >> num; }
TNum(int n) :num(n) {}
virtual ~TNum(void) {}
};
class TStr :public TNum // класс Строка
{
public: char *st;
virtual void Print(void) {
//TNum::Print();
cout << st << " ";
}
TStr(); // конструктор по умолчанию
TStr(char *s) :TNum(strlen(s))// конструктор с параметрами
{
st = new char[num + 1]; strcpy(st, s);
st[num] = '\0';
}
virtual ~TStr(void) { delete[] st; }
};
TStr::TStr() :TNum(40)
{
cout << "Введите строку " << endl;
st = new char[num + 1]; cin >> st;
num = strlen(st); st[num + 1] = '\0';
}
sor<TNum> ob_a(5); //массив из 5 указателей на объекты
int main()
{
setlocale(0, "russian");
int i;
for (i = 0; i < 5; i++)
ob_a.add(new TStr);
cout << "Содержимое контейнера " << "\n";
for (i = 0; i < ob_a.sizeofmas(); i++)
ob_a[i].Print();
cout << "\n";
ob_a.del(0);
cout << "Содержимое контейнера " << "\n";
for (i = 0; i < ob_a.sizeofmas(); i++)
ob_a[i].Print();
ob_a.sortirovka();
cout << "Содержимое контейнера " << "\n";
for (i = 0; i < ob_a.sizeofmas(); i++)
ob_a[i].Print();
return 0;
}```
Ответы (1 шт):
Эта (одна из нескольких) ваша конкретная ошибка состоит в том, что в
sor(int number)
{
contents = new type *[size = number];
}
не указан конструктор родительского типа. Поэтому должен использоваться конструктор по умолчанию, генерируемый компилятором, для arrayob<type>. Но он не генерируется, потому что вы определили свои пользовательские конструкторы.
Поскольку вообще непонятно, зачем вы пытаетесь выделять память в конструкторе sor, если это же действие выполняется в предке, проще всего заменить конструктор на
sor(int number):arrayob<type>(number) {}
убрав ненужное дублирование.
И еще раз: это не единственная неприятность в вашем коде. Но вы четко попросили ничего больше не менять:
Помогите исправить. Только другое ничего не меняйте
Так сказать, подчиняюсь...