我的结构如下:
typedef struct KeypointSt {
float row, col;
float scale, ori;
unsigned char *descrip; /* Vector of descriptor values */
struct KeypointSt *next;
} *Keypoint;
以下是C代码的一部分。考虑到堆的分配和解除分配,我如何将其转换为C ++。
Keypoint k, keys = NULL;
for (i = 0; i < num; i++) {
/* Allocate memory for the keypoint. */
k = (Keypoint) malloc(sizeof(struct KeypointSt));
k->next = keys;
keys = k;
k->descrip = malloc(len);
for (j = 0; j < len; j++) {
k->descrip[j] = (unsigned char) val;
}
}
答案 0 :(得分:0)
转换为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
到位的唯一原因是因为你有现有代码;使用KeypointSt *
无处不在的C ++代码更好 - 或者将结构标记重命名为Keypoint
并使用Keypoint *
代替原始Keypoint
。我不喜欢typedef
隐藏指针的非透明类型。如果我看到声明XYZ xyz;
,并且它是结构或类类型,我希望使用xyz.pqr
而不是xyz->pqr
。
我们可以讨论构造函数代码的代码布局,缺少默认构造函数(没有数组),以及缺少复制构造函数和赋值运算符(由于descrip
的分配而需要)。 init_keypoints()
的代码不是例外安全的;内存分配失败会泄漏内存。修复这是一个练习(我认为这不是很难,但我没有声称异常处理专业知识)。我没有尝试考虑C ++ 11强加的任何额外要求。简单地从C语言翻译成C ++是“容易的”,直到你看到C ++提出的额外要求 - 从长远来看,这些要求会让你的生活更轻松,但需要付出短暂的代价。