1

ある種の階層を作成していますが、ベクターに要素を追加するのに問題があります。コードを単純化しましたが、期待どおりに要素をベクターに追加できません。階層は次のようになります。

Pdb > チェーン > 文字列

Pdb と Chain はクラス名で、strings は Chain に属するベクトルの名前です。文字列を文字列に追加するために push_back できません。私のコードを見ると、より良いアイデアが得られるかもしれません:

チェーン クラス:

class Chain {
  string chain_id;
  vector<string> strings;

public:
  Chain(string id_) { chain_id = id_; }
  vector<string> GetStrings() { return strings; }
  void AddString(string s) { 
    cout << "Size of strings BEFORE push_back in AddString: " << strings.size() << endl;
    strings.push_back(s); 
    cout << "Size of strings AFTER push_back in AddString: " << strings.size() << endl;
  }
  string GetChainId() { return chain_id; }
};

Pdb クラス:

class Pdb {
  string pdb_id;
  vector<Chain> chains;

public:
  Pdb(string id_) { pdb_id = id_; }
  vector<Chain> GetChains() { return chains; }
  void AddChain(Chain c) { chains.push_back(c); }
  string GetPdbId() { return pdb_id; }
};

主要:

int main () {

  vector<Pdb> pdbs;
  pdbs.push_back(Pdb("1ubq"));
  cout << "\n\t1. " << pdbs[0].GetPdbId() << endl;
  pdbs[0].AddChain(Chain("A"));
  cout << "\n\t2. " << pdbs[0].GetChains()[0].GetChainId() << endl;
  pdbs[0].GetChains()[0].AddString("Whateva");
  cout << "\n\t3. Size of strings after AddString in main: " << pdbs[0].GetChains()[0].GetStrings().size() << endl;
  return 0;
}

これは以下を出力します:

1. 1ubq

2. A
Size of strings BEFORE push_back in AddString: 0
Size of strings AFTER push_back in AddString: 1

3. Size of strings after AddString in main: 0

ご覧のとおり、AddString 関数は AddString 関数自体の中で文字列に要素を追加していますが、メインに GetStrings を戻すと、AddString を実行した後、文字列は空になります。なぜこれが起こっているのかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

4

問題は、メンバー自体ではなく、メンバーのコピーを返すことです。

vector<Chain> GetChains()

する必要があります

vector<Chain>& GetChains()

これが機能するために。

単一責任の原則を大きく破っていることに注意する必要があります。メンバーを直接操作していますが、これは良い考えではありません。交換を検討:

pdbs[0].GetChains()[0].AddString("Whateva");

のようなもので

pdbs[0].AddStringToChain(0,"Whateva");
于 2012-06-28T14:25:22.220 に答える