mcrblog

vcpp-ml

2002年08月

31

[vcpp 00059172] Re: コンストラクタからコンストラクタの呼び出し?

PTVIです。

脱線します。

class A
{
public:
    Mutex m_x;
    Mutex m_y;
    const int m_e;
    --その他のメンバ省略--
    A( )
      : m_x("ユニークな文字その1")
      , m_y("ユニークな文字その2")
      , m_e(100)
      , --省略--
    { --省略-- }
    A(int a)
      : m_x("ユニークな文字その1")
      , m_y("ユニークな文字その2")
      , m_e(100)
      , --省略--
    { --省略-- }
};

同じもの書かなきゃならないなんて面倒じゃないかと思ったことはある。

m_xがデフォルトコンストラクタで初期化された後、
initメンバ関数で再度初期化することになる。
m_xがコンストラクタでしか初期化できないものかもしれない。
ということかしら。

私はJavaを知りません。推測ですので嘘を言っているかもしれません。あしからず。
Javaでは : のところではメンバを初期化しない、
this( )と基底クラスのコンストラクタの呼び出しの重複を回避しているということ
かしら。

Javaを知らないので間違えているかもしれませんが
具体的に言うと以下のようになるということか?。

class B : X
{
    public B( )
     :  // ここではメンバ変数の初期化が出来ない。
    { --省略-- }
    public B(int a)
    {
        this(5.5); // Xのコンストラクタは、B(int)から直接は呼ばれない
        // すでにthis(...)があるので、ここからXのコンストラクタを呼べない
    }
    public B(double a)
    {
        super(a); // Xのコンストラクタのコール
        // すでにsuperがあるので、ここからBのコンストラクタを呼べない
    }
    public B(string a)
    {
        // thisもsuperも記述しなければ自動的にsuper(void)がコールされる。
    }
};
31

[vcpp 00059172] Re: コンストラクタからコンストラクタの呼び出し?

PTVIです。

脱線します。

class A
{
public:
    Mutex m_x;
    Mutex m_y;
    const int m_e;
    --その他のメンバ省略--
    A( )
      : m_x("ユニークな文字その1")
      , m_y("ユニークな文字その2")
      , m_e(100)
      , --省略--
    { --省略-- }
    A(int a)
      : m_x("ユニークな文字その1")
      , m_y("ユニークな文字その2")
      , m_e(100)
      , --省略--
    { --省略-- }
};

同じもの書かなきゃならないなんて面倒じゃないかと思ったことはある。

m_xがデフォルトコンストラクタで初期化された後、
initメンバ関数で再度初期化することになる。
m_xがコンストラクタでしか初期化できないものかもしれない。
ということかしら。

私はJavaを知りません。推測ですので嘘を言っているかもしれません。あしからず。
Javaでは : のところではメンバを初期化しない、
this( )と基底クラスのコンストラクタの呼び出しの重複を回避しているということ
かしら。

Javaを知らないので間違えているかもしれませんが
具体的に言うと以下のようになるということか?。

class B : X
{
    public B( )
     :  // ここではメンバ変数の初期化が出来ない。
    { --省略-- }
    public B(int a)
    {
        this(5.5); // Xのコンストラクタは、B(int)から直接は呼ばれない
        // すでにthis(...)があるので、ここからXのコンストラクタを呼べない
    }
    public B(double a)
    {
        super(a); // Xのコンストラクタのコール
        // すでにsuperがあるので、ここからBのコンストラクタを呼べない
    }
    public B(string a)
    {
        // thisもsuperも記述しなければ自動的にsuper(void)がコールされる。
    }
};
31

[vcpp 00059171] Re: スリープ及び時刻設定によるスリープの解除方法

初めまして、大塚といいます。

ITaskScheduler でできると思います。

On Sat, 31 Aug 2002 06:39:08 +0900
"Makoto Fujimoto" <a...@ymg.urban.ne.jp> wrote:

