3

奇妙な問題があります。構造のベクトルがあります。一時的な構造を使用して、その構造のベクトルに push_back します。しかし、最初のメンバーの を確認するcntと、変更されていることがわかります。何か案が?(以下のコードは簡略化されたバージョンですが、代表的なものです)

struct Vector
{
  float *dim;

  Vector ()
  {
    dim = new float [3];
  }
};

struct Face
{
  float an_N, an_P;
  int P, N;
  Vector Af;
  float Ad;
  Vector cnt;
  float ifac;
  float mf;
};

std::vector <Face> face;

Face temp_face;

for (;;)
{
    temp_face.cnt.dim[0] = 0.f;
    temp_face.cnt.dim[1] = 0.f;
    temp_face.cnt.dim[2] = 0.f;

    for (int q=0; q<n_vtx_2D; ++q)
    {
        temp_face.cnt = temp_face.cnt + pt[vtx[q]] / n_vtx_2D;                
    }                 

    face.push_back(temp_face);
}

std::cout << face[0].cnt.dim[0] << std::endl;

出力

0.25

0

4

1 に答える 1

5

デフォルトのコンパイラ生成のコピー コンストラクター (および代入演算子) が and に使用されVectorていますFace(ただし、最も重要なのはVector)。Faceコードは という名前の の同じインスタンスを再利用するため、ベクトル内の のtemp_faceすべてのインスタンスは同じ配列を指します ( には のコピーが含まれるため)。FacefaceFace.cnt.dimfacestemp_face

Vector配列は固定サイズであるため、内部に動的に割り当てられる理由はわかりません。次のように変更することをお勧めします:

struct Vector
{
    float dim[3];
};

または、 のコピー コンストラクター、代入演算子、およびデストラクターを実装する必要がありますVector3 のルールとは何ですか? を参照してください。詳細については。

于 2012-09-22T21:43:59.480 に答える