赛博键盘侠 2023-06-28 21:00 采纳率: 50%
浏览 27
已结题

C++中如何在一个函数中调用另一个函数list容器创建的数据?

在黑马程序员C++课程中list容器部分有一个案例:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高;排序规则为按年龄升序,且当年龄相同时按照身高降序。
起初我先是创建Person类,然后我打算用一个赋值函数去赋值并打印数据:

class Person {
public:
    Person(string name, int age, int height) {
        this->m_name = name;
        this->m_age = age;
        this->m_height = height;
    }
    string m_name;
    int m_age;
    int m_height;
};
//赋值
void creatperson(list<Person>L){
    string nameseed = "ABCDEFG";
    for (int i = 0; i < 7; i++)
    {
        string name = "人物";
        name += nameseed[i];
        int age = 0;
        age = rand() % 16 + 20;
        int height = 0;
        height = rand() % 41 + 150;
        Person p(name, age, height);
        L.push_back(p);
    }
    //show
    cout << "排序前顺序:" << endl;
    for (list<Person>::iterator lit = L.begin(); lit != L.end(); lit++) {
        cout << "姓名:" << lit->m_name << "年龄:" << lit->m_age << "身高:" << lit->m_height << endl;
    }
}

然后并用另一个函数按照排序规则进行排序:

//排序规则
bool my_compare(Person &p1,Person &p2) {
    if (p1.m_age == p2.m_age)
    {
        return p1.m_height > p2.m_height;
    }
    else {
        return p1.m_age < p2.m_age;
    }
}
//排序并打印
void mysort(list<Person>L) {
    L.sort(my_compare);
    cout << "排序后顺序:" << endl;
    for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
        cout << "姓名:" << it->m_name << "年龄:" << it->m_age << "身高:" << it->m_height << endl;
    }
}

我发现打印的时候排序函数里面打印不到数据,然后我把排序函数整个内容搬到main()里,还是无法正常输出,但是在我把这些全部合并成一个函数后,就能够正常输出打印,所以我推测赋值函数中的L和排序函数中的L之间并没有关联到一起。
所以我想请教一下大家,如何在不整合的情况下在排序函数里调用赋值函数里L的数据?

  • 写回答

2条回答 默认 最新

  • 三季人 G 2023-06-28 21:33
    关注

    在C++中,函数参数传递默认是按值传递的,这意味着函数接收到的是实参的副本。在你的代码中,creatperson()和mysort()函数中的L参数是通过按值传递的方式接收的,因此对它们进行的修改不会影响到原来的list容器。

    为了解决这个问题,你可以通过以下两种方式传递参数:

    1. 通过引用传递参数:
    1. 通过指针传递参数:
      修改函数的参数类型,将其改为指向容器的指针类型。通过指针可以直接操作原始容器对象。

    在你调用这些函数时,需要使用容器对象的地址或指针来传递参数。示例代码如下:

    使用引用或指针传递参数可以确保在函数内部对容器的修改能够影响到原始对象,从而在排序函数中正确访问和操作容器中的数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月6日
  • 已采纳回答 6月28日
  • 创建了问题 6月28日

悬赏问题

  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物