C++递归函数能否调用外部函数?购物车课程项目实现咨询
问题解答
递归函数完全可以调用其他外部/成员函数,没有任何语法限制,你的需求可正常实现。
由于作业要求的ShoppingCart类对外公共接口固定,无额外入参,而递归逻辑需要传递当前遍历下标作为参数,我们通过新增私有递归辅助函数的方式实现,不会改动要求的对外接口。
第一步:修改ShoppingCart.h头文件
在类的私有部分新增两个递归辅助函数声明:
class ShoppingCart { public: ShoppingCart(); double GetCostofCart(); void PrintTotal(); private: vector< ItemToPurchase > cartItems; // 新增递归辅助函数声明 double RecurCalcCost(int index); void RecurPrintItems(int index); };
第二步:修改ShoppingCart.cpp的GetCostofCart实现
用递归替换原有for循环计算总成本:
// 递归计算购物车总成本的辅助函数 double ShoppingCart::RecurCalcCost(int index) { // 递归终止条件:遍历完所有商品 if (index >= cartItems.size()) { return 0.0; } // 计算当前商品成本 + 递归计算后续所有商品成本 double currentCost = cartItems.at(index).GetPrice() * cartItems.at(index).GetQuantity(); return currentCost + RecurCalcCost(index + 1); } double ShoppingCart::GetCostofCart() { // 从第一个商品开始递归计算 return RecurCalcCost(0); }
注:原代码中costofCart定义为int类型会丢失double精度,已修正。
第三步:修改ShoppingCart.cpp的PrintTotal实现
用递归替换原有for循环打印商品明细:
// 递归打印所有商品明细的辅助函数 void ShoppingCart::RecurPrintItems(int index) { // 递归终止条件:遍历完所有商品 if (index >= cartItems.size()) { return; } // 调用ItemToPurchase的成员函数打印当前商品 cartItems.at(index).PrintItemCost(); cout << " " << endl; // 递归打印下一个商品 RecurPrintItems(index + 1); } void ShoppingCart::PrintTotal() { if (cartItems.empty()) { cout << "Shopping cart is empty" << endl; return; } // 从第一个商品开始递归打印 RecurPrintItems(0); cout << "Total: $" << GetCostofCart() << endl; }
补充修正说明
你的ItemToPurchase.h头文件缺少必要的成员声明,需要补上才能正常编译:
class ItemToPurchase { public: ItemToPurchase(); void PrintItemCost(); // 补上getter函数声明,供ShoppingCart调用 double GetPrice(); int GetQuantity(); private: std::string itemName; // 补上itemName成员变量 double itemPrice; int itemQuantity; };
原有main.cpp、ItemToPurchase.cpp的代码无需修改,完全兼容现有调用逻辑。
内容的提问来源于stack exchange,提问作者Cheryl Nielsen
相关产品推荐
相关产品推荐

