Управление достигает конца оператора перегрузки не пустых функций []; - PullRequest
0 голосов
/ 08 февраля 2019
#ifndef MyArray_hpp
#define MyArray_hpp
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#define MAX_ARRAY_SIZE 1000

using std::cout;
using std::endl;
using std::ifstream;
using std::cout;

//template class
template<typename NewType>
class MyArray
{

public:

    MyArray(size_t maxSize)
    { // constructor

        //(2)
        array_ = (NewType*) malloc(maxSize * sizeof(NewType));

    }

    void push_back(NewType item)
    {
        array_[size_] = item;
    } // push_back method
    class Iterator
    {

    public:

        Iterator(MyArray<NewType>* a, size_t s) :
                ptr(a), index(s)
        {
        }
        //(1) 
        NewType operator[](size_t i) const
        {   ptr->array_[i];}

    private:

        size_t index;
        MyArray<NewType>* ptr;

    };

    Iterator begin()
    {
        return MyArray<NewType>::Iterator(this, 0);
    }
    Iterator end()
    {
        return MyArray<NewType>::Iterator(this, size_);
    }

private:

    size_t size_;
    NewType* array_;

};

#endif /* MyArray_hpp */

Так что моя проблема в том, что в публичном «Операторе NewType []» я получаю эту ошибку:

Control reaches end of non-void function

, если я возвращаю 0 в конце, я получаю вторую ошибку вконструктор класса в "array_ = (NewType *)":

 Thread 1: EXC_BAD_ACCESS (code=1, address=0x504805ac0)

Я уже некоторое время пытаюсь это исправить, поэтому помогите мне выяснить, что я сделал неправильно, я посмотрел в Интернете, и они сказали, что последняя ошибкаможет быть сложно исправить.

1 Ответ

0 голосов
/ 08 февраля 2019

Функция с возвращаемым типом должна возвращать значение этого типа.

NewType operator[](size_t i) const { ptr->array_[i]; }

не имеет оператора return.

Возможно, вы имели в виду

NewType operator[](size_t i) const { return ptr->array_[i]; }

?

Я не вижу ошибку номер 2

array_ = (NewType*) malloc(maxSize * sizeof(NewType));

но malloc - это не то, что вы должны использовать в C ++, за исключением нескольких редких крайних случаев.Он выделяет память, но не вызывает конструкторы.Это делает MyArray<std::string> бомбу замедленного действия.Предпочитают использовать new.

Примечание:

void push_back(NewType item)
{
    array_[size_] = item;
} // push_back method

Всегда будет подталкивать к одному и тому же месту.Вам нужно увеличить size_.

Говоря о size_, он никогда не инициализируется, поэтому у вас нет возможности узнать, куда array_[size_] = item; попытается поместить item.

...