문제

죄송하는 경우 이 질문하기 전에,나는 용어나는 방법을 묻는 질문입니다.

는지 궁금하네요가 있는 경우 라이브러리 또는 모범 사례를 구현하는 객체 모델 C++.가 있는 경우에는 설정의 클래스의 인스턴스를 이러한 클래스할 수 있는 관계를 서고에서 액세스할 수 있습니다 각각의 기타 다양한 방법을 통해,나를 선택하려면 좋은 설정의 기초 데이터 구조를 관리한 경우와 그들의 간 관계입니다.이것은 쉬운 자바에서는 이를 처리하는 메모리 할당 및 쓰레기 수집에 대한 저지만,C++에서 내가 할 일을 자신입니다.

HTML Document Object Model DOM()한 예입니다;로(인위적인)를 들어,한 두 가지가 아닌 이러한 클래스:

  • Entity
  • Person (의 서브 클래스 Entity)
  • Couple (의 서브 클래스 Entity)
  • Property
  • House (의 서브 클래스 Property)
  • Pet (의 서브 클래스 Property)
  • Car (의 서브 클래스 Property)

그리고 이러한 관계:

  • Entity
    • 1 home 의 클래스 House
    • 는 0 이상 pets 의 클래스 Pet
    • 는 0 이상 cars 의 클래스 Car
    • 는 0 이상 children 의 클래스 Person
  • Person
    • 가 0 또는 1 spouse 의 클래스 Person
    • 가 0 또는 1 marriage 의 클래스 Couple
    • 가 0 또는 1 parents 의 클래스 Entity (이 모델에서 부모 없는 존재하지 않는 경우 살아있다!)
  • Couple
    • 2 members 의 클래스 Person
  • Property
    • 1 owner 의 클래스 Entity

지금 하는 생각했는데 이러한 물체와의 관계,내가 만들기 시작하려면 사용자 인터페이스를 가지고 방법 및 분야를 처리하고 여기가 길을 잃기 때문가격으로 메모리 할당 및 평생을 관리하고 모든 물건입니다.당신이 문제로 실행할 수 있습이 다음과 같습니다.내가 할 수 있습 객체를 넣으로 std::mapstd::vector, 하지만 내가 할 경우는,나는 저장할 수 없습니다 포인터를 해당 개체할 수 있으므로 이전할 때도 또는 벡터장 또는 줄어듭니다.

방법 중 하나 내가 사용되었을 때 일 COM 많은 숨겨진된 컬렉션을 포함하는 모든 것입니다.각 객체에서 컬렉션이 있었는 고유 ID(숫자 또는 name)에 의해,그것이 될 수 있을 보 컬렉션에서,그리고 각각의 개체를 갖고 있는 포인터 컬렉션입니다.는 방법이 있을 경우 객체는 원하는 포인트를 다른 객체를 대신 그대로를 들고 포인터를 다른 개체로,나는 저장하는 ID 와은 그것을 찾을 수 있습을 통해 숨겨진 컬렉션입니다.내가 사용할 수 있습니 참조-계산하는 자동으로 처리 수명 문제(제외한 케이스의 연결이 끊긴 주기 때때로 그의 문제가 되지 않음).

이 있는 다른 방법?또는 있는 라이브러리는 이런 종류의 물건에서 쉽게 C++?

편집: 다음과 같은 다른 문제를 간의 관계 개체될 가능성이 높은 변경 가능한 많은 경우에,당신은 앞서 생각하는 방법에 대한 개체에 대한 참조를 저장되어야 하며,어떤 방법을 제공해야 하는지에 대한 액세스 개체입니다.예를 들어,이 있는 경우를 처리하는 Person X,그리고 내가 원하는 대표하의 개념을 찾아"X 의 아이지"다음을 저장소 이름은"조지"보다는 오히려 아동:어린이들에 저장될 수 있는 벡터와 있는 전화 X.getChildCount()및 X.getChild(0)지만"조지"항상 수 없습니다 아이 수가 0 이후,다른 아이들에 삽입될 수 있기 전에"조지에서"아동 벡터입니다.나 X 있는 두 개 또는 세 개 또는 네 개의 다른 아이들도 이름이"조지".또는"조지"변경될 수 있습 그의 이름을"Anthony"또는"조지나".이러한 모든 경우에 그것은 아마도 더 나은 사용하는 일종의 독특한 불변의 ID 입니다.

