C++初始化非静态成员数组
我正在编辑一些旧的 C++ 代码,这些代码使用如下定义的全局数组:
int posLShd[5] = {250, 330, 512, 600, 680};
int posLArm[5] = {760, 635, 512, 320, 265};
int posRShd[5] = {765, 610, 512, 440, 380};
int posRArm[5] = {260, 385, 512, 690, 750};
int posNeck[5] = {615, 565, 512, 465, 415};
int posHead[5] = {655, 565, 512, 420, 370};
我想让所有这些数组成为下面定义的 Robot 类的私有成员。但是,C++ 编译器不允许我在声明数据成员时对其进行初始化。
class Robot
{
private:
int posLShd[5];
int posLArm[5];
int posRShd[5];
int posRArm[5];
int posNeck[5];
int posHead[5];
public:
Robot();
~Robot();
};
Robot::Robot()
{
// initialize arrays
}
我想在 Robot() 构造函数中初始化这六个数组的元素。除了逐一分配每个元素之外,还有其他方法可以做到这一点吗?
I am working on editing some old C++ code that uses global arrays defined like so:
int posLShd[5] = {250, 330, 512, 600, 680};
int posLArm[5] = {760, 635, 512, 320, 265};
int posRShd[5] = {765, 610, 512, 440, 380};
int posRArm[5] = {260, 385, 512, 690, 750};
int posNeck[5] = {615, 565, 512, 465, 415};
int posHead[5] = {655, 565, 512, 420, 370};
I want to make all of these arrays private members of the Robot class defined below. However, the C++ compiler does not let me initialize data members when I declare them.
class Robot
{
private:
int posLShd[5];
int posLArm[5];
int posRShd[5];
int posRArm[5];
int posNeck[5];
int posHead[5];
public:
Robot();
~Robot();
};
Robot::Robot()
{
// initialize arrays
}
I want to initialize the elements of these six arrays in the Robot() constructor. Is there any way to do this other than assigning each element one by one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
如果您的要求确实允许,那么您可以将这 5 个数组作为类的静态数据成员,并在 .cpp 文件中定义时初始化它们,如下所示:
如果不可能,则像往常一样声明此数组使用不同的名称并使用
memcpy()
作为构造函数内的数据成员。编辑:
对于非静态成员,可以使用下面的
template
样式(对于任何类型,如int
)。要更改大小,只需重载元素数量:C++11
数组初始化现在变得微不足道:
If your requirement really permits then you can make these 5 arrays as
static
data members of your class and initialize them while defining in .cpp file like below:If that is not possible then, declare this arrays as usual with different name and use
memcpy()
for data members inside your constructor.Edit:
For non static members, below
template
style can be used (for any type likeint
). For changing the size, simply overload number of elements likewise:C++11
The array initialization has now become trivial:
您可以将其设置为静态,或者使用 C++0x 中引入的新初始化
you can either make it static, or use the new initialisation introduced in C++0x
将另一种方法加入到混合中(以及一种不告诉您将数组数据成员设置为
静态
,就像大多数其他答案一样 - 我假设 >你知道它们是否应该是静态
),这是我使用的零开销方法:创建静态
成员函数并让它们返回std::array>>
(或boost::array>>< /code>
如果您的编译器太旧,无法提供
std::
或std::tr1::
实现):To throw one other approach into the mix (and one that doesn't tell you to make the array data members
static
as most of the other answers do – I assume you know whether or not they should bestatic
), here's the zero-overhead approach I use: Makestatic
member functions and have them returnstd::array<>
(orboost::array<>
if your compiler is too old to come with astd::
orstd::tr1::
implementation):如果您希望用一些默认值填充数组的所有元素,可以使用
std::fill
。如果数组的每个元素需要填充不同的值,那么在每个索引处分配值是唯一的选择。
If you wish to fill all the elements of array with some default values,
std::fill
can be used.If each element of the array needs to be filled with a different value, then assigning value at each index is the only option.
将全局变量保留在代码中,然后使用 memcpy() 初始化本地数组,将全局数组的内容复制到本地数组。
Leave the globals in the code and then initialize the local arrays with memcpy(), copying the contents of the global arrays to the local ones.
这与当前问题仅略有相关,但它是一种特殊情况,可以完全解决重复。
零初始化是 C++ 语言中数组的特例。如果初始化列表比数组短,则其余元素初始化为零。例如,重复问题的要求是将类的所有成员(包括构造函数中最后一个数组的所有元素)初始化为零:
这对于构造函数定义来说就足够了:
因为
G_
的第一个元素是显式初始化为值0.
并且所有其他元素均初始化为零。This is only slightly related to the present question, but is a special case that fully addresses a duplicate.
Zero initialization is a special case for arrays in C++ language. If the initialization list is shorter than the array, the remaining elements are zero initialized. For example, the requirement for the duplicate question was to zero initialize all members of the class including all elements of the last array in constructor:
This is enough for the constructor definition:
because the first element of
G_
is explicitely initialized to the value0.
and all the other elements are zero initialized.不是真的,尽管我同意 stefaanv 的评论 - 如果它们以前是全局的,那么使它们静态将为您带来“简单的分配”,并且乍一看它们似乎可能是 const static 。
如果这些值是您偶尔更改的内容,您可能会考虑在创建类时从外部文件中读取它们,这样就可以避免重新编译。
您还可以考虑使用 std::vector 而不是固定数组来实现它提供的某些功能。
Not really, although I agree with stefaanv's comment - if they were global previously, making them static would get you the "easy assignment", and they seem as though they may be const static at a glance.
If these values are something you change occasionally, you might consider reading them in from an external file on class creation, such that you can avoid recompiles.
You also might consider using std::vector instead of the fixed arrays for some of the features it provides.
我在这里错过了什么吗?下面的代码有效。只需声明成员并立即初始化。
Am I missing something here? The code below works. Simply declare the members, and initialize right away.