【问题标题】:why can't i define a function of return type 'pointer to struct' outside of class?为什么我不能在类之外定义返回类型“指向结构的指针”的函数?
【发布时间】:2020-11-21 17:33:28
【问题描述】:

此代码给出错误“没有声明匹配 Node* List::getNewNode(int)”

class List
{
private:
    struct Node {
        int data;
        Node* next;
    };

private:
    Node* getNewNode(int data);
};

Node* List::getNewNode(int data)
{
    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

但是这个函数的相同定义在类内部起作用

class List
{
private:
    struct Node {
        int data;
        Node* next;
    } *head = NULL;

private:
    Node* getNewNode(int data)
    {
        Node* newNode = new Node;
        newNode->data = data;
        newNode->next = NULL;
        return newNode;
    }
};

在类声明的括号内定义函数和定义函数有什么区别吗? 使用范围解析在类括号之外定义它或返回类型是问题? 编译器:minGW x64

【问题讨论】:

标签: c++ pointers


【解决方案1】:

如果你在类定义之外定义函数,你必须提供Node的分辨率(因为它是一个嵌套类):

List::Node* List::getNewNode(int data)
{
    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = nullptr;
    return newNode;
}

【讨论】:

  • 即使Node 是公开的,它仍然会报错,无论多余的修饰符是什么,都需要 List::Node*
【解决方案2】:

这是 C++ 中奇怪的元素之一。问题是解析器不(不允许)知道您正在使用 List 的子类。相反,它在全局命名空间和所有使用的命名空间中搜索类 Node。

要解决此问题,您应该在类型前面加上 list。

 List::Node* List::getNewNode(int data)

现在,您还可以使用尾随返回类型来指定您的函数。

 auto List::getNewNode(int data) -> Node*

由于节点现在在函数之后,解析器已经知道你在 List 范围内并且可以找到正确的类。加上这种简化,一些人认为这是一种更一致的代码编写方式,因为它类似于 lambdas 的工作方式。

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2022-06-15
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多