[解決済み] std::shared_ptr of this
質問
現在、スマートポインタの使い方を勉強しています。しかし、いくつかの実験を行っているときに、私は満足のいく解決策を見つけることができない、次のような状況を発見しました。
クラス A のオブジェクトがクラス B (子) のオブジェクトの親であり、両方が互いを知っている必要があると想像してください。
class A;
class B;
class A
{
public:
void addChild(std::shared_ptr<B> child)
{
children->push_back(child);
// How to do pass the pointer correctly?
// child->setParent(this); // wrong
// ^^^^
}
private:
std::list<std::shared_ptr<B>> children;
};
class B
{
public:
setParent(std::shared_ptr<A> parent)
{
this->parent = parent;
};
private:
std::shared_ptr<A> parent;
};
問題は、クラスAのオブジェクトが、どのようにして
std::shared_ptr
を渡すことができるのでしょうか?
this
) をその子に送るか?
Boost共有ポインタに対する解決策があります (
を取得する
boost::shared_ptr
に対して
this
) を使って処理する方法ですが
std::
スマートポインターを使用してどのように処理するのでしょうか?
どのように解決するには?
あるのは
std::enable_shared_from_this
があります。これを継承して
.shared_from_this()
をクラス内部から呼び出すことができます。また、ここでは循環的な依存関係を作っているので、リソースリークにつながる可能性があります。これは
std::weak_ptr
. したがって、あなたのコードは次のようになります(子供は親の存在に依存し、その逆はないと仮定します)。
class A;
class B;
class A
: public std::enable_shared_from_this<A>
{
public:
void addChild(std::shared_ptr<B> child)
{
children.push_back(child);
// like this
child->setParent(shared_from_this()); // ok
// ^^^^^^^^^^^^^^^^^^
}
private:
// note weak_ptr
std::list<std::weak_ptr<B>> children;
// ^^^^^^^^
};
class B
{
public:
void setParent(std::shared_ptr<A> parent)
{
this->parent = parent;
}
private:
std::shared_ptr<A> parent;
};
ただし
.shared_from_this()
を呼び出すには
this
が所有する
std::shared_ptr
が呼び出された時点で所有されます。これは、スタック上にそのようなオブジェクトをもう作れないことを意味し
一般に
を呼び出すことはできません。
.shared_from_this()
をコンストラクタやデストラクタの中から呼び出すことはできません。
関連
-
[解決済み] テスト
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】'cout'は型名ではない
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】'std::cout'への未定義の参照