2015-05-25 21 views
0

我想這樣做,但我有說Y class has no constructors循環引用:類沒有構造函數和空成員的shared_ptr值

class Y; 
class X 
{ 
    std::shared_ptr<Y> base; 
    //other private stuff 
public: 
    X() 
    { 
     base = std::shared_ptr<Y>(new Y(this)); 
    } 
    std::shared_ptr<Y> Get(){ return base; } 
}; 
class Y 
{ 
    X d; 
    //other private stuff 
public: 
    Y(X * b) :d(*b){} 
}; 

使用它作爲

X x; // all values in X is defined 
std::shared_ptr<Y> spy=x.Get(); 

spy包含一個錯誤X中的所有私有值,除了它本身的shared_ptr,它是空的。這是正常的嗎?

更多說明: spy包含dX's。如果我在調試器中查看spy裏面的d,我看到base是空的。我只是錯了嗎?

+0

在X的聲明下移動X的實現。 – Borgleader

+1

定義'Y'後,在類的外面定義'X :: X'。 –

+0

如何在調試器中看到'spy'包含的值? –

回答

1

由於X::X()的定義取決於具體的構造函數的存在,它需要在後者之後。那就是:

class Y; 

class X 
{ 
    std::shared_ptr<Y> base; 
    //other private stuff 
public: 
    X(); // just the declaration here, we don't know that Y(X*) is 
     // a valid constructor yet. 
    std::shared_ptr<Y> Get(){ return base; } 
}; 

class Y 
{ 
    /* all of Y */ 
}; 

// NOW, this is valid 
// because we know that Y::Y(X*) is a valid constructor 
X::X() { 
    base = std::shared_ptr<Y>(new Y(this)); 
} 
+0

爲什麼在Java或C#等其他語言中這一直都不是問題? –

+1

@DavidCattor C++不是Java或C#。他們有不同的規則。 – Barry

+0

@DavidCattor因爲不同的語言有不同的規則。在C++順序中很重要。 – Borgleader

1

您的問題是new Y(this)是應放置在Y被完全定義,不僅宣告範圍。

相關問題