We help IT Professionals succeed at work.

Hiding library private members.

mattososky
mattososky asked
on
963 Views
Last Modified: 2012-05-07
I want to hide the private members of my (C++) library that I am creating. I have something like sub-class1, that is a private member of class1. Class1 obviously contains the header for sub-class1. When I compile the code into a library I want other developers to only see class1, but not bee able to see sub-class1 since it's private. Certainly I do not want other developers to be able to see the members of the private sub-class1 object. What methods are available to achieve this?

Thanks,
Matthew
Comment
Watch Question

Top Expert 2009

Commented:
Perhaps try an inner class?

class Outer {
   class Hidden {

   };

};
CERTIFIED EXPERT
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
CERTIFIED EXPERT

Commented:
Ah, sorry, that was wrong - the 'foo' can only be declared in the header, but not implemented, so it has to be like this:

// in header
...
void foo();
...

// in cpp
...
void Class1::foo()
{
 m_pImpl->foo();
}


Sorry ...

ZOPPO
evilrixSenior Software Engineer (Avast)
CERTIFIED EXPERT

Commented:
Google for the 'pimpl idiom' which is how you hide implementation in C++

Author

Commented:
The idea of a nested class is interesting, but i don't think it's going to cover my problem. Again, I have a library containing classes that are already defined. I don't want to mess with moving their definitions into some kind of out class. I'm not seeing how to incorporate these library classes into an out class.

However, using the opaque point reference, I found this,
http://www.qnx.com/developers/articles/article_302_2.html

That looks alot more what I want to do, but alas at first glance I don't quite understand the implementation. Essentialy what I believe it is saying to to create an interface. But I'm not sure where the interface is created, on the application side or the library side. Fundementally my problem remains the same. There is going to be some kinda of Application->Interface->Library relationship, but I'm not sure what it should look like. Can someone code it quickly? If not, I'll keep toying with it until i get it.
evilrixSenior Software Engineer (Avast)
CERTIFIED EXPERT

Commented:
I'm home now... the pimpl idiom...

http://www.devx.com/cplus/Article/28105
http://www.gotw.ca/gotw/028.htm
http://www.ddj.com/cpp/205918714

Actually, just realized by Zoppo eluded to this with his post about the opaque pointer... but there is far more to the pimpl idiom than just that so it's worth reading up on it.

Author

Commented:
I think I have it. Here is my example. I'm not sure if it follows this pimpl idiom or not, but the key was to put the include for the library header in the code section of the interface. Then have a void pointer in the interface class which be casted into the library class whenever it needs to be accesses. Now the application can include the header for the interface, but that does not allow it to resovle whatever was in the library. Anyone care to comment on this?
//LIBRARY HEADER
////////////////
#include <iostream>
 
class ClassA
{
	public:
 
		int constructor_number;
		ClassA();
		int MySecretFunction();
 
	private:
 
};
 
 
 
//LIBRARY CODE
//////////////
#include "ClassA.h"
 
ClassA::ClassA()
{
	constructor_number = 7;
}
int ClassA::MySecretFunction()
{
	return constructor_number + 1;
}
 
 
 
 
 
 
//INTERFACE HEADER
#include <iostream>
 
typedef void*	PTR_ClassA;
 
class ClassAInterface
{
	public:
 
		PTR_ClassA gp_ClassA;
		ClassAInterface();
		int Function1()
 
};
 
 
 
//INTERFACE CODE
#include "ClassA.h"
 
ClassAInterface::ClassAInterface()
{
	gp_ClassA = new ClassA();
 
}
int ClassAInterface::Function1()
{
	ClassA* true_ptr = (ClassA*)gp_ClassA;
 
	int x = true_ptr->MySecretFunction();
 
	return x;
}

Open in new window

Senior Software Engineer (Avast)
CERTIFIED EXPERT
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.