请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于typename Graph

图片描述
这里实在是不明白为什么这么写,Graph具体指什么?什么是成员变量,什么是类型?不应该先include"SparseGraph",然后再SparseGraph::adjIterator吗?

正在回答 回答被采纳积分+3

1回答

liuyubobobo 2021-06-04 04:29:55

Graph 是这个类的泛型,用户在调用的时候,可以传来 SparseGraph,也可以传来 DenseGraph。


Graph 的声明在 14 行:https://git.imooc.com/coding-71/coding-71/src/master/07-Graph-Basics/Course%20Code%20%28C++%29/05-DFS-and-Components/Components.h


对 Component 类的创建,在16,21,30,35 行,尖括号里的类会成为 Component 类中的 Graph:https://git.imooc.com/coding-71/coding-71/src/master/07-Graph-Basics/Course%20Code%20%28C++%29/05-DFS-and-Components/main.cpp


typename Graph::adjIterator adj(G, v);

中,类别是:typename Graph::adjIterator,变量名称是 adj,创建 adj 要的两个参数是 G 和 v。


为什么这样写?因为通过这个方式,这个类即兼容 SparseGraph,又兼容 DenseGraph。用户处理的图如果是稀疏图,创建 Components 的对象的时候,就用 SparseGraph;用户处理的图如果是稠密图,创建 Components 的对象的时候,就用 DenseGraph。


如果使用 SparseGraph::adjIterator 的方式,相当于把这个类写死了,只能用于 SparseGraph 了。


不过在这里,如果对这个语法不适应,你完全可以写死,让 Components 类只兼容 SparseGraph。这不影响对算法的理解。实际上,我也发现我在这里的代码由于过于追求工程上的高复用性,反而由于使用的语法太复杂,把一些同学绕晕了,忽视了算法的学习。对于这个课程的学习,还是主要要关注算法,语言方面是次要的。模板本来就是 C++ 语言中比较难理解的一部分,这一部分也不是这个课程的重点。可以参考这里:https://coding.imooc.com/learn/questiondetail/vZ85pzYG9Rk6n0rV.html


我后续在出专门的图论课程之后,吸取了这个教训,在代码上更注重算法本身,而一定程度忽视了工程型。如果感兴趣可以参考这里(这个课程是使用 Java 讲解的):https://coding.imooc.com/class/370.html


继续加油!:)

2 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号