【发布时间】: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