0

プロジェクトに XCode を使用しようとしており、.h に次のコードが含まれています。

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

public:
    FileReader();
    ~FileReader();

};

terminalNode 行で「Field has incomplete type int[]」というエラーが表示されますが、transitions 行では表示されません。何が起こっているのでしょうか?それが正しい構文だと確信していますか?

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

そうではありません。構造体定義内にいる場合、コンパイラは構造体のサイズを知る必要があるため、そのすべての要素のサイズも知る必要がありますint []は任意の長さのintの配列を意味するため、そのサイズは不明です。固定サイズの配列(int field[128];)またはmallocメモリ(int *field;)に使用するポインタを使用します。

于 2012-09-12T22:07:29.137 に答える
0

残念ながら、このコードは有効な C++ ではありませんが、有効な C (C99 または C11) です。これを C プロジェクトから継承した場合、C プロジェクトでは機能するのに C++ では機能しないことに驚くかもしれません。int transitions[]しかし、問題の真実は、C++ では長さゼロの配列 (このコンテキストでは不完全な配列とは) を持つことができないということです。

std::vector<int>代わりにaを使用してください。またはstd::unique_ptr<int[]>

(または、2 つの別個のメモリ割り当てを持たないことに本当にうるさい場合は、メモリの 1 つの部分を割り当て、プリアンブルと配列の両方をインプレースで構築する独自のラッパー クラスを作成できます。しかし、それは過剰です。)


元の C の使用法は次のようになります。

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

p->transitions[i]次に、 for iinを使用できます[0, N)

このような構造は、C++ のオブジェクト モデル (コンストラクターと例外を考えてください) では明らかに意味がありません。

于 2012-09-12T22:06:48.163 に答える
0

バインドされていない配列の長さをヘッダーに入れることはできません。コンパイラがクラスのサイズを知る方法がないため、インスタンス化することはできません。

遷移行にエラーがないのは、最初のエラーを処理した結果である可能性があります。つまり、terminalNode をコメントアウトすると、トランジションでエラーが発生するはずです。

于 2012-09-12T22:07:10.140 に答える