C++ 未定义的结构指针名称的typdef在C++;?
让我用代码来解释这个问题 我有以下两个文件 猫a.h cat main.cxxC++ 未定义的结构指针名称的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”
使用名称空间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更改为thistypedef 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;
}