データベース クラスがあり、明示的なコンストラクターは、渡されたフラグに基づいてデータベースに接続しようとします。失敗すると、スローされます。これは望ましくない (データベースが別のアプリによって作成されていない可能性がある) ため、空のコンストラクターとデフォルトの移動コンストラクターを追加しました。ユーティリティ クラスでは、データベースが作成されるまで待ってから、新しいデータベースを移動します。
単体テストでは、database_utils::connected()
移動前に false が返され、移動後に true が返されることがわかります。ただし、データベースを使用する関数を呼び出すと、library routine called out of sequence
エラーが発生します。これは、データベースまたは不正な形式の選択ステートメントを開いていないことを示唆していますが、コンストラクターとデストラクタは正しい順序で呼び出され、データベースを作成してデータを入力し、選択ステートメントが機能するデータベース自体の単体テストがあります。
だから私の質問:デフォルトの動きは実際にそれを動かしていますか?そうでない場合、期待される動作を得るために何をする必要がありますか?
サンプルコード:
class database
{
database() : connected_(false), database_(nullptr) { }
database(/* params */) : connected_(false), database_(nullptr) {
/* attempt connection, throw on fail */
connected_ = true;
}
database(database& other) = default;
database(database&& other) = default;
database& operator=(database&& other) = default;
~database() { /* clean up */ }
operator bool() const { return connected_; }
bool connected_;
sqlite3* database_;
};
class database_utils
{
database_utils() : db_() { }
void connect() {
db_ = std::move(database(/*params*/));
}
bool connected() { return db_; }
void example_select(/* params */) {
/* use db_ */
}
database db_;
};