我有一些C代碼,我試圖轉換/包裝成一個C++類。我遇到了一些C文字數組(糾正我,如果我叫他們錯了),我不知道如何在C++構造函數中初始化它們,因爲我不認爲你可以做文字,我認爲這是文字編譯時間,到運行時特定的東西。轉換C數組文字在C++構造函數中工作?
我應該只是明確地定義數組爲一定的大小,只是在構造函數中做一個strcpy或者這樣的字面值給數組?
char sysUpTime[] = {1,3,6,1,2,1,1,3,0};
我有一些C代碼,我試圖轉換/包裝成一個C++類。我遇到了一些C文字數組(糾正我,如果我叫他們錯了),我不知道如何在C++構造函數中初始化它們,因爲我不認爲你可以做文字,我認爲這是文字編譯時間,到運行時特定的東西。轉換C數組文字在C++構造函數中工作?
我應該只是明確地定義數組爲一定的大小,只是在構造函數中做一個strcpy或者這樣的字面值給數組?
char sysUpTime[] = {1,3,6,1,2,1,1,3,0};
作爲替代初始化器列表或字符串操作,你可以使用類似下面的東西(如果你真的想):
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, ", "));
不錯,我提交併刪除了一個答案,通過大小和數組一起傳遞給構造函數,這更好。不知道大小可以使用這樣的模板推導:) – goji
可以只使用的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;
};
通過不同尺寸的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));
}
不幸的是,我知道沒有辦法做到這一點不使用動態數組(矢量),除了使用的模板,這意味着你會得到一個獨立的類實例化每個數組大小的變化。
msandiford的答案使用了一個更好的方式將大小傳遞給構造函數。 – goji
如果你正在使用** C++ 11 **,那麼你有_initializer-lists_,否則沒有什麼可以做的。也許把它們切換到'boost | std :: array' –