2010-07-03 92 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(地址結構中的第一個變量)