Я обертываю библиотеку C++, написав интерфейс C. По этой причине я создал файл заголовка C, где большинство функций возвращают/принимают void*
вместо указателей класса C++.Кастинг для void * и typedefs в C++
Я знаю, что это опасно отлиты из/к мочеиспусканию * в C++, см Casting to void* and Back to Original_Data_Type*
В настоящее время при наследовании я всегда литейным базового класса объекта перед назначением к мочеиспусканию *
void* temp = static_cast<BaseClass*>(ptr)
и обратно
BaseClass* base = static_cast<BaseClass*>(voidPtr)
DerivedClass* derived = dynamic_cast<DerivedClass*>(base)
Однако использование void*
в заголовке файлов удалить семантику и сделать гр Функции omplex трудно читать. Например:
void myComplexFunc(void* index, void* data, void* somethingElse)
Для смягчения этого я хотел использовать определений типов, что даже если они не дают каких-либо типобезопасность по крайней мере, они дают читателю некоторое представление. Сравните предыдущий фрагмент с этим
extern "C"
{
...
typedef void Index;
typedef void DBRecord;
typedef void DBResult;
void myComplexFunc(Index* index, DBRecord* data, DBResult* somethingElse)
...
}
В основном эти определения типов действуют как своего рода для документирования когда несколько void*
используются в качестве параметров функции (Имейте в виду, что я буду оборачивать несколько классов каждый C++ с 10 способами , поэтому есть множество функций, которые вставляют void * в качестве первого параметра).
По этой причине я хотел использовать для определения типов
extern "C" // In.h file (declaration)
{
typedef void Index;
...
Index* getIndex();
void modifyIndex(Index* index);
...
// In .cpp file (definition)
Index* getIndex() {
DerivedCppIndex* derived = ...
BaseCppIndex* base = static_cast<BaseCppIndex*>(derived)
return base;
}
...
void modifyIndex(Index* index) {
BaseCppIndex* base = static_cast<BaseCppIndex*>(index);
DerivedCppIndex* derived = dynamic_cast<DerivedCppIndex*>(base);
...
}
ли использование ЬурейеГо вместо пустоты * вызывает какие-либо проблемы в отношении вопросов присвоения недействительных *?
Есть ли причина, по которой вы это делаете? Кажется, это супер плохая идея. – tadman
Я думаю (после написания моего ответа), что он не хочет раскрывать свою иерархию типов пользователю; поэтому, хотя из его кода 'DerivedIndex' конвертируется в' Index', он не будет работать, если все, что видно, это 'class Index; класса DerivedIndex'. –
звучит как проблема x-y, пожалуйста, предоставьте пример использования и фон. – user3528438