You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ main函数中调用vector存储的自定义Person类成员函数及邻居属性访问问题

问题1:构造函数外main中调用printTotals()的解决方案

可以调用,你当前报错是因为两个核心设计错误:

  • person是std::vector<Person>类型的STL容器,仅支持vector内置方法,你将printTotals()定义为Person类的普通成员函数,属于单个Person实例的方法,自然不能用vector对象直接调用
  • printTotals()的功能是统计全量Person实例的投票人数,不属于单个Person的行为,不应该定义为普通成员函数,建议改为Person类的静态成员函数,既保证模块化归属,也可以直接在main中调用

你现有代码中相关的其他错误:

  1. Person.h中的构造函数声明Person( std::vector<Person> person, maxPersons);参数maxPersons缺失int类型声明,且该构造函数用值传递vector,修改的是参数副本,main中的person向量不会被实际填充,逻辑完全错误,建议直接把初始化逻辑移到main中实现即可
  2. 类成员函数实现必须加类作用域前缀Person::,你现有getPersonVotingStatus、printTotals的实现都未加,属于全局函数,和类声明不匹配
  3. getPersonVotingStatus的实现逻辑错误,作为单个实例的成员函数,直接返回当前实例的isVoter即可,不需要传入ID,也不存在person[i]变量
  4. 代码中多处语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:15:11