一回も披露したことのない豆知識

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メンバにはアクセスできると思ったのですが、違うのでしょうか。
ご教授お願いします。

A 回答 (5件)

C++では、同じクラスであれば、別のオブジェクトのprotectedメンバにアクセスできます。


quad quad::operator=(quad &ob2)
{
x = ob2.x;
y = ob2.y;
}
は許されます。基底クラスであっても、同じ基底クラスから派生した別のクラスであっても、クラスが違えば、基底クラスでprotectedとされたメンバにはアクセスできません。

ところで、質問のプログラムの意図を満たすために、コンストラクタ
quad(coord&ob2):coord(ob2){};
を使うというのはどうでしょうか。
    • good
    • 2
この回答へのお礼

>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;
}

これで一応希望通りに動いたのですが、もし他に何か方法があれば教えてください。よろしくお願いします。

お礼日時:2010/02/11 13:16

コンストラクタは型変換にも使えるということです。


たいていのコンパイラは、コンストラクタを呼び出して新しいオブジェクトを作り出すというコードを生成するのではなく、コンストラクタの定義に従ってコンパイル時に型を変換します。
    • good
    • 0
この回答へのお礼

なるほど、勉強になりました。
どうもありがとうございました。

お礼日時:2010/02/16 17:02

#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);
と同じことになります。
    • good
    • 0
この回答へのお礼

補足説明ありがとうございます。
試してみたら動いたのですが、少し分からない所がありました。

q = c;
この部分でコピーコンストラクタquad(const coord &ob) : coord(ob){}が呼び出されていることを確認したのですが、何故呼び出されたのかわかりません。

コピーコンストラクタが呼び出されるのは、
quad q = c;
のような初期化の際の代入文や、
q = quad(c);
のように明示的に呼び出した場合だけなのではないのでしょうか?

お手数ですがよろしくお願いします。

お礼日時:2010/02/12 17:42

>コンストラクタということは、



初期化子を調べてください。


>方法があれば教えてください。

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); }
};
    • good
    • 0

protectedメンバは、単純に言うと「外から直接参照することを許さない」つまり、今回のような「ob2.x」という記述によるアクセスを許さない宣言です。



派生クラス内でも参照できるというのはあくまでも「自分のオブジェクト」に限った話です。
    • good
    • 1
この回答へのお礼

>D-Matsuさん

回答ありがとうございます。
勉強になりました。

お礼日時:2010/02/11 12:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報