C++实现Object类对象添加到House类及输入存储校验问题
需求说明
输入格式:标准输入依次接收
要求使用House类的add方法,将每个房屋对应的n个物品添加到House类的成员vector<Object> valuables中,需要先校验输入是否正确存储到House类,以便后续实现每个房屋内所有物品的总价求和功能。
原有代码问题
- 核心逻辑错误:读取到当前房屋的物品后,会遍历所有已创建的House实例添加物品,导致所有房屋都被添加了不属于自己的物品,归属关系完全错误
- 冗余变量:全局声明的
vector<Object> obj无实际业务作用,仅用于测试打印,可直接从House实例中读取物品信息完成校验 - 性能优化点:总价计算函数传值会产生不必要的对象拷贝,改为传常量引用更合理
修复后完整可运行代码
#include <iostream> #include <utility> #include <vector> #include <string> using namespace std; class Object { public: string valuable; float price; public: Object() : Object("",0) {} Object(string v, float p) : valuable(std::move(v)), price(p) {} string getValuable() { return valuable; } float getPrice() { return price; } }; class House{ public: string street; string city; uint32_t number; vector<Object> valuables; public: House(): House("","",0){} House(string s,string c,uint32_t n): street(std::move(s)),city(std::move(c)),number(n){} string getStreet() { return street; } string getCity() { return city; } uint32_t getNumber() { return number; } uint32_t getValuablesSize() { return valuables.size(); } Object getValuable(uint32_t x){ return valuables[x]; } void add(Object a){ valuables.emplace_back(a); } }; float getTotalPrice(const House& a) { float sum = 0; for (uint32_t i = 0; i < a.getValuablesSize(); i++) { sum += a.getValuable(i).getPrice(); } return sum; } int main() { vector<House> house_list; char street[30], city[30], obj_name[30]; float price; uint32_t house_number; int obj_count; while(cin >> street >> city >> house_number >> obj_count) { House cur_house(street, city, house_number); for(int i=0; i<obj_count; i++){ cin >> obj_name >> price; cur_house.add(Object(obj_name, price)); } house_list.push_back(cur_house); } // 校验输入存储结果+打印房屋总价 for(uint32_t i=0; i<house_list.size(); i++){ const House& cur = house_list[i]; cout << "房屋地址:" << cur.getStreet() << " " << cur.getCity() << " " << cur.getNumber() << endl; cout << "屋内物品:" << endl; for(uint32_t j=0; j<cur.getValuablesSize(); j++) { cout << "- " << cur.getValuable(j).getValuable() << " 价格:" << cur.getValuable(j).getPrice() << endl; } cout << "物品总价:" << getTotalPrice(cur) << endl << "------------------------" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Stefan Daniel
相关产品推荐
相关产品推荐

