2017-06-19 21 views
1

mongocxxドライバを正常にインストールしました。今度は、データベースからデータを接続して照会するクラスを作成しようとしました。このようなコンストラクタでクエリを書くと、Mongocxx接続エラー

DBConnection::DBConnection() 
{ 
    mongocxx::instance instance{}; 
    mongocxx::uri uri("mongodb://localhost:27017"); 
    mongocxx::client client(mongocxx::uri{}); 
    coll = client["testdb"]["testcollection"]; 
    auto curs = coll.find(bsoncxx::builder::stream::document{} << finalize); 
    for (auto doc: curs) { 
     std::cout << bsoncxx::to_json(doc) << "\n"; 
    } 
} 

のように動作します。

しかし、私はこの

DBConnection::DBConnection() 
{ 
    mongocxx::instance instance{}; 
    mongocxx::uri uri("mongodb://localhost:27017"); 
    mongocxx::client client(mongocxx::uri{}); 
    coll = client["testdb"]["testcollection"]; 
} 

void DBConnection::loadData() { 
    mongocxx::cursor cursor = coll.find({}); 
    for (auto doc: cursor) { 
     std::cout << bsoncxx::to_json(doc) << "\n"; 
    }  
} 

のように二つの機能に分けた場合、それはエラーを与えた:src/mongoc/mongoc-topology-scanner.c:754 mongoc_topology_scanner_get_error(): precondition failed: ts

なぜわからないのですか?これをどうすれば解決できますか?

+0

どのようにして1つの関数から別の関数にcollを取得しましたか?これはクラスのメンバですか? – pm100

+0

はい、 'coll'はクラスのプライベートメンバーです – GAVD

答えて

0

オブジェクトの寿命は、それを作成したmongocxx::clientオブジェクトの有効期間のサブセットである必要があります。コンストラクタでmongocxx::clientオブジェクトを取得し、mongocxx::collectionオブジェクトを取得してクラスのメンバ変数に(おそらくaのように)格納してから、mongocxx::clientオブジェクトを破棄することで、その制約に違反しています。その後のmongocxx::collectionオブジェクトの使用は無効ですloadData