нужна помощь для 2d массива в классе (c ++) - PullRequest
0 голосов
/ 07 сентября 2018

В этой ситуации я хочу удалить книгу, но я пытаюсь объявить этот код, он не работает.

class Library {
private:
    Book **books;
    int counter;
public:
    Library() {
        books = NULL;
        counter = 0;
    }
    void Add(INPUT &tmp) {
        books = new Book*[counter];
        ++counter;
    }
    void Delete() {
        --counter;
        delete[] books[counter];
        books[counter] = NULL;
    }
    int getCounter() {
        return this->counter;
    }
    ~Library() {
        delete[] books;
    }
};

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Прежде чем вы начнете удаление на работу, вам нужно правильно добавить.

В дополнение к тому, что сказал Джеффри, ваша функция Add, вероятно, не работает должным образом из-за ошибки "out by one". При первом звонке у вас будет books = new Book*[0];. Выделение массива нулевого размера допустимо (см. здесь ), но вы не сможете хранить в нем что-либо.

Если вы можете использовать std::vector, это сделает ваш код намного проще и менее подверженным ошибкам.

class Library {
private:
    std::vector<Book> books;
    // no need for counter, std::vector has size()
public:
    // no need for a constructor, the default constructor
    // will correctly construct 'books'
    void Add(INPUT &tmp) {
        // not sure how you convert 'INPUT' to 'Book'
        books.push_back(tmp);
        // this handles all of the memory management for you
    }
    void Delete() {
        // you need to ensure that books is not empty
        books.pop_back();
    }
    int getCounter() {
        return books.size();
    }
    // no need for a destructor, the default one will
    // do everything
};

Если вам нужны два измерения, то код похож, но будет использовать вектор вектора.

0 голосов
/ 07 сентября 2018
Book **books; 

- указатель на указатель на книгу. Это старый способ иметь список книг (в виде указателей) или список книг.

Library() {
    books = NULL;
    counter = 0;
}

Это создаст пустую библиотеку. Нет книг.

void Add(INPUT &tmp) {
    books = new Book*[counter];
    ++counter;
}

Первое, на что нужно обратить внимание, это то, что вы не пользуетесь книгой tmp. Так что вам, вероятно, не удастся хранить его где-либо, не используя его.

Во-вторых, books = new Book*[counter]; выделяет библиотеку книг. Место для хранения некоторых книг. Вы, вероятно, должны сделать это в конструкторе. Если вы сделаете это там, каждый раз, когда вы пытаетесь добавить книгу, вы потеряете все остальные, и вы также потеряете память.

Здесь есть две возможности. У вас есть старомодный профессор C ++, и вам нужно будет узнать об указателях и указателях на указатели, а также о новых, удалить. Или вы можете узнать о std :: vectors и smart-указателях. Это была бы лучшая идея, но я не могу сказать вам, насколько хорошо она будет принята в вашем классе.

Также, пожалуйста, укажите, как определяется ВХОД.

...