调用访问私有std::string列表的公共成员函数报错求助
问题分析与解决方案
核心错误原因
- 成员函数调用方式错误:
main中误将bestsellingcars和expensivecars当作std::list对象调用.push_back(),但它们是接受字符串参数的void成员函数,需直接传参调用。 - 构造函数赋值逻辑颠倒:构造函数内把成员变量赋值给参数,而非反过来;且初始化
carsinStock时创建了局部变量,未修改类成员。 - 循环变量与成员变量重名:
info()的for循环中,循环变量名和成员std::list同名,导致局部变量覆盖成员变量,无法正确遍历列表。 - 缺失必要头文件:代码使用
std::string、std::list、std::cout,未包含对应标准库头文件。
修正后的完整代码
#include <iostream> #include <string> #include <list> using namespace std; class carCompany{ string name; string owner; int carsinStock; list<string> bestsellingCars; list<string> expensiveCars; public: carCompany(string Name, string Owner) { name = Name; owner = Owner; carsinStock = 0; } void info() { cout << "Autocompany name: " << name << endl; cout << "Company Owner: " << owner << endl; cout << "Total cars available: " << carsinStock << endl; cout << "best selling cars: " << endl; for(const string& car : bestsellingCars) { cout << car << endl; } cout << "Expensive cars : " << endl; for(const string& car : expensiveCars) { cout << car << endl; } } void importCars() { carsinStock++; } void exportCars() { carsinStock--; } void bestsellingcars(string cars) { bestsellingCars.push_back(cars); } void expensivecars(string cars) { expensiveCars.push_back(cars); } }; int main(){ carCompany autocomp("Tesla", "Elon Musk"); autocomp.bestsellingcars("Tesla i"); autocomp.expensivecars("Tesla ins"); autocomp.info(); carCompany rashidMotors("Rashid motors", "Rashid Abu Bakar"); rashidMotors.bestsellingcars("Porche"); rashidMotors.expensivecars("Porche carrera"); rashidMotors.info(); return 0; }
关键修改点说明
成员函数调用修正:
原错误写法:autocomp.bestsellingcars.push_back("Tesla i");修正后直接传入字符串参数:
autocomp.bestsellingcars("Tesla i");因为
bestsellingcars内部已封装push_back逻辑,无需额外调用列表方法。构造函数修正:
交换赋值顺序,去掉局部变量声明,直接初始化类成员变量,确保对象属性正确设置。循环变量修正:
将循环变量名改为car,避免与成员列表同名导致的作用域覆盖,同时使用const string&提升遍历效率。头文件补充:
添加<iostream>、<string>、<list>三个标准库头文件,保证标准库类型和函数可正常编译。
内容的提问来源于stack exchange,提问作者Gi Gichaa
相关产品推荐
相关产品推荐

