VS2005,模板类,如何使用指向成员函数的指针
HI,大家好!
我正在学数据结构,写2叉树遍历。
遍历函数PreOrder,InOrde,PostOrder都写好了,测试了也都有用。
然后要求写个统计叶节点的函数
我的想法是先写一个函数 参数是MyBinaryTreeNode <T>* 然后如果该节点没有子节点 就把叶节点个数+1
最后通过任意一个遍历函数来调用这个函数
template <class T>
class MyBinaryTree()
{
int TreeSize()
{
m_treeSize=0;
PostOrder(TreeSize_1,root);
return m_treeSize;
}
void TreeSize_1(MyBinaryTreeNode <T>* p)
{
if(p->pLeft==0&&p->pRight==0) treeSize++;
}
int m_treeSize;
}
主函数中通过cout<<myTree. TreeSize()输出结果
结果
Error 1 error C3867: 'MyBinaryTree <T>::TreeSize_1': function call missing argument list; use '&MyBinaryTree <T>::TreeSize_1' to create a pointer to member d:\c++ develop\dsaa\mybinarytree\main\mybinarytree.h 72
我按照它的提示修改 仍然没用
我去网上找 说要改成静态函数或全局函数 因为修改了m_treeSize 所以明显没办法用静态函数 如果改成全局函数 又破坏了类的完整性
有什么其他好的解决办法吗?
谢谢各位了 !
[解决办法]
没有你具体的代码 无法分析 指向成员函数的指针使用可以看看这个
http://www.wangchao.net.cn/bbsdetail_65645.html
class Shape { public: //... void moveTo( Point newLocation ); bool validate() const; virtual bool draw() const = 0; //... }; class Circle : public Shape { //... bool draw() const; //... }; //... void (Shape::*mf1)( Point ) = &Shape::moveTo; //指向成员函数的指针 bool (Shape::*mf2)() const = &Shape::validate;//指向成员函数的指针 比较一下就可以发现,指向成员函数的指针的声明与其所要指向的成员函数的声明是一致的, 无论是返回类型,参数,还是const属性。 2、含义 这一点与类数据成员的指针是一致的,是一个偏移量 3、使用 同指向类数据成员的指针使用方法一样,指向成员函数的指针也需要一个具体的对象的地址,然后加上偏移量,才能够得到对应的成员函数: Circle circ; Shape *pShape = ˆ (pShape->*mf2)(); // call Shape::validate (circ.*mf2)(); // call Shape::validate 看着那一对一对的括号,是否感觉到眼花缭乱了呢?那都得怪罪"->*"和".*"的优先级没有"()"的高。 4、当虚成员函数出现时: 由于“虚”只是成员函数本身的一个属性,所以就没有指向成员函数的虚指针,因此就有如下: mf2 = &Shape::draw; // draw is virtual (pShape->*mf2)(); // call Circle::draw 可以这样理解:pShape指向Circle类的对象circ,所以(pShape->*mf2)()就调用Circle::draw,尽管 mf2赋的值是父类Shape的虚成员函数。 这在内部是如何实现的呢? 指向成员函数的指针保存了如下信息: 1)它指向的成员函数是否为虚的 2)虚函数表的人口点 3)相对于函数的this指针的偏移量(或加或减) 有了以上信息,就可以调用pShape所指向的对象的虚函数了。
[解决办法]
上面改一下
PostOrder(&MyBinaryTree<T>::TreeSize_1, root);
void PostOrder(void (MyBinary<T>::*PointerToMem)(MyBinaryTreeNode<T>*), MyBinaryTreeNode<T>* node);
[解决办法]
你这个程序问了好多次了
为什么不贴上完整的代码呢?
公司机密?