从C ++中的1D数组类构建2D数组类

时间:2015-11-11 05:43:21

标签: c++ arrays class operator-keyword

在我的C ++课程中,我们终于在概念上相当深入(好吧,相对来说!)而且我正在努力建立一个上一堂课的课程。

这是我的第一个类头,它构建部分填充的数组对象。据我所知,它功能齐全:

#ifndef PARTIALARRAY_H
#define PARTIALARRAY_H
#include <iostream>
#include <string.h>

using namespace std;
typedef int ITEM_TYPE;
ITEM_TYPE const MAX = 50;

class PartialArray
{
public:
    //-----------------------------------------ctors:-----------------------------------------

    PartialArray();
    PartialArray(const int init[], int used);

    //-----------------------------------------member functions:-----------------------------------------

    void PrintArray();
    int Search(ITEM_TYPE key);
    int Append(ITEM_TYPE appendMe);
    int ShiftRight(int shiftHere);
    int ShiftLeft(int shiftHere);
    int InsertBefore(ITEM_TYPE insertThis, int insertHere);
    int InsertAfter(ITEM_TYPE insertThis, int insertHere);
    int Delete(int deleteHere);
    void DeleteRepeats();
    int NumUsed();
    void Sort();
    void Reverse();
    string ErrorDescr(int failCode);

    //-----------------------------------------operators:-----------------------------------------

    ITEM_TYPE& operator [] (ITEM_TYPE x);


private:
    //-----------------------------------------member vars:-----------------------------------------

    ITEM_TYPE a[MAX];
    int numUsed;
};

#endif // PARTIALARRAY_H

以下是类函数:

#include "partialarray.h"
#include <iostream>
#include <string.h>

using namespace std;

//-----------------------------------------ctors:-----------------------------------------

PartialArray::PartialArray()
{
    numUsed=0;
}

PartialArray::PartialArray(const int init[], int used)
{
    numUsed = used;
    for(int i=0; i<numUsed; i++)
    {
        a[i]=init[i];
    }
}

//-----------------------------------------member functions:-----------------------------------------

//Prints the array up to its last used element
void PartialArray::PrintArray()
{
    for(int i=0; i<numUsed; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}

//Searches the array for a particular value and returns the index at which the value first appears
int PartialArray::Search(ITEM_TYPE key)
{
    for(int i=0; i<numUsed; i++)
    {
        if(a[i]==key)
            return i;
    }
    return -1;
}

//Takes a number and appends it to the end of the array after the last interesting element
int PartialArray::Append(ITEM_TYPE appendMe)
{
    if(numUsed<MAX)
        a[numUsed++] = appendMe;
    else
        return 1;
    return 0;
}

//Shifts all elements of the array to the right starting at a particular index
int PartialArray::ShiftRight(int shiftHere)
{
    if(shiftHere<numUsed)
    {
        ITEM_TYPE save = a[numUsed-1];
        for(int i=numUsed; i>=shiftHere; i--)
        {
            a[i] = a[i-1];
        }
        a[shiftHere] = save;
        return 0;
    }
    else
        return 2;
}

//Shifts all elements of the array to the left starting at a particular index
int PartialArray::ShiftLeft(int shiftHere)
{
    if(shiftHere<numUsed)
    {
        ITEM_TYPE save = a[shiftHere];
        for(int i=shiftHere; i<numUsed; i++)
        {
            a[i] = a[i+1];
        }
        a[numUsed-1] = save;
        return 0;
    }
    else
        return 2;
}

//Takes a number and a position and inserts the number before that position in the array shifting the elements to the right
int PartialArray::InsertBefore(ITEM_TYPE insertThis, int insertHere)
{
    if(insertHere>numUsed)
        return 2;
    else
    {
        numUsed++;
        ShiftRight(insertHere);
        a[insertHere] = insertThis;
    }
    return 0;
}

//Takes a number and a position and inserts the number after that position in the array shifting the elements to the right
int PartialArray::InsertAfter(ITEM_TYPE insertThis, int insertHere)
{
    if(insertHere>numUsed)
        return 2;
    else if(numUsed>=MAX)
        return 1;
    else
    {
        numUsed++;
        ShiftRight(insertHere+1);
        a[insertHere+1] = insertThis;
    }
    return 0;
}

//Takes a position and removes that item from the array, shifting all the elements to the left
int PartialArray::Delete(int deleteHere)
{
    if(deleteHere <= numUsed)
    {
        ShiftLeft(deleteHere);
        numUsed--;
        return 0;
    }
    else
        return 2;
}

//Deletes repeated elements in the array and replaces the with 0
void PartialArray::DeleteRepeats()
{
    for(int i=0;i<numUsed;i++)
    {
        ITEM_TYPE n=a[i];
        for(int j=i+1; j<numUsed;j++)
        {
            if(n == a[j])
            {
                Delete(j);
                j--;
            }
        }
    }
}

//Returns number of interesting elements in the array
int PartialArray::NumUsed()
{
    return numUsed;
}

//Utilizes a bubble sort algorithm
void PartialArray::Sort()
{
    bool swap = true;
    int j = 0;
    int save;
    while (swap==true)
    {
        swap = false;
        j++;
        for (int i = 0; i < numUsed - j; i++)
        {
            if (a[i] > a[i + 1])
            {
                save = a[i];
                a[i] = a[i + 1];
                a[i + 1] = save;
                swap = true;
            }
        }
    }
}

void PartialArray::Reverse()
{
    for(int i=0;i<numUsed-1;i++)
    {
        ITEM_TYPE save = a[numUsed-1];
        ShiftRight(i);
        a[i] = save;
    }
}

//Returns the appropriate error description for a particular fail code
string PartialArray::ErrorDescr(int failCode)
{
    switch(failCode)
    {
    case -1:
        return "ERROR: item not found";
        break;
    case 1:
        return "ERROR: array is full";
        break;
    case 2:
        return "ERROR: unused index";
        break;
    default:
        return "UNKNOWN ERROR";
        break;
    }
}

//-----------------------------------------operators:-----------------------------------------

ITEM_TYPE& PartialArray::operator [](ITEM_TYPE x)
{
    return a[x];
}

现在,这里的事情变得棘手了。要构建二维数组类,我应该创建一个数组数组。我不知道该如何解决这个问题,经过几个小时的修补和谷歌搜索后,我只会变得更加困惑。具体来说,&lt;&lt;,[]和[](常量版本)运算符和TwoDArray构造函数已经抛出了我的循环,而我对于接下来该做什么感到困惑。这是TwoD头文件:

#ifndef TWODARRAY_H
#define TWODARRAY_H
#include "partialarray.h"
#include <iostream>
#include <string.h>

typedef int ITEM_TYPE;

class TwoDArray
{
    friend ostream& operator << (ostream &outs, const TwoDArray& printMe);
public:
    //ctors:
    TwoDArray();

    //member functions:
    //PartialArray& operator [](int index);         //[ ] operator for the TwoDArray object
    //PartialArray operator [](int index) const;    //[ ] operator for the TwoDArray object (const version)
    int Append(int appendMe, int row);
    int InsertBefore(int insertMe, int row, int column);
    int InsertAfter(int insertMe, int row, int column);
    int Delete(int row, int column);
    bool Search(ITEM_TYPE key, int &row, int &column);

private:
    //member vars:
    PartialArray a[MAX];
};

#endif // TWODARRAY_H

到目前为止,这是我试图定义的内容:

TwoDArray::TwoDArray()
{
    const int array0[]= {0};
    PartialArray array(array0, MAX);
}

ostream& operator << (ostream &outs, const TwoDArray& printMe)
{
    for(int i=0;i<MAX;i++)
    {
        outs << printMe.a[i];
    }
    return outs;
}

理想情况下,&lt;&lt;运算符将打印m个n项目。

0 个答案:

没有答案