Search code examples
c++encapsulationprivate-members

Can I access private members from outside the class without using friends?


Disclaimer

Yes, I am fully aware that what I am asking about is totally stupid and that anyone who would wish to try such a thing in production code should be fired and/or shot. I'm mainly looking to see if can be done.

Now that that's out of the way, is there any way to access private class members in C++ from outside the class? For example, is there any way to do this with pointer offsets?

(Naive and otherwise non-production-ready techniques welcome)

Update

As noted in the comments, I asked this question because I wanted to write a blog post on over-encapsulation (and how it affects TDD). I wanted to see if there was a way to say "using private variables isn't a 100% reliable way to enforce encapsulation, even in C++." At the end, I decided to focus more on how to solve the problem rather than why it's a problem, so I didn't feature some of the stuff brought up here as prominently as I had planned, but I still left a link.

At any rate, if anyone's interested in how it came out, here it is: Enemies of Test Driven Development part I: encapsulation (I suggest reading it before you decide that I'm crazy).


Solution

  • If the class contains any template member functions you can specialize that member function to suit your needs. Even if the original developer didn't think of it.

    safe.h

    class safe
    {
        int money;
    
    public:
        safe()
         : money(1000000)
        {
        }
    
        template <typename T>
        void backdoor()
        {
            // Do some stuff.
        }
    };
    

    main.cpp:

    #include <safe.h>
    #include <iostream>
    
    class key;
    
    template <>
    void safe::backdoor<key>()
    {
        // My specialization.
        money -= 100000;
        std::cout << money << "\n";
    }
    
    int main()
    {
        safe s;
        s.backdoor<key>();
        s.backdoor<key>();
    }
    

    Output:

    900000
    800000