我有一些 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, ", "));
可以只使用 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));
}
不幸的是,除了使用模板之外,我知道不使用动态数组(向量)就无法做到这一点,这意味着您将为数组大小的每一次变化都实例化一个单独的类。