这个咋改,有无人帮看看

他说为初始化P,但我想在主函数调用我想用的数组,这个应该咋改

img

两种方法,一种是关闭生命周期检查。另一种是将p初始化为nullptr

很明显,你的程序设计的内存管理思想有问题。C++一般是秉承谁申请内存,谁负责释放。既然传入Set的数组是通过实参传递给其成员pSet,那么就不应该由Set释放其内存,而是由Set调用者(构造函数的调用者,是main函数)负责。
实参int a[]是存储在栈上的,无需显式释放,退出main函数时会自动释放内存。

1)如果你只是想通过Set打印数组,那么像下面这样做就可以了

class Set {
private:
    int* pSet;
    int cnt;
public:
    Set(int* p, int a)
        : pSet(p),
        cnt(a)
    {
    }

    void print()
    {
        for (int i = 0; i < cnt; ++i)
        {
            std::cout << pSet[i];
            if (i < cnt - 1) 
                std::cout << " ";
        }
        std::cout << std::endl;
    }
};


int main()
{
    int a[] = { 1,2,3,4,5 };
    int b;
    std::cin >> b;
    Set s(a, b);
    s.print();
    return 0;
}

2)如果你想深度拷贝数组内容
就可以为Set::pSet动态申请内存,在析构函数中释放。但Set仅限于管理自己申请的内存。

class Set {
private:
    int* pSet;
    int cnt;
public:
    Set(int* p, int a)
        : cnt(a)
    {
        if (!p || a <= 0) return;
        pSet = new int[a];

        std::copy(p, p+a, pSet); // 拷贝p所有元素(p[0]..p[a-1])
    }
    ~Set()
    {
        delete[] pSet;
    }

    void print()
    {
        
        for (int i = 0; i < cnt; ++i)
        {
            std::cout << pSet[i];
            if (i < cnt - 1) 
                std::cout << " ";
        }
        std::cout << std::endl;
    }
};