• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:問題が解けません)

学校で出た問題が解けない!解説付きの代入演算子の定義方法を教えてください

このQ&Aのポイント
  • 学校で出た問題が解けません。代入演算子を定義する方法を教えてください。
  • 問題文には、DateTimeClassというクラスで代入演算子を定義する方法が問われています。
  • DateTimeClassはDateClassとTimeClassを継承しており、strDateとstrTimeというメンバ変数を持っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

ひょっとしたら「定義はクラスの外で」というのがメンバ関数以外の関数による定義を行えという意味ではなくクラス定義内では宣言のみを記述せよという意味かもしれませんので、その場合の回答を書きます。 ------------ ヘッダファイル ------------ class DateClass { public: DateClass() : year(0), month(0), day(0) {}; DateClass(int Year, int Month, int Day) : year(Year), month(Month), day(Day) {}; int GetYear() const { return year; }; int GetMonth() const { return month; }; int GetDay() const { return day; }; void SetDate(int Year, int Month, int Day) { year = Year; month = Month; day = Day; } private: int year, month, day; }; class TimeClass { public: TimeClass() : hour(0), min(0) {}; TimeClass(int Hour, int Min) : hour(Hour), min(Min) {}; int GetHour() const { return hour; }; int GetMin() const { return min; }; void SetTime(int Hour, int Min) { hour = Hour; min = Min; } private: int hour, min; }; class DateTimeClass : public DateClass, public TimeClass { public: DateTimeClass() : DateClass(), TimeClass(), strDate(NULL), strTime(NULL) {}; DateTimeClass(int Year, int Month, int Day, int Hour, int Min) : DateClass(Year, Month, Day), TimeClass(Hour, Min), strDate(NULL), strTime(NULL) {}; DateTimeClass& operator=(const DateTimeClass& src); private: char* strDate; char* strTime; void CopyStr(char* dest, const char* const src); }; ------------ ソースファイル ------------ #include <cstdio> #include <cstring> DateTimeClass& DateTimeClass::operator=(const DateTimeClass& src) { if (this != &src){ SetDate(src.GetYear(), src.GetMonth(), src.GetDay()); SetTime(src.GetHour(), src.GetMin()); CopyStr(strDate, src.strDate); CopyStr(strTime, src.strTime); } return *this; } void DateTimeClass::CopyStr(char* dest, const char* const src) { if (dest != NULL){ delete[] dest; dest = NULL; } if (src != NULL){ dest = new char[std::strlen(src) + 1]; std::strcpy(dest, src); } } ただし、自分ならばこのようなクラス構造(日時クラスを定義するのに日付クラスと時間クラスを多重継承する)にはしません。日時と日付および時間の関係はis-aではなくhas-aであると考えるため、 class DateTimeClass { DateClass date; TimeClass time; ... } というふうにします。

FantaO
質問者

お礼

ありがとうございます。 勉強の参考にさせていただきます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

ああ、そういえば、デフォルトでの存在をすっかり失念しておりました。 その部分は撤回させていただきます。 それでも、出来の悪い問題だというは変わらないと思います。 少し前の問題といい、こんなのでC++の勉強になるのかなぁ、と思います。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

今の場合, (意味を完全に無視して) 「DateClass や TimeClass からの代入」そのものは作れます>#2. DateClass なり TimeClass なりの代入演算子を呼べばいい. まあ #3 と同じく「アホな継承だ」とは思います.

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

あまりに情報不足で、回答できません。 1)定義はクラスの外 好意的に解釈すれば、class DateTimeClass の{}の間でプロトタイプ[宣言]をして、実体を{}の外で[定義]する、ってことなんでしょうけど、プロトタイプ宣言まで含めてclassの外で定義する、という解釈もできます(そして、それは仕様的に不可能) 2)代入演算子の仕様が不明 代入演算子はお決まりの形になります。DateTimeClassの代入演算子なら DateTimeClass& operator=(const 右辺の型 & other) { 代入の内容 return *this ; } ですが。 ・右辺の型が不明。 通常は同じ型(DateTimeClass)だが、オーバーロードで他の型にも対応できます。 継承しているってことは、親クラスの DateClassやTimeClassからの代入も作るってこと? ・そもそもの動作仕様が不明 代入演算子と言えば、右辺を左辺に代入するのが普通ですが、別にそれ以外の動作をやってはいけない、ということはありません(混乱するだけなのでやらない方が無難ですが) 好意的に解釈して、代入動作だけ行うにしても、ポインタがあるとやっかいです。 単に this->strDate = other.strDate と同じアドレスを使うようにするのか(浅いコピー) strcpy( this->strDate , other.strDate)等として、同じ内容の別の文字列を作成するのか(深いコピー) また、DateClass,TimeClassからの代入を作ろうにも、これらのクラスにはpublicやprotectedのメンバが無いので、内容にアクセスできません。値が読めないのに代入なんかできません。 3)クラスの動作が未定義 strDate,strTimeがポインタです。名前から予想すると文字列として使いたいのでしょうが、領域を確保するような記述がありません。 コンストラクタ等でnewを使って確保するのか、別途用意した領域のアドレスを入れるのか。 また、文字列もどんなフォーマットなのか? "2010-11-12"なのか"12,Nov,2010"なのか"平成22年11月12日"なのか

すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

参考URL(英語)に以下の記述があります。 It must be a nonstatic member function. No operator= can be declared as a nonmember function. 訳すと、 「これ(代入演算子)は非静的メンバ関数でなくてはなりません。operator=は非メンバ関数として定義できません。」 となります。 先生に参考URLを添えて文句を言いましょう。

参考URL:
http://msdn.microsoft.com/ja-jp/library/7ac5szsk.aspx
すると、全ての回答が全文表示されます。

関連するQ&A