c ++ установка временных членов - PullRequest
3 голосов
/ 29 ноября 2010

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

Я вижу проблему при установке члена уровня классаОбъект 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;
}

Это не вернет правильные значения timeval.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;
}

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

Ответы [ 2 ]

6 голосов
/ 29 ноября 2010
  • Есть ли вероятность, что вы что-то испортили где-то еще (неопределенное поведение)?
  • Вы используете темы? Если это так, то в первом подходе два потока могут одновременно работать с членом класса 'tv', тогда как во втором подходе каждый поток работает со своим собственным экземпляром с локальным временем.

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

Но почему значения начинаются с массива int в первую очередь? Почему бы просто не иметь временного элемента данных и работать с ним напрямую (и возвращать его по константной ссылке в методе доступа)?

0 голосов
/ 29 ноября 2010
//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;
}

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

...