2013-02-14 162 views
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: '這個':在使用基礎成員初始化列表

那麼這樣的代碼呢?

#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; 
} 

我找不到任何標準報價。

+0

關於警告:如果什麼'Bar'是使用'Foo' *的成員*前成員的構造函數被調用?這可能導致未定義的行爲。 – 2013-02-14 04:19:20

+0

我不知道如何正確標記(常見問題解答沒有幫助),但這看起來像是一個邊界重複。 (http://stackoverflow.com/questions/2516960/c-using-this-pointer-in-constructors) – Pseudonym 2013-02-14 04:21:22

回答

1

,而在第二個例子中Foo構造函數或bar功能不通話不便引用仍然未初始化的成員Bar/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; 
};