c++ - VS2012-类接口(interface)设计: Private Member Funcs Positioning/Hiding

标签 c++ visual-studio visual-studio-2012 private pimpl-idiom

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

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

我有四种设计类型: 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 版本具有标准版本没有的成员数据。两者都可以以任何一种方式实现。

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

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

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

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

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

Hiding private data members? (C++) - 这个指出了 pimpl 习语(我在上面的示例中添加了它)。

How to hide private members of a Class? - 谈论 VS intellisense 不隐藏私有(private)成员

Why does Visual Studio's intellisense show private members and functions? - 给出了一个我不太喜欢的#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 显示为已锁定)

关于c++ - VS2012-类接口(interface)设计: Private Member Funcs Positioning/Hiding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19702134/

相关文章:

c++ - hpp/cpp split with global function : Multiple definition of . .. 错误

c++ - QScrollArea 内的 QGridLayout 内的方形自定义 QWidget

c++ - 奇怪的堆损坏问题?

visual-studio - VS 2019找不到SDK

c# - DbContext 处置错误

C++ 将输入字符串解析为变量

c++ - Visual Studio C++ 性能与英特尔 C++ 编译器 15

visual-studio - Visual Studio 2012 可以使用 cmdlet 实现自动化吗?

c# - ildasm 和 .ldarg - 里面发生了什么?

visual-studio-2012 - 使用wix在程序数据中添加文件