3

2つの現在のクラスレベルのメンバー変数を受け取り、それらを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;
}

これは正しいtimeval値を返しません。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
  • 他の場所で何かを破損した可能性はありますか(未定義の動作)?
  • スレッドを使用していますか?その場合、最初のアプローチでは2つのスレッドが同時にクラスメンバー「tv」で動作する可能性がありますが、2番目のアプローチでは各スレッドが独自のローカル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 に答える