[解決済み] std::unique_ptr の受け渡し方法は?
2023-03-12 13:03:30
質問
C++11に初めて挑戦しています。
unique_ptr
このポインターは 1 つのクラスによって所有されていますが、非常に頻繁に渡されています。
以前はこんな関数がありました。
bool func(BaseClass* ptr, int other_arg) {
bool val;
// plain ordinary function that does something...
return val;
}
しかし、すぐに切り替えができないことに気がつきました。
bool func(std::unique_ptr<BaseClass> ptr, int other_arg);
なぜなら、呼び出し側が関数へのポインタの所有権を処理しなければならないからです。そこで、私の問題に対する最良の解決策は何でしょうか?
私はこのように、ポインタを参照として渡すことを考えました。
bool func(const std::unique_ptr<BaseClass>& ptr, int other_arg);
しかし、私はそうすることに非常に違和感を覚えます。なぜなら、まず、すでに
_ptr
として型付けされたものを参照として渡すのは、直感的ではないと思われるからです。第二に、関数のシグネチャがさらに大きくなってしまうからです。第三に、生成されたコードでは、私の変数に到達するために2つの連続したポインタの間接参照を必要とするためです。
どのように解決するのですか?
関数にポインタを使わせたい場合は、ポインタの参照を渡します。ある種のスマートポインタでしか動作しないように関数を縛る理由はありません。
bool func(BaseClass& base, int other_arg);
また、コールサイトでは
operator*
:
func(*some_unique_ptr, 42);
あるいは、もし
base
引数に null を指定できる場合は、署名をそのままにして
get()
メンバ関数を使用します。
bool func(BaseClass* base, int other_arg);
func(some_unique_ptr.get(), 42);
関連
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み] コンストラクタや関数に unique_ptr 引数を渡すにはどうしたらいいですか?
-
[解決済み] 関数からunique_ptrを返す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】Enterキーを押して続行する
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む