Reputation: 3556
I want to know if I can split a C++ class declaration
Original class
class P
{
private:
int id;
//some really secret method
int secretMethod();
protected:
int x;
public:
P();
int getX();
};
I want to show in the .h only the public and protected method and attributes, and declare somewhere else the private, where the user of the class can't see it.
Wanted class declaration:
class P
{
protected:
int x;
public:
P();
int getX();
};
Edit: I want that for:
Upvotes: 6
Views: 9743
Reputation: 1288
You can heritage the second part like this:
//Class P_Hetitage definition
class P_Heritage {
protected:
int id;
//some really secret method
int secretMethod();
}
//Class P definition
class P : private P_Heritage {
protected:
int x;
public:
P();
int getX();
};
Below a straightforward explanation how inheritance works:
Inheritance the class P_Heritage as:
public
- public elements are public to class P
- protected elements are private to class P
private
- public elements are private to class P
- protected elements are private to class P
P_Heritage's private elements can not be seen by class P
Upvotes: 0
Reputation: 40877
Yes, it is possible but not in the direct kind of way. Here is what you do:
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(); }
As you can see, it's a lot of work and requires the heap. Everything in balance...use when you need to.
Upvotes: 6
Reputation: 103733
If your purpose is to simply reduce clutter in your header, you can include a file in the middle of your class:
class P
{
#include "P.private_parts"
protected:
int x;
public:
P();
int getX();
};
Upvotes: 1
Reputation: 146968
It is not possible to genuinely split a C++ class definition. All that you can do is implement a run-time abstraction which will firewall the source code by using a disgusting hack like PIMPL.
Upvotes: 0
Reputation: 1780
Something like this?
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();
};
Upvotes: 0