我有一个类的对象,它有私有构造函数:
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
如何存储和获取该对象?
答案 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()); }
};