スーパークラスのprotectedな変数を初期化リストで初期化するには?


まちゃ  2005-04-21 00:42:33  No: 57075

タイトルの通り、
スーパークラスのprotectedな変数を初期化リストで初期化する方法を教えていただけないでしょうか。

具体的には、

class SuperClass{
protected:
    int superId;
    };

class SubClass : public SuperClass{
private:
    SubClass(Int id);
}

SubClass::SubClass(int id)
:/* ここでSuperClassのsuperIdを初期化したい、どう記述するのか?? */
{}

よろしくお願いいたします。


PATIO  2005-04-21 00:55:09  No: 57076

SuperClassに引数付きのコンストラクタを作成しておいて
初期化子でそれを呼ぶのが一般的だと思います。
class SuperClass{
public:
    SuperClass(int id) { superId = id; }

protected:
    int superId;
};

class SubClass : public SuperClass {
private:
    SubClass(int id);
};

Subclass::SubClass(int id)
: SuperClass(id)
{
};


YuO  2005-04-21 01:00:30  No: 57077

無理です。
基底クラスのメンバの初期化は,
コンストラクタ以外の方法で手を付ける事はできません。
#protectedメンバ変数って,ほとんど使った事がない……。


まちゃ  2005-04-21 02:26:20  No: 57078

PATIOさん、YuOさん回答ありがとうございます。

あくまで、SuperClassには手をつけないで(つけられない)ので
初期化は無理なんですね・・・(涙

おとなしく代入いたします。
ありがとうございました。


L/D  2005-04-21 02:27:53  No: 57079

推測:
質問の例が実際に問題となっている物と異なっている。

# protectedメンバなんだから、普通の変数ならば、
# 子であろうが、孫であろうが途中で、privateに
# 変更してない限り、普通にアクセスできるでしょ?


L/D  2005-04-21 02:28:51  No: 57080

ありゃ、誤爆?


YuO  2005-04-21 02:42:39  No: 57081

> # protectedメンバなんだから、普通の変数ならば、
> # 子であろうが、孫であろうが途中で、privateに
> # 変更してない限り、普通にアクセスできるでしょ?

アクセスはできるけれど,書き込めるとは限らないですよ。
参照だったりconstだったり……。


Ban  2005-04-21 03:47:58  No: 57082

> # protectedメンバなんだから、普通の変数ならば、
> # 子であろうが、孫であろうが途中で、privateに
> # 変更してない限り、普通にアクセスできるでしょ?

質問の主旨は「初期化リストで初期化する方法/初期化したい」であって、
その後に「おとなしく代入いたします。」ですから、
アクセス権の話は無関係かと思います。


Ban  2005-04-21 03:50:49  No: 57083

# 更新したら YuO さんのレスが...orz


L/D  2005-04-21 20:19:05  No: 57084

YuOさん へ
まぁね。

Banさん へ
その通りだけど、代入ですむ事をなぜ初期化リストで
行いたいかが書かれてなかったので。


シャノン  2005-04-21 22:52:56  No: 57085

> 代入ですむ事をなぜ初期化リストで
> 行いたいかが書かれてなかったので。

初期化リストで済むことをなぜ代入で?  という考え方もありますぜ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加