说,我在C#
中有以下结构:
public struct MyStructCSharp
{
private byte[] offsets = new byte[] { 28, 20, 27, 36 };
}
你如何在C/C++
中做同样的事情?
以下似乎不起作用:
typedef struct _MyStructCpp
{
_MyStructCpp()
{
offsets[] = {28, 20, 27, 36};
}
private:
unsigned char offsets[];
}MyStructCpp;
答案 0 :(得分:3)
声明后,您无法分配给数组。除此之外,语法也是错误的。如果它只有4个元素,那么就这样做,或者如果可以,只使用vector
。
struct MyStruct {
MyStruct() {
offsets[0] = 28;
offsets[1] = 20;
offsets[2] = 27;
offsets[3] = 36;
}
private:
unsigned char offsets[4];
};
此外,不要使用下划线开始您的类型名称。这些是保留的,它可能导致肮脏。
答案 1 :(得分:1)
假设您拥有固定数量的值,Ed S的answer是合适的方式。
否则,您不能这样做,因为您只能初始化初始化列表中的变量成员,并且无法在初始化列表中进行此类分配。
但是,由于使用new
,C#版本是可行的,所以在C ++中执行相同操作可能是一个很好的解决方案,但是,您必须具有offsets
的长度并分配每个值单独:
typedef struct _MyStructCpp
{
_MyStructCpp(int size)
{
_size = size; // Say 4
offsets = new unsigned char[size];
offsets[0] = 28;
// etc....
}
private:
int _size;
unsigned char* offsets;
}MyStructCpp;
但是,您应该记住,您刚刚分配了一个动态内存,因此您应该在析构函数中清除它。
答案 2 :(得分:0)
为您提供支持:
struct MyStructCpp
{
private:
unsigned char offsets[4]{28, 20, 27, 36};
};
好吧,既然你没有支持:
#include <algorithm>
#include <cstddef>
struct MyStruct
{
MyStruct()
{
unsigned char temp[] = {28, 20, 27, 36};
std::copy(temp, temp + MAX, offsets);
}
private:
static const std::size_t MAX = 4;
unsigned char offsets[MAX];
};
(但是,正如前面提到的std::vector
会更好。如果我被限制使用普通的数组,那就显示出来了。)
答案 3 :(得分:0)
对于已修复大小的数组,请使用std::array<>
:
struct MyStructCpp
{
MyStructCpp()
: offsets(initOffsets())
{ }
private:
std::array<unsigned char, 4> offsets;
static std::array<unsigned char, 4> initOffsets()
{
std::array<unsigned char, 4> ret = {{28, 20, 27, 36}};
return ret;
}
};
所有非古代编译器都将通过NRVO在这里删除明显的副本。对于缺少std::array<>
的标准库实现,请改用Boost。Array。
对于动态大小的数组,请使用std::vector<>
。不要使用new
,除非作为最后的手段。
(另外,不相关,但不要使用typedef struct
成语 - 这是C语言中毫无意义且噪音很大的C语言。)
答案 4 :(得分:-3)
char offsets[4]={28,20,27,36};