>藤本と言います。
>
> WindowsXPではタスクの設定に、「タスクの実行時にスリープを解除する」
>設定があり、タスクの継続時間を指定すると、設定時間終了後再びスリープ
>に入る事ができますが、これを自作のプログラムから制御する方法が判りま
>せん。 どなたか ご存じの方は教えて下さい。

----
h...@airnet.ne.jp
31

[vcpp 00059171] Re: スリープ及び時刻設定によるスリープの解除方法

初めまして、大塚といいます。

ITaskScheduler でできると思います。

On Sat, 31 Aug 2002 06:39:08 +0900
"Makoto Fujimoto" <a...@ymg.urban.ne.jp> wrote:

>藤本と言います。
>
> WindowsXPではタスクの設定に、「タスクの実行時にスリープを解除する」
>設定があり、タスクの継続時間を指定すると、設定時間終了後再びスリープ
>に入る事ができますが、これを自作のプログラムから制御する方法が判りま
>せん。 どなたか ご存じの方は教えて下さい。

----
h...@airnet.ne.jp
31

[vcpp 00059170] Re: コンストラクタからコンストラクタの呼び出し?

Satoshi Nakamura wrote:
> > 深く考えるほどの問題ではなく、初期化用に使う共通のメンバ関数を
> > 定義して、それを呼び出せば済む話なんでは?

> メンバ初期化子が使えないので場面によっては上手くいかない or 
> パフォーマンスに問題がでるということがありますね。
--------

具体的に問題になりそうなコードが思い当たらんですが...。

『パフォーマンスに問題が出る』ってのは、どういうことでしょうか?

サブルーチンコールするオーバーヘッドが無視できなくなるには ...

(1) 関数に記述される共通処理がほとんどない
(2) サブルーチンコールが遅い(CALL命令実行にクロックを要する)

などが考えられますが、言語仕様上は関数ではなくても、実体として
のコンストラクタはコンパイラ内でネームスペースで特別扱いされた
関数に過ぎませんし、メンバ関数に限らず、サブルーチンを呼び出す
オーバーヘッドは、コンストラクタを呼び出すのと変わりません。

それと、「コンストラクタ」は、完全なオブジェクトのインスタンス
へのポインタを返すか、オブジェクトの初期化に失敗したらNULLポイ
ンタを返すか、例外をスローするのが決まりです。

「コンストラクタ[A]」内から呼ばれる下請けの「コンストラクタ[B]」
ってのは、直接呼び出された場合、不完全なオブジェクト(コンストラ
クタ[A]でのみ初期化されるメンバが不定)を返すことになるはずで、
オブジェクトの仕様定義そのものに問題があると思えます。

--------
> class A
> {
> public:
>   A() : A(5) {}
>   A(int n) { ... }
> };

> みたいなことって出来ても良いと思うんですが、なんで仕様にないん
> でしょうね?
--------

その必要性がないからでは?

コンストラクタの引数にデフォルト値を指定できればいいんでしょう
けど、そうしたらコンパイラは、引数なしのコンストラクタと、デフ
ォルト値を省略したコンストラクタを区別できなくなるし、かといって
明示的にコンパイラにデフォルトのコンストラクタを指定する記述子
を新たに定義すると、省略するはずの手間が逆に増えてしまうし。

どっちにしろ、タブや括弧のインデント同様、ソース記述上の下らん
こだわりに過ぎんと思います。

+---------------------------------------------------------------------+
| From : Dairyo Gokan ( 後神 大陵 )    mailto:g...@studio-nand.com   |
| Org. : Studio NAND L.L.C.              http://www.studio-nand.com   |
| Adrs : 1820 154th Ave NE #D235, Bellevue, WA 98007 U.S.A.           |
| TEL  : (+1) 425-957-1047    FAX : (+1) 425-957-4603                 |
+---------------------------------------------------------------------+
記事検索
Amazon.co.jp
  • ライブドアブログ