慎&独 2022-11-25 19:37 采纳率: 87.5%
浏览 1
已结题

不理解对应位置的报错原因

该题是求两个集合的并集。
报错原因已在代码中标注,有点看不懂报错原因。
那应该怎么写呢?

用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

#include<iostream>
using namespace std;
class CSet
{
public:
    int n;
    int* data=NULL ;
    CSet(int n) :n(n)
    {
        data = new int[n];
    }
    CSet operator+(CSet& set);
    int datain();
};
int CSet::datain()
{
    int a[100];
    data = a;
    for (int i = 0; i < n; i++)
    {
        cin >> data[i];
    }
    return 0;
}
CSet CSet :: operator+(CSet& set)//求出A和B的并集
{
    int m;
    set.data = new int[m];
    for (int i = 0; i < n; i++)//向set.data[m]中补充
    {
        for (int j = 0; j < m; j++)
        {
            if (data[i] == set.data[j])
            {
                continue;
            }
        }
        set.data[m++] = data[i];//错误原因:写入set.data时缓冲区溢出

    }
    for (int i = 0; i < m; i++)
    {
        cout << set.data[i] << " " << endl;//错误原因:正在从set.data读取无效数据
    }
    return set;
}
int main()
{
    int n1, n2;
    cin >> n1 >> n2;
    CSet A(n1), B(n2);
    A.datain();
    B.datain();
    A.operator+(B);

    return 0;
}

  • 写回答

3条回答 默认 最新

  • 千册 Linux领域新星创作者 2022-11-25 20:37
    关注

    修改后的代码,修改原因写在注释里了,后面有执行结果。

    
    #include <iostream> //第一行补齐头文件
    using namespace std;
    class CSet
    {
    public:
        int n;
        int* data=NULL ;
        CSet(int n) :n(n)
        {
            data = new int[n];
        }
        CSet operator+(CSet& set);
        int datain();
    };
    int CSet::datain()
    {
        //这个数组是栈内存,data是类的指针,已经在构造函数中data = new int[n];申请过内存了
        //栈内存,退出函数就无效了,所以这样写打印出的是乱码。
        //int a[100];
        //data = a;
        for (int i = 0; i < n; i++)
        {
            cin >> data[i];
        }
        return 0;
    }
    CSet CSet :: operator+(CSet& set)//求出A和B的并集
    {
        //求并集,拿出一个B的元素,看看A里有没有,如果没有,就放入A中。有,就继续从B中再拿一个。
        //这里的意图是不是,m代表B集合的元素数量啊?
        int m = set.n;
        int count = this->n;//增加一个变量用于计算合并后的总数。
        //set.data = new int[m]; //这里的data已经在初始化时,使用int申请空间了,无需再次申请内存
        for (int i = 0; i < m; i++)//向set.data[m]中补充
        {
            int j = 0;
            for (j = 0; j < n; j++)
            {
                if (data[j] == set.data[i])//a == b
                {
                    //如果有相同的元素,就无需在比了,直接退出,有相同元素
                    break;
                }
            }
            if(j < n) continue;
            //这里不考虑溢出问题,就没问题。
            if(count < 100){
                data[count++] = set.data[i];//错误原因:写入set.data时缓冲区溢出
            }else{
                break;
            }
        }
        this->n = count;
        for (int i = 0; i < count; i++)
        {
            cout << data[i] << " " << endl;//错误原因:正在从set.data读取无效数据
        }
        return *this;
    }
    int main()
    {
        int n1, n2;
        cout << "input A count" << endl;
        cin >> n1;
        cout << "input B count" << endl;
        cin >> n2;
        CSet A(n1), B(n2);
        cout << "input A" << endl;
        A.datain();
        cout << "input B" << endl;
        B.datain();
        cout << "A+B=" << endl;
        A.operator+(B);
        return 0;
    }
    
    
    input A count
    2
    input B count
    3
    input A
    1
    2
    input B
    2
    3
    4
    A+B=
    1
    2
    3
    4
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月26日
  • 已采纳回答 11月25日
  • 创建了问题 11月25日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题