2016-10-04 1 views
0

のコンパイラ(Apple LLVM 7.0)で親クラスのメンバー変数が認識されないDS Malikのの第16章のDVDストアのコードのコードを使用しています。データ構造を含むプログラムの設計。リンクされたリストクラスから継承した順序付けされていないリストクラスがあり、すべてのプロジェクトファイルをコンパイルすると、継承されたメンバ変数firstcountの呼び出しごとに18の "宣言されていない識別子の使用"クラスがコンパイルされます。ファイルはコピーされて貼り付けられ、どの形式でも変更されませんでした。 Windowsマシンでコンパイルするとこのコードに問題はなくなり、私の教授は過去にC++でMacでコンパイルすると問題を主張していました。ここでMacromediaのYosemite

は、親クラスは、linkedList.hです:ここで

#ifndef H_LinkedListType 
#define H_LinkedListType 

#include <iostream> 
#include <cassert> 

using namespace std; 

//Definition of the node 

template <class Type> 
struct nodeType 
{ 
    Type info; 
    nodeType<Type> *link; 
}; 

template <class Type> 
class linkedListIterator 
{ 
public: 
    linkedListIterator(); 
    //Default constructor 
    //Postcondition: current = nullptr; 

    linkedListIterator(nodeType<Type> *ptr); 
    //Constructor with a parameter. 
    //Postcondition: current = ptr; 

    Type operator*(); 
    //Function to overload the dereferencing operator *. 
    //Postcondition: Returns the info conatined in the node. 

    linkedListIterator<Type> operator++();  
    //Overload the pre-increment operator. 
    //Postcondition: The iterator is advanced to the next 
    //    node. 

    bool operator==(const linkedListIterator<Type>& 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<Type>& 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<Type> *current; //pointer to point to the current 
          //node in the linked list 
}; 

template <class Type> 
linkedListIterator<Type>::linkedListIterator() 
{ 
    current = nullptr; 
} 

template <class Type> 
linkedListIterator<Type>:: 
        linkedListIterator(nodeType<Type> *ptr) 
{ 
    current = ptr; 
} 

template <class Type> 
Type linkedListIterator<Type>::operator*() 
{ 
    return current->info; 
} 

template <class Type> 
linkedListIterator<Type> linkedListIterator<Type>::operator++() 
{ 
    current = current->link; 

    return *this; 
} 

template <class Type> 
bool linkedListIterator<Type>::operator== 
       (const linkedListIterator<Type>& right) const 
{ 
    return (current == right.current); 
} 

template <class Type> 
bool linkedListIterator<Type>::operator!= 
       (const linkedListIterator<Type>& right) const 
{ return (current != right.current); 
} 


//***************** class linkedListType **************** 

template <class Type> 
class linkedListType 
{ 
public: 
    const linkedListType<Type>& operator= 
         (const linkedListType<Type>&); 
     //Overload the assignment operator. 

    void initializeList(); 
     //Initialize the list to an empty state. 
     //Postcondition: first = nullptr, last = nullptr, 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 = nullptr, last = nullptr, 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<Type> 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<Type> 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 nullptr. 

    linkedListType(); 
     //default constructor 
     //Initializes the list to an empty state. 
     //Postcondition: first = nullptr, last = nullptr, count = 0; 

    linkedListType(const linkedListType<Type>& 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<Type> *first; //pointer to the first node of the list 
    nodeType<Type> *last; //pointer to the last node of the list 

private: 
    void copyList(const linkedListType<Type>& otherList); 
     //Function to make a copy of otherList. 
     //Postcondition: A copy of otherList is created and 
     //    assigned to this list. 
}; 


template <class Type> 
bool linkedListType<Type>::isEmptyList() const 
{ 
    return(first == nullptr); 
} 

template <class Type> 
linkedListType<Type>::linkedListType() //default constructor 
{ 
    first = nullptr; 
    last = nullptr; 
    count = 0; 
} 

template <class Type> 
void linkedListType<Type>::destroyList() 
{ 
    nodeType<Type> *temp; //pointer to deallocate the memory 
          //occupied by the node 
    while (first != nullptr) //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 = nullptr; //initialize last to nullptr; first has already 
       //been set to nullptr by the while loop 
    count = 0; 
} 

template <class Type> 
void linkedListType<Type>::initializeList() 
{ 
    destroyList(); //if the list has any nodes, delete them 
} 

template <class Type> 
void linkedListType<Type>::print() const 
{ 
    nodeType<Type> *current; //pointer to traverse the list 

    current = first; //set current so that it points to 
         //the first node 
    while (current != nullptr) //while more data to print 
    { 
     cout << current->info << " "; 
     current = current->link; 
    } 
}//end print 

template <class Type> 
int linkedListType<Type>::length() const 
{ 
    return count; 
} //end length 

template <class Type> 
Type linkedListType<Type>::front() const 
{ 
    assert(first != nullptr); 

    return first->info; //return the info of the first node 
}//end front 

template <class Type> 
Type linkedListType<Type>::back() const 
{ 
    assert(last != nullptr); 

    return last->info; //return the info of the last node 
}//end back 

template <class Type> 
linkedListIterator<Type> linkedListType<Type>::begin() 
{ 
    linkedListIterator<Type> temp(first); 

    return temp; 
} 

template <class Type> 
linkedListIterator<Type> linkedListType<Type>::end() 
{ 
    linkedListIterator<Type> temp(nullptr); 

    return temp; 
} 

template <class Type> 
void linkedListType<Type>::copyList 
        (const linkedListType<Type>& otherList) 
{ 
    nodeType<Type> *newNode; //pointer to create a node 
    nodeType<Type> *current; //pointer to traverse the list 

    if (first != nullptr) //if the list is nonempty, make it empty 
     destroyList(); 

    if (otherList.first == nullptr) //otherList is empty 
    { 
     first = nullptr; 
     last = nullptr; 
     count = 0; 
    } 
    else 
    { 
     current = otherList.first; //current points to the 
            //list to be copied 
     count = otherList.count; 

      //copy the first node 
     first = new nodeType<Type>; //create the node 

     first->info = current->info; //copy the info 
     first->link = nullptr;  //set the link field of 
            //the node to nullptr 
     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 != nullptr) 
     { 
      newNode = new nodeType<Type>; //create a node 
      newNode->info = current->info; //copy the info 
      newNode->link = nullptr;  //set the link of 
             //newNode to nullptr 
      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 copyList 

template <class Type> 
linkedListType<Type>::~linkedListType() //destructor 
{ 
    destroyList(); 
}//end destructor 

template <class Type> 
linkedListType<Type>::linkedListType 
         (const linkedListType<Type>& otherList) 
{ 
    first = nullptr; 
    copyList(otherList); 
}//end copy constructor 

     //overload the assignment operator 
template <class Type> 
const linkedListType<Type>& linkedListType<Type>::operator= 
         (const linkedListType<Type>& 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 Type> 
class unorderedLinkedList: public linkedListType<Type> 
{ 
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 <class Type> 
bool unorderedLinkedList<Type>:: 
        search(const Type& searchItem) const 
{ 
    nodeType<Type> *current; //pointer to traverse the list 
    bool found = false; 

    current = first; //set current to point to the first 
        //node in the list 

    while (current != nullptr && !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 search 

template <class Type> 
void unorderedLinkedList<Type>::insertFirst(const Type& newItem) 
{ 
    nodeType<Type> *newNode; //pointer to create the new node 

    newNode = new nodeType<Type>; //create the new node 

    newNode->info = newItem; //store the new item in the node 
    newNode->link = first;  //insert newNode before first 
    first = newNode;   //make first point to the 
           //actual first node 
    count++;     //increment count 

    if (last == nullptr) //if the list was empty, newNode is also 
         //the last node in the list 
     last = newNode; 
}//end insertFirst 

template <class Type> 
void unorderedLinkedList<Type>::insertLast(const Type& newItem) 
{ 
    nodeType<Type> *newNode; //pointer to create the new node 

    newNode = new nodeType<Type>; //create the new node 

    newNode->info = newItem; //store the new item in the node 
    newNode->link = nullptr;  //set the link field of newNode 
           //to nullptr 

    if (first == nullptr) //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 insertLast 


template <class Type> 
void unorderedLinkedList<Type>::deleteNode(const Type& deleteItem) 
{ 
    nodeType<Type> *current; //pointer to traverse the list 
    nodeType<Type> *trailCurrent; //pointer just before current 
    bool found; 

    if (first == nullptr) //Case 1; the list is empty. 
     cout << "Cannot delete from an empty list." 
      << endl; 
    else 
    { 
     if (first->info == deleteItem) //Case 2 
     { 
      current = first; 
      first = first->link; 
      count--; 
      if (first == nullptr) //the list has only one node 
       last = nullptr; 
      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 != nullptr && !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; 
       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 

私はこれをコンパイルするために取得することができましたfirstcountのすべての呼び出しにthis->を接頭辞として付けることによって、これは私の検索方法がうまくいかないコンパイルされたクラスしか得られませんでした。

多分、教科書の作成者は、Windows固有のものをいくつか入れていますか?または、私が使用しているコンパイラ(Apple LLVM 7.0)に実際に問題があります。この問題は関連していると思われます:C++ inheritance/undeclared identifier issueと、この問題は多少曖昧に見えますが、DS Malikのコードが記述されていないことが示唆されています。

コンパイラに問題がある場合は、XCodeで推奨コンパイラを使用する方法の詳細を提供してください。

答えて

1

この場合、WindowsマシンコンパイラはISO C++標準に従って動作しません(一部の書籍作成者は標準に準拠していないコードを公開します)。

対照的に、LLVM/XCode(およびGCC)は、ISOで指定されているとおりに正確に行います。

基本クラスメンバを参照するとき、その基本クラスは、派生クラステンプルパラメータに依存するテンプレートです。その基本クラスのメンバへの参照が明示的に指定されていなければなりません(たとえば、addindによって前にaddind this->参照)。 詳細をご覧ください。Why doesn't a derived template class have access to a base template class' identifiers?

関連する問題