cpp-ru/ideas

Предварительное описание методов

osheter opened this issue · 7 comments

Разрешить предварительное описание методов, не описывая весь класс.
Использовать вместо pimpl.

// h-файл

class foo;
int foo::bar() const;

// cpp-файл

class foo
{ 
public:
  int bar() const { return 0; }
};

Использовать вместо pimpl.

И отказаться от возможности использовать конструкторы и деструкторы ?

Для Вашего класса компилятор, согласно стандарта, обязан сгенерировать деструктор, если оригинальный недоступен в области видимости(Что достаточно странно и абсурдно для многих, и приводит к частым ошибкам в программах в виде утечек ресурсов и дэдлоков и прочее). Подробности тут: #476. Конкретно для вашего случая pimpl будет утечка ресурсов. Если же деструктор будет видимым, то это уже совсем не Pimpl.

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

У линкера ( в сигнатуре метода ) нет информации о том публичный метод или не публичный.
Также поломается несколько других функций языка с++.

tea commented

Возникает проблема с overloads. Например, есть внешнее определение void foo::bar(int), а в классе есть void bar(long). Вызываем m_foo->bar(1L), и выбор конкретного метода оказывается зависимым от того, видим мы класс или нет.
Кроме того, сама эта проблема (отвязывание использования класса от его деталей реализации), если я правильно понимаю, может/должна решаться сама собой при использовании модулей.