2011-09-15 18 views
1

問題は、下の例のstruct MegaTableというデータテーブルを作成することです(下の例のstruct DataItem)。ここでポインタを使って構造体要素にアクセスするには?

は私のコードです:

MSVSから
#include <vector> 

struct MegaDataItem; 

struct DataItem 
{ 
    int   a_; 
    char*   ch_; 

    MegaDataItem* ptr_; 

    DataItem(int _a, char* _ch, MegaDataItem* ptr) 
      : a_(_a) 
      , ch_(_ch) 
      , ptr_(ptr) 
    {} 
}; 
typedef std::vector<DataItem> DataTable; 


struct MegaDataItem 
{ 
    int   b_; 
    DataTable  data_; 

    MegaDataItem(int _b) 
      : b_(_b) 
    { 
      for (int j = 15; j >= 10; j--) 
      { 
       DataItem item(j, "", this); 
       data_.push_back(item); 
      } 
    } 
}; 
typedef std::vector<MegaDataItem> MegaTable; 


int main(int argc, char** argv) 
{ 
    MegaTable table; 

    for (int i = 0; i < 5; i++) 
    { 
      MegaDataItem megaItem(i); 
      table.push_back(megaItem); 
    } 
    return 0; 
} 

とデバッグスナップショット:

enter image description here

あなたが見ることができるように、ptr_ポインタがどこでも0x0031fcccに等しいが、それは正しくありません。 !ポインタは正しいstruct MegaDataItemデータで構成されている必要があります。struct DataItemのすべてが存在します。

ありがとうございました!

PS。私はこれが難しい質問ではないことを知っていますが、私はそれを手に入れることはできません。


UPDATE(修正液): PS:thnksはjpalecekします! :)

MegaDataItem(const MegaDataItem& other) 
      : b_(other.b_) 
    { 
      data_.clear(); 
      DataTable::const_iterator d_i(other.data_.begin()), d_e(other.data_.end()); 
      for (; d_i != d_e; ++d_i) 
       data_.push_back(DataItem((*d_i).a_, (*d_i).ch_, this)); 
    } 

void operator=(const MegaDataItem& other) 
    { 
      b_ = other.b_; 

      data_.clear(); 
      DataTable::const_iterator d_i(other.data_.begin()), d_e(other.data_.end()); 
      for (; d_i != d_e; ++d_i) 
       data_.push_back(DataItem((*d_i).a_, (*d_i).ch_, this)); 
    } 

答えて

3

問題は、あなたのMegaDataItem構造はコピー可能と割り当て可能ではないです(コピーまたはMegaDataItemvectorを割り当てた場合、バックポインタが間違っていた、元MegaDataItemを指します)。あなたはそれを是正する必要があります。

特に、コピーコンストラクタと代入演算子を実装する必要があります。これらの場合、DataItemのポインタptr_を新しいMegaDataItemにリダイレクトする必要があります。

実装例:

MegaDataItem(const MegaDataItem& other) : b_(other.b_) { 
    // fill data 
    for(DataItem& item : other.data_) 
    data_.push_back(DataItem(item.a_, item.ch_, this)); 
} 

operator=(const MegaDataItem& other) { 
    b_=other.b_; 
    data_.clear(); 
    for(DataItem& item : other.data_) 
    data_.push_back(DataItem(item.a_, item.ch_, this)); 
} 

ところで、DataItem手段で何ch_に応じて、あなたも、DataItemでこれらを実装することをお勧めします。

+0

返信用にThnks!そしてこれを行う方法?つまり、私はコピーコンストラクタと演算子を実装しなければならないことを知っていますが、どうですか? – mosg

+1

編集を参照してください。これは単なる例であり、他の方法で実装できることに注意してください。 – jpalecek

+0

ありがとう、それは動作します! :) – mosg

0

これは意図したとおりに動作しているようです。 をDataItemのコンストラクタに渡しているので、もちろんMegaDataItemによって作成されたDataItemはすべて同じptr_の値を共有します。

関連する問題