VS2012 - 类界面设计:私有成员函数定位/隐藏

VS2012 - Class Interface Design: Private Member Funcs Positioning / Hiding

本文关键字:函数 成员 定位 隐藏 界面设计 VS2012      更新时间:2023-10-16

在VS中,当您键入"class."时,您将看到可以调用的函数列表。必须浏览 15-20 个函数的列表,其中一半或更多是成员并不好。

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

我有四种设计类型: 1) 命名空间方法隐藏 2) 基于类的方法隐藏 3)痘痘版 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版本具有标准版本没有的成员数据。两者都可以通过任何一种方式实现。

  • _ 前缀不会隐藏成员数据,但会将其移动到列表末尾。这样做的好处是允许用户在感兴趣时查看私有功能。我的主要目标不是隐藏私有成员函数,只是将它们移开。

  • 根据标准,以 _ 'should' 为数据添加前缀在全局范围之外是安全的,只要它后面跟一个小写字母。

一般来说,这些设计中的哪一种更容易被接受?我想我可以舒适地使用这四种设计类型,但我宁愿听到一些关于我可能没有想到的优缺点的意见。

Pimpl 使用指针来简化成员数据的复制。在我不需要复制成员数据的情况下,只是使用类是更好还是更差?

我做了一些研究,在这个论坛上发现了一些相关的主题:

隐藏私人数据成员?(C++) - 这个指出了痘痘成语(我添加到上面的例子中)。

如何隐藏类的私人成员? - 谈论VS智能感知不隐藏私人成员

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

我认为这个问题与其他提出的问题足够不同,值得发布。一如既往地感谢。

通常,当您

希望能够在链接时更改实现时,会应用 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 显示为锁定)