具有自定义类的 C++ 动态二维数组

标签 c++ arrays pointers operator-overloading composition

该程序的目标是从一维数组类创建复合二维数组类,利用指针和operator[]在主程序中使用。我们被告知要让 [][] 像标准二维数组一样工作。我可以编译它,但是当我使用 2DArray 类时它崩溃了。我知道目标是理解指针,但我认为运算符 [] 给我带来了最大的麻烦。任何见解将不胜感激。

编辑:使用标准数组进行查找。但是,如果我能够以简单的方式使用该类,我会很高兴,例如:

#include <iostream>
#include "MyArray.h"
#include "TwoDArray.h"

using namespace std;

int main()
{
TwoDArray test(4,5);
cout << "Test output:  "<< test[3][2] << endl;
return 0;
}

这里是二维数组类实现的代码:

#include <iostream>
#include <cstdlib>
#include "TwoDArray.h"
#include "MyArray.h"


TwoDArray::TwoDArray()
{
    //Default Constructor
    row = 10;
    col = 10;
    MyArray** p = new MyArray* [10];
    for (int i = 0; i < 10; i++)
    {
        p[i] = new MyArray[10];
    }
}

TwoDArray::TwoDArray (int r, int c)
{
    row = r;
    col = c;
    MyArray** p = new MyArray* [col];
    for (int i = 0; i < col; i++)
    {
        p[i] = new MyArray[row];
    }
}

TwoDArray::~TwoDArray() //Destructor 
{
    for (int i = 0; i < row; i++)
    {
        delete [] &p[i];
    }
    delete [] p;
}

MyArray & TwoDArray::operator[] (int pos)
{
    if( pos < 0 || pos >= col )
    {
        cout << "Illegal index, pos = " << pos << endl;
    }
    return *p[pos];
}

以及讲师给出的1DArray(MyArray)类实现:

#include <iostream>
#include <cstdlib>
#include "MyArray.h"    // "" around header means "look in current directory first"

// default to an array of 10 integers, fill with 0
MyArray::MyArray()
{
    int i;
    _a = new int[10];    // new allocates RAM from system heap, [] says allocate an array
    _n = 10;
    for( i = 0; i < 10; i++ )
    {
        _a[i] = 0;       // initialize array to all 0
    }
}

// allocate array of a size requested by the client if legal, fill with 0
MyArray::MyArray( int num )
{
    int i;
    if( num <= 0 ) // if illegal, set to default
    {
        num = 10;
    }
    _a = new int[num];
    _n = num;
    for( i = 0; i < num; i++ )
    {
        _a[i] = 0;       // initialize array to all 0
    }
}

// copy constructor - invoke deep copy asignment
MyArray::MyArray( const MyArray &m )
{
   *this = m;
}

// destructor - needed to deallocate RAM allocated in constructors
MyArray::~MyArray()
{
    delete[] _a;
}

// get value at position pos
int &MyArray::At( int pos )
{
    if( pos < 0 || pos >= _n )
    {
        cout << "Illegal index, pos = " << pos << endl;
        exit( -1 );
    }
    return _a[pos];
}

// get value at position pos using [] indexing operator
int & MyArray::operator []( int pos )
{
    cout << "1D [] pos = " << pos << "_n is " << _n << endl;
    if( pos < 0 || pos >= _n )
    {
        cout << "Illegal index, pos = " << pos << endl;
        exit( -1 );
    }
    return _a[pos];
}

// return size, const here means it cannot change self
int MyArray::size( void ) const
{
    return _n;
}

// deep copy - REQUIRED if allocated RAM is used by object!
MyArray &MyArray::operator =( const MyArray &rhs )
{
    int i;
    if( &rhs == this ) // assignment to self?
    {
        return *this;  // if so, don't assign, just return self
    }
    if( rhs._n != _n )   // rhs not the same size as myself?
    {
        delete[] _a;    // yes, clear out my data and reallocate to match
        _a = new int[rhs._n];
        _n = rhs._n;
    }
    for( i = 0; i < rhs._n; i++ )  // copy all elements
    {
        _a[i] = rhs._a[i];
    }
    return *this;      // allow a = b = c; assignment
}

最佳答案

如果MyArray本身是一个一维数组,那么我用MyArray初始化一个二维数组是错误的。我不会描述细节,但我认为你需要做这样的事情 -

TwoDArray::TwoDArray()
{
//Default Constructor
row = 10;
col = 10;
MyArray* p = new MyArray [10];
for (int i = 0; i < 10; i++)
{
    p[i] = new MyArray(10);
} }

TwoDArray::TwoDArray (int r, int c)
{
row = r;
col = c;
MyArray* p = new MyArray [col];
for (int i = 0; i < col; i++)
{
    p[i] = new MyArray(row);
}
}

请注意,我用一个 1D 数组更改了 2D 初始化,每个数组在内部都是一个 MyArray 对象,它本身就是一个数组 - 因此是 2D 数组

关于具有自定义类的 C++ 动态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374620/

相关文章:

c++ - 与类成员的函数调用?

c++ - 无法访问类 'CCustomCommandLineInfo' 中声明的私有(private)成员

c++ - 如何从 Qt Creator 保存和导出自定义构建步骤?

php - 引用 - 这个错误在 PHP 中意味着什么?

javascript - 解析 JSON 不起作用

c++ - C++中的多维对象数组,我无法初始化它!

c - 重新分配指向 char 的指针数组

C++ 函数不在主要部分执行

c++ - new _Elem[_Size]() 与 new _Elem[_Size]{} 之间有何不同?

arrays - 在 Swift 3 中比较字符串数组和字典