2016-11-15 5 views
0

すべてのコードを表示することはできません。サイズが大きいので、私が使用しようとしているものの例を表示できます。交渉が機能しない

namespace TestNamespace { 
    struct TestBase 
    { 
     TestBase(std::string _id = "") : id(_id) {} 
     std::string id; 
    }; 


    struct Test : public TestBase 
    { 
     Test(std::string _id = "") : TestBase(_id), b1(true), b2(true) {}   
     bool b1; 
     bool b2; 
    }; 

    typedef std::list<Test> Tests; 

    struct SomeStatesHolder 
    { 
     SomeStatesHolder() : tests(), someAdditionalVar(true), someAdditionVar2(2222) {} 
     Tests tests; 
     bool someAdditionalVar; 
     int someAdditionVar2; 
    }; 
} 

class WorkingClass 
{ 
public: 
    WorkingClass() : m_someStatesHolder(new TestNamespace::SomeStatesHolder()) { 
     TestNamespace::Test t("id1"); 
     m_someStatesHolder->tests.push_back(t); 
    } 

    TestNamespace::Tests getTests() const { return m_someStatesHolder->tests; } 
    bool getB1(const std::string& id) const { 
     const auto fnd = std::find_if(m_someStatesHolder->tests.cbegin(), m_someStatesHolder->tests.cend(), [&](const TestNamespace::Test& t){ 
      return t.id == id; 
     }); 
     return (fnd == m_someStatesHolder->tests.cend()) ? true : fnd->b1; 
    } 
     bool getB2(const std::string& id) const { 
     const auto fnd = std::find_if(m_someStatesHolder->tests.cbegin(), m_someStatesHolder->tests.cend(), [&](const TestNamespace::Test& t){ 
      return t.id == id; 
     }); 
     return (fnd == m_someStatesHolder->tests.cend()) ? true : fnd->b2; 
    } 

private: 
    TestNamespace::SomeStatesHolder *m_someStatesHolder; 
}; 

しかし、私はライン持っているさらに別のクラスの機能では、プロジェクト内の深い:

qDebug() << "\n\n\n\nTESTS: " 
     << workingClass.getB1("id1") << ":" << !workingClass.getB1("id1") << " " 
     << workingClass.getB2("id1") << ":" << !workingClass.getB2("id1"); 

const auto tests = workingClass.getTests(); 
const std::string fid = "id1"; 
const auto fnd = std::find_if(tests.cbegin(), tests.cend(), [&](const TestNamespace::Test& t){ 
    return t.id == fid; 
}); 
qDebug() << "\nTESTS2: " 
     << fnd->b1 << ":" << !fnd->b1 << " " 
     << fnd->b2 << ":" << !fnd->b2; 

そして、そのラインの出力をされていますので、コードは次のようである

TESTS: true : true true : true 
TESTS2: true : true true : true 

このような奇妙な行動の理由は何でしょうか?なぜは機能しませんでしたか?私は

  • このstrangesがLinuxのOSXであることを、認めなければなりません。 Windowsすべてが問題ありません。

  • 新しい類似のテスト用のものはうまく動作しますが、プロジェクト内の特定の構造体は正しくありません。

UPD1:私も同じことを結果、それらの値を取得するための関数を作ってみました。このようなコードも動作していない:何も見つからなかった場合

qDebug() << "Test3: " 
     << workingClass.getB1("id1") << ":" 
     << !((bool)workingClass.getB1("id1")) << ":" 
     << !workingClass.getB1("id1") << ":" 
     << (!(workingClass.getB1("id1"))) 

bool AAAAA = workingClass.getB1("id1"); 
qDebug() << "Test4: " 
     << AAAAA << ":" 
     << !((bool)AAAAA)) << ":" 
     << !AAAAA << ":" 
     << (!(AAAAA)) 
+0

あなたは評価が正しいことを確認するためにいくつかのparanthesisを追加しようとすることはできます:qDebug()<< "\ nTESTS2:" << (fnd-> B1 )<< "": "<< (!(fnd-> b1))" "" << (fnd-> b2) "": "<< (!(fnd-> b2)); –

+0

はい、UPD1を見てください – user2123079

+0

ええと、あなたのqDebugオブジェクトにバグがあります。 linuxで失敗するコード... –

答えて

1

std::find_if後の最後の要素std::listを指している、lastを返します。それはreturn fnd->b1で返されるメモリガベージです。

このメモリガベージを無効にすると、最後のビットは無効になります。そのため、intにキャストするときは112:113 58:59になります。

+0

私はそのようなもののすべてのチェックをスキップしました。これは間違いなく問題です – user2123079

+0

@ user2123079あなたはどのようにチェックしますか? – Steeve

+0

if(fnd == tests.cend()){/ *値が見つかりません* /} –

0

問題が見つかりました。同じクラス(SomeStatesHolder)の私のプロジェクトでは、私のブール値がコンストラクタリストで初期化されていませんでした。

PS:いまいましい -Wreorderを使用するか、より良い-Werror -Wall

関連する問題