Должен ли конструктор копирования быть закрытым или общедоступным - PullRequest
6 голосов
/ 23 февраля 2012

Я пишу абстрактный класс, который будет родительским для нескольких других классов.Я думаю, что конструктор копирования должен быть закрытым, потому что вы используете абстрактный класс и копировать нечего.Однако я не уверен на 100%.

Прав ли я, и если нет, почему он должен быть публичным или защищенным?

Ответы [ 3 ]

8 голосов
/ 23 февраля 2012

Конструктор копирования должен быть закрытым, если вы не хотите, чтобы объекты класса копировались.В противном случае он должен быть публичным.

6 голосов
/ 23 февраля 2012

Я думаю, protected - лучший выбор: он оставляет решение о том, должен ли объект копироваться в производные классы, и в то же время запрещает копирование на уровне абстрактного класса, предотвращая страшную нарезку объектов .

3 голосов
/ 23 февраля 2012

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

В одном случае конструктор копирования должен быть защищен, а не закрытым, когда у абстрактного класса есть члены-данные. Это случается не очень часто. Базовый класс может копировать члены базового класса, в то время как производный класс копирует своих собственных членов.

class AbstractBase
{
public:
    AbstractBase(const std::string &init) : wtf(init) {}
    virtual ~AbstractBase() {}
    void DoSomething() = 0;
protected:
    AbstractBase(const AbstractBase &r) : wtf(r.wtf) {}

    const std::string wtf;
};

class Derived : public AbstractBase
{
public:
    // ...
    Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {}
private:
    int moredata;
};
...