在 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/