如何在课堂上访问私有结构

How to access private struct in class?

本文关键字:结构 访问 课堂      更新时间:2023-10-16

我想访问我的节点结构,以便创建一个生成新节点的函数。为此,我认为唯一的方法是在我的结构中创建一个构造函数,并在我的 CreateNode 函数中调用该构造函数。但是我收到一个错误:[错误]"结构BS::节点"受到保护。这个问题的一个很好的解决方案是使结构节点公开,但我想问是否有另一种方法可以访问我的结构并保持私有。

头文件

class BS
{
public:
    BS();     //constructor
protected:
    struct Node{
        int data;
        Node* left;
        Node* right;
        Node(int d,Node* lf ,Node* ri)
            :data(d),left(lf),right(ri){}
    }; 
    Node* root;    
    Node* CreateNode(int data);
};

.CPP

BS::BS(){
  root=NULL;
}  
BS::Node* CreateNode(int data){
    Node* new_node= new Node(0,NULL,NULL);
    return new_node;
}

使用带有私有构造函数的公共类,并使外部类成为朋友:

class BS
{
public:
  BS();     //constructor
  class Node {
    // note: private constructor
    Node(int d,Node* lf ,Node* ri)
    :data(d),left(lf),right(ri){}
    int data;
    Node* left;
    Node* right;
    // befriends BS
    friend BS;
  }; 
  Node* CreateNode(int data);
private:
  Node* root = nullptr;
};
BS::Node* BS::CreateNode(int data){
    Node* new_node= new Node(0, nullptr, nullptr);
    return new_node;
}
int main()
{
}

不要使用原始指针。使用std::unique_ptr

不,即使有友谊,您也不能按照自己喜欢的方式创建CreateNode函数,因为此函数返回BS外部的BS::Node,而Node受到保护:

#include <BS.hh>
BS::BS()
{
  root=nullptr;
}
BS::Node* BS::CreateNode(int data)
{
    BS::Node* new_node = new BS::Node(0,nullptr,nullptr);
    return new_node;
}
int main()
{
  BS bs;
  BS::Node* = bs.CreateNode(1); // <- Error, returning a BS::Node outside BS!
  return 0;
}

但是您可以在BS内部使用CreateNode

class BS
{
public:
    BS();     //constructor
protected:
    struct Node{
        int data;
        Node* left;
        Node* right;
        Node(int d,Node* lf ,Node* ri)
            :data(d),left(lf),right(ri){}
    };
    BS::Node* CreateNode(int data);
    BS::Node* root = CreateNode(0); // inside BS it's OK
};