如何使用自引用类型并在C ++类中使用别名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用自引用类型并在C ++类中使用别名相关的知识,希望对你有一定的参考价值。

这是一个简单的代码,我尝试使用自引用类型并同时使用别名。

#include <iostream>
class List {
private:
    struct node {
        int data;
        struct node* next;

        node(const int& d=0, struct node* n=nullptr) {
            data = d; next = n;
        }
        ~node() {};
    };
    using pNode = struct node*;
    pNode head;

public:
    List();
    ~List();
    void print() const { std::cout << head->data; }
};

List::List() {
    head = new node{55};
}

int main() {
  List *a = new List;
  a->print();
}

以上工作正常。但是,我宁愿启动代码,如下所示:

class List {
private:
    using pNode = struct node*;
    struct node {
        int data;
        pNode next;
    ...

我想在using pNode = struct node*定义之前放置struct node,这样我也可以在struct node定义中使用它。我相信如果我不使用类,这种代码风格可以正常工作。

答案

不要在别名中隐藏指针语义。这是我永远落后的一个“永不”的建议。

如果你同意只在你的代码中使用node*,那么你可以写

struct node {
    int data;
    node* next;
    // ..
};

C ++引入了一个名为nodestruct node的类型,与C不同。所以我们可以使用自然语法。

另一答案

要使用后者,您需要转发声明结构节点,如下所示:

struct node;
using pNode = node*;
struct node {
    int data;
    pNode next;
};

以上是关于如何使用自引用类型并在C ++类中使用别名的主要内容,如果未能解决你的问题,请参考以下文章

c 中的引用类型在delphi中如何使用

如何定义XSD并在XML中使用XSD

使用数据注释和代码的自定义验证属性

java引用数据类型(类)

.NET 中的全局导入/使用别名

如何使用Qt和C ++的“接口类”来传递两个线程