1

我的结构如下:

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;
    }
}
4

1 回答 1

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位置的唯一原因是因为你有现有的代码;C++ 代码在任何地方使用会更好KeypointSt *——或者将结构标记重命名为Keypoint并使用Keypoint *代替原来的Keypoint. 我不喜欢typedef隐藏指针的非透明类型。如果我看到一个声明XYZ xyz;,并且它是一个结构或类类型,我希望使用xyz.pqr而不是xyz->pqr.

我们可以讨论构造函数代码的代码布局、缺少默认构造函数(没有数组)以及缺少复制构造函数和赋值运算符(由于分配了 for ,两者都需要descrip)。的代码init_keypoints()不是异常安全的;内存分配失败会泄漏内存。解决这个问题留作练习(我认为这并不难,但我并不声称拥有异常处理专业知识)。我没有尝试考虑 C++11 施加的任何额外要求。简单地从 C 翻译到 C++ 是“容易的”,直到你看到 C++ 提出的额外要求——从长远来看,这些要求会让你的生活更轻松,但短期内会付出痛苦的代价。

于 2013-08-11T05:34:40.563 回答