簡體   English   中英

未定義的結構指針名稱的 typdef 如何在 C++ 中工作?

[英]How does typdef of an undefined struct pointer name work in C++?

讓我在代碼的幫助下解釋這個問題。

我有以下兩個文件。

貓啊

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

此代碼在項目中用於實現列表和迭代器。 我無法理解的是 ah 文件中的第一行:“typedef struct myIterStruct *myIter;”

在代碼中,struct myIterStruct 的定義沒有寫在任何地方,但這段代碼仍然可以編譯並運行良好。

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

謝謝。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM