处理私有类中的数组指针。?

时间:2013-04-30 18:28:48

标签: c++ visual-c++

这是我在这个网站上的第一个问题..参考我的朋友,他从这里学到很多东西;),现在轮到我了......:)

亲爱的尊敬的成员..在这一点上,我完全紧张,很沮丧地发现,我应该怎样做我的代码才能工作.. !! 我是一名具有c ++基础知识的学生,在本学期我们的面向对象编程。 正在完成此任务以阐明类(私有和公共)的概念,此外还有初始化,排序数组,搜索密钥等。

我知道,当我们使用动态内存时,我们必须编写构造函数,析构函数等,&我对此感到困惑..我认为参数中的问题,或复制构造函数,深层,浅层复制。 我不知道该怎么办!!! 好吧,我不是专业先生......所以我很抱歉。 !!

如果有人用我的代码向我提供关于数组,类中的指针的小例子,我该如何处理。 。 。 :( :(这是非常赞赏的先生。

// Constructor.cpp : Defines the entry point for the console application.
//

#include <iostream>

using namespace std;

class IntArray
{
private:

    int size;
    int *values;

public:

    void InputData() const;
    void OutputData() const;
    void Search() const;
    void Bubble() const;
    IntArray(int size)
    {
        values = new int[size];
    }
};

void IntArray::InputData()  const
{
        cout << "==> Entering Data <==" << endl;

        for (int i = 0; i < size; ++i)
        {
        cout << ">> Enter Element #" << i+1 << ": ";
        cin >> values[i];
        }
}

void IntArray::OutputData() const
{
    cout << "==> Printing Data <==" << endl;
    for (int i = 0; i < size; ++i)
    {
        cout << values[i] << " ,";
    }
    cout << "\n";
}
void IntArray::Search() const
{
    int key;
    cout << "Please Enter A KEY To Find: ";
    cin >> key;
    int index = 0;
    bool found = false;
    for (int i = 0; i < size; ++i)
    {
        if ((!found) && (key == values[i]))
        {
            index = i;
            found = true;
        }
    }
    if (found)
    {
        cout << "KEY Found At The Index: " << index+1 << endl;
    }
    else
    {
        cout << "KEY is not present." << endl;
    }
    cout << '\n' << endl;
}

void IntArray::Bubble() const
{
    for (int i = 1; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {

            if (values[j] > values[i])
            {
                int temp = values[j];
                values[j] = values[i];
                values[i] = temp;
            }
        }
    }
}

int main()
{
    const int size = 5;
    IntArray u(size);
    u.InputData();
    u.OutputData();
    u.Search();
    u.Bubble();
    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您没有在构造函数中设置size成员,因此它具有不确定的值,并且在InputData中访问它会为您提供未定义的行为。

IntArray(int size)
{
    this->size = size;
    values = new int[size];
}

更好的是,使用成员初始化列表(它就是它的用途!):

IntArray(int size)
  : size(size), values(new int[size])
{ }

您还应该实现析构函数来销毁动态分配的int s:

数组
~IntArray()
{
  delete[] values;
}

看看Rule of Three,看看你是否也应该实现复制构造函数和复制赋值运算符。

答案 1 :(得分:0)

据我在你的问题和答案中的评论可以理解,你的情况非常糟糕:你的导师很糟糕地使用错误的工具来做这个工作(如果他也读这个网站会很有趣)。

它正在教你OOP使用非OOP纯语言(比如C ++)教你喜欢它是Java,从而产生混乱。

所以你最终以错误的方式管理动态内存(ctor中的new [],但没有dtor因此没有删除[]而没有复制和分配 - 因此共享动态数据和潜在的双重删除),有神秘感怀疑函数与参数(关于静态内存(?!?)函数),一个从未告诉基本标准类(如std :: vector)的教师,但假装你使用动态分配数组...

说什么?这很难,很难。

我的建议是停止片刻并尝试阅读更多基于“工业C ++”的教程。 (This one可能非常有用!但请逐页关注!)