Как использовать объект, чей конструктор копирования и назначение копирования являются частными?

При чтении 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 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам