C++ GraphNode结构体实例化对比与成员函数相关问题求解
问题解答
1. FindEdgeForRoute返回值疑问
首先明确:FindEdgeForRoute是GraphNode的成员函数,不是迭代器,它的返回值是存储std::shared_ptr<GraphEdge>类型元素的vector的const迭代器,和存储普通类型的vector迭代器不同,该迭代器解引用后得到的是GraphEdge类型的智能指针。
2. 两种初始化写法是否等效
两者不完全等效,差异如下:
- 存储位置与生命周期不同:原写法通过
std::make_shared在堆上创建GraphNode实例,返回的node是std::shared_ptr<GraphNode>智能指针对象,托管的堆对象生命周期由引用计数控制;你写的写法是在栈上创建普通GraphNode对象,函数执行结束后就会自动销毁。 - 成员赋值存在错误:你写的代码中给
passengerNumber赋值,但结构体定义的对应成员名是passengerCount,会直接编译报错。 - 未显式初始化的成员:你写的代码没有给
edges成员赋值,但结构体定义时edges有默认初始化{},所以该成员会被初始化为空vector,这部分如果修正成员名错误后,最终成员的值和原写法的临时对象成员值一致。
3. FindEdgeForRoute函数实现示例
你可以参考如下代码实现该成员函数,逻辑为遍历所有边,匹配到对应线路的边就返回对应迭代器,未匹配到返回尾后迭代器:
// 注意要在函数名前加GraphNode::类作用域限定 std::vector<std::shared_ptr<GraphEdge>>::const_iterator GraphNode::FindEdgeForRoute(const std::shared_ptr<RouteInternal>& route) const { for (auto iter = edges.cbegin(); iter != edges.cend(); ++iter) { // 此处匹配逻辑可根据你的实际业务调整 // 示例假设GraphEdge类有存储关联线路的shared_ptr<RouteInternal>类型成员route if ((*iter)->route == route) { return iter; } } // 未找到匹配项,返回尾后迭代器 return edges.cend(); }
如果你的匹配逻辑是比对线路ID而非直接比对智能指针地址,修改if判断条件即可,例如:if ((*iter)->route->id == route->id)。
内容的提问来源于stack exchange,提问作者aldo
相关产品推荐
相关产品推荐

