关于公开的代码,库似乎并不太依赖于C ++ OOP功能。恕我直言,大多数代码可以毫不费力地音译到C语言。所以,我想展示我将要应用的原则。
一个C ++示例类 CPlusPlusThing :
CPlusPlusThing
#include <iostream> class CPlusPlusThing { private: int member1; int member2; public: CPlusPlusThing(int member1, int member2): member1(member1), member2(member2) { } void setMember1(int value) { member1 = value; } void setMember2(int value) { member2 = value; } void print(); }; void CPlusPlusThing::print() { std::cout << "CPlusPlusThing {\n" << " member1: " << member1 << '\n' << " member2: " << member2 << '\n' << "}\n"; }
一个简短的应用示例:
int main() { { CPlusPlusThing thing(123, 0); thing.setMember2(321); thing.print(); } { CPlusPlusThing *pThing = new CPlusPlusThing(234, 0); pThing->setMember2(432); pThing->print(); delete pThing; } return 0; }
编译和测试:
CPlusPlusThing { member1: 123 member2: 321 } CPlusPlusThing { member1: 234 member2: 432 }
的 在coliru现场演示 强>
将此音译为C时,必须考虑以下几点:
C中没有构造函数/析构函数. 如果构造函数只是初始化成员,那么也可以进行简单的初始化。否则,应提供init函数。
C中没有成员函数。 离开 virtual 除了函数之外,成员函数只不过是具有隐式的函数 this 论点。从而, this 使用表达式将参数初始化为左操作数 . 要么 -> 在成员函数调用中。在C中,分别是指针变成了第一个参数。在哪里 this 隐式应用在成员函数内部,只要适当,这在C中是不可能的。它必须明确地完成。
virtual
this
.
->
在C ++中,不同的类可能会提供具有相同名称的成员函数。成员函数调用将根据左操作数的类型选择正确的函数 . 要么 -> 。 C中没有机会。不同的功能必须具有不同的名称。通常的解决方法是将类名包含在C API的函数名中。
那么,这就是上面的例子在C中的样子:
#include <stdio.h> #include <stdlib.h> typedef struct { int member1; int member2; } CThing; CThing* newCThing(int member1, int member2) { CThing *pThis = malloc(sizeof (CThing)); if (pThis) { pThis->member1 = member1; pThis->member2 = member2; } return pThis; } void deleteCThing(CThing *pThis) { free(pThis); } void setCThingMember1(CThing *pThis, int member1) { pThis->member1 = member1; } void setCThingMember2(CThing *pThis, int member2) { pThis->member2 = member2; } void printCThing(CThing *pThis) { printf( "CThing {\n" " member1: %d\n" " member2: %d\n" "}\n", pThis->member1, pThis->member2); }
和相应的应用示例:
int main() { { CThing thing = { 123, 0 }; setCThingMember2(&thing, 321); printCThing(&thing); } { CThing *pThing = newCThing(234, 0); setCThingMember2(pThing, 432); printCThing(pThing); deleteCThing(pThing); } return 0; }
CThing { member1: 123 member2: 321 } CThing { member1: 234 member2: 432 }
的 科利鲁的活恶魔 强>