【问题标题】:c++ setting timeval membersc++设置timeval成员
【发布时间】:2011-05-17 05:40:20
【问题描述】:

我有一个函数,它接受两个当前类级别的成员变量并将它们设置为 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 对象应该不同于创建新对象并设置其值?

【问题讨论】:

  • tv_usec 不需要类型转换?
  • 这两种情况应该没有区别。问题出在代码的其余部分。当您在tv.tv_usec = time[1]; 设置断点时,您是否看到 tv.tv_usec 没有更改?
  • 你能发布一个最小的、可编译的问题示例吗?

标签: c++ timeval


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

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

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

【讨论】:

    【解决方案2】:
    //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;
    }
    

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

    【讨论】:

    • 这听起来像是属于评论。
    • @elusive,您建议如何在评论中发布代码清单?即使可以,你愿意吗?
    • @Alex:pastebin 和朋友们怎么样?
    • @elusive,除非粘贴是永久性的,否则这不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2011-12-28
    • 2011-12-12
    • 2014-11-27
    相关资源
    最近更新 更多