1

特定のグラフのいくつかのパスを計算する小さなアプリケーションを実行しようとしています。

次のように、単純なグラフを処理するクラスを作成しました。

class SimpleGraph {

    int _nbNodes;
    int _nbLines;

   protected:
    int AdjMatrix[_nbNodes, _nbNodes]; //Error happens here...
    int IncMatrix[_nbNodes, _nbLines]; //...and here!


   public:
    SimpleGraph(int nbNodes, int nbLines) { this->_nbNodes = nbNodes - 1; this->_nbLines = nbLines - 1; };
    virtual bool isSimple();
};

コンパイル時に、2 つの保護されたメンバーの宣言でエラーが発生します。

これらの値をパラメーターとして受け取るコンストラクターは 1 つしかないため、何が問題なのかわかりません。そのため、初期化を解除することはできません。

ここで何が欠けていますか?

4

3 に答える 3

3

コンパイラは、 class のメンバーに割り当てるスペースを知る必要がありますSimpleGraph。ただし、AdjMatrixIncMatrixはスタック上で定義され、そのサイズは実行時 (つまり、コンパイル後) に決定されるため、それを行うことはできません。具体的には、標準では、クラス内の配列のサイズはconstexpr.

これを修正するには、次のことができます。

  • 代わりにヒープに割り当てAdjMatrixIncMatrix、実行時にメモリを割り当てることができます。
  • 2 つの配列に固定サイズを使用し、それらをスタックに保持します。

--

コードのもう 1 つの大きな問題は、コンマ ( ) を使用して多次元配列を作成できないことですAdjMatrix[int, int]。代わりに次のいずれかを使用する必要があります。

  • AdjMatrix[int][int]
  • AdjMatrix[int * int]
于 2013-03-28T07:02:14.313 に答える
2

C++ のオブジェクトには、コンパイル時に認識する必要がある固定サイズがあります。AdjMatrix と InMatrix のサイズは、コンパイル時にはわかりません。実行時にのみわかります。

于 2013-03-28T07:02:55.753 に答える
1

ラインで

int AdjMatrix[_nbNodes, _nbNodes]; //Error happens here...
int IncMatrix[_nbNodes, _nbLines]; //...and here!

配列表記が間違っています。C++ ではそのように 2 次元配列を指定することはできません。正しい表記法では、次のように各次元に括弧を使用します。

int data[5][2];

あなたが直面している問題に関して、C++ の配列の次元はコンパイル時に指定する必要があります。コンパイラは、プログラムのコンパイル時に配列の次元を示すために使用される値を認識している必要があります。ここでは明らかにそうではありません。私の例のように整数リテラルを使用するように戻すか、ベクトルを使用するようにコードを変更する必要があります。

std::vector<std::vector<int> > AdjMatrix;

そしてコンストラクターで:

SimpleGraph(int nbNodes, int nbLines) : AdjMatrix(nbNodes) {
    for (int i = 0; i< nbNodes; i++)
        AdjMatrix[i].resize(20);
}

もう必要ないことに注意してください。_nbNodes代わりにsize()メソッド onを使用してAdjMatrixください。についても同じことを行う必要がありますIncMatrix

コンパイル時に値がわかっている場合の別のオプションは、マクロを使用してそれらを記号的に定義することです。

#define NBNODES  20

int AdjMatrix[NBNODES][NBNODES];

ただし、それらをコンストラクターパラメーターとして渡したいため、これはニーズに合わない場合があります。constexprそれでも、パラメーターがコンパイル時に定数であることがわかっている場合は、コンストラクターのパラメーターで C++11 修飾子を使用できる場合があります。

于 2013-03-28T07:27:02.723 に答える