我想访问我的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;
}
答案 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
};