我有一個結構:如何將所有結構成員設置爲相同的值?
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;
};
有一些簡單的方法來設置所有的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