Форум программистов, компьютерный форум CyberForum.ru

Проверить на выход за границы массива - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.68
Kreativ
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
05.05.2013, 12:39     Проверить на выход за границы массива #1
ПРивет, помогите пожалуйста, пишу класс - динамический массив, в перегрузке оператора [] нужно проверить на выход за границы, но не знаю как правильно использовать try, catch, throw.
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T, int size>
T & Array<T, size> :: operator [](int index) {
    try {
    if (index < 0 || index >= currentSize)
        throw out_of_range("Index was out of range");
    }
    catch(...) { // что тут писать чтобы поймать из throw
        cout << "error";
    }
    return aPtr[index]; // и как быть тут куда вставить эту строку
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.05.2013, 20:45     Проверить на выход за границы массива #41
Естессно это работает. Просто я не люблю, когда кишки наружу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
07.05.2013, 23:31     Проверить на выход за границы массива #42
Все эти кишки надёжно упрятаны в сам Array, как и должно быть. Вводить дополнительный класс только для того, чтобы спрятать именно эти "кишки", делать его настолько многословным (да ещё, глядишь, и что-то другое упрятывать в другой класс) - over-engineering.
Kreativ
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
08.05.2013, 18:04  [ТС]     Проверить на выход за границы массива #43
я не знаю как эффективно хранить информацию, думал всякие списки, массивы, но не то, вы дали подсказку, что это как то связано с оператором = , думал мб там проверять элементы и отправлять только те которые проиниц., но тоже не то
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.05.2013, 21:25     Проверить на выход за границы массива #44
Цитата Сообщение от Kreativ Посмотреть сообщение
я не знаю как эффективно хранить информацию, думал всякие списки, массивы, но не то, вы дали подсказку, что это как то связано с оператором = , думал мб там проверять элементы и отправлять только те которые проиниц., но тоже не то
Время сворачивать балаган. Правильный ответ: инициализировать массив строго последовательно слева направо. Тогда достаточно хранить количество проинициализированных элементов, чтобы быстро и точно узнать, что в массиве было проинициализировано, а что нет. В фрагменте кода Nick Alte этой штуке соответствует счётчик i.
Цитата Сообщение от Nick Alte Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t i = 0;
try {
    for(; i < size; ++i)
        new(newArray + i) T(srcArray[i]);
} catch (...) {
    for(; i > 0;)
    {
        --i;
        newArray[i].~T();
    }
    deallocate(newArray);
    throw;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 13:30     Проверить на выход за границы массива
Еще ссылки по теме:

Пользователь вводит с клавиатуры две границы диапазона и число. Проверить, попадает ли число в диапазон C++
C++ При вызове функции необработанное исключение, выход за границы массива
Почему происходит выход за границы? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kreativ
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
09.05.2013, 13:30  [ТС]     Проверить на выход за границы массива #45
Когда я в main()'е использую оператор=, то при завершении, когда уже вызываются деструкторы, вылетает ошибка. Пошагово прогонял, вызывается деструктор Array, но дальше, в деструктор моего созданного класса, он даже не заходит.
C++
1
2
3
4
5
6
7
int main() {
Array<Complex<int>, 4> obj2(3), obj(3);
    cin >> obj;
    cout << endl << obj;
    obj2 = obj;
return 0;
}
Конструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T, size_t size>
Array<T, size> :: Array(const Array<T, size> &arrayForCopying) {
        bool label = true;
        Ex<T, 5> obj(arrayForCopying.currentSize);
 
        for (size_t i = 0; i < arrayForCopying.currentSize; i++) 
            if (obj.init(arrayForCopying.aPtr[i], i) == 0)
                label = false;
        
        if (label) {
            aPtr = obj.get();
            currentSize = arrayForCopying.currentSize;
            maxSize = arrayForCopying.maxSize;
        }
}
оператор =
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T, size_t size>
Array<T, size> & Array<T, size> :: operator = (const Array<T, size> &arrayForAssign) {
    if (this != &arrayForAssign) {
        bool label = true;
        Ex<T, 5> obj(arrayForAssign.currentSize);
 
        for (size_t i = 0; i < arrayForAssign.currentSize; i++) 
            if (obj.init(arrayForAssign.aPtr[i], i) == 0)
                label = false;
        
        if (label) {
            delete [] aPtr;
            aPtr = obj.get();
            currentSize = arrayForAssign.currentSize;
            maxSize = arrayForAssign.maxSize;
        }
        return *this;
    }
    return *this;
}
Деструктор Array:
C++
1
2
3
4
template <class T, size_t size>
Array<T, size> :: ~Array() {
    delete []  aPtr;
}
Метод init
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
int Ex<T> :: init(const T &elem, size_t n) {
    try {
        new (p + n) T(elem);
        return 1;
    }
    catch(...) {
        for (int i = n; i >= 0; i++) {
            p[i].~T();
        }
        operator delete[](p);
        
        return 0;
    }
}
и деструктор класса Ex
C++
1
2
3
4
template <class T>
Ex<T> :: ~Ex() {
    //delete [] p;
}
Добавлено через 1 час 18 минут
нашел свои ошибки, исправил, вроде все работает, но мб что-то нужно будет исправить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
template <class T, size_t size>
Array<T, size> :: Array(size_t length) {
    maxSize = size;
    currentSize = length < size ? length : maxSize;
    aPtr = reinterpret_cast<T*>(operator new[](length * sizeof(T)) );
}
template <class T, size_t size>
Array<T, size> :: Array(const Array<T, size> &arrayForCopying) {
    bool label = true;
    Ex<T, 5> obj(arrayForCopying.currentSize);
 
    for (size_t i = 0; i < arrayForCopying.currentSize; i++) 
        if (obj.init(arrayForCopying.aPtr[i], i) == 0)
            label = false;
        
    if (label) {
        aPtr = obj.get();
        currentSize = arrayForCopying.currentSize;
        maxSize = arrayForCopying.maxSize;
    }
}
template <class T, size_t size>
Array<T, size> :: ~Array() {
    for (int i = (currentSize - 1); i >= 0; i--) {
        aPtr[i].~T();
    }
    operator delete[] (aPtr);
}
template <class T, size_t size>
Array<T, size> & Array<T, size> :: operator = (const Array<T, size> &arrayForAssign) {
    if (this != &arrayForAssign) {
        bool label = true;
        Ex<T> obj(arrayForAssign.currentSize);
 
        for (size_t i = 0; i < arrayForAssign.currentSize; i++) 
            if (obj.init(arrayForAssign.aPtr[i], i) == 0)
                label = false;
        
        if (label) {
            int i = arrayForAssign.currentSize - 1;
            for (; i >= 0; i--) {
                aPtr[i].~T();
            }
            operator delete[] (aPtr);
            aPtr = obj.get();
            currentSize = arrayForAssign.currentSize;
            maxSize = arrayForAssign.maxSize;
        }
    }
    return *this;
}
Yandex
Объявления
09.05.2013, 13:30     Проверить на выход за границы массива
Ответ Создать тему
Опции темы

Текущее время: 07:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru