Access to private members and methods in C++
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:
struct Sheep_name { typedef string (Sheep::*type); }; template class private_member<Sheep_name, &Sheep::name>;struct Sheep_baa { typedef void(Sheep::*type)(); }; template class private_method<Sheep_baa, &Sheep::baa>;struct Sheep_TOTAL { typedef int *type; }; template class private_member<Sheep_TOTAL, &Sheep::TOTAL>;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)();Lilly: Baa! Baa! sheperd actually counted 41 sheeps Works under OSX
GCC 7.x (at least!)
Tested successfully for accessing protected members in Unreal Engine 5 in derived classes under Windows 11
Copyright 2017 Michelangelo Altamore. It may be redistributed under the terms specified in the LICENSE file.
