私人构造函数

时间:2010-10-04 17:52:43

标签: c++ constructor private

我有一个类的对象,它有私有构造函数:

class CL_GUIComponent
{
    // ...
    private:
    CL_SharedPtr<CL_GUIComponent_Impl> impl;
    CL_GUIComponent(CL_GUIComponent &other);
    CL_GUIComponent &operator =(const CL_GUIComponent &other);
    CL_GraphicContext dummy_gc;
};

我有一个类,它有一个指向我之前描述的类型的对象的指针。

class Some
{
   private:
       CL_GUIComponent *obj;
   public:
       CL_GUIComponent getComp() { return *obj; }
}

但是这段代码调用错误:

In member function ‘CL_GUIComponent Some::getComp()’:
error: ‘CL_GUIComponent::CL_GUIComponent(CL_GUIComponent&)’ is private
error: within this context

如何存储和获取该对象?

6 个答案:

答案 0 :(得分:5)

返回引用:

CL_GUIComponent& getComp() { return *obj; } 

和/或

const CL_GUIComponent& getComp() const { return *obj; } 

您拥有的代码正在尝试返回副本,但复制构造函数是私有的,因此无法访问它(因此错误)。在任何情况下,对于非平凡的对象,返回const&几乎总是更好(通常,并非总是如此)。

答案 1 :(得分:2)

通过指针或引用。您不能构建一个新的,因此无法返回副本,因为您试图这样做。

答案 2 :(得分:0)

getComp返回CL_GUIComponent的一个实例。这意味着getComp实际上会生成obj指向的实例的副本。如果你想让getComp返回obj指向的实例,返回对CL_GUIComponent的引用,如下所示:

CL_GUIComponent &getComp() {return *obj;}

答案 3 :(得分:0)

这是non-copyable成语。通过指针或引用返回。

答案 4 :(得分:0)

使用getComp()初始化参考。

CL_GUIComponent const &mycomp = getComp();

然后语言不会尝试在调用函数内调用复制构造函数。 (getComp仍会创建并返回副本。)

答案 5 :(得分:0)

由于构造函数声明为private,因此必须使用公共成员函数来创建使用私有构造函数的类对象。

class CL_GUIComponent 
{ 
    // ... 
    private: 
    CL_GUIComponent();
    CL_GUIComponent(CL_GUIComponent &other); 
    CL_GUIComponent &operator =(const CL_GUIComponent &other); 
    public:
    CL_GUIComponent* CreateInstance()
         {
           CL_GUIComponent *obj = new CL_GUIComponent();
         }

};
class Some 
{ 
   private: 
       CL_GUIComponent *obj; 
   public: 
       CL_GUIComponent* getComp() { return (obj->CreateInstance()); } 
};