C++初心者です。
以下のような基本クラスcoordと、その派生クラスquadがあり、quadクラスに関して=演算子をオーバーロードしました。
class coord
{
protected:
int x, y;
};
class quad : public coord
{
public:
quad operator=(coord &ob2);
};
quad quad::operator=(coord &ob2)
{
x = ob2.x;
y = ob2.y;
}
するとob2からxにアクセスできないとエラーが出ます。
quadクラスのメンバ関数内なので、基本クラスのprotectedメンバにはアクセスできると思ったのですが、違うのでしょうか。
ご教授お願いします。
No.2ベストアンサー
- 回答日時:
C++では、同じクラスであれば、別のオブジェクトのprotectedメンバにアクセスできます。
quad quad::operator=(quad &ob2)
{
x = ob2.x;
y = ob2.y;
}
は許されます。基底クラスであっても、同じ基底クラスから派生した別のクラスであっても、クラスが違えば、基底クラスでprotectedとされたメンバにはアクセスできません。
ところで、質問のプログラムの意図を満たすために、コンストラクタ
quad(coord&ob2):coord(ob2){};
を使うというのはどうでしょうか。
>akayoroshiさん
回答ありがとうございます。
試してみたところ、実際にアクセスできました。
>quad(coord &ob2) : coord(ob2){};
コンストラクタということは、オブジェクトの定義時のみcoordオブジェクトを代入(オブジェクトで初期化)ということでよろしいのでしょうか? 違っていたらすみません。実際は、
coord c1, c2;
quad q1, q2;
q1 = q2 = c1 = c2;
のように使いたいので、x, yにアクセスできるcoordクラスの公開メンバを通してやりとりしてみました。
quad &quad::operator=(coord &ob2)
{
//get_x(), get_y()はcoordクラスの公開メンバ
x = ob2.get_x();
y = ob2.get_y();
return *this;
}
これで一応希望通りに動いたのですが、もし他に何か方法があれば教えてください。よろしくお願いします。
No.4
- 回答日時:
#2の回答を寄せたものです。
コンストラクタ
quad(const coord& ob) : coord(ob) {}
があれば、代入演算子
quad& operator = (const coord &ob) { return *this = quad(ob); }
が不要になります。これがなくても、
coord c; quad q;
のときに、
q=c;
は
q=quad(c);
と同じことになります。
補足説明ありがとうございます。
試してみたら動いたのですが、少し分からない所がありました。
q = c;
この部分でコピーコンストラクタquad(const coord &ob) : coord(ob){}が呼び出されていることを確認したのですが、何故呼び出されたのかわかりません。
コピーコンストラクタが呼び出されるのは、
quad q = c;
のような初期化の際の代入文や、
q = quad(c);
のように明示的に呼び出した場合だけなのではないのでしょうか?
お手数ですがよろしくお願いします。
No.3
- 回答日時:
>コンストラクタということは、
初期化子を調べてください。
>方法があれば教えてください。
get_x, get_y で十分だと思いますが、No2さんの提案だとこうなるのでは
class quad : public coord
{
public:
quad() {}
quad(const coord& ob) : coord(ob) {}
quad& operator = (const coord &ob) { return *this = quad(ob); }
};
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- 世界情勢 中国はQUADやIPEFをどう見てるんでしょうか? 1 2022/06/19 23:38
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- MySQL はもうダメですか? 4 2022/10/20 16:54
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- 世界情勢 QUADとかAUKUSとかIPEFとかで、対中包囲網は大丈夫? 2 2022/06/01 12:42
- 野球 今年の巨人はBクラス 1 2022/07/02 21:37
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
イベントにAddHandlerされてい...
-
C#のクラス設計について教えて...
-
OnInitDialog()の関数の組み込み方
-
正規表現 [^/]+ の意味を教えて
-
C++ protectedにアクセス不可
-
派生クラスから基本クラスprote...
-
オーバーライド関数の呼び出し...
-
CMainFrameクラスの使い方
-
このコンパイルエラーの意味に...
-
ダイアログ表示時にチェックボ...
-
VC++ MFC CFrameWndって・・・
-
ボタンのオーナードローについて
-
DLLからEXEのクラスを呼び出す...
-
エディットコントロールでEnter...
-
[MFC] CWnd::MessageBoxの警告...
-
ダイアログクラスのコントロー...
-
【ASP.NET】 独自で作成したク...
-
名前空間について
-
ソケットを使った「非同期」通...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
【ASP.NET】 独自で作成したク...
-
MFCアプリのコマンドラインでパ...
-
DebugクラスとTraceクラスの違い
-
ボタンのオーナードローについて
-
OnInitDialog()の関数の組み込み方
-
IncludeではなくClassで宣言す...
-
関数の呼び出し元の検索
-
このコンパイルエラーの意味に...
-
C++ protectedにアクセス不可
-
C++で継承元のクラスの代入演算...
-
DataGridViewのセルに斜線を引...
-
C#で通常のbuttonコントロール...
-
エディットコントロールのイベ...
-
CMainFrameクラスの使い方
おすすめ情報