Как установить отдельные элементы массива класса с помощью методов класса?

#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();
}
  

http://melpon.org/wandbox/permlink/aIhwC5c9o1q8ygIo

Ответ №2:

 Boo::Boo()
{
    x = new int[1];
    x = 0;
}
  

вы не можете установить значение в массиве, потому что после инициализации с помощью памяти вы установили указатель массива на null в конструкторе.

пожалуйста, используйте x[0] = 0; вместо x = 0;