2012-09-12 79 views
0
#include <linux/input.h> 
#include <string.h> 

#include <gtest/gtest.h> 
#include <string> 
class Parent{ 
public: 
    Parent(){ 
    } 
    virtual std::string GetString() 
    { 
     int amount = 1; 
     input_event ev[amount]; 

     /** 
     * This solves the problem 
     */ 
     memset(ev, 0, sizeof(ev[0])); 


     ev[0].code = BTN_9; 
     ev[0].value = 1; 
     char* temp = reinterpret_cast<char*>(ev); 
     std::string msg(temp, sizeof(ev[0]) * amount); 
     return msg; 
    } 
}; 
class Child : public Parent 
{ 
public: 
    Child(){ 
    } 
    virtual std::string GetString() 
    { 
     int amount = 1; 
     input_event ev[amount]; 
     ev[0].code = BTN_9; 
     ev[0].value = 1; 
     char* temp = reinterpret_cast<char*>(ev); 
     std::string msg(temp, sizeof(ev[0]) * amount); 
     return msg; 
    } 

}; 

class Child2 : public Parent 
{ 
public: 
    Child2(){ 
    } 
    virtual std::string GetString() 
    { 
     std::string temp(Parent::GetString()); 
     return temp; 
    } 

}; 

TEST(CastToString, test) 
{ 
    Parent parent = Parent(); 
    Child child1 = Child(); 
    Child2 child2 = Child2(); 
    std::string pString(parent.GetString()); 
    std::string c1String(child1.GetString()); 
    std::string c2String(child2.GetString()); 
    EXPECT_EQ(pString, c1String); 
    EXPECT_EQ(pString, c2String); 
} 

我剛纔複製了整個樣本。 問題在於Child2s GetString函數的調用。 它總是返回不同的值,因此我認爲,有一些分配問題,但我無法弄清楚。父母的調用虛函數

+0

什麼是ev定義? –

+0

儘可能嘗試使用編輯器和瀏覽器的複製和粘貼功能。目前形式的代碼無法編譯。 – hvd

+0

@ hvd你爲什麼這麼說? – john

回答

3

我認爲錯誤是在這裏

std::string msg(temp, sizeof(ev) * amount); 

應該

std::string msg(temp, sizeof(ev[0]) * amount); 

(兩地)。

由於數組大小錯誤,您的字符串中會有額外的垃圾字節,所以它們沒有相等的比較結果。

+0

改變了,但沒有幫助。 –

+1

嗯,我建議你改變你的兩個功能的內容爲理智的東西,如'std :: string msg(「testing」);返回味精;'。這將幫助您縮小問題範圍。或者你可以使用調試器。 – john

+0

理智的問題是,我將問題的範圍縮小到了這個範圍。不知何故,鑄造是它的原因。調試器向我展示了兩個不同的字符串,在函數中,真的不知道如何處理它,認爲這是一個基本問題。 –