C ++ 스마트 포인터로 다 대다 / 양방향 참조 구조화

티탄 드라 케

나는 아직 C ++를 몰랐기 때문에 C ++로 프로젝트를하기로 결정했습니다. 가능한 한 모든 것을 C ++에서 수행하려고합니다. 즉, 원시 포인터가 거의 없음을 의미합니다.

개체 컬렉션을 구성하는 방법에 문제가 있습니다. 공정한 경고입니다.이 설명은 매우 추상화 될 것입니다.

  • 정확히 하나의 클래스 인스턴스가 있습니다. 그것을 부르 자Foo
  • 이것은 Foo클래스의 많은 객체를 보유 할 필요가 있습니다 Bar. 빠른 삽입 및 삭제가 필요하고 주문이 필요하지 않아 세트를 사용하고 싶습니다.
  • 각각 Bar은 정확히 4 개의 유형의 객체를 소유 Baz하며 초기화시 생성 및 수정됩니다.
  • 각각 Baz은 다른 많은 유형의 개체에 대한 포인터를 가지고 Baz있습니다. Baz도에 대한 참조가 있어야 Bar구현 이유로 그것을 소유.
  • 기존 Baz객체가 주어지면 의 세트 Bar에서 해당 객체 를 제거하고 그에 Foo따라 메모리를 해제해야합니다. (나는 제거시 Baz소유에 대한 객체가 소유 한 Bar다른 Baz객체를 가리키는 알고리즘 적 보증 이 있습니다 Bar)

이를 구현하려는 방법은 Foo에 대한 고유 한 Bar 포인터 세트, 다 대다 Baz 관계를 처리하기위한 공유 포인터, Bar 개체 당 4 개의 Baz-> Bar 관계에 대한 일반 참조를 저장하는 것입니다. 문제는 내가 더 이상 줄을 얻을 수있는 방법이 없다는 것입니다 unique_ptr으로부터 Baz개체를. 참조가 있지만 세트 제거 방법은를 예상 unique_ptr하므로 쉽게 제거 할 수 없습니다. 수동 포인터 / 메모리 관리에 의존 할 필요가없는이를 구조화하는 더 좋은 방법이 있습니까?

갈릭

솔직히 말해서 모든 개체가 이미 컨테이너에 의해 관리되기 때문에 여기에서 스마트 포인터가 필요하지 않다고 생각합니다. 따라서 삭제가 보장됩니다.

그래서 그냥 원시 포인터를 사용하고 컨테이너가 작업을 수행하도록합니다.

struct Baz
{
    struct Bar& bar;
    std::vector<Baz*> bazs; // no need to be smart - deleted elsewhere
    Baz(Bar& bar): bar(bar) {} // don't use bar in this constructor!
};

struct Bar
{
    std::array<Baz, 4> bazs;
    Bar(): bazs({*this, *this, *this, *this}) {}
};

struct Foo
{
    std::vector<Bar> bars;
};

그들이 가리키는 개체가 스마트 포인터 또는 컨테이너에 의해 관리되는 한 원시 포인터를 사용하는 데 아무런 문제가 없습니다.

std::vector이 예에서는 사용했지만 적절하다고 생각 되는 것을 사용 합니다. CPU 캐싱과 잘 작동하는 연속 메모리를 사용하기 때문에 std::vectors경쟁 할 수 있다고 생각 std::set합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++의 매개 변수로 스마트 포인터보다 스마트 포인터에 대한 참조를 선호해야하는 이유

분류에서Dev

C ++의 스마트 포인터에 대한 댕글 링 참조

분류에서Dev

구조체에 대한 포인터를 이해하면 액세스 할 때 c의 포인터 멤버를 참조합니다.

분류에서Dev

세트의 스마트 포인터에 대해 역 참조가 작동하지 않습니다.

분류에서Dev

다른 구조에 대한 참조를 포함하는 C 구조

분류에서Dev

C ++ 참조 다운로드

분류에서Dev

C ++ 오류 : 포인터를 참조로 변환 할 수 없습니다 (Netbeans).

분류에서Dev

C ++에서 getadrinfo에 유효한 참조로 포인터를 전달합니다.

분류에서Dev

유형이 스마트 포인터인지 또는 스마트 포인터에 대한 참조인지 확인하는 방법

분류에서Dev

조건에 따라 다른 양으로 지터 포인트

분류에서Dev

루트에 대한 이진 트리 포인터를 참조하고 역 참조해야합니다. 왜?

분류에서Dev

c에서 포인터를 역 참조 할 때 다른 값

분류에서Dev

C ++ 람다 포인터 / 참조 메모리 점유 문제

