如何在课堂上访问私有结构
How to access private struct in class?
我想访问我的节点结构,以便创建一个生成新节点的函数。为此,我认为唯一的方法是在我的结构中创建一个构造函数,并在我的 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
};
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 访问存储在向量C++中的结构的多态成员
- 访问类lintalizer列表中的结构元素
- 仅使用结构名称访问结构成员
- 如何从其他结构访问受保护的结构变量
- 如何从类中定义的结构访问私有成员?c++
- 枚举范围无法通过 C++ 中的类中的结构访问
- 通过更高级别的结构访问子变量
- 从匿名结构访问枚举条目
- 如何定义别名以通过结构访问枚举类成员
- C 用于向量中的结构访问索引或使用参考值
- 奇怪的结构访问错误
- 将数组作为结构访问与未定义的行为
- 使用c++以及x86和x64体系结构访问处理器中断
- 使用 ostream 从另一个类的结构访问数据
- 从结构访问数组会使程序崩溃
- 联合中的C++结构访问联合成员
- SWIG如何使用Lua表从Lua中的c结构访问字节数组
- c++结构访问冲突