• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C++ 关于模板之间的继承, 导致的模板子类的成员看不到(cannot

mysql 搞代码 4年前 (2022-01-09) 41次浏览 已收录 0个评论

首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。 这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以

首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。

这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以由linked list 继承出ordered linked list。

言归正传, 出现问题的代码如下:

linkedlist.h 文件如下:

#ifndef H_LinkedListType#define H_LinkedListType#include #include using namespace std;//Definition of the nodetemplate struct nodeType{	Type info;	nodeType *link;};template class linkedListIterator{public:   linkedListIterator();     //Default constructor     //Postcondition: current = NULL;   linkedListIterator(nodeType *ptr);     //Constructor with a parameter.     //Postcondition: current = ptr;   Type operator*();     //Function to overload the dereferencing operator *.     //Postcondition: Returns the info contained in the node.   linkedListIterator operator++();     //Overload the pre-increment operator.     //Postcondition: The iterator is advanced to the next     //               node.   bool operator==(const linkedListIterator& right) const;     //Overload the equality operator.     //Postcondition: Returns true if this iterator is equal to     //               the iterator specified by right,     //               otherwise it returns the value false.   bool operator!=(const linkedListIterator& right) const;     //Overload the not equal to operator.     //Postcondition: Returns true if this iterator is not     //               equal to the iterator specified by     //               right; otherwise it returns the value     //               false.private:   nodeType *current; //pointer to point to the current                            //node in the linked list};template linkedListIterator::linkedListIterator(){    current = NULL;}template linkedListIterator::                  linkedListIterator(nodeType *ptr){    current = ptr;}template Type linkedListIterator::operator*(){    return current->info;}template linkedListIterator linkedListIterator::operator++(){    current = current->link;    return *this;}template bool linkedListIterator::operator==               (const linkedListIterator& right) const{    return (current == right.current);}template bool linkedListIterator::operator!=                 (const linkedListIterator& right) const{    return (current != right.current);}//*****************  class linkedListType   ****************template class linkedListType{public:    const linkedListType& operator=                         (const linkedListType&);      //Overload the assignment operator.    void initializeList();      //Initialize the list to an empty state.      //Postcondition: first = NULL, last = NULL, count = 0;    bool isEmptyList() const;      //Function to determine whether the list is empty.      //Postcondition: Returns true if the list is empty,      //               otherwise it returns false.    void print() const;      //Function to output the data contained in each node.      //Postcondition: none    int length() const;      //Function to return the number of nodes in the list.      //Postcondition: The value of count is returned.    void destroyList();      //Function to delete all the nodes from the list.      //Postcondition: first = NULL, last = NULL, count = 0;    Type front() const;      //Function to return the first element of the list.      //Precondition: The list must exist and must not be      //              empty.      //Postcondition: If the list is empty, the program      //               terminates; otherwise, the first      //               element of the list is returned.    Type back() const;      //Function to return the last element of the list.      //Precondition: The list must exist and must not be      //              empty.      //Postcondition: If the list is empty, the program      //               terminates; otherwise, the last      //               element of the list is returned.    virtual bool search(const Type& searchItem) const = 0;      //Function to determine whether searchItem is in the list.      //Postcondition: Returns true if searchItem is in the      //               list, otherwise the value false is      //               returned.    virtual void insertFirst(const Type& newItem) = 0;      //Function to insert newItem at the beginning of the list.      //Postcondition: first points to the new list, newItem is      //               inserted at the beginning of the list,      //               last points to the last node in the list,      //               and count is incremented by 1.    virtual void insertLast(const Type& newItem) = 0;      //Function to insert newItem at the end of the list.      //Postcondition: first points to the new list, newItem      //               is inserted at the end of the list,      //               last points to the last node in the list,      //               and count is incremented by 1.    virtual void deleteNode(const Type& deleteItem) = 0;      //Function to delete deleteItem from the list.      //Postcondition: If found, the node containing      //               deleteItem is deleted from the list.      //               first points to the first node, last      //               points to the last node of the updated      //               list, and count is decremented by 1.    linkedListIterator begin();      //Function to return an iterator at the begining of the      //linked list.      //Postcondition: Returns an iterator such that current is      //               set to first.    linkedListIterator end();      //Function to return an iterator one element past the      //last element of the linked list.      //Postcondition: Returns an iterator such that current is      //               set to NULL.    linkedListType();      //default constructor      //Initializes the list to an empty state.      //Postcondition: first = NULL, last = NULL, count = 0;    linkedListType(const linkedListType& otherList);      //copy constructor    ~linkedListType();      //destructor      //Deletes all the nodes from the list.      //Postcondition: The list object is destroyed.protected:    int count;   //variable to store the number of                 //elements in the list    nodeType *first; //pointer to the first node of the list    nodeType *last;  //pointer to the last node of the listprivate:    void copyList(const linkedListType& otherList);      //Function to make a copy of otherList.      //Postcondition: A copy of otherList is created and      //               assigned to this list.};template bool linkedListType::isEmptyList() const{    return(first == NULL);}template linkedListType::linkedListType() //default constructor{    first = NULL;    last = NULL;    count = 0;}template void linkedListType::destroyList(){    nodeType *temp;   //pointer to deallocate the memory                            //occupied by the node    while (first != NULL)   //while there are nodes in the list    {        temp = first;        //set temp to the current node        first = first->link; //advance first to the next node        delete temp;   //deallocate the memory occupied by temp    }    last = NULL; //initialize last to NULL; first has already                 //been set to NULL by the while loop    count = 0;}template void linkedListType::initializeList(){	destroyList(); //if the list has any nodes, delete them}template void linkedListType::print() const{    nodeType *current; //pointer to traverse the list    current = first;    //set current so that it points to                        //the first node    while (current != NULL) //while more data to print    {        cout <info <link;    }}//end printtemplate int linkedListType::length() const{    return count;}  //end lengthtemplate Type linkedListType::front() const{    assert(first != NULL);    return first->info; //return the info of the first node}//end fronttemplate Type linkedListType::back() const{    assert(last != NULL);    return last->info; //return the info of the last node}//end backtemplate linkedListIterator linkedListType::begin(){    linkedListIterator temp(first);    return temp;}template linkedListIterator linkedListType::end(){    linkedListIterator temp(NULL);    return temp;}template void linkedListType::copyList                   (const linkedListType& otherList){    nodeType *newNode; //pointer to create a node    nodeType *current; //pointer to traverse the list    if (first != NULL) //if the list is nonempty, make it empty       destroyList();    if (otherList.first == NULL) //otherList is empty    {        first = NULL;        last = NULL;        count = 0;    }    else    {        current = otherList.first; //current points to the                                   //list to be copied        count = otherList.count;            //copy the first node        first = new nodeType;  //create the node        first->info = current->info; //copy the info        first->link = NULL;        //set the link field of                                   //the node to NULL        last = first;              //make last point to the                                   //first node        current = current->link;     //make current point to                                     //the next node           //copy the remaining list        while (current != NULL)        {            newNode = new nodeType;  //create a node            newNode->info = current->info; //copy the info            newNode->link = NULL;       //set the link of                                        //newNode to NULL            last->link = newNode;  //attach newNode after last            last = newNode;        //make last point to                                   //the actual last node            current = current->link;   //make current point                                       //to the next node        }//end while    }//end else}//end copyListtemplate linkedListType::~linkedListType() //destructor{   destroyList();}//end destructortemplate linkedListType::linkedListType                      (const linkedListType& otherList){   	first = NULL;    copyList(otherList);}//end copy constructor         //overload the assignment operatortemplate const linkedListType& linkedListType::operator=                      (const linkedListType& otherList){    if (this != &otherList) //avoid self-copy    {        copyList(otherList);    }//end else     return *this;}#endif

unorderedLinkedList.h文件如下:

#ifndef H_UnorderedLinkedList#define H_UnorderedLinkedList#include "linkedList.h"using namespace std;template class unorderedLinkedList: public linkedListType{public:    bool search(const Type& searchItem) const;      //Function to determine whether searchItem is in the list.      //Postcondition: Returns true if searchItem is in the      //               list, otherwise the value false is      //               returned.    void insertFirst(const Type& newItem);      //Function to insert newItem at the beginning of the list.      //Postcondition: first points to the new list, newItem is      //               inserted at the beginning of the list,      //               last points to the last node in the      //               list, and count is incremented by 1.    void insertLast(const Type& newItem);      //Function to insert newItem at the end of the list.      //Postcondition: first points to the new list, newItem      //               is inserted at the end of the list,      //               last points to the last node in the      //               list, and count is incremented by 1.    void deleteNode(const Type& deleteItem);      //Function to delete deleteItem from the list.      //Postcondition: If found, the node containing      //               deleteItem is deleted from the list.      //               first points to the first node, last      //               points to the last node of the updated      //               list, and count is decremented by 1.};template bool unorderedLinkedList::                   search(const Type& searchItem) const{    nodeType *current; //pointer to traverse the list    bool found = false;    current =  first; //set current to point to the first                     //node in the list    while (current != NULL && !found)    //search the list        if (current->info == searchItem) //searchItem is found            found = true;        else            current = current->link; //make current point to                                     //the next node    return found;}//end searchtemplate void unorderedLinkedList::insertFirst(const Type& newItem){    nodeType *newNode; //pointer to create the new node    newNode = new nodeType; //create the new node    newNode->info = newItem;    //store the new item in the node    newNode->link = this -> first;      //insert newNode before first    first = newNode;            //make first point to the                                //actual first node    count++;                    //increment count    if (last == NULL)   //if the list was empty, newNode is also                        //the last node in the list        last = newNode;}//end insertFirsttemplate void unorderedLinkedList::insertLast(const Type& newItem){    nodeType *newNode; //pointer to create the new node    newNode = new nodeType; //create the new node    newNode->info = newItem;  //store the new item in the node    newNode->link = NULL;     //set the link field of newNode                              //to NULL    if ( first == NULL)  //if the list is empty, newNode is                        //both the first and last node    {         first = newNode;         last = newNode;         count++;        //increment count    }    else    //the list is not empty, insert newNode after last    {         last->link = newNode; //insert newNode after last         last = newNode; //make last point to the actual                        //last node in the list         count++;        //increment count    }}//end insertLasttemplate void unorderedLinkedList::deleteNode(const Type& deleteItem){    nodeType *current; //pointer to traverse the list    nodeType *trailCurrent; //pointer just before current    bool found;    if (first == NULL)    //Case 1; the list is empty.        cout << "Cannot delete from an empty list."             <info == deleteItem) //Case 2        {            current = first;            first = first->link;            count--;            if (first == NULL)    //the list has only one node                last = NULL;            delete current;        }        else //search the list for the node with the given info        {            found = false;            trailCurrent = first;  //set trailCurrent to point                                   //to the first node            current = first->link; //set current to point to                                   //the second node            while (current != NULL && !found)            {                if (current->info != deleteItem)                {                    trailCurrent = current;                    current = current-> link;                }                else                    found = true;            }//end while            if (found) //Case 3; if found, delete the node            {                trailCurrent->link = current->link;                this -> count--;                if (last == current)   //node to be deleted                                       //was the last node                    last = trailCurrent; //update the value                                         //of last                delete current;  //delete the node from the list            }            else                cout << "The item to be deleted is not in "                     << "the list." << endl;        }//end else    }//end else}//end deleteNode#endif

主程序如下main.cpp:

//This program tests various operation of a linked list//34 62 21 90 66 53 88 24 10 -999#include #include "unorderedLinkedList.h"using namespace std;int main(){    unorderedLinkedList list1, list2;          //Line 1    int num;                                        //Line 2    cout << "Line 3: Enter integers ending "         << "with -999" <> num;                                     //Line 4    while (num != -999)                             //Line 5    {        list1.insertLast(num);                      //Line 6        cin >> num;                                 //Line 7    }    cout << endl;                                   //Line 8    cout << "Line 9: list1: ";                      //Line 9    list1.print();                                  //Line 10    cout << endl;                                   //Line 11    cout << "Line 12: Length of list1: "         << list1.length() << endl;                 //Line 12    list2 = list1;	   //test the assignment operator Line 13    cout << "Line 16: list2: ";                     //Line 14    list2.print();                                  //Line 15    cout << endl;                                   //Line 16    cout << "Line 17: Length of list2: "         << list2.length() << endl;                 //Li<strong>本文来源gaodai#ma#com搞@@代~&码*网2</strong>ne 17    cout << "Line 18: Enter the number to be "         <> num;                                     //Line 19    cout << endl;                                   //Line 20    list2.deleteNode(num);                          //Line 21    cout << "Line 22: After deleting " << num         << " list2: " << endl;                     //Line 22    list2.print();                                  //Line 23    cout << endl;                                   //Line 24    cout << "Line 25: Length of list2: "         << list2.length() << endl;                 //Line 25    cout << endl << "Line 26: Output list1 "         << "using an iterator" << endl;            //LIne 26    linkedListIterator it;                     //Line 27    for (it = list1.begin(); it != list1.end();                             ++it)                  //Line 28        cout << *it << " ";                         //Line 29    cout << endl;                                   //Line 30    return 0;}

编译结果error message 如下:


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C++ 关于模板之间的继承, 导致的模板子类的成员看不到(cannot
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址