【问题标题】:VS2012 - Class Interface Design: Private Member Funcs Positioning / HidingVS2012 - 类接口设计:私有成员函数定位/隐藏
【发布时间】:2013-10-31 08:57:47
【问题描述】:

在 VS 中,当您键入“类”时。您会看到可以调用的函数列表。必须查看 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 版本具有标准版本没有的成员数据。两种方式都可以实现。

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

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

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

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 解决方案。

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

【问题讨论】:

  • 试过VS2013?它对智能感知隐藏私有成员。
  • 我听说过。但不,还没有。不想使用 Windows 7。
  • 由于缺乏回应,我开始认为这一定是个糟糕的问题。
  • 你正在调整你的代码,想出一些晦涩的设计,只是为了解决不合标准的工具。不要那样做。如上所述,试试 VS 2013。并看看Visual Assist can filter class members 的方式。 List Non-Inherited Entries First 感觉比通过访问修饰符过滤更自然。
  • 这肯定是未来的更新。但我现在不想更新我的 Windows 副本。感谢您的建议。

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回复!我现在在一个单独的命名空间中使用了一个实现类。我想知道是否还有其他我遗漏的优点或缺点。
  • 只要不使用指针,性能就不会改变子类的主要优点是任何维护代码的人只需要查看一个地方再一次,有些人不会t 喜欢子类顺便说一句,为什么要单独的命名空间?
  • 在我的解决方案中?我添加了命名空间以隐藏全局函数。
  • 也许是这样。这是迄今为止最好的答案。如果没有人给出更好的,我会奖励给你。 “但我宁愿听到一些关于我可能没有想到的利弊的意见。”是问题中唯一缺少您答案的部分。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 2013-07-07
  • 2022-11-13
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多