3

我有一个函数,它接受两个当前类级别的成员变量并将它们设置为 timeval 结构,并返回 timeval obj(按值)。

在设置类级别成员 timeval 对象与在每个 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;
}

这不会返回正确的时间值。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 对象应该不同于创建新对象并设置其值?

4

2 回答 2

6
  • 您是否有可能在其他地方损坏了某些东西(未定义的行为)?
  • 你在使用线程吗?如果是这样,第一种方法可以让两个线程同时在类成员“tv”上工作,而第二种方法让每个线程都在自己的本地 timeval 实例上工作。

也就是说,这里真的没有理由让 timeval 成为班级成员。你没有按原样优化任何东西(为了避免构造一个单独的实例,你必须通过引用而不是通过值返回类成员)所以你只是在类的每个实例中浪费空间。(无论如何,按值返回时间值并不是特别昂贵;它是一个小的 POD 结构,正在堆栈分配。)

但是为什么值首先从 int 数组开始呢?为什么不只拥有一个 timeval 数据成员并直接使用它(并通过访问器中的 const 引用返回它)?

于 2010-11-29T11:34:38.023 回答
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;
}

这对我来说很好,我不明白你的代码中的问题在哪里。因此,请提供您的意见(或编辑此代码),让我们知道实际问题。

于 2010-11-29T12:14:45.713 回答