C ++ 11 : 외부 클래스에 대한 주소 / 참조를 얻는 방법?

emacs는 나를 미치게 만든다.

다음 클래스 (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가지며 컴파일 타임에 알려짐)?

CherryDT

이것은 최선의 해결책이 아닐 수도 있고 표준이 아니며 사람들이 그것이 나쁜 생각이라고 말할 것이라고 확신합니다. 따라서 인터넷에서 무작위로 찾은 경우 맹목적으로 사용하지 마십시오. 그러나 표준 솔루션이 존재하는지 확신 할 수 없습니다.

여기 간다:

// 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

주어진 요소를 포함하는 shadowRoot에 대한 참조를 얻는 방법

분류에서Dev

Scala의 내부 클래스에서 외부 개체를 참조하는 방법

분류에서Dev

외부 클래스에 대한 페이지보기를 만드는 방법

분류에서Dev

다른 클래스에서 예외를 얻는 방법 C #

분류에서Dev

LXC 게스트에 대한 외부 IP 주소를 구성하는 방법은 무엇입니까?

분류에서Dev

C # 메서드에서 제네릭 클래스 참조를 얻는 방법

분류에서Dev

클래스 구현에 대한 액세스 권한이없는 외부 "플러그인"라이브러리에서 C ++ 클래스 참조 사용

분류에서Dev

콜 아웃에 대한 MKPlacemark 주소를 얻는 방법

분류에서Dev

Django serializer에서 참조 된 모델 대신 외래 키 ID를 얻는 방법

분류에서Dev

Mac OSX에서 2 ISP의 외부 IP 주소를 얻는 방법

분류에서Dev

ES6에서 클래스 함수에 대한 참조를 얻는 방법은 무엇입니까?

분류에서Dev

내부 및 외부 IP 주소를 얻는 방법

분류에서Dev

Visual Studio C ++ 주어진 클래스 / 메서드에 대한 포함 네임 스페이스를 찾는 방법

분류에서Dev

다른 클래스 C # Windows Forms에서 클래스를 참조하는 방법

분류에서Dev

객체가 아닌 클래스에 대한 참조 / 포인터를 얻는 방법은 무엇입니까?

분류에서Dev

BenchmarkDotNet-클래스 외부에 매개 변수를 주입하는 방법

분류에서Dev

어떻게 클래스 외부 사용자 정의 대화에 대한 onDismiss / CancelListener를 설정하는 방법?

분류에서Dev

구성 기본 키에 대한 외래 참조 키를 만드는 방법

분류에서Dev

자바 : 상속을 사용하는 외부 클래스에 대한 참조 수

분류에서Dev

C ++ 11에서 복소수의 실수 또는 상상 값에 대한 참조를 반환하는 함수

분류에서Dev

0을 제외한 모델 클래스의 배열에서 최소값과 최대 값을 얻는 방법

분류에서Dev

파이썬의 다른 클래스에서 한 클래스의 한 변수에 대한 참조를 얻는 방법은 무엇입니까?

분류에서Dev

SASS를 사용하여 동일한 요소에서 여러 하위 클래스를 참조하는 방법

분류에서Dev

다음 RecyclerView 항목에 대한 참조를 얻는 방법

분류에서Dev

현재 UITableViewCell에 대한 참조를 얻는 방법

분류에서Dev

RecyclerView-각 행의 뷰에 대한 참조를 얻는 방법

분류에서Dev

viewmodel에 대한 참조를 얻는 방법

분류에서Dev

firebase : 객체 노드에 대한 참조 키를 얻는 방법

분류에서Dev

MessagesController 클래스 외부에서 LUIS 대화 상자를 호출하는 방법

Related 관련 기사

  1. 1

    주어진 요소를 포함하는 shadowRoot에 대한 참조를 얻는 방법

  2. 2

    Scala의 내부 클래스에서 외부 개체를 참조하는 방법

  3. 3

    외부 클래스에 대한 페이지보기를 만드는 방법

  4. 4

    다른 클래스에서 예외를 얻는 방법 C #

  5. 5

    LXC 게스트에 대한 외부 IP 주소를 구성하는 방법은 무엇입니까?

  6. 6

    C # 메서드에서 제네릭 클래스 참조를 얻는 방법

  7. 7

    클래스 구현에 대한 액세스 권한이없는 외부 "플러그인"라이브러리에서 C ++ 클래스 참조 사용

  8. 8

    콜 아웃에 대한 MKPlacemark 주소를 얻는 방법

  9. 9

    Django serializer에서 참조 된 모델 대신 외래 키 ID를 얻는 방법

  10. 10

    Mac OSX에서 2 ISP의 외부 IP 주소를 얻는 방법

  11. 11

    ES6에서 클래스 함수에 대한 참조를 얻는 방법은 무엇입니까?

  12. 12

    내부 및 외부 IP 주소를 얻는 방법

  13. 13

    Visual Studio C ++ 주어진 클래스 / 메서드에 대한 포함 네임 스페이스를 찾는 방법

  14. 14

    다른 클래스 C # Windows Forms에서 클래스를 참조하는 방법

  15. 15

    객체가 아닌 클래스에 대한 참조 / 포인터를 얻는 방법은 무엇입니까?

  16. 16

    BenchmarkDotNet-클래스 외부에 매개 변수를 주입하는 방법

  17. 17

    어떻게 클래스 외부 사용자 정의 대화에 대한 onDismiss / CancelListener를 설정하는 방법?

  18. 18

    구성 기본 키에 대한 외래 참조 키를 만드는 방법

  19. 19

    자바 : 상속을 사용하는 외부 클래스에 대한 참조 수

  20. 20

    C ++ 11에서 복소수의 실수 또는 상상 값에 대한 참조를 반환하는 함수

  21. 21

    0을 제외한 모델 클래스의 배열에서 최소값과 최대 값을 얻는 방법

  22. 22

    파이썬의 다른 클래스에서 한 클래스의 한 변수에 대한 참조를 얻는 방법은 무엇입니까?

  23. 23

    SASS를 사용하여 동일한 요소에서 여러 하위 클래스를 참조하는 방법

  24. 24

    다음 RecyclerView 항목에 대한 참조를 얻는 방법

  25. 25

    현재 UITableViewCell에 대한 참조를 얻는 방법

  26. 26

    RecyclerView-각 행의 뷰에 대한 참조를 얻는 방법

  27. 27

    viewmodel에 대한 참조를 얻는 방법

  28. 28

    firebase : 객체 노드에 대한 참조 키를 얻는 방법

  29. 29

    MessagesController 클래스 외부에서 LUIS 대화 상자를 호출하는 방법

뜨겁다태그

보관