В моем кабинете меня попросили сделать структуру Queue реализована как двухсторонний Linked List с методами, позволяющими удалять элементы с обоих концов. Меня также попросили сделать перерыв в стеке, который изначально был изначально выделен из очереди (например, стек - это производный класс), который поддерживает метод push и pop, так что push & pop будет использовать метод отцов, чтобы вставить \ вынуть из одного из концов.Наследование и шаблоны в C++
Я также создал класс узлов для создания связанного списка. Кроме того, мне не разрешено менять «главное». Меня попросили реализовать его дважды (две отдельные программы, две отдельные основные функции): один для двойного типа и один общий тип (tamplate). «двойная» программа работает нормально, но общая программа сталкивается с множеством ошибок, которые я действительно не понимаю, что это значит, что-то с глобальным пространством имен. Кроме того, я проверил отсутствие синтаксиса, например, точки с запятой/бараки и т. д., и, похоже, все в порядке.
прилагает обе программы и ошибок общей программы в конце поста:
«двойной» программа (отлично работает):
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class dNode
{
private:
dNode* prev_value;
dNode* next_value;
double data_value;
friend class ddutor;
friend class dstack;
public:
//default constructor
dNode(double val);
~dNode();
};
dNode::dNode(double val)
{
next_value=NULL;
prev_value=NULL;
data_value=val;
}
dNode::~dNode()
{
data_value=-1;
}
/*************************************************************************************************************************************/
class ddutor
{
protected:
dNode* current;
dNode* head;
dNode* tail;
int size;
public:
//default constructor
ddutor(double val);
//destructor
~ddutor();
//members functions
void add_first(double data);
void add_last(double data);
double remove_first();
void remove_last();
};
ddutor::ddutor(double val)
{
head=new dNode(val);
tail = new dNode(-1);
tail=head;
head->next_value=tail;
head->prev_value=NULL;
size=1;
}
void ddutor::add_first(double data)
{
current = new dNode(data);
head->prev_value = current;
current->next_value = head;
head = current;
head->prev_value= NULL;
size++;
}
void ddutor::add_last(double data)
{
current = new dNode(data);
tail->next_value = current;
current->prev_value= tail;
tail = current;
tail->next_value = NULL;
size++;
}
double ddutor::remove_first()
{
double temp=head->data_value;
if (head->next_value == NULL)
head = NULL;
else
head = head->next_value;
size--;
return temp;
}
void ddutor::remove_last()
{
if (tail->prev_value == NULL)
tail = NULL;
else
tail = tail->prev_value;
size--;
}
ddutor::~ddutor()
{
delete current;
delete head;
delete tail;
size=-1;
}
/******************************************************************************************************************************************/
class dstack:public ddutor
{
public:
void push(double d);
double pop();
dstack(double d);
};
dstack::dstack(double d):ddutor(d){};
void dstack::push(double d)
{
add_last(d);
}
double dstack::pop()
{
double temp=tail->data_value;
remove_last();
return temp;
}
/*******************************************************************************************************************************/
int main()
{
int i;
ddutor dd(1.1);
dstack ds(11.1);
for(i=2; i < 14; i += 2)
{
dd.add_first((double)i*1.1);
dd.add_last((double)((i+1)*1.1));
} //for
cout<<"dd print:\n";
for(i=1; i < 14; i++)
cout << " " << dd.remove_first();
cout << endl;
for(i=2; i < 14; i ++)
ds.push((double)i*11.1);
cout << "ds print:\n";
for(i=1; i < 14; i++)
cout << " " << ds.pop();
cout << endl;
cin>>i;
} // main
на «общую программу (много ошибок)
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class ELEMENT_TYPE>
class gNode
{
private:
gNode* prev_value;
gNode* next_value;
ELEMENT_TYPE data_value;
friend class tdutor;
friend class tstack;
public:
//default constructor
gNode(ELEMENT_TYPE val);
~gNode();
};
template <class ELEMENT_TYPE>
gNode<ELEMENT_TYPE>::gNode(ELEMENT_TYPE val)
{
next_value=NULL;
prev_value=NULL;
data_value=val;
}
template <class ELEMENT_TYPE>
gNode<ELEMENT_TYPE>::~gNode()
{
data_value=-1;
}
//***************************************************************************************************************************//
template <class ELEMENT_TYPE>
class tdutor
{
protected:
gNode* current;
gNode* head;
gNode* tail;
int size;
public:
//default constructor
tdutor(ELEMENT_TYPE val);
//destructor
~tdutor();
//members functions
void add_first(ELEMENT_TYPE data);
void add_last(ELEMENT_TYPE data);
ELEMENT_TYPE remove_first();
void remove_last();
};
template <class ELEMENT_TYPE>
tdutor<ELEMENT_TYPE>::tdutor(ELEMENT_TYPE val)
{
head=new gNode(val);
tail = new gNode(-1);
tail=head;
head->next_value=tail;
head->prev_value=NULL;
size=1;
}
template <class ELEMENT_TYPE>
void tdutor<ELEMENT_TYPE>::add_first(ELEMENT_TYPE data)
{
current = new gNode(data);
head->prev_value = current;
current->next_value = head;
head = current;
head->prev_value= NULL;
size++;
}
template <class ELEMENT_TYPE>
void tdutor<ELEMENT_TYPE>::add_last(ELEMENT_TYPE data)
{
current = new gNode(data);
tail->next_value = current;
current->prev_value= tail;
tail = current;
tail->next_value = NULL;
size++;
}
template <class ELEMENT_TYPE>
ELEMENT_TYPE tdutor<ELEMENT_TYPE>::remove_first()
{
ELEMENT_TYPE temp=head->data_value;
if (head->next_value == NULL)
head = NULL;
else
head = head->next_value;
size--;
return temp;
}
template <class ELEMENT_TYPE>
void tdutor<ELEMENT_TYPE>::remove_last()
{
if (tail->prev_value == NULL)
tail = NULL;
else
tail = tail->prev_value;
size--;
}
template <class ELEMENT_TYPE>
tdutor<ELEMENT_TYPE>::~tdutor()
{
delete current;
delete head;
delete tail;
size=-1;
}
/*******************************************************************************************************************************/
template <class ELEMENT_TYPE>
class tstack:public tdutor
{
public:
void push(ELEMENT_TYPE d);
ELEMENT_TYPE pop();
tstack(ELEMENT_TYPE d);
};
template <class ELEMENT_TYPE>
tstack<ELEMENT_TYPE>::tstack(ELEMENT_TYPE d):tdutor(d){};
template <class ELEMENT_TYPE>
void tstack<ELEMENT_TYPE>::push(ELEMENT_TYPE d)
{
add_last(d);
}
template <class ELEMENT_TYPE>
ELEMENT_TYPE tstack<ELEMENT_TYPE>::pop()
{
ELEMENT_TYPE temp=tail->data_value;
remove_last();
return temp;
}
int main()
{
int i;
tdutor<double> dd(1.1);
tstack<double> ds(11.1);
for(i=2; i < 14; i += 2)
{
dd.add_first((double)i*1.1);
dd.add_last((double)((i+1)*1.1));
} //for
cout << "dd print:\n";
for(i=1; i < 14; i++)
cout << " " << dd.remove_first();
cout << endl;
for(i=2; i < 14; i ++)
ds.push((double)i*11.1);
cout << "ds print:\n";
for(i=1; i < 14; i++)
cout << " " << ds.pop();
cout << endl;
cin>>i;
} // main
ошибки родовое:
ошибка 23 ошибка C 1903: невозможно восстановить предыдущие ошибки; остановка компиляции
Ошибка 5 Ошибка C2039: «add_first»: не является членом «'глобального пространства имен» «
Ошибка 12 Ошибка C2039:„add_last“: не является членом„' глобального пространства имен“»
ошибка 13 ошибка C2039: 'remove_first': не является членом '' глобального пространства имен' '
Error 21 ошибка C2039: 'remove_last': не является членом '' глобального пространства имен''
Ошибка 4 ошибка C2059: синтаксическая ошибка: '< '
Ошибка 11 Ошибка C2059: ошибка синтаксиса:' < '
Ошибка 20 Ошибка C2059: ошибка синтаксиса:' < '
Ошибка 18 Ошибка C2086: 'INT tdutor': переопределение
Ошибка 6 ошибка C2143: синтаксическая ошибка: отсутствует ';' before '{'
Ошибка 14 ошибка C2143: синтаксическая ошибка: отсутствует ';' before '{'
Ошибка 8 ошибка C2143: синтаксическая ошибка: отсутствует ';' до '<'
Ошибка 16 ошибка C2143: синтаксическая ошибка: отсутствует ';' перед тем '<'
Ошибка 9 Ошибка C2182: 'tdutor': незаконное использование типа 'пустоты'
Ошибка 17 Ошибка C2182: 'tdutor': незаконное использование типа 'пустоты'
Ошибка 7 ошибка C2447: '{': отсутствует заголовок функции (формальный список старого стиля?)
Ошибка 15 ошибка C2447: '{': отсутствует заголовок функции (формальный список в старом стиле?)
Ошибки 22 Ошибка C2588: ':: ~ tdutor': недопустимый глобальный деструктор
Ошибка 3 Ошибка C2988: неузнаваемая декларация шаблона/определение
Ошибки 10 Ошибка C2988: неузнаваемая декларация шаблона/определение
ошибки 19 ошибки C2988: неузнаваемая декларация шаблона/определение
ошибка 1 ошибка C2989: «tdutor»: шаблон класса уже был объявлен в качестве шаблона неклассовой
Ошибка 2 Ошибка C3857: «tdutor»: несколько списков параметров шаблона не допускается
Вы должны указать «много ошибок», чтобы все знали, где проблема. Особенно полезны первые ошибки компилятора. – Till
Окно «ошибки» в Visual Studio содержит неполную информацию, особенно при использовании шаблонов. Скопируйте ошибки из окна вывода, включая любые «заметки» вокруг них. Они перечисляют специализации, которые пытается сгенерировать компилятор, и без них ошибки могут не иметь смысла. –
Помимо списка, который вы вставили, все перемешано. Скопируйте ошибки в том порядке, в котором их сгенерировал компилятор. –