1

私がこの設定をしているとしましょう:

struct XView;
struct X
{
  ...
  XView  view;
};

タイプXViewはこの1つのフィールドにのみ使用されます。内部にもあるため、外部からインスタンス化すること、つまり他の目的に使用することは禁止されています。

したがって、型のオブジェクトがフィールドであると仮定すると、C ++標準で定義された動作の範囲内に完全にとどまり、型のパンニングなしで、のアドレスからのアドレスを見つけることができますか?つまり、次のようなことを行うことは可能ですか?XViewX::viewXXView

void XView::some_function ()
{
  X&  this_x = some_computations_involving (this);
}

もちろんポインタを格納できるので、これは簡単になりますがx = *this->parent_x、可能であればポインタなしで実行したいと思います。

編集:型のパンニングを伴わない答えが必要であることに注意してください。そうでない場合は、「ポインタを格納するだけ」のソリューションを使用したいと思います。

4

2 に答える 2

1

最初のアプローチはXView、の最初のメンバーを作成Xすることです。次に、これを行うことができます。

void XView::some_function ()
{
   X & this_x = reinterpret_cast<X&>(*this);
}

2番目のアプローチは、XViewがの最初のメンバーでない場合にオフセットを使用することXです。

技術的に言えば、仮想性が含まれていない場合、これらのアプローチは両方とも同じですが、最初のアプローチが一般的なケースである2番目のアプローチの特殊なケース(つまり、offset = 0の場合)であるということだけです。

編集に関しては、キャストせずにはできないと思います。ポインタをに格納するか、ポインタXViewのマップ(またはその他のデータ構造)を維持する必要があります。

于 2013-03-16T19:41:23.320 に答える
0

最も重要なことは、子オブジェクトから親オブジェクトにアクセスする必要があるかどうかであり、その逆ではありません。

ある種の双方向リンクリストなどを使用することをお勧めします。

コードをリファクタリングして、よりオブジェクト指向にすることはできますか?(そしておそらく継承を使用する(そしてsuper :: some_function ...を使用して親を呼び出す)

于 2013-03-16T19:45:28.820 に答える