2016-11-16 4 views
-1

コードの助けを借りて質問を説明しましょう。未定義のstructポインタ名のtypdefはどのようにC++で動作しますか?

次の2つのファイルがあります。

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; 
     } 
    }; 

a.h猫は

#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; 
} 
をmain.cxx

このコードは、リストとイテレータを実装するプロジェクトで使用されます。 私が理解できないのは、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

ありがとうBo! – Dharmendra

+0

@SergeyA - 私たちは、それぞれの単語にいくつかの文字が含まれている単語を扱うマシンを使用していました。 'char *'はwordというアドレスに加えてインデックスを必要とするかもしれません。 –

関連する問題