拆分一个C++;类声明 我想知道我是否可以分割一个C++类声明< /p>
原始类拆分一个C++;类声明 我想知道我是否可以分割一个C++类声明< /p>,c++,C++,原始类 class P { private: int id; //some really secret method int secretMethod(); protected: int x; public: P(); int getX(); }; 我想在.h中只显示public和protect
class P
{
private:
int id;
//some really secret method
int secretMethod();
protected:
int x;
public:
P();
int getX();
};
我想在.h中只显示public和protected方法和属性,并在其他地方声明private,在这里类的用户看不到它
通缉类别声明:
class P
{
protected:
int x;
public:
P();
int getX();
};
编辑:
我想要这个:
class P
{
private:
class Impl
{
public:
int id;
//some really secret method
int secretMethod();
};
private:
Impl* _pimpl;
protected:
int x;
public:
P() : _pimpl(new P::Impl()) {}
~P() { delete _pimpl; }
int getX();
};
<>不可能真正地分割C++类定义。你所能做的就是实现一个运行时的抽象,它将使用一个恶心的黑客,比如piml来防火墙。 如果你的目的是简单地减少你的报头中的混乱,你可以在你的类中包含一个文件:
class P
{
#include "P.private_parts"
protected:
int x;
public:
P();
int getX();
};
是的,这是可能的,但不是以直接的方式。以下是您要做的: my_object.h:
struct my_object {
void fun();
my_object();
my_object(my_object const&);
~my_object();
my_object& operator = (my_object);
protected:
void pfun();
private:
struct impl;
std::unique_ptr<impl> pimpl;
};
正如您所看到的,这需要大量的工作,并且需要堆。一切都在平衡中…需要时使用。您可以像这样继承第二部分: //类p_Hetitage定义
class P_Heritage {
protected:
int id;
//some really secret method
int secretMethod();
}
class P : private P_Heritage {
protected:
int x;
public:
P();
int getX();
};
//p类定义
class P_Heritage {
protected:
int id;
//some really secret method
int secretMethod();
}
class P : private P_Heritage {
protected:
int x;
public:
P();
int getX();
};
下面简单介绍继承的工作原理:
继承p_类遗产为:
公开
pimpl习语可能就是您想要的,但是什么是
int secretMethod()代码>?为什么需要实际隐藏源代码?Pimpl习语也是一种减少编译时间的巧妙技术。不仅仅是为了隐藏东西。Off-topic.PIMPL非常糟糕,不应该使用。不,不,不。这根本不是拆分类。更不用说,Impl的定义仍然为标题所知……感谢您的评论。可能我太快了。我建议不要在代码中使用前缀“u”,除非您使用的是标准库。虽然在这种情况下,因为它不在全局范围内,但在很多情况下,您会遇到IDB,通常以名称冲突的形式暴露出来。“u”前缀有特殊的含义,取决于作用域和它后面的内容……您可能正在编写格式错误的程序。最好不要使用这个前缀来避免这一切。我相信你有充分的理由来解释为什么你认为Pimpl这个成语很糟糕。如果你能详细说明这些,这样OP就能做出合理的决定,那就太好了。@BenjaminLindley:不是我的答案,但是Pimpl的习惯用法——就像单例模式一样——存在过度使用的问题。将实现与公共接口隔离是一回事(即,库的客户端将在/usr/include/MyLib中看到什么)。当你发现代码库中的每一个类都被“粉刺”时,那就完全是另一回事了,因为这会使源代码难以调试,而且不必要地难以调试,只获得很少的收益。。我认为P.private_零件不可能是秘密。@Troncador:我不确定你想隐藏私人数据的原因是什么,因为当Tibor问你时,你没有详细说明。一个可能的原因是,您只是希望头文件不那么凌乱,所以我回答了如何解决这个问题。因此,在将来,请回答人们在你帖子的评论中向你提出的问题,这样每个人都可以清楚地知道你真正想要完成的是什么。但是,如果你想访问成员,代码完成在P.private\u parts
中不起作用。。。