0

テンプレート配列クラスのコードを書き(まだ完成していないことはわかっています)、演算子をオーバーロードする方法を覚えようとしています(その間、特別な困難はありません...)。

とにかく、実装方法を考えながらoperator[]、インデックスが配列の境界の外にあるとどうなるのだろうと思いました...私がNULLを返すことはできないと確信しています(戻り値の型のため)、そうです? もしそうなら、インデックスが境界の外にある場合、何を返すべきですか?

ここにコードがあります。そのほとんどは私の質問には冗長ですが、グーグルの演算子が過負荷になっている人には役立つかもしれないので、完全なコードを投稿します...

#ifndef __MYARRAY_H
#define __MYARRAY_H

#include <iostream>
using namespace std;

template <class T>
class MyArray
{
    int phisicalSize, logicalSize;
    char printDelimiter;
    T* arr;

public: 
    MyArray(int size=10, char printDelimiter=' ');
    MyArray(const MyArray& other);
    ~MyArray() {delete []arr;}

    const MyArray& operator=(const MyArray& other);
    const MyArray& operator+=(const T& newVal);

    T& operator[](int index);

    friend ostream& operator<<(ostream& os, const MyArray& ma)
    {
        for(int i=0; i<ma.logicalSize; i++)
            os << ma.arr[i] << ma.printDelimiter;
        return os;
    }
};

template <class T>
T& MyArray<T>::operator[]( int index )
{
    if (index < 0 || index > logicalSize)
    {
        //do what???
    }

    return arr[index];
}

template <class T>
const MyArray<T>& MyArray<T>::operator+=( const T& newVal )
{
    if (logicalSize < phisicalSize)
    {
        arr[logicalSize] = newVal;
        logicalSize++;
    }

    return *this;
}

template <class T>
const MyArray<T>& MyArray<T>::operator=( const MyArray<T>& other )
{
    if (this != &other)
    {
        delete []arr;
        phisicalSize = other.phisicalSize;
        logicalSize = other.logicalSize;
        printDelimiter = other.printDelimiter;
        arr = new T[phisicalSize];

        for(int i=0; i<logicalSize; i++)
            arr[i] = other.arr[i];
    }

    return *this;
}

template <class T>
MyArray<T>::MyArray( const MyArray& other ) : arr(NULL)
{
    *this = other;
}

template <class T>
MyArray<T>::MyArray( int size, char printDelimiter ) : phisicalSize(size), logicalSize(0), printDelimiter(printDelimiter)
{
    arr = new T[phisicalSize];
}

#endif
4

1 に答える 1

6

operator[]通常、境界チェックは行いません。範囲を持つことができる標準コンテナのほとんどは、別の関数 を利用します。これは、範囲がチェックされ、例外at()がスローされます。std::out_of_range

オーバーロードも実装したいでしょうconst T& operator[]

于 2013-01-10T01:36:49.227 に答える