2014-11-06 2 views
-2
#include<iostream> 
#include<string> 
using namespace std; 
class my_int_array 
private: 
int num; 
int *ptr; 
public: 
my_int_array(int n){ 
    num = n; 
    int *ptr = new int[n]; 
    for (int i = 0; i < n; i++){ 
     ptr[i] = 0; 
    } 
} 
my_int_array(int x[], int size){ 
    int *ptr = new int[size]; 
    for (int i = 0; i < size; i++){ 
     ptr[i] = x[i]; 
    } 
} 
my_int_array(my_int_array&other){ 
    int *ptr = new int[other.num]; 
    for (int i = 0; i < other.num; i++){ 
     ptr[i] = other.ptr[i]; 
    } 
    num = other.num; 
} 
int size(){ 
    return num; 
} 
int at(int n){ 
    if (n > num - 1 || n < 0){ 
     cout << "out of range" << endl; 
    } 
    else{ 
     return ptr[n]; 
    } 
} 
my_int_array &operator=(const my_int_array&temp){ 
    int *ptr = new int[temp.num]; 
    for (int i = 0; i < temp.num; i++){ 
     ptr[i] = temp.ptr[i]; 
    } 
    num = temp.num; 
} 
~my_int_array(){ 
    delete[] ptr; 
} 
}; 
int main(){ 
my_int_array arrry1(5); 
cout << arrry1.size() << endl; 
} 

Когда я запускаю эту программу, она может отображать 5, но тогда произойдет сбой .exe и может кто-то помочь мне найти мои ошибки в этот кодНекоторые проблемы с моим простым кодом массива, это действует как очень простой вектор.

что у него есть: 1. создать пустой массив; 2. size() возвращает размер массива и() возвращает значение определенного индекса. 3. копировать конструктор и оператор присваивания, которые делают копии 4. при передаче массива и размера массива этот класс должен скопировать этот массив в его элементы.

Если кто-то может помочь, это было бы здорово, так как я новый ученик, любое предложение будет приветствоваться, спасибо!

+1

Вы обновляете «int * ptr» во всех конструкторах и не используете «int * ptr;» поле, объявленное в частном разделе. В деструкторе вы удаляете неинициализированный указатель, который вызывает сбой. Удалите «int *» из объявления указателя в методах. –

+0

Ваш 'operator =' не возвращает значение. Неопределенное поведение. Кроме того, как только вы сделаете изменение, чтобы удалить «int *» из всех ваших методов, ваш код не является безопасным для всех. – PaulMcKenzie

+0

@BrianWalker, я думаю, вы должны продвигать свой комментарий к ответу. –

ответ

0

Тонкая ошибка, у вас есть это (при условии, что вы исправить очевидную ошибку объявляя ptr каждый раз):

my_int_array &operator=(const my_int_array&temp){ 
    ptr = new int[temp.num]; 
    for (int i = 0; i < temp.num; i++){ 
     ptr[i] = temp.ptr[i]; 
    } 
    num = temp.num; 
} 

Проблема заключается в том, что ваша функция должна возвращать ссылку на my_int_array, но ничего не возвращает. Это undefined behavior, поэтому любой код, который назначает ваши объекты, будет неисправным (возможно, сбой).

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

Чтобы это исправить, я покажу вам простой способ реализации operator=:

#include <algorithm> 
//... 
my_int_array &operator=(const my_int_array& rhs) 
{ 
    my_int_array temp(rhs); 
    std::swap(temp.ptr, ptr); 
    std::swap(temp.num, num); 
    return *this; 
} 

Вот и все. Это работает с использованием конструктора копирования и деструктора my_int_array в ваших интересах, поэтому для этого требуется совершенно рабочий конструктор и деструктор копирования для my_int_array. Посмотрите copy and swap idiom.

Смежные вопросы