2010-11-29 103 views
3

我有一個函數,它接受兩個當前類級別的成員變量並將它們設置爲timeval結構,並返回timeval obj(按值)。C++設置timeval成員

我在設置類級別成員timeval對象vs在每個get()調用中創建新的timeval對象時看到一個問題。

protected: 
int time[2]; 
timeval tv; 

// work done on setting the time array 

timeval getTimeval() 
{ 
    tv.tv_sec = (time_t)time[0]; 
    tv.tv_usec = time[1]; 
    return tv; 
} 

這裏面會不會返回正確的timeval值。 tv.tv_sec將被覆蓋,但tv_usec保持不變。但是,當我在get調用中創建timeval對象時,它將返回正確的值。

timeval getTimeval() 
{ 
    timeval t; 
    t.tv_sec = (time_t)time[0]; 
    t.tv_usec = time[1]; 
    return t; 
} 

是否有任何理由在成員變量上設置timeval對象應該不同於創建新對象並設置它的值?

+0

tv_usec不需要類型轉換嗎? – rplusg 2010-11-29 11:30:16

+1

這兩種情況應該沒有區別。問題在於代碼的其餘部分。當你在`tv.tv_usec = time [1]設置斷點時,`你看到tv.tv_usec沒有改變嗎? – Dialecticus 2010-11-29 11:38:44

回答

6
  • 你有可能損壞別的東西(未定義行爲)的機會嗎?
  • 你使用線程嗎?如果是這樣,第一種方法可能有兩個線程同時在類成員'tv'上工作,而第二種方法是每個線程都在它自己的本地timeval實例上工作。

也就是說,真的沒有理由將timeval作爲類成員在這裏;你沒有優化任何東西(爲了避免構建一個單獨的實例,你必須通過引用而不是按值返回類成員),所以你只是在每個類的實例內部浪費空間。 (無論如何,通過值返回timeval並不是特別昂貴;它是一個很小的POD結構,被堆棧分配。)

但是爲什麼這些值首先出現在int數組中?爲什麼不只是有一個timeval數據成員,並直接使用它(並在訪問器中通過const引用返回它)?

0
//header file header_1.h 
#include <time.h> 

class header_1{ 

protected: 
    int time[2]; 
    timeval tv; 
public: 
    timeval getTimeval(); 
    void setTimeval(); 

}; 


// header_1.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <vector> 
#include "header_1.h" 

using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    timeval tv_temp; 
    header_1 t1; 
    t1.setTimeval(); 
    tv_temp = t1.getTimeval(); 


    return 0; 
} 

timeval header_1::getTimeval() 
{ 
    tv.tv_sec = (time_t)time[0]; 
    tv.tv_usec = time[1]; 
    return tv; 
} 

void header_1::setTimeval() 
{ 
    time[0] = 100; 
    time[1] = 111; 
} 

這對我來說工作正常,我不明白代碼中的問題在哪裏。所以,請給出您的意見(或編輯此代碼)讓我們知道實際問題。