質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

534閲覧

C++ 日数の計算 オペレーターのオーバーロード

amareno

総合スコア20

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/10/17 05:13

前提・実現したいこと

現在、C++でオペレーターのオーバーロードの仕方を学んでおります、

ある日付からある日付の経過日数をアウトプットしようといております。
下記のコードの場合、Date date1(10,16,2000); と Date date2(12,24,2004); の間の日数を得たいです。
1年は360日、毎月変わらず30日としています。

main関数内でdate1とdate2どちらの方が昔かを確かめて、date1とdate2の間の日数を求めようとしています。

bool operator < (const Date& d) {
if (year < d.year) {
return true;
}
if (year == d.year && month < d.month) {
return true;
}
if (year == d.year && month == d.month && day < d.day) {
return true;
}
return false;
}

上記のコードと下記のコードをどの様にMain関数に渡すのか教えて頂きたいです。
また、day = (day * 30) - (day * 30); この部分はこれであっていますでしょうか?
少しこれで良いのかどうか自信がないので確認したいです。
よろしくお願いいたします。

int operator -(const Date& d) {
month = (month * 12) - (month * 12);
day = (day * 30) - (day * 30);
year = (year * 360) - (year * 360);

return month + day + year; }

C++

#include <iostream> #include <string> using namespace std; class Date { private: int month; int day; int year; public: Date () { month = 0; day = 0; year = 0; } Date (int m, int d, int y) { month = m; day = d; year = y; } int getMonth() { return month; } void setMonth(int m) { month = m; } int getDay() { return day; } void setDay(int d) { day = d; } int getYear() { return year; } void setYear(int y) { year = y; } bool operator < (const Date& d) { if (year < d.year) { return true; } if (year == d.year && month < d.month) { return true; } if (year == d.year && month == d.month && day < d.day) { return true; } return false; } int operator -(const Date& d) { month = (month * 12) - (month * 12); day = (day * 30) - (day * 30); year = (year * 360) - (year * 360); return month + day + year; } // void display() { // // cout << month << day << year << date1 // } }; int main() { Date date1(10,16,2000); Date date2(12,24,2004); int date3; Date D1(date1), D2(date2); if( D1 < D2 ) { cout << date1.getMonth() << date1.getDay() << date1.getYear() << " is earlier than " << date2.getMonth() << date2.getDay() << date2.getYear() << endl; date3 = date2 - date1; cout << "The number of days between the dates is " << date3 << endl; } else { cout << date1.getMonth() << date1.getDay() << date1.getYear() << " is later than " << date2.getMonth() << date2.getDay() << date2.getYear() << endl; date3 = date1 - date2; cout << "The number of days between the dates is " << date3 << endl; } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

上記のコードと下記のコードをどの様にMain関数に渡すのか教えて頂きたいです。

既にコーディングされている内容で渡し方は合っています。

また、day = (day * 30) - (day * 30); この部分はこれであっていますでしょうか?

間違っています。全て、dayと書いている以上、全部同じ変数をアクセスしますので、結果は0になる筈です。
例えば、以下のように書くと、引数のdayを引き算することができます。

day = (day * 30) - (d.day * 30);

ただ、日数を求める式は完全に誤っていますので、適切な値にはならないようです。
1日だけ異なる日付の差、1ヶ月だけ異なる日付の差など、簡単なデータを入れてデバッグするのがお薦めです。

投稿2018/10/17 06:56

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amareno

2018/10/18 04:27

回答ありがとうございます。day = (day) - (d.day)でいけました。簡単なデータを入れてデバッグするというアドバイスがすごく役に立ちました。ありがとうございます。
guest

0

2つの日付オブジェクトの差分(比較についても)であれば、

グローバル関数として

int operator -(const Date& d1, const Date& d2) {
}
とか
Date operator -(const Date& d1, const Date& d2) {
}
としないとダメです(戻りは使いやすい様に)。

クラスメンバは単項演算子で、newdate = -date1 とか用途で使います。
T operator-() const ;で定義します。

投稿2018/10/17 06:26

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amareno

2018/10/18 04:22

回答ありがとうございます。参考になります。
guest

0

質問そのものに対しては、operator<をoverloadしたなら単に<で比較すれば呼び出されますとしか・・・。

なお日付関連についてはC++20で標準ライブラリとなる予定です

C++標準ライブラリのカレンダー(Calendar) - yohhoyの日記

投稿2018/10/17 05:19

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amareno

2018/10/18 04:22

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問