2012-04-23 12 views
1

同じタイプのメンバーをループしたいと思います。ここでは時にはうまく動作するソリューションがあります。参照配列を持つクラスメンバーをループする(C++)

#include <iostream> 
#include <vector> 
class Test{ 
    public: 
     Test():xmin(0),ymin(0),xmax(0),ymax(0),acs((vector<int> (&)[4])xmin){}; 
     vector<int> xmin,ymin,xmax,ymax; 
     vector<int> (&acs)[4]; 
}; 
int main(){ 
    Test t; 
    t.xmin.push_back(2); 
    cout << t.xmin.size() << "=!=" <<t.acs[0].size() << endl; 
} 

上記のテストコードは私のために働きます。はるかに大きなプログラムでは、私は現時点でそれをしません。つまり、t.yminはt.acs [1]と同じではないようです。 上記の構成は一般的に意味がありますか、まったく違うのですか?事前に

おかげで、 トーマス

+4

あなたは確かにそこに未定義の動作で演奏しています。連続するクラスメンバーが配列要素と同じ方法で配置されるという保証はありません。 –

答えて

2

メンバへのポインタの配列を使用することができます。この方法はおそらく最も速いです(あなたにとって重要だと思われる)が、やや不明瞭で、メンバー変数のリストをもう一度言及する必要があります。

#include <iostream> 
#include <vector> 

struct Test 
{ 
    std::vector<int> xmin,ymin,xmax,ymax; 

    std::vector<int>& GetByIndex(int index) 
    { 
     typedef std::vector<int> Test::*ptr_to_member; // typedef makes syntax less crazy 

     static const ptr_to_member pointers[4] = { 
      &Test::xmin, &Test::ymin, &Test::xmax, &Test::ymax 
     }; 

     return this->*pointers[index]; 
    } 
}; 

int main(){ 
    Test t; 
    t.xmin.push_back(2); 
    std::cout << t.xmin.size() << "=!=" << t.GetByIndex(0).size() << '\n'; 
} 

あなたはスピードを必要としない場合は、非常に簡単な解決策は、スイッチが含まれます。

std::vector<int>& GetByIndex(int index) 
{ 
    switch (index) { 
    case 0: return xmin; 
    case 1: return ymin; 
    case 2: return xmax; 
    case 3: return ymax; 
    default: abort(); 
    } 
} 
+0

間違ったインデックスで '中止 'しています:)それは素晴らしいです..."遅い "スイッチバージョンは実際に目立つべきではありません。 – RedX

+0

ありがとう、それはトリックを行います!関連する問題:私は、コンストラクタ 'Test():xmin(0)、ymin(0)、xmax(0)、ymax(0)、acs({&xmin、&ymin、&xmax、 &ymax}){}; 'とメンバ'ベクトル * acs [4]; 'を返します。これはテストスクリプトで動作するようですが、警告が表示されます:-std = C++ 0xまたは-std = gnu ++ 0x'でのみ使用できる拡張イニシャライザリストが表示されます。コンストラクタで初期化子リストに割り当てていない場合、同じ警告が発生します。私は気にする必要がありますか?ありがとう –

0

マイク・シーモア-absolutely右 - あなたのソリューションは危険です。

は、次の注入試してみてください。

class Test 
{ 
    struct AllArrays 
    { 
     vector<int> * vec1, .... * vecN; 
    }; 
    union 
    { 
     AllArrays _as_fields; 
     vector<int> * _as_Array[]; 
    } _allTogether; 
}; 

あなたは少し長い修飾子書く必要がある。このためペイロード:これは非常に悪い習慣です

Test t; 
t._allTogether._as_fields.vec1 
+0

'vector'を含む' union'は、少なくともC++では無効です(コンパイルしません)03 – anatolyg

+0

@anatolygは、ポインタ 'vector *'を使っているかどうかを調べます。ユニオン内でポインタが許可されています! – Dewfy

+0

それから、ベクトル [] _as_Array' – anatolyg

0

を。特に、あなたはpadding詳細に依存しています。コンパイラが間にパディングなしでデータメンバーをレイアウトするという保証はありません。 の場合はアレイ、の場合はアレイを使用してください。私の2c ...

関連する問題