矢量push_back在类对象中不起作用

vector push_back not working in class object

本文关键字:对象 不起作用 push back 矢量      更新时间:2023-10-16

我正在制作各种层次结构,并且在向量中添加元素时遇到问题。我简化了代码,但仍然无法按预期向向量添加元素。层次结构如下所示:

Pdb> 链>字符串

Pdb 和 Chain 是类名,字符串是属于 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 << "nt1. " << pdbs[0].GetPdbId() << endl;
  pdbs[0].AddChain(Chain("A"));
  cout << "nt2. " << pdbs[0].GetChains()[0].GetChainId() << endl;
  pdbs[0].GetChains()[0].AddString("Whateva");
  cout << "nt3. 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 函数本身的刺痛中,但是当我在执行 AddString 后将 Gets String 重新放入主线程时,字符串为空。我不明白为什么会发生这种情况。任何帮助将不胜感激。

问题是你返回的是成员的副本,而不是成员本身:

vector<Chain> GetChains()

应该是

vector<Chain>& GetChains()

为此工作。

我必须指出,你严重违反了单一责任原则。您直接对成员进行操作,这不是一个好主意。考虑更换:

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

用类似的东西

pdbs[0].AddStringToChain(0,"Whateva");