다음 클래스 (C ++ 11)를 가정합니다.
class A
{
int i;
class B
{
void meth()
{
// Get outer address / reference?
};
} b;
};
여기서 B
항상의 일부가 될 것A
, 즉 존재하지 아니 같은 코드 new B()
.
이것은 b.meth()
항상 외부 A
.
질문 : 어떻게 외부로부터 b.meth()
(항상 동일한 오프셋을 b
가지며 컴파일 타임에 알려짐)?
이것은 최선의 해결책이 아닐 수도 있고 표준이 아니며 사람들이 그것이 나쁜 생각이라고 말할 것이라고 확신합니다. 따라서 인터넷에서 무작위로 찾은 경우 맹목적으로 사용하지 마십시오. 그러나 표준 솔루션이 존재하는지 확신 할 수 없습니다.
여기 간다:
// Example program
#include <iostream>
#include <cstdint>
// This may not be needed if your compiler already has an offsetof macro defined
#ifndef offsetof
#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
#endif
class A
{
public:
int i;
class B
{
public:
void meth()
{
// We basically subtract the offset of `b` within `A` from the start of `b`,
// giving us the outer `A`'s `this`.
A* outer = (A*)((std::uintptr_t)this - offsetof(A, b));
std::cout << outer->i;
};
} b;
};
int main()
{
A a;
a.i = 123;
a.b.meth();
return 0;
}
// Output: 123
A
가 표준 레이아웃 유형이 아닌 경우 실패합니다 .
어쨌든 데이터 구조를 모델링하는 더 나은 방법에 대해 생각해야한다고 생각합니다. 제가 게시 한 것은 귀하의 당면한 문제에 대한 반창고입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다