【问题标题】:How do I make a class containing a vector of objects?如何创建一个包含对象向量的类?
【发布时间】:2015-08-18 15:34:03
【问题描述】:

我在Flashcard.hFlashcard.cpp 中声明了Flashcard 类。我想创建一个CardList 类,它应该存储std::vector<Flashcard> 以及其他一些信息,并提供一些操作方法。

CardList.h

#include <vector>
#ifndef LC_FLASHCARD
    #include "Flashcard.h"
#endif

class CardList
{
    public:
        /* Constructor */
        CardList (int number_of_cards = 1);
        /* Returns the j'th card. */
        Flashcard getCard ( int j );
        /* Replaces the j'th card with new_card. */
        void setCard ( int j, Flashcard new_card );
        /* ... */

    private:
        std::vector<Flashcard> card_list;
        /* ... */
};

CardList.cpp

#include "CardList.h"

CardList::CardList ( int number_of_cards ) {
    std::vector<Flashcard> card_list(number_of_cards);
}

CardList::~CardList ( void ) { }

Flashcard CardList::getCard ( int j ) {
    return this->card_list[j];
}

void CardList::setCard ( int j, Flashcard new_card ) {
    this->card_list[j] = new_card;
}

Flashcard CardList::drawCard ( void ) {
    return this->getCard(0);
}

问题

每当我调用CardList::getCardCardList::setCard 时,我都会遇到段错误。例如:

#include "Flashcard.h"
#include "CardList.h"
/* ... */

int main( int argc, char** argv ) {
    /* Creates flashcard card */
    Flashcard card;
    /* (do things to card) */ 

    CardList card_list(7);
    std::cout << "Declaration and initialisation of card_list successful" << std::endl;

    card_list.setCard(0, card); // *** SEGFAULT ***
    std::cout << "Assignment successful" << std::endl;

    /* ... */
    return 0;
}

我认为问题在于我的构造函数CardList::CardList,但我该如何解决呢?

【问题讨论】:

  • 我怀疑您的错误出现在 Flashcard 的复制构造函数或析构函数中,您拒绝让我们看到它。我建议使用调试器,单步调试您的代码,并确定它的来源。

标签: c++ segmentation-fault


【解决方案1】:

这段代码完全不像你想的那样:

CardList::CardList ( int number_of_cards ) {
    std::vector<Flashcard> card_list(number_of_cards);
}

你应该做的是:

CardList::CardList ( int number_of_cards ) :
    card_list(number_of_cards)
{
}

您的 seg 错误是因为您从未调整 card_list 的大小。您的构造函数版本中的代码创建了一个不同的临时 card_list,该临时 card_list 在构造函数退出后立即被销毁。同时,card_list 成员默认构造为大小为零。

【讨论】:

  • 谢谢,这行得通。 :stackoverflow.com/questions/1711990/… 的一个例子吗?
  • 是的,: 以及它通常比构造函数体内的赋值更好的原因似乎在您链接的那个问题中得到了很好的解释。
【解决方案2】:

您的类中有一个名为card_list 的属性,但您没有在构造函数中正确进行初始化。在您的代码中,您有:

CardList::CardList ( int number_of_cards ) {
    std::vector<Flashcard> card_list(number_of_cards);
}

在这种情况下,您正在初始化一个名为 card_listlocal variable,而不是类的属性 card_list

正确的做法如下:

CardList::CardList ( int number_of_cards ) {
    this->card_list = std::vector<Flashcard>(number_of_cards);
} 

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2020-09-21
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多