mcrblog

vcpp-ml

2002年08月

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                 |
+---------------------------------------------------------------------+
31

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

藤本と言います。

 WindowsXPではタスクの設定に、「タスクの実行時にスリープを解除する」
設定があり、タスクの継続時間を指定すると、設定時間終了後再びスリープ
に入る事ができますが、これを自作のプログラムから制御する方法が判りま
せん。 どなたか ご存じの方は教えて下さい。
 目的は、通常パソコンをスリープ状態にしておいて、指定した時刻に自動的
にスリープが解除され、プログラム内で設定した時刻にある作業を実行し、
作業終了時に再度スリープ状態に戻る動作です。
 今では、タスクにダミープログラムを入れてスリープの解除、再スリープを行
っていますが、時刻設定など一々タスク画面を開いて設定し直す必要があり、
不細工で仕方ありません。 スマートな解答をお願いします。

環境:VC++6.0、WindowsXP
31

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

藤本と言います。

 WindowsXPではタスクの設定に、「タスクの実行時にスリープを解除する」
設定があり、タスクの継続時間を指定すると、設定時間終了後再びスリープ
に入る事ができますが、これを自作のプログラムから制御する方法が判りま
せん。 どなたか ご存じの方は教えて下さい。
 目的は、通常パソコンをスリープ状態にしておいて、指定した時刻に自動的
にスリープが解除され、プログラム内で設定した時刻にある作業を実行し、
作業終了時に再度スリープ状態に戻る動作です。
 今では、タスクにダミープログラムを入れてスリープの解除、再スリープを行
っていますが、時刻設定など一々タスク画面を開いて設定し直す必要があり、
不細工で仕方ありません。 スマートな解答をお願いします。

環境:VC++6.0、WindowsXP
31

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

中村です。

At 30 Aug 2002 11:15:03 -0700 Dairyo Gokan wrote:
> 深く考えるほどの問題ではなく、初期化用に使う共通のメンバ関数を
> 定義して、それを呼び出せば済む話なんでは?

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

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

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

---
Satoshi Nakamura <s...@zak.att.ne.jp>
31

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

中村です。

At 30 Aug 2002 11:15:03 -0700 Dairyo Gokan wrote:
> 深く考えるほどの問題ではなく、初期化用に使う共通のメンバ関数を
> 定義して、それを呼び出せば済む話なんでは?

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

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

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

---
Satoshi Nakamura <s...@zak.att.ne.jp>
記事検索
Amazon.co.jp
  • ライブドアブログ