函数返回结构指针

时间:2016-05-02 14:06:08

标签: c++ pointers struct

我想用C ++创建一个八叉树数据结构。我有一个头文件,如下所示:

class Octree
{
public:
    typedef struct node
    {
        int value;
        node *child[8];
    }node;

    Octree();
    ~Octree();

    int convert(int sorszam);
    void clear(struct node*);
    node* search(int dec,int oct);
};

我想在.cpp文件中编写搜索功能,但我总是收到错误消息。这是.cpp代码:

node* Octree::search(int dec, int oct) {
//doing something here
return nullptr;
}

错误信息显示:

  

声明与“Octree :: node * Octree :: search(int dec,int oct)”不兼容(在“c:\ Users \ xxx \ Documents \ Visual Studio 2015 \ Projects \ xxx \ xxx”的第19行声明\ Octree.h“)

我不知道发生了什么,因为两个函数的类型是相同的。我做错了什么?

3 个答案:

答案 0 :(得分:2)

  

我不知道发生了什么,因为两个函数的类型是相同的。

类型相同。在Octree的定义中,您已定义了嵌套类node。因此,在Octree的定义中,类型名称node引用Octree::node。但是,在Octree(您已定义成员函数)的定义之外,node未引用Octree::node。它指的是::node,可能已在其他地方宣布过。

  

我做错了什么?

您(意外)重新声明成员函数的返回类型与声明返回的类型不同。只需使用完全限定名称即可引用正确的类型:

Octree::node* Octree::search(int dec, int oct)

答案 1 :(得分:2)

节点的typedef范围限定在类中。当你使用

node* Octree::search(int dec, int oct)

在类体之外,编译器不知道什么节点是什么,因为我们在类的范围之外。您需要使用类名称<{1}}来限定node

Octree::node* Octree::search(int dec, int oct)

这允许编译器使用类中的node

Octree中,没有理由在typedef上使用node。与C不同,您在使用struct时不必使用struct关键字。你可能有

class Octree
{
public:
    struct node
    {
        int value;
        node *child[8];
    };
    //...
};

然后您可以像使用node一样使用typedef

答案 2 :(得分:2)

错误是因为您还没有真正声明名为node的类型。您已声明了名为Octree::node的类型。由于Octree::search函数的定义不在类声明之内,因此您需要使用类型的完全限定名称:

Octree::node* Octree::search(int dec, int oct) {
...