заголовок
#ifndef INTVECTOR_H
#define INTVECTOR_H
using namespace std;
class IntVector{
private:
unsigned sz;
unsigned cap;
int *data;
public:
IntVector();
IntVector(unsigned size);
IntVector(unsigned size, int value);
unsigned size() const;
unsigned capacity() const;
bool empty() const;
const int & at (unsigned index) const;
};
#endif
Главный
#include "IntVector.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> iVector;
int *array;
IntVector::IntVector(){
sz = 0;
cap = 0;
*data = NULL;
vector<int> iVector (sz);
iVector.reserve(sz);
}
IntVector::IntVector(unsigned size){
sz = size;
iVector.resize(sz);
iVector.reserve(sz);
cap = iVector.capacity();
array = new int[sz];
array = 0;
}
IntVector::IntVector(unsigned size, int value){
sz = size;
iVector.reserve(sz);
cap = iVector.capacity();
array = new int[sz];
for(int i = 0; i < sz; i++){
array[i] = value;
}
}
unsigned IntVector::size() const{
return sz;
}
unsigned IntVector::capacity() const{
return cap;
}
bool IntVector::empty() const{
if(sz > 0){
return false;
}
else{
return true;
}
}
const int &IntVector::at(unsigned index) const{
if(index > sz){
exit(0);
}
else{
return array[index];
}
}
У меня есть эта надоедливая проблема в попытке установить int * data в NULL, так как я получаю ошибку сегментации. Какой метод следует использовать для назначения * данных Null в IntVector, чтобы избежать ошибки сегментации? Это не похоже на то, что я переназначаю что-либо для * Data, поэтому я немного смущен.
Вторая часть моего вопроса - это функция IntVector :: at. Предполагается вернуть значение, хранящееся в элементе, в переданной позиции индекса, но я не уверен, как я могу напрямую вернуть значение, так как это динамически распределенный массив, и то, что я читал в Google, было довольно запутанным. Нужно ли использовать специальный параметр для доступа к значению? Спасибо.
*data = NULL;
Вы не устанавливаете data
в NULL
(предпочитаете nullptr
), вы устанавливаете значение в *data
равным NULL
. data
здесь нетинициализированный указатель, поэтому разыменование его недействительно.
То, что вы хотели, было:
data = NULL;
Или лучше
data = nullptr;
Или, лучше всего, используйте список инициализаторов.
IntVector::IntVector() : sz(0), cap(0), data(nullptr)
{
// I removed your vector initialization since
// you're just using sz, which has a value of 0.
// iVector is already initialized here, but I don't
// believe that you mean to shadow it as you are doing.
// iVector is declared statically, and then again here.
}
*data = NULL;
устанавливает содержимое ячейки памяти в NULL. Но поскольку данные еще не указывают нигде, это неверно.
exit(0);
для неверного индекса? Как кто-то должен выяснить, что не так? Вы могли бы рассмотреть возможность создания исключения. А что происходит сarray
иiVector
? Они не являются частью вашего класса, и использование их так, как они, будет очень плохо для вас.