2010-01-06 95 views
1

我已經寫這將一些數據存儲在結構內部和我將結構傳遞給其它過程如下面問題++(指針混淆我)

slotUpdate(Datas); 

而I」的過程

:使結構slotUpdate再次我將它傳遞給另一程序,但此時作爲參數,並如(無效*),如以下後

someNameSpace::stuData Datas; 

:VE定義如結構

注意:我通過數據更新db這樣的:updateDB(& Datas);

當我嘗試從這個結構檢索數據時進入一些函數我不成功,我會得到錯誤的數據,一些垃圾: - ?

這裏有什麼問題?

+0

感謝大家的尊重和有益的答案。 但問題出在結構的定義裏面,因爲我想把結構作爲指針傳遞給其他函數以及其他對象。我必須爲它定義一個構造函數,否則在遍歷期間結構將不保存它的數據。 關於。 – 2010-01-06 10:54:03

回答

1

我無法從你所寫的內容中知道發生了什麼以及按照什麼順序。 someFucntion()內發生故障嗎?

應該由slotUpdate()填寫的結構,如果是這樣,你定義slotUpdate()接受一個基準參數(例如,void slotUpdate(someNameSpace::stuData &Datas);?)

+0

是someFunction將操縱數據,但因爲它有我認爲這裏沒有問題的副本,當我將結構投射到(void *)時,問題就開始了。 – 2010-01-06 08:13:59

1

有沒有可能是你有兩個不同的StudData在兩個命名空間中,並且在使用它時投射到不正確的那個?另一點,只是爲了重構:在C++中,使用C風格轉換(如(data *))並不是一個好習慣,最好是在適當的地方使用static_cast/dynamic_cast等。所以你可以在你的例子中使用static_cast()。

另外,在C中拋出void *和backward是可以的,因爲這是啓用抽象/泛型編程的原因,但C++有其他更好的機制。

5

在您撥打slotUpdate時,您傳遞的是「數據」而不是「&數據」。你沒有帶給了我們slotUpdate的聲明,但它可以通過以下兩種方式之一進行申報:

void slotUpdate(stuData& Data); 
void slotUpdate(stuData Data); 

如果函數定義的第一種方式的話,我不明白。然而,第二種方法是通過值語義傳遞: - slotUpdate將寫入到一個本地拷貝的數據結構中,這個結構中傳遞的數據將不會被更新,因此將包含它在slotUpdate返回時啓動的相同垃圾。然後你會傳遞給其他功能。

您slotUpdate的定義更改爲以下之一: -

void slotUpdate(stuData* pData); 
void slotUpdate(stuData& Data); 

我更喜歡第一種形式,因爲它使明確的,你傳遞一個指針要更改的結構。第二種形式很難理解 - 正如您在文章中明顯的那樣 - 是否使用按值傳遞或傳遞引用語義。