如何将所有结构成员设置为相同的值?
我有一个结构:如何将所有结构成员设置为相同的值?
struct something {
int a, b, c, d;
};
有一些简单的方法来设置所有的A,B,C,d为一定的价值,而无需另行键入它们:
something var = {-1,-1,-1,-1};
即使世界还是太很多重复(让我们想象结构有30个成员...)
我听说过“构造”或某事,但我想将这些值设置为代码的不同部分中的其他值。
这是我这个问题的第二个答案。第一个是你问的,但正如其他评论者指出的,这不是正确的做事方式,如果你不小心,可能会让你陷入麻烦。相反,这里是如何写一些有用的构造函数的结构:
struct something {
int a, b, c, d;
// This constructor does no initialization.
something() { }
// This constructor initializes the four variables individually.
something(int a, int b, int c, int d)
: a(a), b(b), c(c), d(d) { }
// This constructor initializes all four variables to the same value
something(int i) : a(i), b(i), c(i), d(i) { }
// // More concise, but more haphazard way of setting all fields to i.
// something(int i) {
// // This assumes that a-d are all of the same type and all in order
// std::fill(&a, &d+1, i);
// }
};
// uninitialized struct
something var1;
// individually set the values
something var2(1, 2, 3, 4);
// set all values to -1
something var3(-1);
您可以为结构定义一个方法。那么,为什么不:
struct something {
int a, b, c, d;
void set_values(int val)
{
a = b = c = d = val;
}
};
something foo;
foo.set_values(-1);
它绝对值得一提的一点@sbi在意见中提出:如果你的意图是初始化结构,那么你应该有一个构造函数来完成。您应该避免允许您的结构/对象的用户将其置于不可用/错误状态。
时,只需提供该结构构造:
struct something {
int a, b, c, d;
something() {
a = b = c = d = -1;
}
};
,然后使用它:
int main() {
something s; // all members will be set to -1
}
,您还可以使用构造函数来重置成员:
int main() {
something s; // all members will be set to -1
s.a = 42;
s = something(); // reset everything back to -1
}
不会memset做同样的事情?我想如果你做了一个memset,它会放弃它的OO并且更像C一样。 – 2010-07-05 11:55:07
memset适用于字符,不适用于大小不同于char的对象。虽然它适用于0和-1(至少在x86上,我不会在不同平台上下注),但如果初始化值发生更改,则会导致错误的分配。例如,'int i; memset(&i,1,sizeof(i));'将sizeof(int)1存储到i中,这是32位机器上的0x01010101。 – Rudi 2010-07-07 10:59:30
@Rudi:是的,你说得对。我正在采用OP的示例文字,意思是他想将所有值设置为-1。 – 2010-07-13 14:20:42
正如我云集,你想你的结构留POD但还是希望有一些“方便构造函数”。
添加一个构造函数,它不会在这种情况下象您失去POD的烦躁,因此,我会使用一个辅助函数:
something make_something() {
something s = { -1, -1, -1, -1};
return s;
}
如果你想将其设置为可变值让功能需要,也许是可选的,参数:
something make_something(int i = 0) {
something s = { i, i, i, i };
return s;
}
现在你可以定义和初始化到一个行:
something s = make_something(-1);
这个函数与Alan的答案有什么不同?当它仍然(可能)只与一个结构一起工作时,我没有看到创建外部函数的一点。 – Newbie 2010-07-04 00:04:46
@Newbie:唯一显着的区别是你需要更多的陈述和解决方案:'s s; s.set_values(-1);'与'something s = make_something(-1);'。当直接作为参数传递时,它变得更加明显:“某事物; s.set_values(-1); some_func(s);'''some_func(make_something(-1));'。 – 2010-07-04 00:09:56
如果你使用C++,你的结构是一个类。因此,添加'class-like'位(构造函数)不会改变它的POD。即使你忘记初始化,Gunslinger的方法仍然可行,通过声明myvar;例如:这是一个很大的好处。 – 2010-07-04 06:53:30
使你工会r结构和一个数组。并使用循环来初始化数组。
union something {
struct {
int a,b,c,d;
};
int init[4];
};
something truc;
for (int i=0; i<4; i++) truc.init[i] = -1;
如果您
struct
{int a,b,c.......;}foo;
我写的代码,它似乎是做工精细:
int* pfoo;
for (int i = 0; i < sizeof(foo); i++)
{
pfoo = (int*)((int)(&foo) + i*sizeof(int));
*pfoo = f(i/2); //set the values (here: the values of a random function f)
}
它写存储器直接开始& FOO(地址结构中的第一个变量)
您是否需要结构来保留POD,例如仍然有集合初始化('foo = {bar};')? – 2010-07-03 23:33:15
是的,它应该像普通的struct那样工作,除了我只是想把所有的成员都设置好。 – Newbie 2010-07-03 23:39:17
输入它们有什么问题?也许人们需要通过键盘(打字)课来提高速度。 – 2010-07-04 19:06:50