【问题标题】:Function return struct pointer函数返回结构指针
【发布时间】:2016-05-02 14:06:07
【问题描述】:

我想用 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")

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

【问题讨论】:

  • 尝试将 cpp 中的返回类型更改为 Octree::node* 而不仅仅是 node*。您也可以删除 typedef,在 C++ 中不需要它。
  • 或者将struct node的typedef移到类外
  • 他们也可以去掉typedef,因为在C++中你不需要用struct来装饰struct的名字。
  • 是否有可能,在定义(cpp 文件)中,您的命名空间被令牌“节点”的另一个定义弄乱了?

标签: c++ pointers struct


【解决方案1】:

节点的typedef 作用于类。当你使用

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

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

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

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


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

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

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

【讨论】:

    【解决方案2】:

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

    类型相同。在Octree 的定义中,您定义了一个嵌套类node。因此,在Octree的定义中,类型名称node指的是Octree::node。但是,在Octree 的定义之外(您已在其中定义了成员函数),node 并不引用Octree::node。它指的是::node,它可能已在别处声明。

    我做错了什么?

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

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

    【讨论】:

      【解决方案3】:

      错误是因为您实际上没有声明一个名为node 的类型。您已经声明了一个名为Octree::node 的类型。由于Octree::search函数的定义在类声明之外,你需要使用类型的完全限定名:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多