我想知道我是否可以拆分C ++类声明
原创课程
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();
};
编辑: 我希望如此:
答案 0 :(得分:5)
是的,这是可能的,但不是以直接的方式。这是你做的:
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;
};
my_object.cpp:
struct my_object::impl {
void fun() { do stuff...}
void pfun() { do other stuff... }
int private_member;
};
my_object::my_object() : pimpl(new impl) {}
my_object::my_object(my_object const& o) : pimpl(new impl(*o.pimpl) {}
my_object::~my_object() {}
my_object& my_object::operator = (my_object o) { swap(pimpl, o.pimpl); return *this; }
void my_object::fun() { pimpl->fun(); }
void my_object::pfun() { pimpl->pfun(); }
正如您所看到的,这需要很多工作并需要堆。一切都在平衡......在你需要的时候使用。
答案 1 :(得分:1)
如果你的目的是简单地减少标题中的混乱,你可以在课程中间包含一个文件:
class P
{
#include "P.private_parts"
protected:
int x;
public:
P();
int getX();
};
答案 2 :(得分:0)
这样的东西?
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();
};
答案 3 :(得分:0)
您可以像这样继承第二部分:
// P_Hetitage类定义
class P_Heritage {
protected:
int id;
//some really secret method
int secretMethod();
}
// P类定义
class P : private P_Heritage {
protected:
int x;
public:
P();
int getX();
};
下面简单说明继承的工作原理:
将类P_Heritage继承为:
公开
- public 元素对P类是 public
- 受保护的元素属于P类的私有
私有
P类无法看到
- 公共元素是P类的私有
- 受保护的元素属于P类的私有
P_Heritage的私有元素
答案 4 :(得分:-1)
无法真正拆分C ++类定义。您所能做的就是实现一个运行时抽象,它将使用像PIMPL这样恶心的黑客来防火墙源代码。