如何在类中访问私有结构?

时间:2017-06-14 12:31:19

标签: c++

我想访问我的Node结构以创建一个生成新节点的函数。为此,我认为唯一的方法是在我的struct中创建一个构造函数,并在我的CreateNode函数中调用构造函数。但是我得到一个错误:[错误]'struct BS :: Node'受到保护。问题的一个明显的解决方法是使结构节点公开,但是我想询问是否有另一种方法来访问我的结构并将其保密。

标头文件

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;
}

2 个答案:

答案 0 :(得分:0)

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

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()
{

}

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

答案 1 :(得分:-2)

不,你不能以你想要的方式创建你的CreateNode功能,即使是友谊,因为这个函数在BS::Node之外返回BS,而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;
}

但您可以在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){}
    };
    BS::Node* CreateNode(int data);
    BS::Node* root = CreateNode(0); // inside BS it's OK
};