c++ - 使用嵌套结构是否相关?
问题描述
我正在尝试定义一个具有私有结构和公共结构的类。
私有结构是仅由类使用的结构(例如 SNode),我不希望它在类外可见,因为我不希望它被错误地使用(例如 new Node())。因此,我达到了将其设置为基本隐藏的想法。
Public struct是在外部使用的结构(例如 SKeyValuePair),它有一个指向 SNode 的指针。
代码示例如下。
【类定义】
template <typename T>
class A
{
private:
struct SNode
{
SNode* pParentNode;
SNode* pLeftChildNode;
SNode* pRightChildNode;
...
};
public:
A<T>()
{
}
virtual ~A()
{
}
struct SPair
{
private:
public:
SNode* pNode;
unsigned long long ullKey;
T value;
...
};
const SPair GetMinKeyPair()
{
return SPair(...);
}
const SPair GetNextMinKeyPair()
{
...
return SPair(...);
}
};
[用法]
A a;
...
for (A::SPair pair = a.GetMinKeyPair(); pair.pNode != nullptr; pair = a.GetNextMinKeyPair())
{
...
}
Q1。我想知道由于我目前不知道的某种原因,是否应该避免这种嵌套结构(包含私有结构指针的公共结构)。
Q2。如果有原因,我想知道它们是什么。
解决方案
一般来说,这不是一个糟糕的经商方式。
SNode<T>
当不需要公开时,它会保持名称私有。(尽管,正如 aschepler 在评论中指出的那样,请注意类型本身仍然可以完全使用 via auto
;可访问性仅影响名称。)
所以这是一种非常巧妙的组织方式,我个人确实使用了嵌套类型。
但是,由于A
是类模板,因此您将拥有SNode
每个T
使用的副本。这就是模板的工作方式。这意味着更多的代码和更大的可执行文件。出于这个原因,您可能会考虑更传统的方法,将实用程序类型放在命名空间中。人们是否尝试在外部使用它们真的很重要A<T>
吗?
推荐阅读
- javascript - Native-React + Expo:无法从“src/boot/setup.js”解析“@expo/vector-icons/fonts/Ionicons.ttf”
- c++ - 函数模板不适用于字符串文字
- python - pandas - 将更频繁的 DataFrame 下采样到不太频繁的 DataFrame 的频率
- node.js - async.waterfall() 在将回调传递给 bcrypt.hash() 时中断
- c++ - ostream 和运算符重载
- angular - 在 Angular 中调用 REST API 首先返回 null,然后再次调用并返回正确的数据
- javascript - *ngFor 不迭代数组
- c# - 从类型访问数据的更简洁的方法
- hapijs - 允许某些键通过或不通过 JOI 验证
- graphql - 在与类型定义相同的模式文档中扩展类型是否有效