2012-02-16 68 views
2

我想访问类InternalNode的getSurplus()方法。在实例化之前访问方法

我有getSurplus()在“InternalNode.h”文件中定义。

“...”表示其他代码。

如何从InternalNode类引用方法getSurplus?

//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

“children”的类型是什么? – 2012-02-16 04:31:15

+0

这是一个指向“BtreeNode *”类型数组的指针 – Jason 2012-02-16 04:40:53

回答

1

由于childrenBtreeNode*对象的数组,并InternalNodeBtreeNode衍生,然后只要从children[i]返回的指针是在-事实一个指向InternalNode对象(而不是BtreeNode一些其它派生对象),您必须将指针明确地转换回InternalNode*类型。可以这样做,像这样:

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

如果你是每个BtreeNode*指向的InternalNode对象(即,它可以被指向一些其他派生类型)不知道,那么你要必须使用dynamic_cast<InternalNode*>(children[i]),并检查以确保操作返回有效指针,而不是NULL

所以,如果您在数组中是绝对肯定的类型,那么你可以在这种情况下使用static_cast<>()(即现在BtreeNode是唯一的基类的InternalNode,它不是一个虚基类等。)...否则,如果您想以某些运行时间开销为代价保证安全,请使用dynamic_cast<>()并检查铸造操作中的NULL指针返回值。

+0

不,子[i]返回一个ptr给BTreeNode。 children = new BTreeNode * [size]; – CyberShot 2012-02-16 04:30:33

+0

你假设'children'中的所有指针都是'InternalNode'的实例,可能不正确。如果OP真的想这样做,我觉得最好使用带有NULL检查的'dynamic_cast'。 – Naveen 2012-02-16 04:37:13

+0

我在添加,因为你输入该评论:) – Jason 2012-02-16 04:37:50