0

コンストラクターが終了する前に、このポインターをクラスの外で安全に使用できますか(コンストラクターからの仮想関数呼び出しを意味するわけではありません)?

私はこのようなものを意味します:

#include <iostream>

class Bar;

class Foo
{
public:
   Foo(Bar* bar);
};

class Bar
{
public:
   Bar() : instance(this) {}
   void foo()
   {
      std::cout << "Bar::foo() \n";
   }

private:
   Foo instance;
};

Foo::Foo(Bar* bar)
{
   bar->foo(); // UB or not
}

int main()
{
   Bar instance;
}

このコードをMSVC-11.0でコンパイルしようとすると、次の警告が表示されます。

警告C4355:'this':ベースメンバー初期化子リストで使用されます

そして、そのようなコードはどうですか?

#include <iostream>

class Foo;

void bar(Foo* instance);

class Foo
{
public:
   Foo()
   {
      bar(this);
   }

   void foo()
   {
      std::cout << "Foo::foo() \n";
   }
};

void bar(Foo* instance)
{
   instance->foo(); // UB or not
}

int main()
{
   Foo instance;
}

標準からの見積もりが見つかりません。

4

1 に答える 1

1

これは、2番目の例のctorFooまたはfunctionが、まだ初期化されていない/のメンバーを参照するsmthを呼び出さない場合に機能します。最初の例を少し変換して、次のことを示します。barBarFoo

class Bar
{
public:
    Bar() : instance(this),zzz(123) {}
    void foo()
    {
        std::cout << "Bar::foo(): garbage in zzz=" << zzz << "\n";
    }

private:
    Foo instance;
    int zzz;
};
于 2013-02-14T04:19:14.710 に答える