2012-09-18 7 views
0

클래스 내에 같은 클래스의 포인터를 포함해야한다는 요구 사항이 있습니다 (링크 목록과 같은 것으로, 다음 링크의 포인터 포함). 내 요구 사항은 다음과 같습니다 :동일한 클래스 유형의 인스턴스가 포함 된 클래스

class A 
    { 
     class A* child; 
    } 

A-> child-> child가 항상 NULL이면서 아무도 변경할 수 없도록하고 싶습니다. (링크 목록에 두 개 이상의 노드가 없도록 보장).

어떤 도움이 필요합니까?

+0

'A' 개체를 가진 코드가 자식 개체를 가져올 수 있어야하지만 손주자는 가져올 수 없다는 것을 의미합니까? –

+0

내가 의미하는 바는 코드가 자식을 변경할 수 있어야한다는 것입니다. (A가 인스턴스화되면 NULL이 될 것이고 자식의 자식은 아닐 것입니다. (첫 번째 자식을 만들 때 NULL이됩니다) – Agrawal

+1

이것은입니다. "내 문제를 해결하기 위해 기괴한 일을하는 방법"- 실제 문제 대신 기괴한 문제를 논의하는 중입니다. 내게는 계층 구조의 각 수준이 근본적으로 다르게 동작하기를 원하기 때문에 다른 클래스를 사용해야합니다 다른 트리 레벨에 대한 유형 – tenfour

답변

0

는 그것은 어쨌든 하나의 링크를 사용하지 않는, 할 수 없습니다 :

당신은 프로그래밍 방식 같은 것을 통해 그 제한을 적용 할 수 있습니다. "부모"를 가리키는 링크가있는 경우 childparent 멤버 변수를 비공개로 설정 한 다음 체인의 첫 번째 객체에 두 개 이상의 링크를 추가 할 수 없도록하는 특수 액세스 기능을 사용하여 수행 할 수 있습니다 .

"부모"체인을 사용하는 것이 좋습니다 이유는 체인의 첫 번째 오브젝트가 child 체인을 확인하도록 강요 할 수 있기 때문입니다. 체인의 마지막 객체 두 개 더 그 체인에있는 자식을 추가 할 수 있습니다.

+0

기본적으로 부모 링크가 있으면 확인 할 수 있습니다 .. 부모가 NULL이면 자식이 있고 부모가있는 경우 NULL이 아니기 때문에 자식을 가질 수 없습니다. 나는 이것이 할 것이라고 생각한다. – Agrawal

3

그런 제한은 (가능하면) 어색 할 것입니다. 당신은 슬라이스를 방지해야하는 경우

A* l[3]; 

, 또는 그렇지 않으면 단순히

A l[3]; 

: 내가 대신 고정 길이 배열로 가고 싶어.

class A 
{ 
    A* child; 
public: 
    void addChild(A* newChild) 
    { 
     if (child == NULL) 
      child = newChild; 
     else if (child->child == NULL) 
      child->child = newChild; 
     else 
      throw std::exception("list is already at full capacity"); 
    } 
} 
+0

addChild를 호출 할 때 매개 변수로 전달할 newChild를 만들어야합니다. 이제 newChild-> chil입니다. d는 항상 NULL이 될 것이므로이 객체에 대해 addChild를 호출 할 수있는 사람이 아무도 없을 수 있습니다. 그렇지 않으면 호출이 오류를 반환합니다. 그래서 당신의 솔루션에서, 부모 객체 대신에 자식 객체에서 이것을 호출 할 것인지를 보장하지 않습니다. – Agrawal

+0

@Agrawal so ... 'newChild'에 추가 검사를 추가하십시오 ... –

관련 문제