未定义的结构指针名称的typdef如何在C ++中工作?

时间:2016-11-16 15:22:20

标签: c++ pointers struct g++ typedef

让我在代码的帮助下解释这个问题。

我有以下两个文件。

  
    

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

cat 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文件中的第一行:&#34; typedef struct myIterStruct * myIter;&#34;

在代码中,struct myIterStruct的定义是无处编写的,但这段代码编译并运行良好。

C ++编译器是否将未定义的struct指针转换为void *?或者这是我特定的g ++编译器? 请详细说明。

感谢。

1 个答案:

答案 0 :(得分:1)

知道myIterStruct是一个类或结构就足够了。当编译器看到struct myIterStruct时,它知道它并且可以形成指向它的指针。

这必须起作用的规则间接强制编译器对类/ struct的所有指针使用相同的大小。

其他一些指针,特别是void*char*,可能会在某些异常系统上使用额外的字节。