2013-12-20 51 views
1

我的OOP風格的C++應用程序有一個方法(在許多.cpp文件中使用),即獲得兩個參數:指針數組,數組大小:如何在類中存儲const數組?

bool SendData(unsigned char* data, size_t size); 

我有一些陣列,永遠不會改變。我想定義它們,或者做一個consts,還是別的什麼,這樣做的:

bool result1, result2; 
unsigned char arr2[] = {0x2, 0x5, 0x6}; 
result1 = SendData(PREDEFINED_ARRAY_1, sizeof(PREDEFINED_ARRAY_1)); 
result2 = SendData(arr2, sizeof(arr2)); 

我設法解決它,使用常數 - 只是寫在頭文件:

static const unsigned char PREDEFINED_ARRAY_1[] = {0x1, 0x3, 0x5}; 
static const unsigned char PREDEFINED_ARRAY_1[] = {0x2, 0x3, 0x4, 0x5, 0x6, 0x7}; 

但得到有關'{'和'}'的編譯器錯誤。這讓我感到困惑,因爲我可以寫:

static const unsigned char c = 10; 

而且一切都會好的。我可以初始化變量,但不能初始化數組?真奇怪。

是的,我知道,靜態變量應該在cpp文件中初始化,但我有很多文件,這個函數使用常量,所以,據我所知,這是一種死路。我只顯示這個代碼來解釋我想要的。

此外,我不想寫定義後的構造是這樣的(或特殊功能)類:

PREDEFINED_ARRAY_1[0] = 0x1; 
PREDEFINED_ARRAY_1[1] = 0x3; 
PREDEFINED_ARRAY_1[2] = 0x5; 

因爲數組的數量是每各約100 andlength〜20-30符號。太簡單的代碼太多。或不?

然後,我嘗試創建特殊類:

class Array 
{ 
public: 
    void Set(unsigned char symbol, ...); // using va_args 
    unsigned char* GetData(); 
    size_t GetSize(); 

private: 
    unsigned char* data; 
    size_t size; 
}; 

class MainClass 
{ 
public: 
    MainClass(); 
    void Send(); 

    Array PREDEFINED_ARRAY_1; 
    Array PREDEFINED_ARRAY_2; 
}; 

MainClass::MainClass() 
{ 
    PREDEFINED_ARRAY_1.Set(3, 0x1, 0x3, 0x5); 
    PREDEFINED_ARRAY_1.Set(6, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7); 
} 

void MainClass::Send() 
{ 
    SendData(PREDEFINED_ARRAY_1.GetData(), PREDEFINED_ARRAY_1.GetSize()); 
} 

但在這種情況下,我應該手工清點符號數。最大長度可能是大約50個符號,錯誤的風險很高。我想避免它。

三中,最笨的方法是這樣的:

#define PREDEFINED_ARRAY_1 {0x1,0x3,0x5} 

int main() 
{ 
    unsigned char arr1[] = PREDEFINED_ARRAY_1; 
    SendData(arr1, sizeof(arr1)); 
} 

但它是太醜陋了。

我的問題是:這樣做的最佳做法是什麼?

P.S.正如我已經說過的,我正在使用OOP範例,並希望避免全局變量和其他C-事物。

+1

*什麼*編譯器錯誤? –

+0

@JohnDibling,C2059(語法錯誤:'{')和C2334('{'之前的意外標記;跳過明顯的函數體)。 – DeniDoman

+0

你應該讓'SendData'接受常量數據或者讓數組非常量...否則你會遇到常量問題。 – leemes

回答

1

您可以在頭文件中聲明數組,但爲它們提供C樣式數組的完整類型信息(即長度)。然後在實現文件中定義數組內容。

然後,數組內容在相應的.cpp文件的翻譯單元中「生存」(一次在您的項目中),但每個包含的標頭足夠了解甚至正確使用sizeof

// .h 
class MainClass { 
public: 
    static const unsigned char predefinedArray1[3]; 
    static const unsigned char predefinedArray2[5]; 
}; 

// .cpp 
const unsigned char MainClass::predefinedArray1[] = { 'x', 'y', 'z' }; 
const unsigned char MainClass::predefinedArray2[] = { 'a', 'b', 'c', 'd', 'e' }; 

演示的使用方式:http://ideone.com/UK0EOv

+0

謝謝。但那意味着,我手動應該計數數組中的符號數量?有沒有辦法避免它?因爲如果我錯誤地寫數組[4],但數組只有3個符號,那麼它編譯好,但在運行時我會遇到問題。 – DeniDoman

+0

嗯,不,它不應該編譯:http://ideone.com/EpMrON(用5聲明,分配6) – leemes

+0

哦,但如果你指定* less *聲明,[編譯確實](http:// ideone .com/Mg3uke)...讓我想想 – leemes