VS2012 - 类界面设计:私有成员函数定位/隐藏
VS2012 - Class Interface Design: Private Member Funcs Positioning / Hiding
在VS中,当您键入"class."时,您将看到可以调用的函数列表。必须浏览 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版本具有标准版本没有的成员数据。两者都可以通过任何一种方式实现。
_ 前缀不会隐藏成员数据,但会将其移动到列表末尾。这样做的好处是允许用户在感兴趣时查看私有功能。我的主要目标不是隐藏私有成员函数,只是将它们移开。
根据标准,以 _ 'should' 为数据添加前缀在全局范围之外是安全的,只要它后面跟一个小写字母。
一般来说,这些设计中的哪一种更容易被接受?我想我可以舒适地使用这四种设计类型,但我宁愿听到一些关于我可能没有想到的优缺点的意见。
Pimpl 使用指针来简化成员数据的复制。在我不需要复制成员数据的情况下,只是使用类是更好还是更差?
我做了一些研究,在这个论坛上发现了一些相关的主题:
隐藏私人数据成员?(C++) - 这个指出了痘痘成语(我添加到上面的例子中)。
如何隐藏类的私人成员? - 谈论VS智能感知不隐藏私人成员
为什么Visual Studio的智能感知显示私有成员和功能?-给出了一个我不太喜欢这个想法的 #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++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针