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

Когда нам нужен частный конструктор в С++

У меня вопрос о private constructor в С++, если конструктор является приватным, как создать экземпляр класса? Должен ли быть метод getInstance() внутри класса?

4b9b3361

Ответ 1

Есть несколько сценариев для private конструкторов:

  1. Ограничение создания объектов для всех, кроме friend; в этом случае все конструкторы должны быть private

    class A
    {
    private:
       A () {}
    public:
       // other accessible methods
       friend class B;
    };
    
    class B
    {
    public:
       A* Create_A () { return new A; }  // creation rights only with 'B'
    };
    
  2. Ограничение определенного типа конструктора (т.е. конструктор копирования, конструктор по умолчанию). например, std::fstream не позволяет копировать с помощью такого недоступного конструктора

  3. Чтобы иметь общий конструктор делегата, который не должен быть открыт внешнему миру:

    class A
    {
    private: 
      int x_;
      A (const int x) : x_(x) {} // common delegate; but within limits of 'A'
    public:
      A (const B& b) : A(b.x_) {}
      A (const C& c) : A(c.foo()) {}
    };
    
  4. Для одноэлементных шаблонов, когда одноэлементный class не наследуется (если он наследуется, используйте protected конструктор)

    class A
    {
    public:
       A();
       A(int);
    private:
       A(const A&);  // Neither others nor 'friend' can use this
       // A(const A&) = delete;  // C++11 equivalent 'private' doesn't matter
    };
    

Пояснение: в случае синглетонов типичным способом является использование в классе public: static getInstance() метода public: static getInstance(), который может получить доступ к private конструктору. В конце концов он создает и поставляет объект во внешний мир.

    class Singleton
    {
    public:
       static Singleton& getInstance() {
          Singleton object; // invokes the 'private' constructor
          return object;
       }
    private:
       Singleton() {}  // make 'protected' for further inheritance
       Singleton(const Singleton&);  // inaccessible
       Singleton& operator=(const Singleton&);  // inaccessible
    };

Ответ 2

Частный конструктор обычно используется с методами Builder, например, в идиоме Named Constructor.

class Point
{
public:
  static Point Polar(double, double);
  static Point Cartesian(double, double);
private:
  Point(double,double);
};

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

Ответ 3

Частный конструктор полезен, если вы хотите контролировать создание объекта в классе. Давайте попробуем код

#include <iostream>
using namespace std;
class aTestClass
{
    aTestClass()//////////private constructor of this class
    {
        cout<<"Object created\n";
    }
    public:

};
int main()
{
    aTestClass a;
    aTestClass *anObject;
}

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

#include <iostream>
using namespace std;
class aTestClass
{
    aTestClass()//////////private constructor of this class
    {
        cout<<"Object created\n";
    }
    public:

    aTestClass* getAnObject()/////a public method create an object of this class and return the address of an object of that class
    {

        return (new aTestClass);

    }
};
int main()
{
    //aTestClass a;
    aTestClass *anObject=NULL;
    anObject=anObject->getAnObject();
}

Выходной сигнал

Object created

поэтому мы создали объект класса, содержащий частный конструктор. Use this concept to implement singleton class Благодаря

Ответ 4

Да, это обычно используется в Singleton pattern, где объект доступен через статическую функцию-член.

Ответ 5

Это зависит от того, почему конструктор был закрыт в первую очередь (вы должны спросить, кто бы написал этот класс, который вы редактируете). Иногда конструктор может быть закрыт, чтобы запретить создание копии (при разрешении построения через какой-либо другой конструктор). В других случаях конструктор может быть закрыт, чтобы запретить создание класса, за исключением класса "friend" (это обычно делается, если класс является "помощником", который должен использоваться только классом (классами), для которого вспомогательный класс был создан). Конструктор также может быть закрыт, чтобы принудительно использовать функцию (обычно статическую) создания.

Ответ 6

Если какой-либо конструктор является закрытым, это означает, что никто, кроме самого класса (и друзей), не сможет создать экземпляры его с помощью этого конструктора. Поэтому вы можете предоставить статические методы, такие как getInstance(), для создания экземпляров класса или создания экземпляров в каком-либо классе/методе friend.

Ответ 7

Закрытый конструктор в C++ можно использовать для ограничения создания объектов постоянной структуры. И вы можете определить аналогичные константы в той же области видимости, что и enum

struct MathConst{
    static const uint8 ANG_180 = 180;
    static const uint8 ANG_90  = 90;

    private:
        MathConst(); // restricting object creation
};

доступ как MathConst::ANG_180