C ++结构创建错误未命名类型

时间:2018-08-20 07:38:39

标签: c++ pointers struct dynamic-memory-allocation

运行程序时,每次使用temp->时都会发生以下错误。

对“ * temp”中的成员“ key”的[错误]请求,其指针类型为“ NodeType {aka Node *}”(也许您打算使用“->”吗?)

代码有什么问题。

struct Node;
typedef Node *NodeType;

int NumNodes = 0;
const int SIZE = 100;
NodeType data[SIZE];


struct Node{
int key;
NodeType *left, *right;
};

NodeType *newNode(int value){
  if(NumNodes == SIZE)
    cout << "This Node Pool is full." << endl;
    exit(1);

  NodeType *temp = &data[NumNodes++];
  temp->key  = value;                  
  temp->left = temp->right = NULL;     
  return temp;
}

3 个答案:

答案 0 :(得分:1)

如果我们摆脱了令人困惑的typedef,那就是您拥有的:

x

如您所见,您已经添加了(不必要的)间接级别,在树中存储了指向指针的指针,并拥有struct Node; int NumNodes = 0; const int SIZE = 100; Node* data[SIZE]; struct Node{ int key; Node **left, **right; }; Node** newNode(int value){ if(NumNodes == SIZE) cout << "This Node Pool is full." << endl; exit(1); Node** temp = &data[NumNodes++]; temp->key = value; temp->left = temp->right = NULL; return temp; } 指针池而不是Node池。

删除typedef并使用由Node插入的Node

NodeType

答案 1 :(得分:1)

您对指针感到困惑。首先摆脱NodeType并改用Node*。重要的是要知道程序中的指针在哪里,将它们隐藏在typedef后面对您没有任何帮助。

现在是真正的错误。您正在尝试创建一个对象池以进行分配。因此池应该是对象而不是指针。

int NumNodes = 0;
const int SIZE = 100;
Node data[SIZE];

现在,分配函数应该返回指向池中对象的指针。在您的代码中,它返回NodeType*,它是指向指针的指针(因为NodeType是指针)。同样非常重要的是,您在newNode中的if语句周围缺少括号(对exit的调用不在代码的if语句内)。所以

Node *newNode(int value) {
    if (NumNodes == SIZE) {
        cout << "This Node Pool is full." << endl;
        exit(1);
    }
    Node *temp = &data[NumNodes++];
    temp->key  = value;                  
    temp->left = temp->right = NULL;     
    return temp;
}

最后,当您的struct应该具有普通指针时,它也具有指向指针的指针

struct Node{
    int key;
    Node *left, *right;
};

基本上,您通过声明NodeType作为指针,然后在顶部添加另一个指针,在自己的脑海中产生了很多困惑。

答案 2 :(得分:1)

struct Node
{
int key;
Node *left, *right;
};

int NumNodes = 0;
const int SIZE = 100;
Node data[SIZE];

Node* nNode(int value)
{

if(NumNodes == SIZE)
{
    cout << "This is full" << endl;
    exit(1);
}
else
{        
    Node* temp = &data[NumNodes++];
    temp->key  = value;                  
    temp->left = temp->right = NULL; 
    return temp;
}
}