privablic
privablic copied to clipboard
Access to private members and methods of a C++ struct or class
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.