/* Copyright 2015-2019 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ class A; static int get_values (const A& a); enum myenum {E_A = 10, E_B, E_C, E_D, E_E}; namespace N { typedef enum {NA = 20, NB, NC, ND} ANON_NE; } namespace { typedef enum {AA = 40, AB, AC, AD} ANON_E; } ANON_E g_e = AC; class A { public: typedef int ATYPE; A () : public_ (1), protected_ (N::NB), private_ (3) {} ATYPE public_; static const myenum s_public_; friend ATYPE get_values (const A&); protected: N::ANON_NE protected_; static N::ANON_NE s_protected_; private: ATYPE private_; static myenum s_private_; }; const myenum A::s_public_ = E_A; N::ANON_NE A::s_protected_ = N::NA; myenum A::s_private_ = E_C; static A::ATYPE get_values (const A& a) { A::ATYPE val; val = a.public_ + a.private_; // 1 + 3 if (a.protected_ == N::NB) // + 21 val += 21; if (a.s_public_ == E_A) // +10 val += 10; if (a.s_protected_ == N::NA) // +20 val += 20; if (a.s_private_ == E_C) // +30 val += 30; if (g_e == AC) // +40 val += 40; return val; // = 125 } typedef int A::*PMI; int main () { A a; int var = 1234; PMI pmi = &A::public_; return a.*pmi + get_values (a); // break here }