Skip to content

altamic/privablic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

privablic logo

Access to private members and methods in C++

How to use it

Copy privablic.h into your project and #include "privablic.h", and for easy reading, add:

using namespace privablic;

Now, suppose you know the implementation of a class (or a struct) like that:

class Sheep 
{
public:
    Sheep(std::string name_) : name{ std::move(name_) } {}
    
private:
    // Data
    std::string name;
    static int TOTAL;

    // Functions
    void baa() { std::cout << name << ": Baa! Baa!\n"; };
    
    static void FlockCount() 
    {
      std::cout << "sheperd actually counted " << TOTAL << " sheep\n";
    }
};

int Sheep::TOTAL = 42;

You only have to map some stubs according to types of members and/or methods signatures:

Instance Member

struct Sheep_name { typedef string (Sheep::*type); };
template class private_member<Sheep_name, &Sheep::name>;

Instance Method

struct Sheep_baa { typedef void(Sheep::*type)(); };
template class private_method<Sheep_baa, &Sheep::baa>;

Static Instance Member

struct Sheep_TOTAL { typedef int *type; };
template class private_member<Sheep_TOTAL, &Sheep::TOTAL>;

Static Instance Method

struct Sheep_FlockCount { typedef void(*type)(); };
template class private_method<Sheep_FlockCount, &Sheep::FlockCount>;

Then, using an instance of Sheep, you can access the private members like this:

Sheep dolly = Sheep("Dolly");

// now we have a sheep under our complete control:

// - change dolly's identity
dolly.*member<Sheep_name>::value = "Lilly";

// - make dolly baa
(&dolly->*func<Sheep_baa>::ptr)();

// - steal dolly
int flockCount = *member<Sheep_TOTAL>::value -= 1;

// - let the sheperd realize it
(*func<Sheep_FlockCount>::ptr)();

Output:

Lilly: Baa! Baa!
sheperd actually counted 41 sheeps

Tested compilers which works with

clang

Works under OSX

gcc

GCC 7.x (at least!)

msvc

Tested successfully for accessing protected members in Unreal Engine 5 in derived classes under Windows 11

Credits

License

Copyright 2017 Michelangelo Altamore. It may be redistributed under the terms specified in the LICENSE file.

About

Access to private members and methods of a C++ struct or class

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •