Почти весь типичный код OO C ++ - это просто шикарный синтаксис вокруг старой техники создания библиотек, которая создала «cookie» и требовала, чтобы он передавался при каждом вызове.Поэтому, если ни один из классов не имеет виртуальных методов (без диспетчеризации во время выполнения), вы должны быть в состоянии сделать следующее:
- Думайте обо всех именах классов как об «средствах» или «библиотеках».
- Поместите все члены данных класса в структуру с именем classname (то, что раньше назывался класс)
- Превратите все методы в функции с именем classname_methodname.
- Добавьте указатель наструктура имени класса к списку параметров всех функций (методов) для этого класса.
- Превратите конструкторы в функции с именем classname_construct (возможно, # для перегрузок) и деструктор в функцию с именем classname_destruct.
- Измените все вызовы методов в другом коде с
objectname.methodname (...)
на classname_methodname (objecname, ...)
. - Это сложная часть: вам придется ввести код для вызова деструкторов вручную, поскольку они автоматически вызываются вC ++.
Принимая пример, приведенный в комментариях:
class QtCommandData {
public:
QtCommandData(unsigned short net, unsigned short command,
unsigned long n_data_bytes, unsigned short flgs,
unsigned char* data = NULL);
QtCommandData();
~QtCommandData();
public:
unsigned char* m_pData;
int m_Async;
protected:
unsigned int m_nDataBytes;
unsigned int m_BytesAllocated;
protected:
int Fill_Trailer();
};
... становится (я сокращу "средство name "от QtCommandData
до QtCD
):
typedef struct {
unsigned char* m_pData;
int m_Async;
unsigned int m_nDataBytes;
unsigned int m_BytesAllocated;
} QtCD;
QtCD_Construct(QtCD * handle,
unsigned short net, unsigned short command,
unsigned long n_data_bytes, unsigned short flgs,
unsigned char* data);
QtCD_Destruct(QtCD * handle);
QtCD_Fill_Trailer (QtCD * handle);
Это общая идея.Шаблоны, динамическая рассылка и некоторые другие вещи могут отбросить вас или два, но я уверен, что вы справитесь с этой задачей.: -)