2012-12-31 67 views
0

我有一些C代碼,我試圖轉換/包裝成一個C++類。我遇到了一些C文字數組(糾正我,如果我叫他們錯了),我不知道如何在C++構造函數中初始化它們,因爲我不認爲你可以做文字,我認爲這是文字編譯時間,到運行時特定的東西。轉換C數組文字在C++構造函數中工作?

我應該只是明確地定義數組爲一定的大小,只是在構造函數中做一個strcpy或者這樣的字面值給數組?

char sysUpTime[] = {1,3,6,1,2,1,1,3,0}; 
+1

如果你正在使用** C++ 11 **,那麼你有_initializer-lists_,否則沒有什麼可以做的。也許把它們切換到'boost | std :: array' –

回答

3

作爲替代初始化器列表或字符串操作,你可以使用類似下面的東西(如果你真的想):

struct Wrapper 
{ 
    template <size_t N> 
    Wrapper(const char(&arr)[N]) : vec(arr, arr+N) { } 

    vector<char> vec; 
}; 

由於我的慢性懶惰,我已經把所有東西都公開了。然後,您可以初始化這樣的:

char foo[] = { 1, 2, 3, 4, 5 }; 
    Wrapper bar(foo); 

    copy(bar.vec.begin(), bar.vec.end(), ostream_iterator<int>(cout, ", ")); 
+0

不錯,我提交併刪除了一個答案,通過大小和數組一起傳遞給構造函數,這更好。不知道大小可以使用這樣的模板推導:) – goji

1

可以只使用的std :: string存儲OID然後初始化它在member initializer list例如:

#include <string> 
class Wrapper 
{ 
public: 
    Wrapper() : sysUpTime("1.3.6.1.2.1.1.3.0") { } 
private: 
    std::string sysUpTime; 
}; 

或者使用C++ 11 std::array

class Wrapper 
{ 
public: 
    Wrapper() : sysUpTime{{1,3,6,1,2,1,1,3,0}} { } 

public: 
    std::array<char, 10> sysUpTime; 
}; 
+0

謝謝@Billz。是'Wrapper():...'構造函數的簡寫嗎?我正在使用C++加快速度,但我並不熟悉這種語法。 – EhevuTov

+1

@EhevuTov是,之間:{{被稱爲成員初始值列表 – billz

+1

@EhevuTov這是正常的語法壓扁在一行 – goji

1

通過不同尺寸的C風格的數組構造函數時,主要的問題是,你必須與它一起傳遞的大小。這裏是把數組成員載體例子:

#include <vector> 
#include <iostream> 

struct Test 
{ 
    std::vector<char> sysUpTime; 

    Test(const char sysUpTime[], size_t size) : 
    sysUpTime(sysUpTime, sysUpTime + size) 
    { } 
}; 


int main() 
{ 
    const char sysUpTime[] = {1,2,3,4,5}; 

    Test test(sysUpTime, sizeof(sysUpTime)/sizeof(char)); 
} 

不幸的是,我知道沒有辦法做到這一點不使用動態數組(矢量),除了使用的模板,這意味着你會得到一個獨立的類實例化每個數組大小的變化。

+0

msandiford的答案使用了一個更好的方式將大小傳遞給構造函數。 – goji