Используя ключевое слово `class`, за которым следует необъявленный идентификатор - PullRequest
3 голосов
/ 06 января 2020

Следующие файлы hpp и cpp являются выдержкой из большой программы, с которой я работаю. Он будет компилироваться с g++ -std=c++17 -pedantic -Wall -Wextra.

// a.hpp

#include <memory>

class A
{
    std::unique_ptr<class A_impl> my;
};
//a.cpp

#include "a.hpp"

int main()
{}

Но я не понимаю синтаксис в строке относительно уникального указателя.

Вопросы:

  1. Какой синтаксис для <class A_impl>? Как это называется (помещая class перед необъявленным идентификатором)? Это делает "предварительную декларацию" на A_impl или как? Я ничего не сказал об идентификаторе A_impl. Почему с этим компилятор все в порядке?

  2. Если это, возможно, связано с каким-либо «шаблоном проектирования», пожалуйста, помогите мне определить его.

Пожалуйста, укажите верное направление.

1 Ответ

6 голосов
/ 06 января 2020

Он делает "предварительное объявление" на A_impl или как?

Точно. Вероятно, это сбивает с толку то, что для этого он использует разработанный спецификатор типа в аргументе шаблона. Отличия от "обычного" форвардного объявления

Я ничего не сказал об идентификаторе type A_impl. Почему с этим компилятор все в порядке?

std::unique_ptr может быть создан с неполным типом - как необработанный указатель.

Если это возможно как я могу его идентифицировать?

PIMPL - идиома "указатель на реализацию".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...