模板化动态数组中的运算符重载[]

时间:2019-06-18 06:12:24

标签: c++

我正在尝试在模板动态数组中重载[]运算符,但是它似乎没有做任何事情?

我为学校创建了一个模板化的动态数组,我试图将重载分离到课堂之外。

DynArray.h

template <typename T>
class DynArray
{
public:
    //The constructor initialises the size of 10 and m_Data to nullptr
    DynArray(void)
    {
        m_AllocatedSize = 10;
        m_Data = nullptr;
    }

    //deletes m_Data
    ~DynArray()
    {
        delete[] m_Data;
        m_Data = nullptr;
    }

    T* operator [] (int index)
    {
        return m_Data[index];
    }

    //creates the array and sets all values to 0
    T* CreateArray(void)
    {
        m_Data = new T[m_AllocatedSize];
        m_UsedElements = 0;

        for (int i = 0; i < m_AllocatedSize; ++i)
        {
            m_Data[i] = NULL;
        }

        return m_Data;
    }

private:

    bool Compare(T a, T b)
    {
        if (a > b)
            return true;
        return false;
    }


    T* m_Data;
    T* m_newData;
    int m_AllocatedSize;
    int m_UsedElements;
};

Main.cpp

#include <iostream>
#include "DynArray.h"
int main()
{
    DynArray<int>* myArray = new DynArray<int>;
    //runs the create function
    myArray->CreateArray();

    int test = myArray[2];

    delete myArray;
    return 0;
}

在这种情况下,我希望重载返回m_Data [2]处的int,但是似乎根本没有重载[],而是说no suitable conversion from DynArray<int> to int

1 个答案:

答案 0 :(得分:1)

您返回的指针不是您想要的。您应该这样做:

T& operator [] (const int& index)
 { 
    return   m_Data[index];
 }

myArray也是一个指针,在使用之前必须先取消引用它。

int test = (*myArray)[2];

最好不要使用指针:

    int main()// suggested by @user4581301
{
    DynArray<int> myArray;
    //runs the create function
    myArray.CreateArray();

    int test = myArray[2];


    return 0;
}

这里没有理由使用指针。

代替newdelete进行动态分配,最好使用smart pointer。 这里还有一个问题,您不是在限制范围,而如果索引是负数怎么办?