转换为 C++ 的一种可能方法是:
#include <cstring> // memset()
typedef struct KeypointSt
{
float row, col;
float scale, ori;
size_t len;
unsigned char *descrip; /* Vector of descriptor values */
KeypointSt *next;
KeypointSt(int p_len, int p_val) : row(0.0), col(0.0), scale(0.0),
ori(0.0), len(p_len),
descrip(new unsigned char[len]), next(0)
{ memset(descrip, len, p_val); }
~KeypointSt() { delete descrip; }
} *Keypoint;
extern KeypointSt *init_keypoints(size_t num, size_t len, unsigned char val);
extern void free_keypoints(KeypointSt *list);
KeypointSt *init_keypoints(size_t num, size_t len, unsigned char val)
{
KeypointSt *keys = NULL;
for (size_t i = 0; i < num; i++)
{
/* Allocate memory for the keypoint. */
KeypointSt *k = new KeypointSt(len, val);
k->next = keys;
keys = k;
}
return keys;
}
void free_keypoints(KeypointSt *list)
{
while (list != 0)
{
KeypointSt *next = list->next;
delete list;
list = next;
}
}
int main(void)
{
KeypointSt *keys = init_keypoints(4, 5, 6);
free_keypoints(keys);
return 0;
}
我保留这个typedef
位置的唯一原因是因为你有现有的代码;C++ 代码在任何地方使用会更好KeypointSt *
——或者将结构标记重命名为Keypoint
并使用Keypoint *
代替原来的Keypoint
. 我不喜欢typedef
隐藏指针的非透明类型。如果我看到一个声明XYZ xyz;
,并且它是一个结构或类类型,我希望使用xyz.pqr
而不是xyz->pqr
.
我们可以讨论构造函数代码的代码布局、缺少默认构造函数(没有数组)以及缺少复制构造函数和赋值运算符(由于分配了 for ,两者都需要descrip
)。的代码init_keypoints()
不是异常安全的;内存分配失败会泄漏内存。解决这个问题留作练习(我认为这并不难,但我并不声称拥有异常处理专业知识)。我没有尝试考虑 C++11 施加的任何额外要求。简单地从 C 翻译到 C++ 是“容易的”,直到你看到 C++ 提出的额外要求——从长远来看,这些要求会让你的生活更轻松,但短期内会付出痛苦的代价。