2013-07-12 61 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