0

これは、2 つの Duration オブジェクトを一緒に format に追加する私の方法です(HH,MM,SS)

    inline ostream& operator<<(ostream& ostr, const Duration& d){
      return ostr << d.getHours() << ':' << d.getMinutes() << ':' << d.getSeconds();
    }

    Duration operator+ (const Duration& x, const Duration& y){
        if ( (x.getMinutes() + y.getMinutes() >= 60) && (x.getSeconds() + y.getSeconds() >= 60) ){
           Duration z( (x.getHours() + y.getHours() + 1), (x.getMinutes() + y.getMinutes() + 1 - 60), (x.getSeconds() + y.getSeconds() - 60) );
           return z;
        }
        else if (x.getSeconds() + y.getSeconds() >= 60){
           Duration z( (x.getHours() + y.getHours()), (x.getMinutes() + y.getMinutes() + 1), (x.getSeconds() + y.getSeconds() - 60) );
           return z;
        }
        else if (x.getMinutes() + y.getMinutes() >= 60){
           Duration z( (x.getHours() + y.getHours() + 1), (x.getMinutes() + y.getMinutes() - 60), (x.getSeconds() + y.getSeconds()) );
           return z;
        }
        else{
            Duration z( (x.getHours() + y.getHours()), (x.getMinutes() + y.getMinutes()), (x.getSeconds() + y.getSeconds()) );
            return z;
        }
    }

私の主な方法では:

  Duration dTest4 (01,25,15);
  Duration result = dTest4+dTest4;
  cout << result << endl;

残念ながら、プログラムを実行すると、次のエラーが発生します。

  error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Duration const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVDuration@@@Z) referenced in function _wmain 1>C:\Users\...exe : fatal error LNK1120: 1 unresolved externals

個々のエンティティで 2 回を一緒に追加できるようにしたい。すなわち。時間、次に分、そして秒。したがって、if-else2 セットの分が 1 時間の上限である 60 分を超えた場合に対処する必要があります...

どんな助けでも大歓迎です。

4

4 に答える 4

2

問題はここにあります:オブジェクトを ostreamに書き込むためcout << result << endl; のオーバーロードされたバージョンを定義していません。このような何かがそれを行う必要があります:std::ostream& operator<<Duration

std::ostream& operator<<(std::ostream& os, const Duration& rhs)
{ 
os << "Hours: <" << hours_ << ">, ";  
os << "Minutes: <" << minutes_ << ">, "; 
os << "Seconds: <" << seconds_ << ">"; 
return os; 
}
于 2012-12-10T18:50:09.783 に答える
1

ストリーム インサーターはDuration、ヘッダーではなく、クラスのソース ファイルで定義されていると思います。インラインであるため、未定義の参照を説明します。その場合は、インライン定義をヘッダーに移動します。

足し算にも問題があります。分と秒の両方がオーバーフローするとどうなるでしょうか。最初のifステートメントは分のオーバーフローをキャッチDurationし、秒が範囲外のオブジェクトを返します。オーバーフローに関係なく新しいオブジェクトを作成し、秒単位のオーバーフローをチェックし、必要に応じてそれを処理し、次に分単位のオーバーフローをチェックし、必要に応じて処理する方がおそらく簡単です。これで、ほとんどの日付/時刻ライブラリが、このように詳細を分割するのではなく、エポックを過ぎた秒数 (または任意の数) を格納するために整数型を使用する理由がわかりました。

于 2012-12-10T19:01:17.873 に答える
0

<< 演算子のメソッドを作成する必要があります。今のところ、cout は Duration を解析できません。

于 2012-12-10T18:50:00.773 に答える
-1

問題はこの行にあります
cout << result << endl;

+ 演算子のみをオーバーロードしているときに、オブジェクトで << 演算子を使用しようとしています: cout << result.getHours() << endl;

于 2012-12-10T18:52:19.163 に答える