1

在 VS 中,当您键入“类”时。您会看到可以调用的函数列表。必须查看 15-20 个函数的列表,其中一半或更多是成员并不好。

我对找到一个可以隐藏私有成员函数或将它们移动到列表末尾的系统非常感兴趣,因此用户不必滚动锁定函数列表。

我有四种设计类型:1)命名空间方法隐藏 2)基于类的方法隐藏 3)pimpl 版本 4)_前缀

为了清楚起见,这里是代码:

#pragma once
#include <memory>

using namespace std; // ignore the fact this is global here

struct Hide_Test_Data
{
    int value;
};

namespace Hide_Test_Private_Member_Ns
{
    void private_function(Hide_Test_Data& data) {}
};

class Hide_Test_Methods
{
public:
    Hide_Test_Methods() {}
    void private_function(Hide_Test_Data& data) {}
};

class Hide_Test_Methods_Alt
{
public:
    Hide_Test_Methods_Alt() {}
    void private_function() {}
private:
    Hide_Test_Data htd_;
};

class Hide_Test
{
public:
    Hide_Test() {}

    void public_function() 
    {
        _private_function(); // member function prefixed with _ 
        Hide_Test_Private_Member_Ns::private_function(htd_); // namespace version
        htm_.private_function(htd_); // subclass version  (no private data)
        pimpl->private_function(); // pimpl version (with private data)
    }

private:
    Hide_Test_Data htd_; // class to hold data 
    Hide_Test_Methods htm_; // class to hold methods
    void _private_function() {}; // _ prefixed member function
    unique_ptr<Hide_Test_Methods_Alt> pimpl;
};

笔记:

  • unique_ptr Hide_Test_Methods_Alt 版本具有标准版本没有的成员数据。两者都可以以任何一种方式实现。

  • _ 前缀不会隐藏成员数据,但会将其移动到列表的末尾。这具有允许用户在感兴趣的情况下查看私有功能的优点。我的主要目标不是隐藏私有成员函数,而是将它们移开。

  • 根据标准,使用_“应该”作为前缀的数据在全局范围之外是安全的,只要它后面跟着一个小写字母。

一般来说,这些设计中哪一个更容易被接受?我想我可以轻松地使用所有这四种设计类型,但我更愿意听到一些关于我可能没有想到的利弊的意见。

Pimpl 使用指针来轻松复制成员数据。在我不需要复制成员数据的情况下,只是使用一个类是好还是坏?

我做了一些研究,并在这个论坛中找到了一些相关的主题:

隐藏私有数据成员?(C++) ——这一点指出了 pimpl 成语(我在上面的示例中添加了它)。

如何隐藏班级的私人成员?- 谈论 VS intellisense 不隐藏私人成员

为什么 Visual Studio 的智能感知显示私有成员和函数?- 给出了一个我不太喜欢的#ifdef 解决方案。

我认为这个问题与其他值得发布的问题有很大不同。一如既往地感谢。

4

1 回答 1

2

通常,当您希望能够在链接时更改实现并且因此必须是指针时,通常会应用 pimpl 模式在这里您不想要开销,因此您可以考虑内部类和该类的实例,而不是一个指针:

class fewfunctions
{
    class manyfunctions
    {
    public:
        int a1() { return 0; }
        int a2() { return 0; }
        int a3() { return 0; }
        int a4() { return 0; }
        // ... many more
    };
public:
    int b() { return a.a1() + a.a2() + a.a3() +a.a4(); }
private:
    manyfunctions a;
};

只有 b 会显示为函数(a 显示为已锁定)

于 2013-11-07T16:18:38.760 回答