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も見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
C++ protectedにアクセス不可
C言語・C++・C#
-
protectedなのにアクセスできないのは何故
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C# で 数式文字列処理を処理す...
-
VisualStudio2022でC言語プログ...
-
mallocについて
-
C言語 列挙型(enum型)変数について
-
いまc言語の標準ライブラリ文字...
-
C言語のことです。写真(見にく...
-
Cのプログラムからアクセスでき...
-
C#でログファイルにファイルパ...
-
c言語
-
C言語 解答について。
-
Cのコンパイルでコメントアウト...
-
ディスプレイの解像度とマウス...
-
Windows Formアプリからコンソ...
-
逆コンパイルと逆アセンブルの...
-
VisualStudioで、コードを印刷...
-
C++でデスクトップGUIアプリ開...
-
ストリームについて。
-
C言語 1から20までの逆数の和を...
-
gccを行ってもexeファイルが生...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
C++ protectedにアクセス不可
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
ダイアログクラスのコントロー...
-
DataGridViewのセルに斜線を引...
-
C++で継承元のクラスの代入演算...
-
MFCのCListCtrlでスクロールを検出
-
イベントにAddHandlerされてい...
-
MFCのドラッグ&ドロップについて
-
MFCアプリのコマンドラインでパ...
-
DebugクラスとTraceクラスの違い
-
[MFC] CWnd::MessageBoxの警告...
-
個々の関数について継承してい...
-
クラスのアドレスを引数として...
-
関数の呼び出し元の検索
おすすめ情報