2012-02-16 17 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*オブジェクトの配列であり、そしてInternalNodeBtreeNode由来し、次いでchildren[i]から返されたポインタがイン事実InternalNodeオブジェクト(としないBtreeNodeのいくつかの他の派生オブジェクトへのポインタであることを条件とします)、ポインタを明示的にタイプInternalNode*にキャストする必要があります。これがそうのように行うことができる:

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

あなたは、各BtreeNode*InternalNodeオブジェクト(すなわち、それは他のいくつかの派生型を指すことができる)を指しているわからないている場合は、するつもりですdynamic_cast<InternalNode*>(children[i])を使用して、操作がNULLではなく有効なポインタを返すことを確認する必要があります。

あなたは配列のタイプについて絶対に確信している場合、あなたはこのような状況(すなわち、中static_cast<>()を使用することができ、今BtreeNodeInternalNodeの唯一の基本クラスであるので、それはなど、仮想基底クラスではありません)...そうでなければ、実行時のオーバーヘッドを犠牲にして安全にしたい場合は、dynamic_cast<>()を使用し、キャスト操作からNULLポインタ戻り値を確認してください。

+0

いいえ、children [i]はBTreeNodeにptrを返します。子=新しいBTreeNode * [サイズ]; – CyberShot

+0

'children'内のすべてのポインタが' InternalNode'のインスタンスであると仮定していますが、これは正しくない可能性があります。 OPが本当にこれをやりたいのであれば、NULLチェックで 'dynamic_cast'を使うほうが良いと思います。 – Naveen

+0

あなたがそのコメントを入力したときにそれを追加していました:) – Jason

関連する問題