如何遍历Salesman类所有对象打印销售员姓名并计算平均薪资
解决方案
你可以通过以下两种常用方案实现Salesman类所有实例的遍历需求:
方案1:用std::vector统一管理对象(推荐新手使用,无需修改原有类结构)
这种方式不需要改动你现有的Salesman类定义,只需要在创建对象时统一存入容器即可,管理更灵活,也不容易出现内存泄漏问题。
修改后的完整代码如下:
#include <string> #include <iostream> #include <vector> // 引入vector容器头文件 class Salesman { private: int salesmanId; std::string salesmanName; int salary; std::string contactNumber; public: Salesman(); ~Salesman(); void setSalesmanDetails(int id, std::string name, int sal, std::string number); void displaySalesmanDetails(); void setSalesmanContactNumber(std::string number); // 新增两个getter方法,用于外部获取姓名和薪资 std::string getName() { return salesmanName; } int getSalary() { return salary; } }; void Salesman ::setSalesmanDetails(int id, std::string name, int sal, std::string number) { salesmanId = id; salesmanName = name; salary = sal; contactNumber = number; } void Salesman ::displaySalesmanDetails() { std::cout << "Salesman ID: " << salesmanId << std::endl; std::cout << "Salesman Name: " << salesmanName << std::endl; std::cout << "Salary: " << salary << std::endl; std::cout << "Contact Number: " << contactNumber << std::endl << std::endl; } void Salesman::setSalesmanContactNumber(std::string number) { contactNumber = number; } Salesman::Salesman() { } Salesman::~Salesman() { } int main(int argc, char *argv[]) { // 用vector存储所有Salesman对象 std::vector<Salesman> salesTeam; // 批量创建1000个对象演示,这里你可以替换为实际的数据源读取逻辑 for(int i = 0; i < 1000; i++) { Salesman s; s.setSalesmanDetails(i+1, "员工" + std::to_string(i+1), 30000 + rand()%20000, "1380000" + std::to_string(1000+i)); salesTeam.push_back(s); } // 遍历打印所有销售员姓名 std::cout << "所有销售员姓名:" << std::endl; for(const auto& s : salesTeam) { std::cout << s.getName() << std::endl; } // 计算平均薪资 long long totalSalary = 0; for(const auto& s : salesTeam) { totalSalary += s.getSalary(); } double avgSalary = (double)totalSalary / salesTeam.size(); std::cout << "平均薪资:" << avgSalary << std::endl; return 0; }
方案2:类内置静态容器自动跟踪所有实例
如果需要让类自动管理所有创建的实例,不需要外部手动存入容器,可以在类中添加静态成员变量存储所有实例的指针:
你需要在原有类中添加以下内容:
#include <vector> #include <algorithm> class Salesman { private: // 原有私有成员不变 static std::vector<Salesman*> allInstances; // 静态容器存储所有实例指针 public: // 原有公有成员不变 Salesman() { allInstances.push_back(this); // 构造时自动加入容器 } ~Salesman() { // 析构时自动从容器移除 auto it = std::find(allInstances.begin(), allInstances.end(), this); if(it != allInstances.end()) allInstances.erase(it); } // 静态方法获取所有实例 static const std::vector<Salesman*>& getAllInstances() { return allInstances; } }; // 类外初始化静态成员 std::vector<Salesman*> Salesman::allInstances = {};
之后你在任何位置都可以直接通过Salesman::getAllInstances()获取所有实例的列表,直接遍历即可。
注意:该方案需要注意线程安全问题,且如果你用new创建对象,需要手动delete避免内存泄漏。
内容的提问来源于stack exchange,提问作者Rohan Jayaraj
相关产品推荐
相关产品推荐

