2016-04-25 7 views
0

私は書籍を含むbookという名前のクラスを持っています。std :: push_back中のベクタセグメンテーションエラー

#ifndef BOOK_H 
#include<string> 
#include<vector> 
#include<iostream> 
#define BOOK_H 
class book 
{ 
public: 
    std::string Author, Title; 
    int Year; 
    book(){} 
    book(std::string author, std::string title, int year); 
    ~book(){} 
    void add_book(); 
    std::vector<book*>library; 
}; 
#endif 

book.cppファイル

#include "book.h" 

book::book(std::string author, std::string title, int year) 
:Author(author), Title(title), Year(year){} 

void book::add_book() 
{ 
    int y; 
    std::string a, t; 
    std::cin>>a; 
    std::cin>>t; 
    std::cin>>y; 
    library.push_back(new book(a, t, y)); 
} 

しかし、私はライブラリに新しいbookを追加したいとき、私はmain.cppにファイル内の新しいオブジェクトのpush_back中にセグメンテーションフォールトを取得しています

#include "book.h" 

int main() 
{ 
    book* ptr; 
    ptr->add_book(); 
    return 0; 
} 

誰かが私に問題点を説明できますか?

私はOOPで新しく、ここで多くの記事を読みましたが、解決策はまだ見つかりません。

+1

各書籍の個別のライブラリを持っていることの全体的なアイデアは、私には少しの不良に見えます。また、 'book *'を宣言しますが、決して初期化せず、そのメソッドの1つを呼び出します。 – apokryfos

+0

図書館に行ったり本を読んだことはありますか? – molbdnilo

+0

私はそれがそうであることを知っていますが、それは練習のためだけです。 はい、あります –

答えて

2

ptrmainに初期化しません。

int main() 
{ 
    book* ptr = new book(); // initialize it here 
    ptr->add_book(); 
    return 0; 
} 

これはセグメンテーションフォルトを修正します、しかし、私は、サンプルコードに関連するロジックのか分からない、と可能性メモリリーク。私はより良い構図のためbookタイプからlibraryを分離し、ヒープ割り当てを避けるためになり


。ここ

#include<string> 
#include<vector> 
#include<iostream> 

class book 
{ 
public: 
    std::string Author, Title; 
    int Year; 
    book(){} 
    book(std::string author, std::string title, int year) : Author(author), Title(title), Year(year) {} 
    ~book(){} 
}; 

struct library { 
    std::vector<book> books_; 
    void add_book(const book& value) { books_.push_back(value); } 
}; 

int main() 
{ 
    library lib; 
    int y; 
    std::string a, t; 
    std::cin>>a; 
    std::cin>>t; 
    std::cin>>y; 
    lib.add_book(book(a, t, y)); 
    return 0; 
} 
1

まあ、:その使用はワンセグ障害の原因となるので

book* ptr; 
ptr->add_book(); 

ptrは、割り当てられていません。使用前に割り当てる必要があります。

ptr = new book();

これはメモリリークが発生しますので、私は(あなたの動的割り当てのような場合)のお勧め:

book bk; 
bk.add_book(); 

同じように動作します:あなたは、これは、とにかくポインタが必要な理由

auto ptr = std::make_unique<book>(); 
ptr->add_book(); 

けど、。あなたのbookクラスがbookインスタンスのベクトルを保持し、なぜ一方、


? book-sのベクトルを保持するlibraryクラスが必要です。

+0

ありがとうございます。私はそれについて覚えています、残念ながら、私は現在、C++ 11コンパイラで作業しています。 今この質問に答えることはできません。私はもっ​​と練習しなければなりません:)しかし、もう一度、セカンドクラスを作ることに感謝します。 –

1

メソッドを使用する前にBookクラスのオブジェクトを作成する必要があります。

Book *ptr = new Book(); 
関連する問題