1

Можете ли вы объяснить, почему это порождает ошибку сегментации? Проблема возникает, когда вызывается оператор [], и когда я его не называю, идет нормально. Оператор [] должна возвращать ссылку на элемент с индексом я .. любая помощь будет большой ..Ошибка сегментации: 11? C++

//dynamic_array.cpp file 

#include <iostream> 

#include "dynamic_array.h" 

using namespace std; 

dynamic_array::dynamic_array() { 

     int *array; 
     array=new int[4]; 
     array[0]=3; 
     size = 4; 
     allocated_size = 5;   
} 

dynamic_array::~dynamic_array() { 
    delete [] array; 
} 

int dynamic_array::get_size(void) const { 
    return size; 
} 

int dynamic_array::get_allocated_size(void) const { 
    return allocated_size; 

} 

int& dynamic_array::operator[](unsigned int i) { 
     return array[i]; 
     } 
//test.cpp file 

#include <iostream> 
#include <stdlib.h> 

#include "dynamic_array.h" 

using namespace std; 


int main() { 
    dynamic_array a; 

    cout << a[0]; 

} 
//dynamic_array.h file 

using namespace std; 

class dynamic_array { 
public: 
     enum { 
     BLOCK_SIZE = 5, 
     SUBSCRIPT_RANGE_EXCEPTION = 1, 
     MEMORY_EXCEPTION = 2, 
    }; 

    dynamic_array(); 

    ~dynamic_array(); 

    int get_size(void) const; 

    int get_allocated_size() const; 

    int& operator[](unsigned int i); 

    class exception { 
     public: 
      exception(int n0) { n = n0; }; 
      int n; 
    }; 
    private: 

    int *array; // pointer to dynamically allocated memory 
    int allocated_size; // total number of elements in allocated memory 
    int size; // number of active elements 
    }; 
+1

Вы затеняете свой массив переменных-членов в своем конструкторе. –

+0

как это исправить? –

ответ

2

Местная декларация

int *array; 

тенями члены array. Таким образом, следующий код использует локальную переменную, а не член. Следовательно, член неинициализирован.


Вместо того, чтобы создать свой собственный динамический массив, используйте std::vector.

Это безопаснее и удобнее.


В других новостях:

  • get префикса в, например, get_size - это Java-ism.
    В C++ префикс get не имеет преимуществ, и он делает код менее читаемым. Например, стандартные библиотечные контейнеры имеют метод size, а не get_size.

  • Использование void в качестве официального объявления аргумента, как в get_size(void), является C-ism.
    В C он имеет важный эффект, говорящий компилятору, что на самом деле нет аргументов, а не любых аргументов. В C++ () указывает это.

  • Не имеет также const версия operator[] не соответствует предыдущему использованию const.
    Согласование очень важно в программировании. Наше ожидание, например. при сохранении кода, является то, что он согласован. Код, который является непоследовательным, добавляет дорогостоящие человеко-часы к обслуживанию.

  • Идентификаторы ALL UPPERCASE для констант являются Java-ism.
    В Java нет препроцессора и унаследовано все соглашения с верхним регистром от раннего C, которым не хватало const. C++ имеет как const, так и препроцессор. Имея const, обычно нет необходимости использовать #define для констант (как и в начале C), и имея препроцессор, существует хорошая техническая причина не использовать все прописные буквы (это противоречит соглашению для имен макросов). Кроме того, многие/большинство программистов видят все заглавные буквы как крики. Больно.

  • Класс exception лучше всего получить из std::exception.
    Вместо того, чтобы изобретать собственный класс исключений, который может содержать код ошибки, просто используйте std::system_error. Вот для чего это. В качестве альтернативы можно получить класс от std::runtime_error или напрямую использовать std::runtime_error.

+0

Это часть домашней работы. Я не должен использовать новые понятия в качестве векторов. любая альтернатива? –

+1

удалить массив извести; в вашем конструкторе –

1

Проблема заключается в конструкторе

Go, как это для конструктора:

dynamic_array::dynamic_array() { 

    array = new int[4]; 
    array[0] = 3; 
    size = 4; 
    allocated_size = 5; 
} 

Проблема заключается в additinal строка кода в конструкторе:

int *array; 

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

Но эта переменная является локальной конструктором, и она не является объявленной в вашем классе, как вам полагается.

+1

Пожалуйста, прочитайте [«дать человеку рыбу»] (https://www.google.com/search?q=give+a+man+a+fish). –

+1

@ Пользователи и hth. Альф: Я знаю, что вы имеете в виду. Я добавил дополнительную помощь. – HDJEMAI

+0

Я ценю это спасибо –

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