不能在课堂上返回指针

时间:2014-09-28 09:11:40

标签: c++ class pointers

#include "C_IntArray.h"

C_IntArray::C_IntArray()
{
    m_Array = 0;
    m_Length = 0;
}

C_IntArray::~C_IntArray(void)
{
    delete m_Array;
    m_Length = 0;
}

void C_IntArray::ContructorWithParater(int *intArray, int size)
{
    m_Array = new int[size];
    m_Length = size;
    for (int i = 0; i < size; i++)
        m_Array[i] = intArray[i];
}

void C_IntArray::InputArray()
{
    cout << "Nhap so luong phan tu: ";
    cin >> m_Length;

    m_Array = new int [m_Length];

    for(int i = 0; i < m_Length; i++)
    {
        cout << "Nhap phan tu Array[" << i << "] = ";
        cin >> m_Array[i];
    }
}

void C_IntArray::OutputArray()
{
    for(int i = 0; i < m_Length; i++)
        cout << m_Array[i] << " ";
}

C_IntArray C_IntArray::Remove(int x)
{
    C_IntArray temp;
    temp.ContructorWithParater(m_Array, m_Length);
    temp.OutputArray();
    for(int i = 0; i < temp.m_Length; i++)
    {
        if(temp.m_Array[i] == x)
        {

            {
                temp.m_Length--;
                for(int j = i; j < temp.m_Length; j++)
                    temp.m_Array[j] = temp.m_Array[j + 1];
            }
        }
        cout << "\n";
        temp.OutputArray();
    }
    cout << "\n";
    return temp;
}

档案标题

#include <iostream>
using namespace std;

#ifndef _C_IntArray_h
#define _C_IntArray_h

class C_IntArray
{
private:
    int *m_Array, m_Length;

public:
    C_IntArray();
    ~C_IntArray();
    // khoi tao tham so dau vao
    void ContructorWithParater(int *, int);

    void InputArray();
    void OutputArray();

    // xoa phan tu trung
    C_IntArray Remove(int );
};

#endif _C_IntArray_h;

档案主

#include "C_IntArray.h"

void main()
{
    C_IntArray a;
    a.InputArray();
    int giaTriCanXoa = 5;
    C_IntArray b = a.Remove(giaTriCanXoa);
    b.OutputArray();
    cout << "\n";
    a.OutputArray();
    system("pause");
}

我试图调试我的项目。类中的Remove是有效的,当我调试返回temp时它仍然可以工作,但我接下来调试它返回NULL或返回1个数组 函数中删除函数不能返回temp。

如果我删除析构函数或我的temp是静态C_IntArray,我的项目就可以运行。

如果我拼错了帮助人们修复的愿望,那么

谢谢你的关注。

1 个答案:

答案 0 :(得分:0)

Remove返回类的副本,而不是指针。因此它是一个副本。 由于您没有定义复制构造函数或赋值运算符,因此您将使用默认的复制/赋值 - 这将导致m_Array被多次删除。

您可以在复制类时执行内部数组的深层复制,也可以使用写入时复制和引用计数。

即。您需要添加以下功能:

C_IntArray(C_IntArray const& other);
C_IntArray& operator=(C_IntArray const& rhs);

他们应该为数组中的数据分配新的存储空间,并从'other'或'rhs'复制元素。查找如何编写复制构造函数或赋值运算符。网上会有无数的例子。

你班上也有内存泄漏。 C_IntArray :: InputArray()将泄漏内存,因为在为其分配新内存之前不删除m_Array。

最好将自由函数用于输入职责而不是使其成为类成员 - 保持类的接口最小化和完整。

即。将它移出课堂:

void InputArray(C_IntArray& dst) {
    // ...
}

正如其他人所建议的那样,只需使用std :: vector。