0

特定のクラス (B) が常に 2 番目のクラス (D) に派生することがわかっているクラス階層があります。thisB のコンストラクターでは、構築全体が完了する前に誰も使用しようとしないことが確実な場合、ポインターを D* に静的にキャストしても安全ですか? 私の場合、オブジェクトへの参照をさらに別のクラス (A) に渡したいと考えています。

struct A
{
    D & d_;

    A(D & d) : d_(d) {}
};

struct D; //forward declaration

struct B
{
    A a;

    B() : a(std::static_cast<D&>(*this)) {}
};

struct D : public B
{};

このコードは安全ですか?

4

3 に答える 3

2

それについては何も見つかりませんでした。これは安全ですが、コードが安全ではない理由を見つけるのに苦労しました:

struct B
{
    A a;

    B(D& d) : a(d) {}
};

struct D : public B
{
    D() : B(*this) {}
};

しかし、私はおそらくここで提示したフォームを引き続き使用します。

于 2009-07-28T10:30:59.687 に答える
2

いいえそうではありません。D のデータ メンバーのコンストラクターはまだ実行されていません。

D のメンバーが構築されていないため、D はまだ完全には構築されていないため、技術的には、D への参照は無効である必要があります。ほとんどの実装では問題ないと思いますが、それでも.

より良いメカニズムを提案したいのですが、「より良い」は実際の詳細に大きく依存すると思います.

于 2009-07-28T10:08:41.667 に答える
0

@AProgrammerの回答により、派生クラスから基本クラスにポインターstatic_castを渡すことで簡単に回避できることに気付きました。thisしたがって、問題はthis、メンバー初期化子リストへのポインターの有効性に要約されます。

C++ 標準 [12.6.2.7] で次のメモを見つけました。

[注: mem-initializerはコンストラクターのスコープで評価されるため、 mem-initializer の式リストthisポインターを使用して、初期化されるオブジェクトを参照できます。]

したがって、thismember-initializer-list での使用は完全に有効であるため、提示されたコードは安全だと思います (D のメンバーがアクセスされない限り)。

于 2009-07-28T12:10:53.667 に答える