Подтвердить что ты не робот

Что такое практическое использование защищенного конструктора?

Почему кто-либо объявляет конструктор защищенным? Я знаю, что конструкторы объявляются закрытыми с целью не допускать их создания в стеке.

4b9b3361

Ответ 1

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

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

Ответ 2

одно использование может быть factory шаблонами

Ответ 3

Негосударственные конструкторы полезны, когда существуют требования к конструкции, которые не могут быть гарантированы только конструктором. Например, если метод инициализации нужно вызвать сразу после конструктора или если объект должен зарегистрировать себя с некоторым объектом container/manager, это должно быть сделано вне конструктора. Ограничивая доступ к конструктору и предоставляя только метод factory, вы можете гарантировать, что любой экземпляр, который пользователь получит, выполнит все его гарантии. Это также обычно используется для реализации Singleton, что на самом деле является просто еще одной гарантией, которую делает класс (что будет только один экземпляр).

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

Ответ 4

Защищенный конструктор означает, что только производные члены могут создавать экземпляры класса (и производные экземпляры) с использованием этого конструктора. Это звучит немного курица-яйцо, но иногда полезно при внедрении фабрик классов.

Ответ 5

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

Это не совсем абстрактно в смысле С++, поскольку классы друзей все еще могут использовать его без переопределения, но тогда вам придется объявить их.

Ответ 6

Чтобы подкласс использовал конструктор, который не должен быть доступен для непосредственного непосредственного пользователя.

Ответ 7

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

class Level
{
private:

 Level();
 ¨Level();

 friend class LevelManager;
};

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

Ответ 8

Для методов factory с побочными эффектами.

class mine {

  private:
    mine () {};

  protected:
    mine(int id) : m_id(id) {};

   int m_id;
   static int m_count;

  public:
    static mine* CreateOneOfMe() {
         return mine(m_count++);
    }

    int GetId() { return m_id; }

 };

Это создает экземпляры класса и гарантирует, что каждый из них имеет уникальный инкрементирующий целочисленный id. Обратите внимание, что если конструктор, который вы хотите использовать, не является значением по умолчанию, вы также должны скрыть значение по умолчанию.