2016-11-16 128 views
-1

讓我在代碼的幫助下解釋這個問題。未定義的結構指針名稱的typdef如何在C++中工作?

我有以下兩個文件。

貓A.H

typedef struct myIterStruct* myIter; 

    class myIterator; 

    class myList 
    { 
     int mVal; 
     myList* mNext; 
     friend class myIterator; 

     public: 

     myList(myList* next, int val) : mVal(val), mNext(next) {} 

     ~myList() {} 

     void AddTail(int val) { 
      myList* newnode = new myList(NULL, val); 
      myList* tail = this->GetTail(); 
      tail->mNext = newnode; 
     } 

     myList* GetTail() { 
      myList* node = this; 
      while (node->mNext) 
       node = node->mNext; 
      return node; 
     } 

     myList* GetNext() { return mNext; } 

     int GetVal() { return mVal; } 
    }; 

    class myIterator 
    { 
     myList* mList; 

     public: 

     myIterator(myList* list) : mList(list) {} 
     ~myIterator() {} 

     int next() { 
      int ret = -1; 
      if (mList) { 
       ret = mList->GetVal(); 
       mList = mList->GetNext(); 
      } 
      return ret; 
     } 
    }; 

貓main.cxx

#include <iostream> 
#include "a.h" 
using namespace std; 

myIter createIterator(myList* list) 
{ 
    myIterator *returnitr = new myIterator(list); 
    return (myIter) returnitr; 
} 

int myListGetNextNode(myIter iter) 
{ 
    if (iter == NULL) 
     return -1; 
    myIterator* funciter = (myIterator *) iter; 
    return funciter->next(); 
} 

int main() 
{ 

    myList* list = new myList(NULL, 1); 
    list->AddTail(2); 
    list->AddTail(3); 

    myIter iter = createIterator(list); 
    int val = -1; 

    while((val = myListGetNextNode(iter)) != -1) { 
     cout << val << '\t'; 
    } 
    cout << endl; 

    return 0; 
} 

此代碼用於項目中以實現列表和迭代器。 我無法理解的是a.h文件中的第一行:「typedef struct myIterStruct * myIter;」

在代碼中,struct myIterStruct的定義是無處寫的,仍然這個代碼編譯和運行良好。

C++編譯器是否將未定義的結構指針轉換爲void *?或者這是特定於我正在使用的g ++編譯器? 請詳細說明。

謝謝。

+1

你轉發聲明結構。它應該改變,當你改變typedef到這個'typedef myIterStruct * myIter;' – Hayt

回答

1

知道myIterStruct是一個類或結構就足夠了。當編譯器看到struct myIterStruct它知道並且可以形成指向它的指針。

這個必須工作的規則間接強制編譯器對所有指向class/struct的指針使用相同的大小。

其他一些指針,特別是void*char*,可能會在一些不尋常的系統上使用額外的字節。

+1

我無法想象一個平臺'sizeof(char *)'!='sizeof(RandomType *)''。你有一個例子嗎? – SergeyA

+0

非常感謝博! – Dharmendra

+0

@SergeyA - 我們曾經有過尋址機器,其中每個單詞將包含幾個字符。除了字地址之外,char *可能還需要一個索引。 –