VS2012 - 类接口设计:私有成员Funcs定位/隐藏

时间:2013-10-31 08:57:47

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

在VS中,键入“class”时。您将看到一个可以呼叫的功能列表。必须查看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使用指针来轻松复制成员数据。在我不需要复制成员数据的情况下,只是使用更好或更差的类?

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

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

How to hide private members of a Class? - 讨论VS intellisense不隐藏私人成员

Why does Visual Studio's intellisense show private members and functions? - 提供一个我不太喜欢的#ifdef解决方案。

我认为这个问题与其他有待发布的问题不同。一如既往地谢谢。

1 个答案:

答案 0 :(得分: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会显示为一个功能(显示为锁定)