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

Foo当第二个示例中的ctor 或bar函数调用引用仍然未初始化Bar/成员的 smth时,这将起作用Foo。我会稍微改变你的第一个例子来演示:

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 回答