Частный конструктор - PullRequest
       19

Частный конструктор

1 голос
/ 04 октября 2010

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

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 ]

5 голосов
/ 04 октября 2010

Вместо этого верните ссылку:

CL_GUIComponent& getComp() { return *obj; } 

и / или

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

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

2 голосов
/ 04 октября 2010

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

0 голосов
/ 04 октября 2010

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

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()); } 
};
0 голосов
/ 04 октября 2010

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

CL_GUIComponent const &mycomp = getComp();

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

0 голосов
/ 04 октября 2010

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

0 голосов
/ 04 октября 2010

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

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