2012-02-16 4 views
2

클래스 InternalNode의 getSurplus() 메서드에 액세스하려고합니다.인스턴스화하기 전에 메서드에 액세스

"InternalNode.h"파일에 getSurplus()가 정의되어 있습니다.

"..."은 다른 코드를 의미합니다.

InternalNode 클래스에서 getSurplus 메소드를 어떻게 참조 할 수 있습니까? children 이후

//InternalNode.h 
{ 
class InternalNode:public BTreeNode 

{ 
... 

void remove(int a); 
int getSurplus() const; 
... 
} 

} 



int InternalNode::getSurplus() const 
{ 
return (count - (internalSize + 1)/2); 
} 

// 
BTreeNode* InternalNode::remove(int value) 
{ 
... 

if (children[i]->getSurplus() >= 0) return SURPLUS; //Not correct syntax 

... 
} 
+1

'어린이'유형은 무엇입니까? –

+0

그것은'BtreeNode *'타입의 배열에 대한 포인터입니다 – Jason

답변

1

BtreeNode* 오브젝트의 배열이며, InternalNode 다음, BtreeNode로부터 유도 children[i]에서 리턴 포인터 인 사실 InternalNode 객체에 대한 포인터 (및 BtreeNode 아닌 다른 파생 개체가 제공된다), 명시 적으로 포인터를 다시 InternalNode* 유형으로 변환해야합니다. 이것은과 같이 할 수있다 :

if (static_cast<InternalNode*>(children[i])->getSurplus() >= 0) 

BtreeNode*InternalNode 객체 (즉, 그것은 다른 파생 형을 가리키는 수)를 가리키는 확실하지 경우에, 당신은에거야 dynamic_cast<InternalNode*>(children[i])을 사용해야하고 NULL이 아닌 유효한 포인터를 반환하는지 확인하십시오.

그래서 당신은 당신의 배열의 유형에 대한 확신이 있다면, 당신은 즉, 지금 BtreeNodeInternalNode의 유일한베이스 클래스가 (이 상황에서 static_cast<>()을 사용할 수 있습니다, 그것은 가상 기본 클래스 등 아니다) ... 그렇지 않으면 런타임 오버 헤드가 발생하여 안전을 원할 경우 dynamic_cast<>()을 사용하고 캐스트 작업에서 NULL 포인터 반환 값을 확인하십시오.

+0

아니요, children [i]는 BTreeNode에 ptr를 반환합니다. children = 새 BTreeNode * [크기]; – CyberShot

+0

'children'의 모든 포인터가 올바르지 않을 수있는'InternalNode'의 인스턴스라고 가정하고 있습니다. OP가 정말로 이것을 원한다면 NULL 체크와 함께'dynamic_cast'를 사용하는 것이 더 좋습니다. – Naveen

+0

당신이 그 코멘트를 타이프했을 때 저는 그것을 추가하고있었습니다 :) – Jason

관련 문제