Skip to content

altamic/privablic

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

Visual Studio 2019 (at least!)

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