#c #arrays #getter-setter
#c #массивы #getter-setter
Вопрос:
Я использую C и пытаюсь установить значения элементов массива с помощью метода setter. Массив является закрытым членом класса:
class Boo{
private:
int *x;
public:
Boo();
~Boo();
void setX(int,int);
int getX(int);
}
Boo::Boo(){
x = new int[1];
x = 0;
}
void Boo::setX(int value, int index){
//set condition for NULL
x[index] = value;
}
int Boo::getX(int index){
if(x[index] == NULL) {cout<<"invalid index"<<end; return;}
return x[index];
}
void test(){
Boo *p = new Boo();
p->setX(12,0);
cout<<p->getX(0)<<endl;
}
Я пытался протестировать установку значений в ‘x’, начиная с индекса ‘0’ (например, test ()), но он выходит из строя. Я хотел написать программу, в которой я запускаю цикл подсчета, и я устанавливаю значения массива. Можно ли это сделать таким образом?
Комментарии:
1. он выходит из строя, потому что x имеет значение null после того, как вы его выделили. остановитесь learncpp.com и посмотрите, что они могут предложить
2. Я предполагаю, что сбой как-то связан с тем фактом, что вы устанавливаете указатель
x
на 0 в своем конструкторе, поэтому, когда вы пытаетесь получить доступ к 0-му индексу вsetX()
, вы пытаетесь получить доступ к элементу, который не существует, дляx
которого у вас неопределенное поведение (или, возможно, ошибка seg).
Ответ №1:
Не используйте new
в C !
В этом случае вы должны использовать std::vector<int>
.
Если вы хотите исправить свой код, если не используете std::vector
,
#include <cstddef>
#include <iostream>
#include <stdexcept>
#include <memory>
using std::size_t;
class Boo {
private:
int *x;
size_t size;
size_t capacity;
public:
Boo();
~Boo();
void setX(int,size_t);
int getX(size_t);
};
Boo::Boo() : size(), capacity(1) {
this->x = new int[1];
//x = 0;//DO NOT ASSIGN NULL POINTER!!!!
}
Boo::~Boo() noexcept {
delete[] x;
}
void Boo::setX(int value, size_t index){
if(this->capacity <= index) throw std::out_of_range("Boo::setX");//YOU MUST CHECK RANGE
this->x[index] = value;
this->size;
}
int Boo::getX(size_t index){
if(this->size <= index) throw std::out_of_range("Boo::getX");//YOU MUST CHECK RANGE
return x[index];
}
void test(){
auto p = std::make_unique<Boo>();
p->setX(12,0);
std::cout << p->getX(0) << std::endl;
}
int main(){
test();
}
Ответ №2:
Boo::Boo()
{
x = new int[1];
x = 0;
}
вы не можете установить значение в массиве, потому что после инициализации с помощью памяти вы установили указатель массива на null в конструкторе.
пожалуйста, используйте x[0] = 0; вместо x = 0;