2017-11-07 10 views
-1

私はクラスAPDを持っており、ベクトルを介してファイルのデータを読み込みます。 いくつかの操作では、enumフラグを使用しますが、フラグの設定は機能しますが、その後のチェックはしません。クラスによる列挙チェックは機能しません

ここでのコードセグメントです:

for(unsigned long int i=0; i<apdvec_filter.size(); i++) 
{ 
    long int APD_filter_SN_i = apdvec_filter[i].getSN(); 
    for(unsigned long int j=0; j<apdvec_database.size(); j++) 
    { 
     long int APD_database_SN_j = apdvec_database[j].getSN();  

     if(APD_filter_SN_i==APD_database_SN_j && APD_filter_SN_i!=0 && apdvec_database[j].getMatchStateString()!=APD::MATCHED) 
     { 
      apdvec_database[j].setMatchState(APD::MATCHED); 
      cout << "SN_i: " << APD_database_SN_j << " SN_j:" << APD_database_SN_j << " type: " << apdvec_database[j].getMatchStateString() << endl; 
     } 

     if(APD_filter_SN_i==APD_database_SN_j) 
     { 
      // if(apdvec_database[j].getMatchStateString()==APD::MATCHED) 
      { 
       cout << "SN_j: " << APD_database_SN_j << " type: " << apdvec_database[j].getMatchStateString() << endl; 
      } 
     } 
    }   
} 

この利回りは:

SN_i: 818008630 SN_j:818008630 type: MATCHED 
SN_j: 818008630 type: MATCHED 
SN_i: 917010242 SN_j:917010242 type: MATCHED 
SN_j: 917010242 type: MATCHED 
SN_i: 912009899 SN_j:912009899 type: MATCHED 
SN_j: 912009899 type: MATCHED 
SN_i: 906009386 SN_j:906009386 type: MATCHED 
SN_j: 906009386 type: MATCHED 

しかし、私はライン// if(apdvec_database[j].getMatchStateString()==APD::MATCHED)

を入力したときに、私は唯一の

SN_i: 818008630 SN_j:818008630 type: MATCHED 
SN_i: 917010242 SN_j:917010242 type: MATCHED 
SN_i: 912009899 SN_j:912009899 type: MATCHED 
SN_i: 906009386 SN_j:906009386 type: MATCHED 

取得クラスAPDのヘッダに列挙の宣言がある:

class APD 
{ 
     public: 
     enum MatchStateType{UNDEFINED=0,NOT_MATCHED=1, MATCHED=2}; 
     static string MatchStateStrings[3]; 
     MatchStateType getMatchState() const; 
     string getMatchStateString() const;  
     void setMatchState(int a_match_state); 

     private: 
     MatchStateType m_match_state; 
} 

とによるCPP-ファイルで宣言自体:

APD::MatchStateType APD::getMatchState() const 
{ 
    return m_match_state; 
} 

string APD::getMatchStateString() const 
{ 
    return MatchStateStrings[(int)m_match_state]; 
} 

void APD::setMatchState(int a_match_state) 
{ 
    m_match_state=static_cast<MatchStateType>(a_match_state); 
} 

なぜこれが起こるのですか?

+0

「MATCHED」項目のみをフィルタリングすると、「MATCHED」項目のみが取得されます。問題は何ですか?比較演算を 'if'の中に括弧で囲むこともできます。 – VTT

+0

stackoverflow.comの[ヘルプ]で説明されているように、質問が[mcve]のすべての要件を満たしていないため、誰でもあなたに何かを説明することはできません。あなたはあなたの質問を編集し、[mcve]を提供する必要があります。 –

+0

@VTT問題は、列挙型フラグをMATCHEDに設定することですが、MATCHEDに設定されているすべてのベクトル要素をフィルタリングしたいときは、何も表示されません。 – Ben

答えて

1

コードが多すぎてコードが不十分です。文字列と列挙型の比較があなたの質問である場合、それに焦点を当てて、コードをコンパイルするのに十分なものにする必要があります。これはどちらもそうではありません。

あなたが使用している文字列クラスの種類はわかりませんが、列挙子の数値と文字列を比較していて、その比較が意味をなさないと思われるようです。

apdvec_database[j].getMatchStateString()!=APD::MATCHED 

あなたは(getMatchStateStringないgetMatchStateを()、呼び出したいしないでください):これはコンパイルなぜ私が(?あなたの文字列クラスが数値からストリングへの変換のいくつかの並べ替えをするのか推測が)わからないんだけど?列挙子(2)を「MATCHED」と比較することは、等しくないと予想されます。

+0

それは信じられません..その愚かな間違いも誰かが本当にそれを非常に速く発見することもありません。どうもありがとうございました! – Ben

+0

あなたが言ったように:私はなぜこれがコンパイルされているのだろうと思っていますが、m_match_state = UNDEFINED;を直接設定する以外はすべての宣言を投稿しました。 – Ben

+0

どのような文字列クラスを使用していますか? std :: stringではないと思います。もしそうなら、このコンパイラは何歳ですか?それはどんなバージョンですか? –

関連する問題