如何解决在 C++ 中使用 unordered_set/map 时如何制作封装良好的类?
我在看一些关于如何为类/结构制作 unordered_set 的教程。我发现这个易于理解的代码(作为 Java 开发人员)可以解决问题:
#include <iostream>
#include <unordered_set>
using namespace std;
struct Node{
int val;
bool operator==(const Node& n) const{
return (this->val == n.val);
}
};
class HashFunction{
public:
size_t operator()(const Node& n) const{
return n.val;
}
};
int main(){
Node n1 = { 1 },n2 = { 2 },n3 = { 3 },n4 = { 4 };
unordered_set<Node,HashFunction> us;
us.insert(n1);
us.insert(n2);
us.insert(n3);
us.insert(n4);
for (auto node : us){
cout << node.val << " ";
}
cout << endl;
return 0;
}
我想知道我们是否可以将 struct Node
设为类,将 int val
设为私有字段并将 unordered_set<Node,HashFunction> neighbours
作为字段添加到 Node
类中。
如果不是,保持类/结构良好封装并为类设置集合/映射字段的好做法是什么?
解决方法
这里有几个问题,所以我会尽量按顺序回答:
可以使 struct Node
成为一个类
是的,struct
和 class
仅在默认权限上不同(在 struct
中,除非另有说明,否则为 public
,在 class
中,它们为 {{ 1}})
所以这与您编写的代码相同:
private
将 class Node{
public:
int val;
bool operator==(const Node& n) const{
return (this->val == n.val);
}
};
设为私有字段并将 int val
作为字段添加到 unordered_set<Node,HashFunction> neighbours
类
是的,你可以。我能想到的从您编写的代码进行转换的最简单方法是使 Node
成为 HashFunction
的子类。
例如:
Node
如果不是,保持类/结构良好封装并为类设置集合/映射字段的好做法是什么?
在这种情况下,我想这是一个有点无语的问题 - 但一般的答案是只公开所需的最低接口。例如,现在 class Node {
class HashFunction {
public:
size_t operator()(const Node& n) const{
return n.val;
}
};
public:
Node(int _val) : val(_val) {}
bool operator==(const Node& n) const{
return (this->val == n.val);
}
// More methods here
private:
int val;
unordered_set<Node,HashFunction> neighbours;
};
知道 HushFunction
的内部内容。为了增加封装性,我们可以向 Node
添加一个 hush
方法,并让 Node
调用该方法。这样,如果 HushFunction
的内容发生变化,那么 Node
之外的任何内容都不需要注意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。