2010-11-29 7 views
3

현재 클래스 수준 멤버 변수 두 개를 사용하여 timeval 구조로 설정하고 timeval obj (값 기준)를 반환하는 함수가 있습니다.C++ 설정 timeval 멤버

각 get() 호출시에 새 ​​timeval 객체를 작성하는 것과 비교하여 클래스 수준 멤버 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에는 type-cast가 필요하지 않습니까? – rplusg

+1

이 두 가지 경우에는 차이가 없어야합니다. 문제는 나머지 코드에 있습니다. 'tv.tv_usec = time [1];에 중단 점을 설정하면 tv.tv_usec가 변경되지 않은 것을 알 수 있습니까? – Dialecticus

+1

최소한의 컴파일 가능한 예제를 게시 할 수 있습니까? –

답변

6
  • 혹시 다른 곳에서 어떤 내용이 손상된 경우 (정의되지 않은 동작)?
  • 스레드를 사용하고 있습니까? 그렇다면 첫 번째 접근 방식은 두 개의 스레드가 동시에 클래스 멤버 'tv'에서 동시에 작동하는 반면 두 번째 접근 방식은 각 스레드가 자체 로컬 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; 
} 

이 코드는 제게 잘 돌아가고 있습니다. 코드에서 문제가 어디 있는지 이해할 수 없습니다. 따라서 실제 문제를 알려주기 위해 의견을 보내주십시오 (또는이 코드를 수정하십시오).

+0

댓글에 포함 된 것 같습니다. – jwueller

+0

@elusive 및 의견에 코드 목록을 게시하는 방법은 무엇입니까? 그리고 할 수 있더라도 당신은하고 싶습니까? –

+0

@Alex : 페이스트 인 및 친구는 어떨까요? – jwueller