【问题标题】:need help for 2d array in class (c++)需要帮助类中的二维数组(c++)
【发布时间】:2018-09-07 13:35:39
【问题描述】:

在这种情况下,我想删除这本书,但我尝试声明此代码,但它不起作用。

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;
    }
};

【问题讨论】:

  • 什么不起作用?如果您遇到编译器错误,请将它们包含在问题中。如果它在运行时崩溃,请告诉我们(请注意,您在此处显示的代码只是一个类定义,因此这里没有可运行的内容)。
  • 1) 请准确解释什么对您不起作用。 2) 请提供minimal reproducible example
  • @MustafayevTural 您是否尝试过使用调试器单步执行您的代码?
  • @MustafayevTural 这没有回答我的问题。在我最初的评论中,让我扩展一下“使用调试器单步执行代码”的含义:您是否尝试逐行逐行执行代码,同时调查局部变量的值,在每一步,同时将它们与您的期望进行比较,以了解您的程序的行为与您的期望不符的点?
  • @john 好吧,我们不知道 OP 代码中的 Book 是什么,也不知道应该如何使用它。据我们所知,他们可能需要std::vector<std::unique_ptr<Book>>

标签: c++ arrays class pointers heap-memory


【解决方案1】:

在您开始删除之前,您需要正确添加。

除了 Jeffrey 所说的之外,您的 Add 函数可能由于“out by one”错误而无法正常工作。在第一次通话中,您将收到books = new Book*[0];。分配一个大小为零的数组是合法的(请参阅here),但您将无法在其中存储任何内容。

如果您可以使用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
};

如果您需要二维,则代码类似,但将使用向量的向量。

【讨论】:

  • 也许是Book book(tmp); books.push_back(book);
  • @Eljay 我用books.emplace_back(tmp);加注...
  • @Bob • 但tmp 不是一本书,它是一个输入。
  • @Eljay 没错。在您的 sn-p 中,您假设有一个 Book 的构造函数接受 INPUT 并且 emplace_back 所做的是使用提供的参数就地构造元素,而不是临时的。
【解决方案2】:
Book **books; 

是指向书的指针。这是拥有书籍列表(作为指针)或书籍列表的旧式方式。

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

这将创建一个空库。没有书。

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

首先要注意的是您没有使用tmp 书。因此,如果不使用它,您可能无法成功地将其存储在任何地方。

第二件事是books = new Book*[counter]; 分配了一个图书馆。存放一些书籍的空间。您可能应该在构造函数中执行此操作。如果您在此处执行此操作,则每次尝试添加一本书时,您都会丢失所有其他图书,并且还会泄漏内存。

这里有两种可能性。你有一个老 C++ 教授,你需要学习指针和指针的指针,以及新的、删除。或者您可以了解 std::vectors 和智能指针。这将是一个更好的主意,但我无法告诉你它会在你的课堂上获得多大的好评。

另外,请说明 INPUT 的定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2023-03-04
    • 2016-08-12
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多