-4

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

尊敬的成员.. 在这一点上,我非常紧张并且非常沮丧地发现,我应该如何处理我的代码才能工作..!!好吧,我是一个具有 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;
}
4

2 回答 2

2

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

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

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

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

您还应该实现一个析构函数来销毁动态分配的ints 数组:

~IntArray()
{
  delete[] values;
}

看一下三法则,看看您还应该实现复制构造函数和复制赋值运算符。

于 2013-04-30T18:38:12.670 回答
0

据我从您在问题和答案中的评论中了解到,您的处境非常糟糕:您的讲师严重使用错误的工具来完成工作(如果他也阅读此网站会很有趣)。

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

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

说什么?这很难,非常难。

我的建议是停下来尝试阅读更多基于“工业 C++”的教程。(这个真的很有用!但要一页一页地跟着它!)

于 2013-04-30T19:18:59.660 回答