class member variable, указатель на void. В файле реализации когда его использую, то всегда делаю static_cast на один и тот же объект, который не доступен в header. Сам объект - typedef struct.
Возможно ли сделать так, чтобы каждый раз не кастить в файле реализации? Без define
Использовать объявление типа в заголовке ("файл декларации") вида class T; (указатели на неполные типы допустимы).
Можно, не использовать void*
Костыль: .h: void* member: struct wrapper; wrapper get(); .cpp: struct wrapper { void* m; MyCTypedef* operator->() const { return static_cast<..>(m); } } wrapper get() { return { member }; } .
Думал об этом, но тогда уж лучше делать каст все время)
Я не могу, потому что объект недоступен в заголовочном файле, а доступен только в файле реализации
Почему же? Для использующего заменяется member-> на get()->
Forward declaration
typedef же нельзя напрямую так(
усложнять код ради этого...
Для чего так делать?
Вы точно знаете, что так можно: struct S1; struct S2 { S1* s1; }; ?
Покажи код уже
Есть сторонняя c-библиотека, где: typedef struct { // 12 полей разных типов } ui_writer Хотелось бы конечно так провернуть, да к сожалению невозможно :) .h: struct ui_writer; class ui_cpp_wrapper { ui_writer* writerptr; }; .cpp: // доступ просто как "writeptr", без static_cast
А зачем struct ui_writer; писать?
Forward declaration, но это typedef, поэтому это не будет работать
Ну я и говорю, можно и без этого создать указатель на тип же
В заголовочном файле "ui_writer" из примера выше недоступен, он доступен только в файле реализации
Так у него значит есть набор функций для работы?
В c-библиотеки или в моем классе? В c-библиотеке есть, я их вызываю в файле реализации
Ну так их и используйте
Я их использую. Но это не статическая библиотека, ее нужно создавать как экземпляр
Библиотеку создавать как экземпляр?
Создавать объект "ui_writer" (который typedef), который используется для вызова функций в библиотеке. Он является отправной точкой
И в чем проблема?
Создайте и работайте с ним
Если надо обернуть в класс обработайте в конструкторе
Но мне его нужно хранить для каждого класса отдельно
static ui_writer*?
Просто "ui_writer*"
Так для каждого класса отдельно
Для каждого экземпляра класса я имею в виду :)
Сделай forward declaration для своего враппера, а во враппер вложи структуру стороннего api: // my.h struct wrapper; struct my { wrapper* w; }; // my.cpp #include "my.h" #include <api.h> struct wrapper { api_struct api; };
Спасибо, наверное так и сделаю
Так можно сделать forward declaration этого класса даже в заголовке (до определения твоего класса), это ничему не помешает., и использовать указатель или ссылку на этот класс .
Ну тут пока это было не нужно...
Обсуждают сегодня