首页 > 解决方案 > 使用嵌套结构是否相关?

问题描述

我正在尝试定义一个具有私有结构和公共结构的类。

私有结构是仅由类使用的结构(例如 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。如果有原因,我想知道它们是什么。

标签: c++

解决方案


一般来说,这不是一个糟糕的经商方式。

SNode<T>当不需要公开时,它会保持名称私有。(尽管,正如 aschepler 在评论中指出的那样,请注意类型本身仍然可以完全使用 via auto;可访问性仅影响名称。)

所以这是一种非常巧妙的组织方式,我个人确实使用了嵌套类型。

但是,由于A是类模板,因此您将拥有SNode每个T使用的副本。这就是模板的工作方式。这意味着更多的代码和更大的可执行文件。出于这个原因,您可能会考虑更传统的方法,将实用程序类型放在命名空间中。人们是否尝试在外部使用它们真的很重要A<T>吗?


推荐阅读