2013-07-12 88 views
8

我有兩個類:Point,即只生活在SpaceC++朋友構造

class Point 
{ 
private: 
    Point(const Space &space, int x=0, int y=0, int z=0); 
    int x, y, z; 
    const Space & m_space; 
}; 

構造函數是故意私人的,我不希望它被直接調用。 我想創建這樣的點

Space mySpace; 
Point myPoint = mySpace.Point(5,7,3); 

有沒有什麼辦法可以這樣做?謝謝。

+1

研究['friend'](http://en.cppreference.com/w/cpp/language/friend)類和函數。 –

+0

*構造函數是故意隱私* ...爲什麼? –

回答

10

是的,聲明Space::Point()作爲朋友的方法。該方法將獲得訪問Point的私人會員。

class Point 
{ 
public: 
    friend Point Space::Point(int, int, int); 
private: 
    // ... 
+0

謝謝,但它不喜歡使用與構造函數相同的名稱: 'Point Space :: Point(int,int,int)的聲明從'struct Point'改變'Point'的含義。我想我應該重新命名它。 – Heretron

+0

@ user2578002您也可以在創建Point對象時使用完全限定的名稱,例如'your :: namespace :: Point(x,y,z)'。 – cdhowie

6

我會做這樣的:

class Space 
{ 
public: 
    class Point 
    { 
    private: 
     Point(const Space &space, int x=0, int y=0, int z=0); 
     int m_x, m_y, m_z; 
     const Space & m_space; 

    friend class Space; 
    }; 

    Point MakePoint(int x=0, int y=0, int z=0); 
}; 

Space::Point::Point(const Space &space, int x, int y, int z) 
    : m_space(space), m_x(x), m_y(y), m_z(z) 
{ 
} 

Space::Point Space::MakePoint(int x, int y, int z) 
{ 
    return Point(*this, x, y, z); 
} 

Space mySpace; 
Space::Point myPoint = mySpace.MakePoint(5,7,3); 
+0

感謝您的選擇,問題是,我將不得不始終引用空間類操作點 mySpace.p1 + mySpace.p2,我會牢記嵌套類 – Heretron