C++ main函数中调用vector存储的自定义Person类成员函数及邻居属性访问问题
问题1:构造函数外main中调用printTotals()的解决方案
可以调用,你当前报错是因为两个核心设计错误:
person是std::vector<Person>类型的STL容器,仅支持vector内置方法,你将printTotals()定义为Person类的普通成员函数,属于单个Person实例的方法,自然不能用vector对象直接调用printTotals()的功能是统计全量Person实例的投票人数,不属于单个Person的行为,不应该定义为普通成员函数,建议改为Person类的静态成员函数,既保证模块化归属,也可以直接在main中调用
你现有代码中相关的其他错误:
- Person.h中的构造函数声明
Person( std::vector<Person> person, maxPersons);参数maxPersons缺失int类型声明,且该构造函数用值传递vector,修改的是参数副本,main中的person向量不会被实际填充,逻辑完全错误,建议直接把初始化逻辑移到main中实现即可 - 类成员函数实现必须加类作用域前缀
Person::,你现有getPersonVotingStatus、printTotals的实现都未加,属于全局函数,和类声明不匹配 getPersonVotingStatus的实现逻辑错误,作为单个实例的成员函数,直接返回当前实例的isVoter即可,不需要传入ID,也不存在person[i]变量- 代码中多处语法错误:
for(int = 0)缺失变量名i、if (i / 2 = 0)是赋值操作不是相等判断,应该改为i%2 == 0、返回值std::String大小写错误,应为std::string
问题2:邻居成员声明与调用的说明
std::vector<Person> neighbor的声明逻辑可行,语法上只要补全std::前缀即可正常使用,如果后续需要避免大对象拷贝,也可以改为存储Person*指针,当前需求下存值完全够用person[3].neighbor[1].getPersonVotingStatus()的调用写法完全正确,只要保证person向量长度≥4、person[3]的neighbor向量长度≥2,就可以正常取到对应第二个邻居的投票状态
修正后的可运行代码示例
Person.h
#include <iostream> #include <string> #include <vector> class Person { public: Person(); Person(int pID, float pHeight, std::string pName, std::string isV); std::string getPersonVotingStatus(); // 静态成员函数,归属Person类,不属于单个实例 static void printTotals(const std::vector<Person>& person); private: std::string personName; float personHeight; int personID; std::string isVoter; std::vector<Person> neighbor; };
Person.cpp
#include "Person.h" Person::Person() {} Person::Person(int pID, float pHeight, std::string pName, std::string isV) : personID(pID), personHeight(pHeight), personName(pName), isVoter(isV) {} std::string Person::getPersonVotingStatus() { return isVoter; } void Person::printTotals(const std::vector<Person>& person) { int totalVoter = 0; int totalNonvoter = 0; for (size_t i = 0; i < person.size(); i++) { if (person[i].isVoter == "yes") { totalVoter++; } else { totalNonvoter++; } } std::cout << "总投票人数:" << totalVoter << ",总非投票人数:" << totalNonvoter << std::endl; }
main.cpp
#include "Person.h" int main() { const int maxPersons = 10; std::vector<Person> person; // 初始化所有Person实例 for(int i = 0; i < maxPersons; i++) { std::string isVoter = (i % 2 == 0) ? "yes" : "no"; person.emplace_back(i, i + 100.0f, "testName", isVoter); // 给每个实例添加3个邻居 for(int j = 0; j < 3; j++) { int neighborId = (i + j + 1) % maxPersons; person[i].neighbor.push_back(person[neighborId]); } } // 调用静态方法统计总数 Person::printTotals(person); // 测试获取ID为3的第二个邻居的投票状态 std::cout << "ID为3的第二个邻居投票状态:" << person[3].neighbor[1].getPersonVotingStatus() << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者ithoughtso
相关产品推荐
相关产品推荐

