Как использовать объект, конструктор копирования и назначение копирования которого являются частными? - PullRequest
3 голосов
/ 05 июня 2010

При чтении TCPL у меня возникла проблема, так как заголовок ссылался, а затем класс private:

class Unique_handle {
private:
    Unique_handle& operator=(const Unique_handle &rhs);
    Unique_handle(const Unique_handle &rhs);
public:
    //...
};

код использования:

struct Y {
    //...
    Unique_handle obj;
};

и я хочу выполнить такие операции:

int main()
{
    Y y1;
    Y y2 = y1;
}

хотя, этот код пришел из TCPL, но я до сих пор не могу найти решение ... Кто-нибудь может мне помочь, ценю.

Ответы [ 6 ]

6 голосов
/ 05 июня 2010

Как следует из названия, Unique_handle не предназначен для копирования. Его реализация обеспечивает это, отключая конструктор копирования и оператор присваивания копии.

Одним из решений для нескольких экземпляров, имеющих доступ к Unique_handle, является удержание указателя на него и копирование указателя. Затем несколько экземпляров Y указывают на один и тот же уникальный дескриптор.

Позаботьтесь, однако, , чтобы правильно управлять ресурсами в этом случае.

4 голосов
/ 05 июня 2010

Пример, который вы просматриваете в книге Страуструпа, демонстрирует, как конструктор класса может явно предотвратить копирование или присвоение объектов этого класса.

Класс намеренно делает это, чтобы ваш код не мог делать то, что вы пытаетесь сделать (предположительно, потому что класс не будет функционировать должным образом или копирование иначе не имеет смысла). Если вы хотите иметь возможность копировать объекты этого класса, вам необходимо изменить класс.

Некоторые другие опции, которые у вас могут быть (которые также могут не иметь смысла, но это зависит от того, что вы действительно делаете) - вместо указателей передайте указатели на ссылки на объект.

2 голосов
/ 05 июня 2010

вы не должны пытаться скопировать его. Но, сказав это ... вы можете это запомнить. Единственная причина, по которой вы делаете это, заключается в том, что вы знаете, что делаете, знаете о последствиях и т. Д. Но вы можете сделать что-нибудь немного ниндзя.

2 голосов
/ 05 июня 2010

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

0 голосов
/ 05 июня 2010

Вы можете использовать shared_ptr для совместного использования объекта:

class Y
{
public:
  Y(): mHandle(new UniqueHandle()) {}

private:
  boost::shared_ptr<UniqueHandle> mHandle;
};

Это так просто.

Если вы не хотите совместно использовать владельца, вы можете использовать boost::scoped_ptr или только что созданный std::unique_ptr, если у вас есть к нему доступ, а затем самостоятельно реализовать CopyConstructor и AssignmentOperator, заботясь об их семантике.

0 голосов
/ 05 июня 2010

Я погуглил свой вопрос и нашел способ построить такой объект:

static Unique_handle * instance () {return new Unique_handle (); }

но это кажется неправильным, тогда как я могу определить такой объект снаружи?

В любом случае, спасибо за вашу заботу.

...