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

Posted

技术标签:

【中文标题】如何在 C++ 类中使用自引用类型和别名【英文标题】:How to use of a self reference type and using alias inside C++ class 【发布时间】:2019-02-26 07:07:38 【问题描述】:

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

#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 node55;


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 定义中使用它。我相信如果我不使用类,这种代码风格可以正常工作。

【问题讨论】:

避免为指针类型添加typedefs。 const pNodeconst node* 非常不同。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

要使用后者,您需要像这样转发声明结构节点:

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

【讨论】:

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

C++ 构建警告:取消引用类型双关指针将破坏严格别名规则

C++——引用

C++温故补缺:引用类型

C++引用详解

C++之类之类的其它特性

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板类型别名