#include <assert.h>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
namespace
{
class Foo
{
private:
struct PrivateStruct
{
int m_value;
PrivateStruct() : m_value(0) {}
};
PrivateStruct m_st;
public:
PrivateStruct& refStruct() { return m_st; }
int getPrivateStructValue() const { return m_st.m_value; }
};
}
int main()
{
Foo x;
//cout << x.m_st.m_value << endl; // これはもちろんビルドが通らない。xのprivateメンバm_stのメンバm_valueを参照しようとしている。
cout << "Step 01: x.getPrivateStructValue()=" << x.getPrivateStructValue() << endl;
assert(x.getPrivateStructValue() == 0);
auto& st = x.refStruct(); // stはFooのprivateな型だがビルドが通る。
const int value1 = st.m_value; // st.m_valueはFooのprivateなメンバm_stのメンバm_valueと同一実体だが値を読める。
cout << "Step 02: st.m_value=" << value1 << endl;
assert(value1 == x.getPrivateStructValue());
st.m_value = 100; // st.m_valueはFooのprivateなメンバm_stのメンバm_valueと同一実体だが値を書ける。
const int value2 = x.getPrivateStructValue();
cout << "Step 03: x.getPrivateStructValue()=" << value2 << endl;
assert(x.getPrivateStructValue() == value2);
}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmVuZGw7CgpuYW1lc3BhY2UKewoJY2xhc3MgRm9vCgl7Cglwcml2YXRlOgoJCXN0cnVjdCBQcml2YXRlU3RydWN0CgkJewoJCQlpbnQgbV92YWx1ZTsKCQkJUHJpdmF0ZVN0cnVjdCgpIDogbV92YWx1ZSgwKSB7fQoJCX07CgoJCVByaXZhdGVTdHJ1Y3QgbV9zdDsKCglwdWJsaWM6CgkJUHJpdmF0ZVN0cnVjdCYgcmVmU3RydWN0KCkgeyByZXR1cm4gbV9zdDsgfQoJCWludCBnZXRQcml2YXRlU3RydWN0VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3N0Lm1fdmFsdWU7IH0KCX07Cn0KCmludCBtYWluKCkKewoJRm9vIHg7CgoJLy9jb3V0IDw8IHgubV9zdC5tX3ZhbHVlIDw8IGVuZGw7CS8vIOOBk+OCjOOBr+OCguOBoeOCjeOCk+ODk+ODq+ODieOBjOmAmuOCieOBquOBhOOAgnjjga5wcml2YXRl44Oh44Oz44OQbV9zdOOBruODoeODs+ODkG1fdmFsdWXjgpLlj4LnhafjgZfjgojjgYbjgajjgZfjgabjgYTjgovjgIIKCgljb3V0IDw8ICJTdGVwIDAxOiB4LmdldFByaXZhdGVTdHJ1Y3RWYWx1ZSgpPSIgPDwgeC5nZXRQcml2YXRlU3RydWN0VmFsdWUoKSA8PCBlbmRsOwoJYXNzZXJ0KHguZ2V0UHJpdmF0ZVN0cnVjdFZhbHVlKCkgPT0gMCk7CgoJYXV0byYgc3QgPSB4LnJlZlN0cnVjdCgpOwkJCS8vIHN044GvRm9v44GucHJpdmF0ZeOBquWei+OBoOOBjOODk+ODq+ODieOBjOmAmuOCi+OAggoKCWNvbnN0IGludCB2YWx1ZTEgPSBzdC5tX3ZhbHVlOwkJLy8gc3QubV92YWx1ZeOBr0Zvb+OBrnByaXZhdGXjgarjg6Hjg7Pjg5BtX3N044Gu44Oh44Oz44OQbV92YWx1ZeOBqOWQjOS4gOWun+S9k+OBoOOBjOWApOOCkuiqreOCgeOCi+OAggoJY291dCA8PCAiU3RlcCAwMjogc3QubV92YWx1ZT0iIDw8IHZhbHVlMSA8PCBlbmRsOwoJYXNzZXJ0KHZhbHVlMSA9PSB4LmdldFByaXZhdGVTdHJ1Y3RWYWx1ZSgpKTsKCglzdC5tX3ZhbHVlID0gMTAwOwkJCQkJLy8gc3QubV92YWx1ZeOBr0Zvb+OBrnByaXZhdGXjgarjg6Hjg7Pjg5BtX3N044Gu44Oh44Oz44OQbV92YWx1ZeOBqOWQjOS4gOWun+S9k+OBoOOBjOWApOOCkuabuOOBkeOCi+OAggoJY29uc3QgaW50IHZhbHVlMiA9IHguZ2V0UHJpdmF0ZVN0cnVjdFZhbHVlKCk7Cgljb3V0IDw8ICJTdGVwIDAzOiB4LmdldFByaXZhdGVTdHJ1Y3RWYWx1ZSgpPSIgPDwgdmFsdWUyIDw8IGVuZGw7Cglhc3NlcnQoeC5nZXRQcml2YXRlU3RydWN0VmFsdWUoKSA9PSB2YWx1ZTIpOwp9Cg==