fork(2) download
  1. #include <assert.h>
  2. #include <iomanip>
  3. #include <iostream>
  4.  
  5. using std::cout;
  6. using std::endl;
  7.  
  8. namespace
  9. {
  10. class Foo
  11. {
  12. private:
  13. struct PrivateStruct
  14. {
  15. int m_value;
  16. PrivateStruct() : m_value(0) {}
  17. };
  18.  
  19. PrivateStruct m_st;
  20.  
  21. public:
  22. PrivateStruct& refStruct() { return m_st; }
  23. int getPrivateStructValue() const { return m_st.m_value; }
  24. };
  25. }
  26.  
  27. int main()
  28. {
  29. Foo x;
  30.  
  31. //cout << x.m_st.m_value << endl; // これはもちろんビルドが通らない。xのprivateメンバm_stのメンバm_valueを参照しようとしている。
  32.  
  33. cout << "Step 01: x.getPrivateStructValue()=" << x.getPrivateStructValue() << endl;
  34. assert(x.getPrivateStructValue() == 0);
  35.  
  36. auto& st = x.refStruct(); // stはFooのprivateな型だがビルドが通る。
  37.  
  38. const int value1 = st.m_value; // st.m_valueはFooのprivateなメンバm_stのメンバm_valueと同一実体だが値を読める。
  39. cout << "Step 02: st.m_value=" << value1 << endl;
  40. assert(value1 == x.getPrivateStructValue());
  41.  
  42. st.m_value = 100; // st.m_valueはFooのprivateなメンバm_stのメンバm_valueと同一実体だが値を書ける。
  43. const int value2 = x.getPrivateStructValue();
  44. cout << "Step 03: x.getPrivateStructValue()=" << value2 << endl;
  45. assert(x.getPrivateStructValue() == value2);
  46. }
  47.  
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
Step 01: x.getPrivateStructValue()=0
Step 02: st.m_value=0
Step 03: x.getPrivateStructValue()=100