簡體   English   中英

如何在課堂上訪問私有結構?

[英]How to access private struct in class?

我想訪問我的Node結構,以創建一個生成新節點的函數。 為此,我認為唯一的方法是在我的結構中創建一個構造函數並在我的CreateNode函數中調用該構造函數。 但是我得到一個錯誤:[Error]'struct BS :: Node'受保護。 一個解決該問題的方法是將struct Node公開,但是我想問一問是否還有另一種訪問我的struct並將它保持私有的方法。

頭文件

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

}

ps。 不要使用原始指針。 使用std::unique_ptr

不,你不能創建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;
}

但是您可以在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
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM