Как исправить проблемы с вектором и T * - PullRequest
0 голосов
/ 06 мая 2019

У меня есть задача, где я должен сделать C ++ реализацию ArrayList в стиле Java. Но в нескольких областях у меня возникли некоторые проблемы.

Невозможно изменить объявление .h и main.cpp.

У меня есть шаблон

template <class T>
class ArrayList
{
public:
    // ********* Applying rule of 5: constructors ******************
    // default constructor.
    ArrayList() //OK
    {
        mElements = new T[5];
        mReserved = 5;
        mSize = 0;
    }

    // copy constructor
    ArrayList(const ArrayList<T>& copyArray): mSize(copyArray.mSize), 
    mElements(new T[mSize])//OK
    {
        for (int i = 0; i < mSize; ++i)
            mElements[i] = copyArray.mElements[i];
    }

    // move constructor
    ArrayList(ArrayList<T>&& moveArray): mSize(moveArray.mSize), 
    mElements(moveArray.mElements)//OK
    {
        moveArray.mSize = 0;
        moveArray.mElements = nullptr;
    }

    // copy assignment operator
    ArrayList<T>& operator = (const ArrayList<T> &copyArrayOpt)//OK
    {
        if( &copyArrayOpt != this)
        {
            if (mSize != copyArrayOpt.mSize)
            {
                delete [] mElements;
                mSize = copyArrayOpt.mSize;
                mElements = new T[mSize];
            }

            for (int i = 0; i < mSize; ++i)
                mElements[i] = copyArrayOpt.mElements[i];

            return *this;
        }
    }

    // move assignment operator
    ArrayList<T>& operator = (ArrayList<T> && moveArrayOpt)//OK
    {
        if ( &moveArrayOpt != this)
        {
            delete [] mElements;
            mSize = moveArrayOpt.mSize;
            mElements = moveArrayOpt.mElements;

            moveArrayOpt.mSize = 0;
            moveArrayOpt.mElements = nullptr;
        }

        return *this;
    }

    virtual ~ArrayList()
    {
        delete [] mElements;
    }

    const T& operator[](int index) const;//OK
    T& operator[](int index);//OK
    int size() const;//OK
    int reserved() const;//OK
    bool isEmpty() const;//OK

    void add(const T& element);//OK
    void add(int index, const T& element);//OK
    void remove(int index);//OK
    void trimToSize();//OK

    void mergeSort(ArrayList<T>& mElements, int low, int high);
    void merge(ArrayList<T>& mElements, int left, int middle1, int middle2, int right);

    ArrayList<T> subArrayList(int fromIndex, int toIndex) const;
    T* toArray();

private:
    void extendStorage();//OK
    void wrongIndexInput();

    int mSize, mReserved;
    T* mElements;
};

2 функции, вызывающие проблемы: ArrayList<T> subArrayList(int fromIndex, int toIndex) и T* toArray().

Это я реализовал следующим образом:

template <class T>
ArrayList<T> ArrayList<T>::subArrayList(int fromIndex, int toIndex) const
{
    ArrayList<T> partialArray;
    int sizeP = toIndex - fromIndex;

    if (sizeP > partialArray.reserved())
    {
        partialArray.extendStorage();
    }

    for (int i = 0; i < (sizeP); ++i)
    {
        partialArray[i] = partialArray;
    }
    return partialArray;
}

и

template <class T>
T* ArrayList<T>::toArray()
{
    std::vector<T*> array;

    for (int i = 0; i < mSize; ++i)
    {
        array[i] = &mElements[i];
    }

    return *array.data();
}

В main.cpp две функции вызываются так:

ArrayList<double> subArray = array.subArrayList(1,10);

std::cout << "Sub ArrayList have reserved space for " <<
             subArray.reserved() << " elements and stores "
          << subArray.size() << " elements. " << std::endl;

for (int i = 0; i < subArray.size(); ++i)
{
    std::cout << subArray[i] << ", ";
}

std::cout << "\b\b  " << std::endl << std::endl;

// double* sArray = subArray.toArray();

for (int i = 0; i < 7; ++i)
{
    subArray.add(i + 1);
}

std::cout << "Basic array of sub array contains: " <<
             std::endl;
/*
for (int i = 0; i < subArray.size() - 7; ++i)
{
    std::cout << sArray[i] << ", ";
}
std::cout << "\b\b  " << std::endl << std::endl;
*/

std::cout << "Sub array with 7 elements added: " <<
             std::endl;
for (int i = 0 ; i < subArray.size(); ++i)
{
    std::cout << subArray[i] << ", ";
}
std::cout << "\b\b  " << std::endl << std::endl;

В выводе из subArrayList написано:

Sub ArrayList have reserved space for 10 elements and stores 0 elements.

И я понятия не имею, почему я ничего не могу получить в подмассив.

Когда я запускаю другую функцию, программа просто вылетает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...