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


まちゃ  2005-04-20 15:42:33  No: 57075  IP: 192.*.*.*

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

具体的には、

class SuperClass{
protected:
    int superId;
    };

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

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

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

編集 削除
PATIO  2005-04-20 15:55:09  No: 57076  IP: 192.*.*.*

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-20 16:00:30  No: 57077  IP: 192.*.*.*

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

編集 削除
まちゃ  2005-04-20 17:26:20  No: 57078  IP: 192.*.*.*

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

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

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

編集 削除
L/D  2005-04-20 17:27:53  No: 57079  IP: 192.*.*.*

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

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

編集 削除
L/D  2005-04-20 17:28:51  No: 57080  IP: 192.*.*.*

ありゃ、誤爆?

編集 削除
YuO  2005-04-20 17:42:39  No: 57081  IP: 192.*.*.*

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

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

編集 削除
Ban  2005-04-20 18:47:58  No: 57082  IP: 192.*.*.*

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

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

編集 削除
Ban  2005-04-20 18:50:49  No: 57083  IP: 192.*.*.*

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

編集 削除
L/D  2005-04-21 11:19:05  No: 57084  IP: 192.*.*.*

YuOさん へ
まぁね。

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

編集 削除
シャノン  2005-04-21 13:52:56  No: 57085  IP: 192.*.*.*

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

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

編集 削除