edit2: (나는 깨끗한 내 질문에 조금이라이 밖으로 곧게)내가 다룰 수 있는 방법의 선택과 재산의 이름을 내가 다룰 수 있는지 여부를 사용하지도 또는 목록 또는 벡터입니다.는 매우 간단합니다.문제를 하려고 해요 다루는 특별히 있다:

  • 어떻게 해야 하나의 객체 저장에 대한 참조 다른 객체를 때,해당 개체의 일부가 될 수 있습니다 데이터 구조는 할당
  • 을 처리하는 방법 개체 수명 동안 관리가있을 때,상호 관계를 사체
도움이 되었습니까?

해결책

당신이 쓴 저장에 대한 개체에서 객체 모델의 내부에는 std::벡터 등등.그리고 문제를 사용하여 포인터를니다.는 생각 나게는 그것의 좋은 분할의 C++클래스는 두 가지 범주로(나에 대한 확실하지 않은 용어는 여기):

  1. 엔터티 클래스 을 나타내는 개체는 일부 개체의 모델입니다.그들은 일반적으로 다형 또는 잠재적으로 미래에있을 것입니다.그들은 생성에 힙고 항상 참조하여 포인터 또는 스마트 포인터입니다.지 직접 만들에 스택으로 클래스/구조체 회원들이나 직접 넣어에서 같은 컨테이너 std::벡터입니다.그들이 없는 사본을 생성자나 운영자=(을 만들 수 있는 새로운 복사본으로부 복제 방법).당신이 그들을 비교할 수 있습(자국)의 경우 의미가 있는지만 교환할 수 있기 때문에 정체성입니다.각각 두 개체들이 구분되어 있습니다.

  2. 구현하는 원시적인 사용자 정의 형식(문자열,복소수,큰 숫자로,스마트 포인터,손잡이 래퍼,etc.).그들이 직접 만들에 스택 또는 클래스/구조체의 멤버입니다.그들은 복사할 수 없으로 복사본을 생성자와 연산자=.그들은 다형(polymorhism 및 연산자=잘 작동하지 않는 함께).당신은 종종 자신의 복사본을 내부 stl 컨테이너입니다.당신이 거의 저장소의 포인터에서 그들에게 독립니다.그들이 교환할 수 있습니다.때 두 개의 인스턴스 값이 같은,당신은 그들을 치료할 수 있으로 동일합니다.(변수를 포함하는 그들은 다른 일을 하지만입니다.)

많은 아주 좋은 이유 위에 휴식 규칙이 있습니다.그러나 저는 관찰을 무시하고 그 시작에서 리드하는 프로그램을 읽을 수 없 신뢰성(특히 메모리 관리)및을 유지하기 어렵다.


이제 당신의 질문입니다.

을 저장하려는 경우에는 데이터 모델과 복잡한 관계를 할 수있는 가장 쉬운 방법과 같은 쿼리를 찾을 수"X 의 아이지"왜 고려하지 않을 몇 가지 메모리에 관계형 데이터베이스?

는 경우에는 것을 효율적으로 구현 a)더 복잡한 양방향 관계를 그리고 b)쿼리를 기반으로 다른 객체 속성에,당신은 아마를 만들 필요가 인덱스는 데이터 구조는 것과 매우 유사한 관계형 데이터베이스 내부입니다.은 당신의 구현을(있을 것이 많은,단일 프로젝트)를 더 효과적이고 강력한 무엇입니까?

같은"컬렉션의 모든 것을"그리고 객체 id 입니다.당신을 추적해야 합 개체 간의 관계를 피하 id 없이 어쨌든 물체.그것은 어떻게 다른 점?기타 다음이 의미있는 오류를 대신 미친을 통해 모든 메모리,즉;-)


