2013-10-01 3 views
-2

В моем кабинете меня попросили сделать структуру 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»: несколько списков параметров шаблона не допускается

+0

Вы должны указать «много ошибок», чтобы все знали, где проблема. Особенно полезны первые ошибки компилятора. – Till

+1

Окно «ошибки» в Visual Studio содержит неполную информацию, особенно при использовании шаблонов. Скопируйте ошибки из окна вывода, включая любые «заметки» вокруг них. Они перечисляют специализации, которые пытается сгенерировать компилятор, и без них ошибки могут не иметь смысла. –

+1

Помимо списка, который вы вставили, все перемешано. Скопируйте ошибки в том порядке, в котором их сгенерировал компилятор. –

ответ

2

Вы говорите

friend class tdutor; 
friend class tstack; 

в середине gNode, и он идет вниз холм оттуда. Кажется, что VS считает, что это не шаблонный tdutor и tstack.

Без этих линий вы просто получите ошибку IONE:

error C2955: 'tdutor' : use of class template requires template argument list 

на class tstack:public tdutor

Changing это

class tstack:public tdutor<ELEMENT_TYPE> 

затем перемещает ошибки на жалобы о gNode требующих список аргументов шаблона.

Как только вы преследовали все это, вам нужно подумать о декларации друга.

Некоторые подсказки: here

1

Вы не указали параметр шаблона tdutor.

Вы должны изменить свой код:

template <class ELEMENT_TYPE> 
class tstack : public tdutor<ELEMENT_TYPE> 
1

Всякий раз, когда вы экземпляр одного из ваших шаблонов классов, вам придется дать параметр шаблона, а также.

Таким образом, вместо того, чтобы писать

gNode* tail; 

вам придется написать

gNode<ELEMENT_TYPE>* tail; 

Есть много этих вопросов (в том числе и наследование, где вы должны дать тип а).

Охота на все это поможет вам.

Смежные вопросы