C++运行时创建并命名对象 实现预算APP动态添加商品条目需求
C++ 预算计算APP动态条目功能实现方案
1. 先修正完善Item类定义
你原有代码存在拼写错误(Public应为小写public),且缺少必要的成员初始化、访问接口,修正后代码如下:
#include <string> #include <ctime> class Item { private: std::string name; std::string date; int amount; float singlePrice; float totalPrice; public: // 构造函数:自动生成当前日期,计算总价 Item(std::string name, int amount, float singlePrice) : name(std::move(name)), amount(amount), singlePrice(singlePrice) { totalPrice = amount * singlePrice; // 自动生成yyyy-mm-dd格式日期 time_t now = time(0); char buf[20]; strftime(buf, sizeof(buf), "%Y-%m-%d", localtime(&now)); date = buf; } // 提供访问接口供外部读取数据 std::string getName() const { return name; } std::string getDate() const { return date; } int getAmount() const { return amount; } float getSinglePrice() const { return singlePrice; } float getTotalPrice() const { return totalPrice; } };
2. 运行时动态创建存储商品条目
不需要所谓「动态命名对象」,直接用C++标准库容器std::vector存储动态生成的Item实例即可,你可以随时通过用户输入添加新条目,不需要提前硬编码任何对象名:
#include <vector> #include <iostream> int main() { // 存储所有商品条目的容器 std::vector<Item> itemList; // 初始化总预算,可自定义或者让用户输入 float totalBudget = 5000.0f; // 示例:用户交互添加条目 while(true) { std::cout << "请输入商品名称(输入exit结束添加):"; std::string name; std::cin >> name; if(name == "exit") break; std::cout << "请输入购买数量:"; int amount; std::cin >> amount; std::cout << "请输入商品单价:"; float price; std::cin >> price; // 直接在容器尾部创建Item对象,无需提前定义变量名 itemList.emplace_back(name, amount, price); std::cout << "添加成功!\n"; }
3. 剩余可支配金额计算
遍历容器内所有条目累加总支出,用总预算减去总支出即可得到剩余金额:
// 计算总支出 float totalSpent = 0.0f; for(const auto& item : itemList) { totalSpent += item.getTotalPrice(); } float remaining = totalBudget - totalSpent; std::cout << "总预算:" << totalBudget << " 元,已支出:" << totalSpent << " 元,剩余可支配:" << remaining << " 元\n";
4. 条目数据持久化到文件
你可以将itemList内的所有数据写入本地文本文件,下次启动APP时可读取恢复:
#include <fstream> // 保存数据到文件 void saveItems(const std::vector<Item>& items, const std::string& filePath) { std::ofstream out(filePath); for(const auto& item : items) { out << item.getDate() << "," << item.getName() << "," << item.getAmount() << "," << item.getSinglePrice() << "," << item.getTotalPrice() << "\n"; } out.close(); } // 从文件加载数据 std::vector<Item> loadItems(const std::string& filePath) { std::vector<Item> res; std::ifstream in(filePath); if(!in.is_open()) return res; std::string line; while(std::getline(in, line)) { // 按逗号分隔解析字段,解析后调用emplace_back添加到res即可 } in.close(); return res; }
内容的提问来源于stack exchange,提问作者user16538261
相关产品推荐
相关产品推荐

