0

我正在尝试将 XCode 用于我的项目,并在我的 .h 中有此代码:

class FileReader
{
private:
    int numberOfNodes;
    int startingNode;
    int numberOfTerminalNodes;
    int terminalNode[];
    int numberOfTransitions;
    int transitions[];

public:
    FileReader();
    ~FileReader();

};

我在终端节点行上收到“字段类型不完整 []”错误...但在转换行上没有。会发生什么?我确定这是正确的语法吗?

4

4 回答 4

1

严格来说,数组的大小是其类型的一部分,并且数组必须具有(大于零)大小。

有一个扩展允许将不确定大小的数组作为类的最后一个元素。这用于方便地访问可变大小的数组作为结构的最后一个元素。

struct S {
    int size;
    int data[];
};

S *make_s(int size) {
    S *s = (S*)malloc(sizeof(S) + sizeof(int)*size);
    s->size = size;
    return s;
}

int main() {
    S *s = make_s(4);
    for (int i=0;i<s->size;++i)
        s->data[i] = i;
    free(s);
}
于 2012-09-12T22:05:55.907 回答
0

您不能将未绑定的数组长度放在标头中——编译器无法知道类的大小,因此它永远不能被实例化。

转换线上没有错误很可能是处理第一个错误的结果。也就是说,如果您注释掉 terminalNode,则转换应该会给出错误。

于 2012-09-12T22:07:10.140 回答
0

它不是。如果您在结构定义中,编译器需要知道结构的大小,因此它还需要知道其所有元素的大小。因为int []意味着一个任意长度的整数数组,它的大小是未知的。使用固定大小的数组 ( int field[128];) 或将用于 malloc 内存 ( int *field;) 的指针。

于 2012-09-12T22:07:29.137 回答
0

不幸的是,这段代码不是有效的 C++,但它有效的 C(C99 或 C11)。如果你从某个 C 项目继承了它,你可能会惊讶于它在那里工作,但在 C++ 中却不行。但事情的真相是,你不能int transitions[]在 C++ 中拥有零长度数组(这就是不完整数组在这种情况下的含义)。

改用 a std::vector<int>。或者一个std::unique_ptr<int[]>.

(或者,如果您真的对没有两个单独的内存分配非常挑剔,您可以编写自己的包装类,它分配一块内存并就地构造前导码和数组。但这太过分了。)


最初的 C 用途是这样的:

FileReader * p = malloc(sizeof(FileReader) + N * sizeof(int));

那么你可以使用p->transitions[i], for iin [0, N)

这样的构造显然在 C++ 的对象模型中没有意义(想想构造函数和异常)。

于 2012-09-12T22:06:48.163 回答