2015-02-23 140 views
0

我想單元測試我正在構建的C++應用程序,並且在類中使用時遇到初始化數組的問題。我已經嘗試了很多加載這些信息的不同方法,只有那些工作效率低下/不適合。類中的char數組初始化

這裏是十六進制陣列,我(隨機的部分)

0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10 

和頭文件爲我的單元測試:

class MessageParsingTest : public CPPUNIT_NS::TestFixture { 
    CPPUNIT_TEST_SUITE(MessageParsingTest); 

    CPPUNIT_TEST(testIdentifyFirstMessageType); 

    CPPUNIT_TEST_SUITE_END(); 

public: 
    MessageParsingTest(); 
    virtual ~MessageParsingTest(); 
    void setUp(); 
    void tearDown(); 

private: 
    void testIdentifyFirstMessageType(); 
    void testIdentifySecondMessageType(); 

    // data members for the hex array 
    unsigned char firstMessage[1500]; 
}; 

然後在我的測試用例設置功能;

void MessageParsingTest::setUp() { 
    firstMessage = {0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10}; 
} 

這是我最新的嘗試失敗,它說compilcation在其無效的,如我所料,但在這一點上,我是想什麼。

我也試過類似的東西(所有設置功能)

firstMessage << "\0x24\0x54\0x3b\0x72\0x8b\0x03\0x24\0x29\0x23\0x43\0x66\0x22\0x53\0x41\0x11\0x62\0x10"; 

firstMessage[1500] = "\0x24\0x54\0x3b\0x72\0x8b\0x03\0x24\0x29\0x23\0x43\0x66\0x22\0x53\0x41\0x11\0x62\0x10"; 

和其他一些瘋狂的方式,有誰知道加載該數據的正確方法?到目前爲止,我使用它的唯一方法是使用沒有數據成員聲明並直接定義它,並在一行中初始化(但之後我無法訪問測試用例),或者像firstMessage[0] = 0x24;一樣一個一個地執行。

我明白這樣做會有一個簡單而適當的方法,並考慮應用程序的實際作用,這部分應該是最簡單的。

回答

1

您有幾種選擇:使用語法構造MesssageParsingTest

  1. 初始化數組:firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10} 在初始化列表。
  2. 創建包含消息的靜態常量數組,或者使用memcpy將其複製到成員變量,或者使用靜態成員並刪除firstMessage成員變量。

申報量靜態成員在類定義的.h:在.ccp

const unsigned char MessageParsingTest::kFirstMessage[] = "\0x24\0x54\0x3b\0x72\0x8b\0x03\0x24\0x29\0x23\0x43\0x66\0x22\0x53\0x41\0x11\0x62\0x10"; 

static const unsigned char kFirstMessage[]; 

,並定義+初始化它,我寧願靜態常量成員,如果你不打算以後再修改這個數組,因爲它使意圖更清晰。

+0

我試圖方法1。首先,當我向編譯器選項添加'-std = C++ 0x'時,它工作正常,但選項2從來沒有工作,但似乎更具吸引力,我是否正確地在頭文件中的類定義中添加此行? – Scriptable 2015-02-23 15:54:18

+0

請參閱編輯,我詳細的語法。 – 2015-02-23 16:01:35

+0

@llya感謝您的幫助。但是當我在構造函數中通過'const unsigned char MessageParsingTest :: kFirstMessage [] = ...'方法得到錯誤時,這個靜態方法會告訴我錯誤:函數內部不允許定義或重新聲明kFirstMessage。我喜歡在C \ C++中工作,但有時候最簡單的事情可能是一種正確的痛苦! – Scriptable 2015-02-23 16:20:07

0

您可以使用一個臨時緩衝區,然後複製到您成員,因爲這:

void MessageParsingTest::setUp() { 
    unsigned char tmp[1500] = {0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10}; 
    memcpy(firstMessage, tmp, 1500); 
} 
1

下面是做到這一點的方法之一。

void MessageParsingTest::setUp() 
{ 
    unsigned char x[] = {0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10}; 
    ::memcpy(firstMessage, x, sizeof(x)); 
} 

如果使用C++ 11,也可以在初始化類成員初始化列表中firstMessage作爲

MessageParsingTest::MessageParsingTest() : 
    firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10}, 
    ... 
+0

謝謝你,你的第二種方法和對c + + 11的參考工作。我將嘗試下面的靜態常量方法,因爲我認爲這會更合適 – Scriptable 2015-02-23 15:55:30