Шаблон построителя: как работает частный конструктор объекта, который будет построен? - PullRequest
0 голосов
/ 28 марта 2020
  1. Элемент списка

Запрос 1: Если мы скрываем конструкторы A, как ABuilder создает A? Этот код соответствует примеру, указанному в Design Patterns in Modern C++.

. Запрос 2. Если мы хотим sh лениво инициализировать объект, используя шаблон Builder, нужно ли размещать объект A внутри ABuilder в куче ? Хорошо ли задокументирован случай с примером?

Запрос 3: Что такое оператор operator A() внутри класса построителя? это оператор типографирования? Как он вызывается в классе строителя?

struct A
{
    int x;

    static std::unique_ptr<ABuilder> build()
    {
        return std::unique_ptr<ABuilder>(new ABuilder());
    }

    std::string str() const {
        std::cout << "str\n";
    }

    private: // hide all constructors
    A() {}
    A(int x)
    : x(x) {}
};

struct ABuilder
{
    operator A() const { return root; }
    A root;
    // other operations omitted
    ABuilder() {}

    ABuilder& x(int x)
    {
        root.x = x;
        return *this;
    }
};

int main() {
    A e = A::build()
     ->x(2);
   std::cout << e.str() << std::endl;
}

1 Ответ

0 голосов
/ 28 марта 2020

1) Это работает, потому что в момент создания объекта (в вызове build) конструктор находится в области видимости. Помните, что в C ++ доступ управляется на основе типов, а не на основе объектов.

Внутри функции-члена (stati c или нет) у вас есть доступ ко всем publi c и защищенным членам of 'this' (для не-stati c функций), а также любой другой объект типа, который находится в области видимости. У вас также есть такой доступ к любым друзьям, находящимся в области видимости.

2) Можно выполнить ленивую инициализацию отдельного объекта типа и поместить его в стек, используя функцию stati c object Это общий шаблон для одноэлементных типов:

class example
{
  example & get_object() {
    static example object;
    return object;
  }

private: example () = default; };

Объект на самом деле не будет инициализирован, пока get_object () не будет вызван в первый раз.

...