분류에서Dev

포인터 참조 초기화에 대한 Visual C ++ 구문 오류

분류에서Dev

클래스에 대한 모든 참조를 해당 인터페이스에 대한 참조로 바꿉니다.

분류에서Dev

함수에서 다른 포인터를 참조하는 C 포인터

분류에서Dev

Git bash 로그인 "오류 : src 참조 사양 마스터가 일치하지 않습니다"

분류에서Dev

다양한 클래스 유형의 노드에 대한 C ++ 트리 / 포레스트 구조

분류에서Dev

포인터에 대한 참조 C ++에서 스왑

분류에서Dev

양방향 참조

분류에서Dev

다양한 유형의 구조 변수에 대한 C ++ 인덱스 액세스

분류에서Dev

Highcharts에서 다른 시리즈의 데이터 포인트 (또는 포인트)를 참조하는 방법

분류에서Dev

C ++ 구조체 포인터 역 참조

분류에서Dev

C ++ 참조를 기본 포인터에 대한 참조를 파생 된 포인터로 변환

분류에서Dev

참조 / 포인터를 Rust 구조에 C ffi 인터페이스로 전달하는 방법은 무엇입니까?

분류에서Dev

Eigen을 사용하여 C ++에서 벡터 및 방향을 다른 참조로 표현

분류에서Dev

for 루프에서 생성 된 C ++ 다형성 포인터는 동일한 것을 참조합니다. 스마트 포인터를 사용하지 않기 때문입니까?

분류에서Dev

PHP에서 다중 "참조"(객체 포인터)에 대한 컨텍스트는 무엇입니까?

분류에서Dev

데이터베이스 설계 다 대다 및 소유 참조

Related 관련 기사

  1. 1

    C ++의 매개 변수로 스마트 포인터보다 스마트 포인터에 대한 참조를 선호해야하는 이유

  2. 2

    C ++의 스마트 포인터에 대한 댕글 링 참조

  3. 3

    구조체에 대한 포인터를 이해하면 액세스 할 때 c의 포인터 멤버를 참조합니다.

  4. 4

    세트의 스마트 포인터에 대해 역 참조가 작동하지 않습니다.

  5. 5

    다른 구조에 대한 참조를 포함하는 C 구조

  6. 6

    C ++ 참조 다운로드

  7. 7

    C ++ 오류 : 포인터를 참조로 변환 할 수 없습니다 (Netbeans).

  8. 8

    C ++에서 getadrinfo에 유효한 참조로 포인터를 전달합니다.

  9. 9

    유형이 스마트 포인터인지 또는 스마트 포인터에 대한 참조인지 확인하는 방법

  10. 10

    조건에 따라 다른 양으로 지터 포인트

  11. 11

    루트에 대한 이진 트리 포인터를 참조하고 역 참조해야합니다. 왜?

  12. 12

    c에서 포인터를 역 참조 할 때 다른 값

  13. 13

    C ++ 람다 포인터 / 참조 메모리 점유 문제

  14. 14

    포인터 참조 초기화에 대한 Visual C ++ 구문 오류

  15. 15

    클래스에 대한 모든 참조를 해당 인터페이스에 대한 참조로 바꿉니다.

  16. 16

    함수에서 다른 포인터를 참조하는 C 포인터

  17. 17

    Git bash 로그인 "오류 : src 참조 사양 마스터가 일치하지 않습니다"

  18. 18

    다양한 클래스 유형의 노드에 대한 C ++ 트리 / 포레스트 구조

  19. 19

    포인터에 대한 참조 C ++에서 스왑

  20. 20

    양방향 참조

  21. 21

    다양한 유형의 구조 변수에 대한 C ++ 인덱스 액세스

  22. 22

    Highcharts에서 다른 시리즈의 데이터 포인트 (또는 포인트)를 참조하는 방법

  23. 23

    C ++ 구조체 포인터 역 참조

  24. 24

    C ++ 참조를 기본 포인터에 대한 참조를 파생 된 포인터로 변환

  25. 25

    참조 / 포인터를 Rust 구조에 C ffi 인터페이스로 전달하는 방법은 무엇입니까?

  26. 26

    Eigen을 사용하여 C ++에서 벡터 및 방향을 다른 참조로 표현

  27. 27

    for 루프에서 생성 된 C ++ 다형성 포인터는 동일한 것을 참조합니다. 스마트 포인터를 사용하지 않기 때문입니까?

  28. 28

    PHP에서 다중 "참조"(객체 포인터)에 대한 컨텍스트는 무엇입니까?

  29. 29

    데이터베이스 설계 다 대다 및 소유 참조

뜨겁다태그

보관