Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未定义的结构指针名称的typdef在C++;?_C++_Pointers_Struct_G++_Typedef - Fatal编程技术网

C++ 未定义的结构指针名称的typdef在C++;?

C++ 未定义的结构指针名称的typdef在C++;?,c++,pointers,struct,g++,typedef,C++,Pointers,Struct,G++,Typedef,让我用代码来解释这个问题 我有以下两个文件 猫a.h cat main.cxx #包括 #包括“a.h” 使用名称空间std; myIter createIterator(myList*列表) { myIterator*returnitr=新的myIterator(列表); return(myIter)returnitr; } int myListGetNextNode(myIter iter) { if(iter==NULL) 返回-1; myIterator*funciter=(myIter

让我用代码来解释这个问题

我有以下两个文件

猫a.h

cat main.cxx

#包括
#包括“a.h”
使用名称空间std;
myIter createIterator(myList*列表)
{
myIterator*returnitr=新的myIterator(列表);
return(myIter)returnitr;
}
int myListGetNextNode(myIter iter)
{
if(iter==NULL)
返回-1;
myIterator*funciter=(myIterator*)iter;
返回函数->下一步();
}
int main()
{
myList*list=新的myList(空,1);
列表->AddTail(2);
列表->AddTail(3);
myIter iter=createIterator(列表);
int val=-1;
而((val=myListGetNextNode(iter))!=-1){

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

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


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

您可以向前声明结构。当您将typedef更改为this
typedef myIterStruct*myIter;
时,它应该会改变;
我无法想象一个平台会出现
sizeof(char*)
!=
sizeof(RandomType*)
。你有一个例子吗?非常感谢Bo!!@SergeyA-我们以前有一个单词寻址机器,每个单词都包含几个字符。
char*
可能需要一个索引来添加单词地址。@BoPersson,但是指向每个对象的指针都可以表示为char*。在这种情况下,这些索引从何而来?@SergeyA-这将取决于实现者。它只允许不同类型的指针具有不同的大小,请参见此。
    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;
        }   
    };
#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;
}