2016-07-05 46 views
-1

我正在設計一個遊戲WordBrain的作弊。基本上這只是一個小程序,需要一些字母,將序列置換,然後將序列分成具有長度屬性的「單詞」,然後搜索我的文本文件以提交有意義的排列以便打印出來。(C++)不能使用string :: substr將子字符串分配給對象

while (next_permutation(letters.begin(), letters.end())) //loop through possible permutations of the combination 
    { 
     int position_marker = 0; //serve specific purpose 
     for (auto x : substring_collection) //trouble is in this loop 
     { 
      string temp; 
      int k = x.take_length(); 
      try { temp = letters.substr(position_marker, k); } 
      catch (out_of_range) { cout << "OUT OF RANGE"; } 
      x.set(temp); //member content does not register change 
      position_marker += x.take_length(); //also member word_length is 0 now, despite their are no invocation of methods capable of changing it 
     } 
     if (all_of(substring_collection.begin(), substring_collection.end(), [&](substring & s) {return !(library.find(s.take_content()) == library.end()); })) 
     { 
      for (auto x : substring_collection) 
      { 
       cout << x.take_content() + " "; 
      } 
     } 
    } 

這是麻煩來自的位置。基本上,substring_collection是vector<substring>,其中包含的類的對象substring 這裏是一流的樣子:

class substring 
{ 
private: 
    std::string content; 
    int word_length; 
public: 
    substring() : content(""), word_length(0) {}; 
    substring(std::string & s, int c) : content(s), word_length(c) {}; 
    void set(std::string & s) 
    { 
     content = s; 
    } 
    void clear() 
    { 
     content.clear(); 
    } 
    void set_length(int c) 
    { 
     word_length = c; 
    } 
    void showinfo() const 
    { 
     std::cout << "Content is " + content << " Length is : " << word_length; 
    } 
    int take_length() const 
    { 
     return word_length; 
    } 
    std::string take_content() const 
    { 
     return content; 
    } 
}; 

我懷疑代碼出錯的原因是position_marker,其價值取決於該成員word_length「的對象substring設置爲0. 在此循環之前的代碼中,我只是該成員從用戶輸入(從std::cin)獲取數據的設置方法。 你能告訴我,是否有任何隱藏的機制重置財產,或創建我不知道的品牌新對象? 此外,編碼風格的教學非常受歡迎。我剛開始學習編碼,因此非常感謝任何提示。

+0

您應該包括爲什麼您認爲它在提到的行上失敗,以及它如何不按預期工作/運行的描述。 –

+0

謝謝你的提示。我將確保包括如果在未來出現其他問題時,錯誤如何出現。目前,我已經制定出解決方案。 – StormBlade

回答

0
for (auto x : substring_collection) 

這裏,xsubstring類型。這是向量中元素的副本,然後當您修改它時,您只修改副本,而不是原始副本。

你必須使用引用來修改原始元素的矢量

for (auto& x : substring_collection) 

爲什麼word_length0,我不知道,這是不是在你的代碼發佈。我的猜測是你resized這個向量,它被稱爲substring的默認構造函數,它將word_length設置爲0

+0

謝謝。你救了我的命。事實證明,這正是你確定的!代碼在子字符串的副本上執行,而不是原始代碼,因此當我嘗試從cin讀入輸入時,原始代碼不受影響。我試圖使用參考,現在它的工作! – StormBlade