몇 가지 아이디어에 대한 메모리 관리:

  • 강한 소유권:을 때 선언할 수 있습니다 일부는 엔티티만큼의 소유자의 가능성은 없는 독립적으로 기존의 포인터를,그것은 당신을 삭제할 수 있습 그것에 소유자의 소멸자(또는 scoped_ptr).

  • 누군가가 이미 제안 smart_ptr.그들은 함께 사용할 수 있습니 stl 컨테이너입니다.그들은 참조 couter 기반으로하지만,이렇게 만들지 않 주기:-(.나는 모든 사적으로 사용되는 c++자동적인 포인터를 처리할 수 있는 주기입니다.

  • 어쩌면 몇 가지 최고 수준의 객체를 소유하고 다른 모든 개체입니다.예를 들어.자주 당신이 말할 수 있는 모든 조각에 속하는 문서 또는 알고리즘이나 트랜잭션이 있습니다.그들은 만들 수 있습에서의 컨텍스트 상위 수준의 개체고 다음 자동으로 삭제될 때 그들의 최고 수준의 객체가 삭제됩니다(때를 제거할 문서를 메모리 또는 실행이 완료되는 알고리즘의).물론 공유할 수 없습니다 조각 사이에 최고 수준의 개체입니다.

다른 팁

대만(에서 보수적인 추정)방법이 있다.당신이 정말로 요청"나는 어떻게 디자인 소프트웨어는 C++에서".그리고 그 대답은,나는 두려워,"무엇이 당신의 소프트웨어떻게 하시겠습니까?" -간단하게 아는 거래를 원하는 사람과 집은 충분하지 않습니다.

지 않는 이 전체적인 포인트의 객체 지향 프로그래밍?는 당신이 무엇을 요청하는 구현에 관한 세부 정보,당신 뒤에 숨어 공용 인터페이스의 이러한 클래스고,따라서 수행에 대해 걱정할 필요가 없기 때문에,당신은 그것을 변경할 수 있습을 변경하지 않고 인터페이스가 있습니까?그래서 앞서,그것을 시도하는 방법을 제안합니다.음이 있는 경우의 성능,메모리 또는 기타 문제를 해결할 수 있습니다,구현 없이 파괴하지 않고 나머지 부분의 코드입니다.

그것은 나에게 보이는 데이터를 저장하는 데이터베이스에서,그리고 사용하여 어떤 종류의 개체-관계형 매핑을 수 있는 또 다른 옵션입니다.

당신이 사용할 수 있 부스트::shared_ptr 주소로 메모리 문제를 해결합니다.할 수 있습니다 다음을 자유롭게 복사 shared_ptr 주위에,그것을 반환 함수에서 사용하고,그것으로의 지역 변수,등등.

A Person 할 수 있 다음 std::map< string, boost::shared_ptr<Person> >, 래 X.getChild("George") 단순히 찾을 아이에게도 반환하고 포인터이다.나는 당신을 얻을 개념,그래서 떠날 것으로 나머지는 운동이다;당신)

제이슨,내가 가장 좋아하는 소스입 C++FAQ 예약.문제입니다 당신이 효과적으로 요청"어떻게 사용할 수 있습니 C++을 위한 객체 지향 프로그래밍이 가능한가요?"

최고 말할 수 있는 그래서 대답은 이:

이 모든 것을 하려고 클래스에서는 C++및 관계 등을 볼 것이 많은 쓰레기와 같이 수집한 언어 당신을 사용:필요한 경우 사이의 관계는 사람과 자신의 자녀"라는 조지",당신이 선택한 데이터 구조를 저장할 수 있는 사람이나 차에 의해 색인 이름입니다.

메모리 관리 실제로 보다 쉽게 스트레 C 는 경우에,당신은 몇 가지 규칙을 따르십시오:지 확인하는 모든 객체를 필요로 그들이 소멸자는지 확인의 소멸자가 깨끗한 모든 개체가 소유하고 있는지 확인 후,당신은 항상 이러한 동적으로 생성 개체를 상황에서 그들이 범위를 벗을 때 그들은 더 이상 필요하지 않습니다.그루지 않다 모든 경우에,하지만 그들은 당신을 저장하에서 아마의 80 퍼센트는 메모리 할당 실수를 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top