9

私は構造体(クラスにすることができます)を持っており、示されているように別のクラスで定義されています

struct A{
somedata_A;
somespecificimplementation_A(someclass *S1);
};

class someclass{
somedata_someclass;
A a;
};

main(){
 someclass c1, *c2;
 c2 = &c1;
 c1.a.somespecificimplementation_A(c2);
}

c2 が実際に c1 の参照であることを確認するにはどうすればよいですか? c2 が c1 の参照であることは明らかであるため、この例を挙げたことをお許しください。

更新: A は someclass へのポインタを格納しません

4

5 に答える 5

6

親について何も知らない場合は、メンバーのアドレスを比較してください

void A::somespecificimplementation_A(someclass *S1)
{
    if (this == &(S1->a)) {
        // parent == S1
    } else {
        // parent != S1
    }
}
于 2013-07-18T07:47:38.433 に答える
3

Like that:

struct A{
  int somedata_A;
  int somespecificimplementation_A(someclass *S1){
    if ((void*) &(S1->a) == this)
    {
      std::cout << "S1 is a pointer to myself" << std::endl;
      return 1;
    }
    return 0;
  }
};
于 2013-07-18T07:39:45.423 に答える
1

struct Aへのポインターがあると仮定すると、ポインターc1を取得してc2ポインター値を比較できますか? 代入演算子のオーバーロードで行うことと同様ですか?

于 2013-07-18T07:36:49.923 に答える
1

技術的には特定されていませんが、以下はほとんどの最新の汎用マシンで動作します。

void A::somespecificimplementation_A( someclass* S1 )
{
    char const* s = reinterpret_cast<char const*>( S1 );
    char const* t = reinterpret_cast<char const*>( this );
    if ( this >= s && this < s + sizeof( someclass ) ) {
        //  This A is a member of S1
    } else {
        //  This A isn't
    }
}

そうは言っても、私は強調します:

  1. これ規格では規定されていません。フラットで線形のアドレッシングを備えたマシンでは動作しますが、セグメント化されたメモリなどを備えたマシンでは失敗する (誤検知を引き起こす) 可能性があります。

  2. Aそれが誰のメンバーであるかを知る必要がある場合、私はそのデザインに真剣に疑問を投げかけます.

  3. そして、A本当にこの情報が必要な場合someclassは、依存関係が明らかになるように、コンストラクターに渡される へのポインターを実際に格納する必要があります。

于 2013-07-18T07:49:03.100 に答える
1

代わりに、構築中に親によって親への参照を与えることができるのに、テストする必要があるネストされた構造体にクラスのポインターを渡すのはなぜですか?

class someclass
{
    public:
        struct a
        {
            void foo()
            {
                parent.doSomething();
            }

            private:
                friend someclass;
                a(someclass & parent)
                : parent(parent)
                {}
                someclass & parent;
        } a;

        someclass() : a(*this) {}

    private:
        void doSomething()
        {
        }
};
于 2013-07-18T07:43:52.877 に答える