2010-11-29 2 views
3

У меня есть функция, которая принимает две текущие переменные уровня класса и устанавливает их в структуру timeval и возвращает значение timeval obj (по значению).C++ set timeval members

Я вижу проблему при установке элемента timeval объекта уровня класса против создания нового объекта timeval при каждом вызове get().

Внутри класса

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; 
} 

Это не будет возвращать правильные значения формата: первый формат. Tv.tv_sec будет перезаписан, но tv_usec останется постоянным. Тем не менее, он вернет правильные значения, когда я создам объект timeval внутри вызова get.

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

Есть ли какой-либо причине установки на объекты формата: первый формат переменной-члена должны отличаться от создания нового объекта и установки его значения?

+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 по значению в любом случае не является особенно дорогостоящим, это небольшая структура 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; 
} 

это прекрасно работает для меня, я не понимаю, где проблема в вашем коде. Поэтому, пожалуйста, дайте свои комментарии (или отредактируйте этот код), чтобы сообщить нам о реальной проблеме.

 Смежные вопросы

  • Нет связанных вопросов^_^