我有一个函数,它接受两个当前的类级别成员变量并将它们设置为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对象应该与创建新对象和设置其值不同?
答案 0 :(得分:6)
那就是说,没有理由把时间安排作为班级成员;你没有按原样优化任何东西(为了避免构造一个单独的实例,你必须通过引用而不是通过值返回类成员),所以你只是在类的每个实例中浪费空间。 (无论如何,按值返回timeval并不是特别昂贵;它是一个小的POD结构,是堆栈分配的。)
但是为什么值首先在int数组中开始?为什么只是有一个timeval数据成员并直接使用它(并在访问器中通过const引用返回)?
答案 1 :(得分: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;
}
这对我来说很好,我不明白你的代码中的问题在哪里。所以,请发表您的意见(或编辑此代码),让我们知道实际问题。