2010-10-04 7 views
1

У меня есть объект класса, который имеет частный конструктор:Частный конструктор

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; 
}; 

У меня есть класс, который имеет указатель на объект типа I, описанного ранее.

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 

Как я могу хранить и получить этот объект?

ответ

5

возвращает ссылку вместо:

CL_GUIComponent& getComp() { return *obj; } 

и/или

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

код у вас есть их пытается вернуть копию, но конструктор копирования является частным, поэтому он не может получить доступ это (следовательно, ошибка). В любом случае, для нетривиальных объектов, почти всегда лучше возвращать const& (в общем, не всегда).

+0

Это не решает проблему, поскольку он явно не может изменить эту функцию. – Potatoswatter

2

По указателю или ссылке. Вы не можете создать новую и, таким образом, не можете возвращать копии, как ваши попытки сделать.

+0

Я думал, что возвращаю ссылку, а не копию? – Ockonal

+0

в C++, если вы хотите вернуть объект по ссылке, вам нужно поместить знак '&' после возвращаемого типа: 'CL_GuIComponent & getComp ...', как показывает Питер Александр. – Donotalo

0

getComp возвращает экземпляр CL_GUIComponent. Это означает, что getComp фактически сделает копию экземпляра, на который указывает obj. Если вы хотите getComp вернуть экземпляр где OBJ указывает на, возвращает ссылку на CL_GUIComponent, как это:

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

non-copyable Это идиома в действии. Верните указатель или ссылку.

0

Использовать getComp() для инициализации ссылки.

CL_GUIComponent const &mycomp = getComp(); 

Тогда язык не пытается вызвать конструктор копирования внутри вызывающей функции. (getComp все равно создает и возвращает копию.)

0

Поскольку конструктор объявлен как закрытый, для создания объекта класса, использующего частный конструктор, вы должны использовать функцию открытого члена.

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()); } 
}; 
Смежные вопросы