2010-07-03 90 views
5

我有一个结构:如何将所有结构成员设置为相同的值?

struct something { 
    int a, b, c, d; 
}; 

有一些简单的方法来设置所有的A,B,C,d为一定的价值,而无需另行键入它们:

something var = {-1,-1,-1,-1}; 

即使世界还是太很多重复(让我们想象结构有30个成员...)

我听说过“构造”或某事,但我想将这些值设置为代码的不同部分中的其他值。

+0

您是否需要结构来保留POD,例如仍然有集合初始化('foo = {bar};')? – 2010-07-03 23:33:15

+0

是的,它应该像普通的struct那样工作,除了我只是想把所有的成员都设置好。 – Newbie 2010-07-03 23:39:17

+0

输入它们有什么问题?也许人们需要通过键盘(打字)课来提高速度。 – 2010-07-04 19:06:50

回答

13

这是我这个问题的第二个答案。第一个是你问的,但正如其他评论者指出的,这不是正确的做事方式,如果你不小心,可能会让你陷入麻烦。相反,这里是如何写一些有用的构造函数的结构:

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); 
6

您可以为结构定义一个方法。那么,为什么不:

struct something { 
    int a, b, c, d; 

    void set_values(int val) 
    { 
     a = b = c = d = val; 
    } 
}; 

something foo; 

foo.set_values(-1); 

它绝对值得一提的一点@sbi在意见中提出:如果你的意图是初始化结构,那么你应该有一个构造函数来完成。您应该避免允许您的结构/对象的用户将其置于不可用/错误状态。

+0

那怎么不能单独打字呢?有'init'采取一个参数将工作 – 2010-07-03 22:44:59

+0

是的,对不起,我编辑它,当我重读他的问题。 – Alan 2010-07-03 22:45:50

+1

我认为,在这种情况下,它会更清楚地表达为:a = b = c = d = val; – Ferruccio 2010-07-03 22:49:23

8

时,只需提供该结构构造:

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 
} 
+0

不会memset做同样的事情?我想如果你做了一个memset,它会放弃它的OO并且更像C一样。 – 2010-07-05 11:55:07

+0

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

+0

@Rudi:是的,你说得对。我正在采用OP的示例文字,意思是他想将所有值设置为-1。 – 2010-07-13 14:20:42

1

正如我云集,你想你的结构留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); 
+0

这个函数与Alan的答案有什么不同?当它仍然(可能)只与一个结构一起工作时,我没有看到创建外部函数的一点。 – Newbie 2010-07-04 00:04:46

+0

@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

+0

如果你使用C++,你的结构是一个类。因此,添加'class-like'位(构造函数)不会改变它的POD。即使你忘记初始化,Gunslinger的方法仍然可行,通过声明myvar;例如:这是一个很大的好处。 – 2010-07-04 06:53:30

1

使你工会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; 
+0

嗯...这看起来不错,如果我只是可以使循环与每个具有init成员的结构一起工作?以某种方式获得init成员的大小进入for循环?那可能吗? – Newbie 2010-07-13 10:57:54

+0

我得到警告“使用非标准扩展名:无名结构/联合”我怎么能避免这个错误,而不使用#pragma禁用错误?并保持相同的功能? – Newbie 2010-07-13 11:32:26

+1

这实际上非常优雅 – 2010-07-13 12:31:06

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(地址结构中的第一个变量)