Можно ли создать заголовочный файл С++ (.h), который объявляет класс и его общедоступные методы, но не определяет частные члены этого класса? Я нашел несколько страниц, в которых говорится, что вы должны объявить класс и все его члены в файле заголовка, а затем определить методы отдельно в файле cpp. Я спрашиваю, потому что я хочу иметь класс, определенный в DLL Win32, и я хочу, чтобы он был правильно инкапсулирован: внутренняя реализация этого класса может измениться, включая его членов, но эти изменения не должны влиять на код, который использует класс.
Я предполагаю, что если бы у меня было это, то это сделало бы невозможным, чтобы компилятор знал размер моих объектов раньше времени. Но это должно быть хорошо, если компилятор достаточно умен, чтобы использовать конструктор и просто передавать указатели на место в памяти, где хранится мой объект, и никогда не позволяйте запускать "sizeof (MyClass)".
Обновление: Спасибо всем, кто ответил! Похоже, что идиома pimpl - хороший способ добиться того, о чем я говорил. Я собираюсь сделать что-то подобное:
У моего DLL файла Win32 будет куча отдельных функций, таких как:
void * __stdcall DogCreate();
int __stdcall DogGetWeight(void * this);
void __stdcall DogSetWeight(void * this, int weight);
Это типичный способ, которым Microsoft пишет свои DLL файлы, поэтому я думаю, что для этого есть веская причина.
Но я хочу воспользоваться хорошим синтаксисом С++ для классов, поэтому я напишу класс-оболочку, чтобы завершить все эти функции. У него будет один член, который будет "void * pimpl". Этот класс-оболочка будет настолько простым, что я могу просто объявить его и определить его в файле заголовка. Но этот класс-оболочка действительно не имеет никаких целей, кроме того, что код С++ выглядит довольно хорошо, насколько я могу судить.