C++相談室 part53

このエントリーをはてなブックマークに追加
1(σ´∀`)σ
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>1-15 付近参照

前スレ
C++相談室 part52
http://pc8.2ch.net/test/read.cgi/tech/1156525695/
2デフォルトの名無しさん:2006/09/27(水) 15:59:42
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
3デフォルトの名無しさん:2006/09/27(水) 16:00:58
4デフォルトの名無しさん:2006/09/27(水) 16:02:03
5デフォルトの名無しさん:2006/09/27(水) 16:03:12
6デフォルトの名無しさん:2006/09/27(水) 16:04:18
今日はなんの日
フッフー
7デフォルトの名無しさん:2006/09/27(水) 16:04:43
4様
8デフォルトの名無しさん:2006/09/27(水) 16:04:57
9デフォルトの名無しさん:2006/09/27(水) 16:05:28
10デフォルトの名無しさん:2006/09/27(水) 16:06:05
11デフォルトの名無しさん:2006/09/27(水) 16:06:49
12デフォルトの名無しさん:2006/09/27(水) 16:07:25
STLつかうと一気に実行ファイルサイズが10倍に?!
13デフォルトの名無しさん:2006/09/27(水) 16:08:49
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
14デフォルトの名無しさん:2006/09/27(水) 16:09:19
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。
CreateFileとかCopyFile等の動作チェック用です。
自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。
VisualStudioパッケージあるかもしれんがようわからん。
誰か知らないか?
15デフォルトの名無しさん:2006/09/27(水) 16:09:20
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
16デフォルトの名無しさん:2006/09/27(水) 16:09:52
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
17デフォルトの名無しさん:2006/09/27(水) 16:10:28
#include <stdafx.h>
後死ね。
18デフォルトの名無しさん:2006/09/27(水) 16:11:10
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
19デフォルトの名無しさん:2006/09/27(水) 16:21:29
うわ、久しぶりに個別レス版の儀式乙w
20デフォルトの名無しさん:2006/09/27(水) 16:25:57
儀式に>>14が組み込まれたな
21デフォルトの名無しさん:2006/09/27(水) 17:04:18
>>20
www
前スレの質問だ。
22デフォルトの名無しさん:2006/09/27(水) 17:09:26
>>14
あれ、これもしやマナー違反?
23デフォルトの名無しさん:2006/09/27(水) 18:02:34
いい具合にマナー違反が組み込まれたな。
24デフォルトの名無しさん:2006/09/27(水) 18:47:36
class cls{};

class sub_cls : public cls
{
public:
  class cls{};
};

class sub_sub_cls : public sub_cls::cls{};

int main()
{
  (sub_cls::cls)sub_cls::cls();//OK
  (sub_cls::cls)sub_sub_cls(); //ERROR!!
  (cls)sub_sub_cls();     //OK!!
  return 0;
}
2524:2006/09/27(水) 18:48:48
>>24のプログラムにおいて,sub_cls::clsの意味が場所に
よって変わってしまいます.
継承元に使用した場合: sub_clsの基底クラスであるcls
それ以外: sub_clsの内部クラスであるcls

このような振る舞いはC++の仕様でしょうか?
また,sub_clsの内部クラスclsを基底クラスに指定
する方法はあるのでしょうか?

環境: VC++.net2003
26デフォルトの名無しさん:2006/09/27(水) 20:10:17
とても初歩的なことだと思いますが、質問させて下さい。

/* プログラム1 */
#include<iostream>
using namespace std;
void main()
{
char C[80];
cin >> C;
}

というプログラムのcharをintに変更するとエラーが出ます。
charとintは単にバイト数が違うだけの変数だと思うのですが、
なぜエラーが出るのでしょうか?cinの仕様でしょうか?
また、上記プログラム1を

/* プログラム2 */
#include<iostream>
using namespace std;
void main()
{
char C[80];
for(int i=0; i<80; i++){
cin >> C[i];
}
}

の様に書き換えてもうまくいくと思います。
しかし、プログラム1はアドレスCを、プログラム2は配列要素C[i]を
cinに作用させていますが、なぜどちらとも問題なく動くのでしょうか?

本当に初歩的な質問だとは思いますが、どなたかよろしくお願いします。
27デフォルトの名無しさん:2006/09/27(水) 20:13:19
ヒント:オーバーロード
2826:2006/09/27(水) 21:11:01
>>27
回答ありがとうございます。下の質問については理解できました。
ただ、やはりchar→intへの変換でエラーがでるプログラム1の
疑問が分かりません・・・。

よろしくお願いします。
29デフォルトの名無しさん:2006/09/27(水) 21:15:03
>>28
C++においてchar配列は文字列を格納するのに使われるので、
ストリームにおいてもchar配列は文字列の入出力のために多重定義(オーバーロード)されている。
30デフォルトの名無しさん:2006/09/27(水) 21:18:11
>>28
プログラム1を

char c[80] -> int c[80]

と変更すると、
コンパイラはoperator>>(int* rhs) を探すが、
そんなもんは無いのでエラーになる。
3126:2006/09/27(水) 21:27:39
>>29,>>30
回答ありがとうございます。
つまり、charとintはバイト数の違いだけではなく、C++では、
その意味も微妙に違っていて(charは多重定義されていて)、
charは色々な意味の幅を持つので、関数cinは使えるが、
多重定義されていないintは使えないということでしょうか。
32デフォルトの名無しさん:2006/09/27(水) 21:41:06
テンプレートについての質問です。

■宣言部
template<typename T>
class A {
public:
A();
int getValue();
};

■定義部
A<T>::A() {}
int A<T>::getValue()
{
return 0;
}

このテンプレートを使ったクラスの宣言部と定義部を一つの
ファイルに書くと問題ないのですが、ヘッダファイルとcppファイルの
二つに分けて書くと、リンク時にエラーになってしまいます。
書き方が悪いと思うのですが、どこが悪いのか教えていただけないでしょうか。
33デフォルトの名無しさん:2006/09/27(水) 21:49:48
32の質問ももはやテンプレに入れてもいいのではというほど既出。

テンプレートはコンパイル時に定義が見えていないとコンパイルできないのが原則。
ただし例外がある。
1. 宣言にexportを付ける。 - 正攻法だが対応しているコンパイラは絶望的に少ない。
2. ヘッダで定義したり、定義があるcppをヘッダでインクルードしたりする。 - ようするに諦めること。おそらく最もよく取られる手段。
3. cppファイルで明示的実体化を宣言する。 - テンプレート引数を使うだけ並べなければならず面倒。
34デフォルトの名無しさん:2006/09/27(水) 22:03:36
>>33
丁寧な説明、ありがとうございました。
35(^-^) ◆MONSOON/qo :2006/09/27(水) 22:03:51
テンプレートとかクラスとか使ったことないんだけどやばい?
普通に配列にアクセスしていく方がやりやすいんだけど
多数で開発とかじゃないといらなくない?
36デフォルトの名無しさん:2006/09/27(水) 22:05:06
>>35
それ開発じゃなくてコーディングじゃね?
37デフォルトの名無しさん:2006/09/27(水) 22:15:59
>>25
gcc 3.4.4 ではコンパイルできたんで VC のバグなのかも。
typedef sub_cls::cls sub_cls_inner_cls; で回避できない?
38デフォルトの名無しさん:2006/09/27(水) 23:13:47
>>35
趣味で一人でやっていて、誰からも求められていないなら好きなようにやればOK
3924:2006/09/28(木) 00:30:55
>>37
回避できました.有難うございます.
色々試してみたところ,どうもVCのバクのようです.
40デフォルトの名無しさん:2006/09/28(木) 17:20:06
自分で作ったコンテナっぽいものを
汎用アルゴリズムに投入したいのですが、
コンテナが満たさなければならない必要十分条件は何でしょうか?
41デフォルトの名無しさん:2006/09/28(木) 17:27:02
STLスレのほうが食いつきがいいかなあ

引数なしコンストラクタ
コピーコンストラクタ
代入演算子

があればいいんじゃなかったっけ。
あと

デストラクタは例外を投げない

必要があった希ガス。
42デフォルトの名無しさん:2006/09/28(木) 17:40:18
汎用アルゴリズム(<algorithm>ヘッダにあるようなのだよな?)に突っ込むって話なら
一通り機能備えたiterator持ってればいいんじゃないか?
43デフォルトの名無しさん:2006/09/28(木) 17:45:14
アルゴリズムに対してはコンテナよりもイテレータの要件を満たす方が大事。
それはともかく、コンテナの要件はここに書くのは面倒だから規格書見ろ。
44デフォルトの名無しさん:2006/09/28(木) 18:14:21
>>43
規格書(のドラフト)見るのが面倒だから
ここに書いたのに    >_<
45デフォルトの名無しさん:2006/09/28(木) 18:30:24
アルゴリズムとコンテナには何の関係もないんじゃないかね。
イテレータが対応するコンセプトを満たしていればそれでいい。
istream_iteratorとかコンテナと関連付けられてすらいないし。
46デフォルトの名無しさん:2006/09/28(木) 18:33:07
>>45
致命的に読解力がありませんね。
47デフォルトの名無しさん:2006/09/28(木) 18:45:19
>>44
http://www.jisc.go.jp/
JIS検索→規格番号 X3014

PDFの366頁(内容の365頁) 「23. コンテナ」からコンテナの要件が書いてある。
PDFの366頁「24. 反復子」から各種の反復子(イテレータ)の要件が書いてある。
48デフォルトの名無しさん:2006/09/28(木) 19:09:00
>>47
ファイルが破損していますってメッセージが出て開けないけどどうなっとるの?
49デフォルトの名無しさん:2006/09/28(木) 19:39:40
std::vector の一部分の要素、たとえば10番目の要素から20番目の要素を
取り出すのに便利な方法ってありますか?コピー元のイテレータ動かしながら
からの vector に push_back しまくるとかですか?
50デフォルトの名無しさん:2006/09/28(木) 19:45:30
適当にコンストラクタ使うとかinsert_iteratorつかうとか色々あるから好きにしろ。
vector<int>v;
vector<int>v2(v.begin()+10,v.begin()+20);
v2.assign(v.begin()+10,v.begin()+20);
v2.clear();
copy(v.begin()+10,v.begin()+20,back_inserter(v2));
51デフォルトの名無しさん:2006/09/28(木) 20:50:11
質問です。std::string に関してです。
今、マルチバイト文字列を使用する設定であるとして、

std::string hoge = "表表表";
int pos = (int)hoge.find('\\');

とすると、「表」の2バイト目を \ と認識してしまい、期待通りの動作になりません。
この場合、あくまでマルチバイト文字列を使いたいとすれば、
find を使わずに検索を自分で実装するしかないでしょうか?
それとも、find に代わる何かいい道具はないでしょうか?

よろしくお願いします。
52デフォルトの名無しさん:2006/09/28(木) 20:58:51
マルチバイト文字のままでは無理。
自前で実装しなさい。
5351:2006/09/28(木) 21:05:10
>>52
ありがとうございます、ちまちま実装します。
54デフォルトの名無しさん:2006/09/28(木) 21:36:26
>>53
事情が許す無いのはわかるけど、可能な限りwchar_tに乗り換えた方がいいよ。
マルチバイト絡みの悩み一切合財から開放される。
処理効率的には微妙でも、
MB->WCへ変換->フィルタ等で処理->MBに再変換
の流れの方がいいくらいの時も多い。
バグも減るしね…
55デフォルトの名無しさん:2006/09/28(木) 21:50:25
>>51
c_str()使えば、const char*が得られる。
VC++の_mbsstrのようなマルチバイト対応の関数が使えるときにはこういう手もなくはない。
56デフォルトの名無しさん:2006/09/28(木) 23:11:34
C++マスターするのにどれくらい時間かかるんですか?
57デフォルトの名無しさん:2006/09/28(木) 23:45:19
>>56
どんなものにも、マスターしたなんて状態は存在しない。
常に上には上があり続ける。上を目指し続けなければならない。

まあC++だとそれが精神論に聞こえないというやつも多いと思うのだが、
別にC++に限ったことではないと俺は思っているよ。
58デフォルトの名無しさん:2006/09/29(金) 00:12:47
ISOの規格票を完全に把握した上で各処理系毎の実装の問題を全て網羅し、
主要なライブラリ/フレムワークに精通すればC++をマスターしたといえるかもしれない。

んな奴いねーよ。
59デフォルトの名無しさん:2006/09/29(金) 00:16:26
ある程度行くと納得して、勉強しなくなる。
60デフォルトの名無しさん:2006/09/29(金) 00:28:36
Boostの議論に参加してC++そのものを作り始めたら
プロフェッサーと呼ばれるかも知れない。
61デフォルトの名無しさん:2006/09/29(金) 02:23:19
とりあえずハゲろ。話はそれからだ。
http://public.research.att.com/~bs/
62デフォルトの名無しさん:2006/09/29(金) 02:46:22
あー、それは思った。
ハゲとヒゲは大事だよな。
63デフォルトの名無しさん:2006/09/29(金) 03:02:38
>>57
ピント外れの正論を一所懸命書くお前みたいな奴って
ほんと馬鹿だと思う。
64デフォルトの名無しさん:2006/09/29(金) 07:46:47
一番納得したのが>>61だったんだがw
65デフォルトの名無しさん:2006/09/29(金) 18:48:42
>>61
彼の名前って正しく発音するとどう読むの?
びょーん?
誰かマジレスしてくれ…
66デフォルトの名無しさん:2006/09/29(金) 18:51:39
>>65
びょーんすっぽすっぽ
67デフォルトの名無しさん:2006/09/29(金) 18:55:50
ベンジャミン
68デフォルトの名無しさん:2006/09/29(金) 19:23:16
びょーん・それ・しらんかっとってんちんとんしゃん
69デフォルトの名無しさん:2006/09/29(金) 21:48:10
70デフォルトの名無しさん:2006/09/29(金) 22:15:37
FAQのwav聞いた。声が若い気がするが本人なんだろうか。

Is "bjarne" an impostor? bjarneは「インポ」スターですか?
がウケた。辞書ひいたが。

まずは、>>56は、
1mm/秒くらいのものすごい勢いで禿げ上がれ。
毛穴の量を減少させよ。
次に、インポになれたら、発音しにくい名前に改名しろ。
71デフォルトの名無しさん:2006/09/29(金) 22:43:31
規格はビヨーンと伸び続け
実装予定もビヨーンと伸びる
毛は伸びない
72デフォルトの名無しさん:2006/09/30(土) 02:37:49
言語仕様と毛髪は規模に関して反比例する。
73デフォルトの名無しさん:2006/09/30(土) 02:44:33
BASICやればフサフサになれますか?
74デフォルトの名無しさん:2006/09/30(土) 02:58:35
Brainf*ckをやるとモサモサになりますか?
75デフォルトの名無しさん:2006/09/30(土) 03:01:56
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。
76デフォルトの名無しさん:2006/09/30(土) 03:08:41
>>75
>>12-
77デフォルトの名無しさん:2006/09/30(土) 22:33:11
しかし>>75は何がおもしろいんだろう

78デフォルトの名無しさん:2006/09/30(土) 22:51:02
ネタが無いけどとにかく何か書いてみたかったんじゃね?
79デフォルトの名無しさん:2006/10/01(日) 07:36:02
>>77
これが書き込まれた当時は爆笑したものだ。
80デフォルトの名無しさん:2006/10/01(日) 08:25:05
笑いどころがわからん。
解説してくれ。
しなくてもいいが。
81デフォルトの名無しさん:2006/10/01(日) 08:43:11
あとから解説されてもわからんと思うぞ。
こういう、何て言うのかな、リアルタイムでマジ馬鹿に遭遇したおかしさは。
82デフォルトの名無しさん:2006/10/01(日) 09:48:50
そういえば75にはうむご苦労が抜けているな。
最初にやっているからもういいけど。
83デフォルトの名無しさん:2006/10/01(日) 10:50:26
上級プログラマ様ともなるとこれぐらいの厨で爆笑できるものなのですか
84デフォルトの名無しさん:2006/10/01(日) 11:28:14
やっぱり笑いどころがわからん。
まあいいか。
次の話題。
85デフォルトの名無しさん:2006/10/01(日) 12:48:36
そりゃわからんだろう。後から理解するには想像力が要るからな。
86デフォルトの名無しさん:2006/10/01(日) 14:44:31
>>76 >>81 >>85
昨日今日のことなのに、当時ってなんだよ?
お前は、そろそろ現実に戻ってきた方がいいんじゃねーの?
87デフォルトの名無しさん:2006/10/01(日) 14:56:42
>>86よ、とりあえず当時ってなんだ?
お前こそ早くもどってくぁw背drftgyふじこlp;@:「
88デフォルトの名無しさん:2006/10/01(日) 15:08:39
>>87 あんかーのつけまちがえじゃないか?
とくに>>79は嫌われてるからな・・
89デフォルトの名無しさん:2006/10/01(日) 15:08:57
>>86

とりあえずこのテンプレは俺がこのスレ来たときから有るが。
って言っても日が浅いからpart46からなんだけど。
90デフォルトの名無しさん:2006/10/01(日) 15:10:13
>>86
うーん、過去スレ見てみるってのはどうかな?
91デフォルトの名無しさん:2006/10/01(日) 15:33:17
そうだったのか。
92デフォルトの名無しさん:2006/10/01(日) 15:40:27
何この流れ
93デフォルトの名無しさん:2006/10/01(日) 17:32:06
ぬるぽ
94デフォルトの名無しさん:2006/10/01(日) 17:38:17
  ∧_∧
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ     人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/←>>93
 (_フ彡
95デフォルトの名無しさん:2006/10/01(日) 18:48:24
インヘリタンスなクラスはヴァーチャルなスーパークラスにインスタンスをオーバーライドですか?
96デフォルトの名無しさん:2006/10/01(日) 18:49:32
ヴァーチャルなスーパークラスのメソッドをオーバーライドじゃね?
97デフォルトの名無しさん:2006/10/01(日) 18:53:53
とりあえずなんでもカタカナを使えばいいってもんではないよ。
98デフォルトの名無しさん:2006/10/01(日) 18:56:53
インヘリタンス:inheritance
(n) 相続財産。先祖、前代などから受け継いだもの。

形容詞でも副詞でも無いのに、インヘリタンス”な”はちょっとなぁ
99デフォルトの名無しさん:2006/10/01(日) 18:57:27
ネタでいったのに、微妙に意味がつながってしまった・・・シクシク
100デフォルトの名無しさん:2006/10/01(日) 18:58:12
とりあえずこれでも聞いとけ
http://194.79.31.249:7660
101デフォルトの名無しさん:2006/10/01(日) 19:16:40
>>15
何のためにダイナミックリンクが存在するのかと。
102デフォルトの名無しさん:2006/10/01(日) 19:41:15
>>100
何分間あるのよ。もしかして、延々と続くのか。
103デフォルトの名無しさん:2006/10/01(日) 22:33:04
3時間経過・・・
104デフォルトの名無しさん:2006/10/01(日) 22:39:08
>>102,103
男が説明してるだろ。webラジオだよ。
105デフォルトの名無しさん:2006/10/02(月) 07:17:49
おーなつかしー SHOUTcastジャン
106デフォルトの名無しさん:2006/10/02(月) 21:23:11
質問です。CのスレかC++か迷ったんですが、こっちに書き込みます
関数のプロトタイプ定義で、
void hoge(void)とvoid hoge()と書くのでは同じですよね?
どちらを採用すべきでしょうか
107デフォルトの名無しさん:2006/10/02(月) 21:26:28
void hoge()でいいよ
108デフォルトの名無しさん:2006/10/02(月) 21:34:18
サンクス
109デフォルトの名無しさん:2006/10/02(月) 21:38:54
>>106
C++では同じ。

だがCでは微妙に意味が異なり、引数を取らないという意味になるのは前者だけ。
後者はK&R流になり、引数の指定が無いということでvoid hoge(...)と同じような扱い。

ってここC++スレか、すまん。
110デフォルトの名無しさん:2006/10/02(月) 23:50:05
>>109
キニスンナ、メンテの都合でCのコード引っ張ってくる事もあらぁな。
111デフォルトの名無しさん:2006/10/03(火) 01:03:24
なんでもCで開発するやつ会社にいる。まぁそれはいいんだが
毎回車輪の発明を繰り返すのなんとかならんのかなぁ

C++は遅いから使えないとかいってるし使い方しらねーだけじゃんって
いいたいが上司だしいえんし
みんなこうゆうばあいどうするのよ?
112デフォルトの名無しさん:2006/10/03(火) 01:15:07
上司相手にも言う。
相手の目を見て真剣に何度でも言う。
ないしは上司が直接コードのメンテをするのは勘弁してもらって
進行管理や折衝仕事に回ってもらう。

ベテランプログラマの戦力は確かに馬鹿にならないんだが、
技術の新しさを伴った勉強熱心な若い子の方が役に立つ場合は
往々にしてあるのだし。

ベテランのベテランたる所以はコーディング能力ばかりによるものでもないし、
技術は若干古いが設計は優秀って人には、より上位の工程を管理してもらった方がいい。


まあ、理想論ですけっどもね。
113デフォルトの名無しさん:2006/10/03(火) 01:19:51
しかもあれなんだよね、IEEEとソフトウェア系の論文読めばのってる
知識って普通に誰でも知ってるはずなのにさもすごいだろって自慢するのは
簡便して欲しい。早いといってもアセンブラレベルで比較したりしないし
はぁやれやれ、だよ例外も何もかもつかえないからエラー処理のために
全部コールバックで受け渡すとかいうきもい設計だしまじ鬱になりそう
114デフォルトの名無しさん:2006/10/03(火) 01:26:33
いつから愚痴スレに…
115デフォルトの名無しさん:2006/10/03(火) 01:30:27
そんな会社、辞めちまえ!!
116デフォルトの名無しさん:2006/10/03(火) 01:31:39
C++で例外使えない場合って、そこそこ多くないか?
俺が組み込みとかばっかりで、例外飛ばされたところで
回復させられる見込みがねえ&例外処理のコストを呑めねえって
場合が多いからってだけなのかもしれんが。
117デフォルトの名無しさん:2006/10/03(火) 01:51:07
>>113 今の会社にいることが、お前の限界だと思うがな。
118デフォルトの名無しさん:2006/10/03(火) 02:03:24
>>116
>例外飛ばされたところで回復させられる見込みがねえ
それなら返り値でエラー返しても何も出来ないんじゃないのか?
119デフォルトの名無しさん:2006/10/03(火) 02:12:33
>>118
実際その通り。
bad_alloc飛ばされてガリガリ巻き戻って「ごめん無理」って出すか
ぬるぽ祭り開催かどっちかってなもんで。
どっちも大して変わらんので、最悪ぬるぽ祭りを後ろに控えつつ、
開催阻止運動にせいを出すと。

で、首尾よく阻止できてる限りは、そもそも例外が飛ぶシチュに縁がないと。
そんなノリですよ。
120デフォルトの名無しさん:2006/10/03(火) 02:19:56
>>119
「ごめん無理」って出るのと未定義動作とでは全然違うと思うけどなぁ。
奥底で発生したぬるぽがすぐには問題として顕在化せずに潜伏してる可能性とか最悪。
バグの原因探すのに余計な気をまわさないといけない。
121デフォルトの名無しさん:2006/10/03(火) 02:46:31
原因を例外として飛ばしてるんじゃないか。
それを回復できないんじゃ、
原因を例外で飛ばす意味をはじめっからやり直した方がいいだろ。
122デフォルトの名無しさん:2006/10/03(火) 02:50:56
>>121 日本語でおk
123デフォルトの名無しさん:2006/10/03(火) 03:00:17
>>122
その程度のお前じゃ、C++例外は使いこなせないがよく分かる。
124デフォルトの名無しさん:2006/10/03(火) 03:01:41
>>123
いや、頼むから日本語でおk
125デフォルトの名無しさん:2006/10/03(火) 03:11:43
>>124 大人は早く寝ろってこった。
126デフォルトの名無しさん:2006/10/03(火) 03:23:21
・意味をやり直す
・使いこなせないが分かる

言葉って日々変化しているんだなぁw
127デフォルトの名無しさん:2006/10/03(火) 03:59:39
>>126
何をそんなに怖がってるんだ?
ところで、お前が直すとどんな日本語になるのか直してやってみてよ。
128デフォルトの名無しさん:2006/10/03(火) 04:01:09
どうみても121の日本語が変だぞ。

さて、ご飯炊いて弁当詰めるか。 orz
129デフォルトの名無しさん:2006/10/03(火) 04:01:16
元の分では正しい意味が伝わらないので、本人以外が直すのは無理でしょう。
130デフォルトの名無しさん:2006/10/03(火) 04:18:51
> 直してやってみてよ
これも(間違いとまでは言わないまでも)変だな。
留学生か?
131デフォルトの名無しさん:2006/10/03(火) 04:23:28
>>127
おかしな日本語をおかしいと感じられない人間が氾濫のは、
おかしなC++のソースが氾濫するのよりも怖いな。
132デフォルトの名無しさん:2006/10/03(火) 04:35:38
こんな時間に書き込んでる、おまえらの方がおかしいんと思うが?
133デフォルトの名無しさん:2006/10/03(火) 04:41:33
>>130
>直してやってみてよ
これは普通に通じるし、日常使うだろ。
つまり、お前が言う「変」は感じないが?

ところでいつまでもしつこいようだが、
お前は日本語の教師か何かなのか。
134デフォルトの名無しさん:2006/10/03(火) 04:48:49
確かにこの日本語教師じゃ例外は無理だなと思う。
>>126は「使いこなせないのが分かる」と脱字なだけと思うけど。違うのか?
135デフォルトの名無しさん:2006/10/03(火) 05:27:23
ヤクザがこっち見てえらい怒鳴ってるけど意味がさっぱり理解できなくて困っちゃう状態なスレですね
136デフォルトの名無しさん:2006/10/03(火) 05:43:02
ところで、>>120は日本語だと思うが、
言ってることが理解できないのだが。
誰か解読を頼む。
137デフォルトの名無しさん:2006/10/03(火) 05:49:47
どこまで自分で考えてどこでどうわからなくなったのか
言ってくれない奴って最悪だよね。
138デフォルトの名無しさん:2006/10/03(火) 05:51:51
(ノ∀`) アチャー
139デフォルトの名無しさん:2006/10/03(火) 06:06:52
日本語が変って言われたなら次から直せばいいだけなのに
なんでくだらない言い訳に走るんだろう。
140デフォルトの名無しさん:2006/10/03(火) 06:23:05
>>120が何を言ってるのか俺も同じく分からないが
誰か解読してくれないか?
141デフォルトの名無しさん:2006/10/03(火) 06:27:09
>>139は、どの当たりがくだらない言い訳なんだ?
このままでは、みんながお前に合わせないといけないようだな。
142デフォルトの名無しさん:2006/10/03(火) 06:44:11
>>140-141
日本語が変とかしつこい奴だけど、たまに現れるだよ。
これじゃ友達いないようだし、一番近づきたくないタイプだ。
こんなのに係わっても疲れるだけだぞ。
143デフォルトの名無しさん:2006/10/03(火) 06:57:29
>>141
×どの当たり
○どの辺り
144デフォルトの名無しさん:2006/10/03(火) 07:49:58
彼は亡くなったお祖父さんの
「日本語の使い方について指摘されても、決して自分の非を認めてはならん」
という遺言を忠実に守っているお祖父ちゃん想いの少年なのです

そっとしておいてあげて下さい
145デフォルトの名無しさん:2006/10/03(火) 08:28:56
>>120はそんなにおかしいか?
俺は普通に理解できたが。
146デフォルトの名無しさん:2006/10/03(火) 08:31:51
滝川人民キモイ
147デフォルトの名無しさん:2006/10/03(火) 09:30:02
変かどうかはともかく、漏れも>>120は理解できた。
説明ったって、一体あれのどこがわからんのかわからん。
148デフォルトの名無しさん:2006/10/03(火) 09:38:53
>>120は分かるけど>>121がさっぱり
149デフォルトの名無しさん:2006/10/03(火) 10:02:08
30レス近くも引っ張るような話題なのか?
150デフォルトの名無しさん:2006/10/03(火) 11:20:35
char()やwchar_t()の値が、'\0'やL'\0'と等しい事は保証されてますか?
151デフォルトの名無しさん:2006/10/03(火) 11:24:32
はい。
152デフォルトの名無しさん:2006/10/03(火) 11:32:22
ありがとう
153デフォルトの名無しさん:2006/10/03(火) 14:19:10
>>150
誤字脱字で細かい奴が一人いるんからだろ。
いつからここはオレ様専用スレになったんだろうな。
154デフォルトの名無しさん:2006/10/03(火) 15:07:55
>>154
いい加減しつけーんだよ黙れクズ
155デフォルトの名無しさん:2006/10/03(火) 15:10:21
ずいぶんと自虐的なヤツだな
156デフォルトの名無しさん:2006/10/03(火) 15:18:30
自分の非をやっと認めたようだな。
今後は釣られんじゃねーよ!
157デフォルトの名無しさん:2006/10/03(火) 15:37:46
>原因を例外で飛ばす意味をはじめっからやり直した方がいいだろ。

「原因を例外で飛ばす意味をはじめっから学び直した方がいいだろ」
と書くべきでは?

>その程度のお前じゃ、C++例外は使いこなせないがよく分かる。

「その程度のお前じゃ、C++例外は使いこなせないであろう事がよく分かる」
では?

>ところで、お前が直すとどんな日本語になるのか直してやってみてよ。

「直す」が重複。
「ところで、お前が直すとどんな日本語になるのかやってみてよ」
では?
158デフォルトの名無しさん:2006/10/03(火) 15:53:00
はいはい、よくできました。
これは>>121だけど、>>120は修正しないのか?
>>120の方が難しそうだけどな。
159デフォルトの名無しさん:2006/10/03(火) 15:57:58
まだ在日が暴れてんのか
160デフォルトの名無しさん:2006/10/03(火) 16:59:29
最近ム板も、朝鮮人がよく出入りするようになってから、荒れ出した。
161デフォルトの名無しさん:2006/10/03(火) 17:05:59
>>157
こいつずいぶんと偉そうだ。
日本語勉強中のチョンだろう。
お前は嫌われてるんだからマ板にいけ。
162デフォルトの名無しさん:2006/10/03(火) 17:19:47
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーた朝鮮人か!!
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
163デフォルトの名無しさん:2006/10/03(火) 17:23:17
>>159市ね
164デフォルトの名無しさん:2006/10/03(火) 18:25:09
>>161
その「日本語勉強中のチョン」に遠く及ばない日本語を書く連中って・・・。
165デフォルトの名無しさん:2006/10/03(火) 18:43:16
在日ってこんなにしつこいとは知らなかった…
これじゃ、嫌われて当然だよな。
166デフォルトの名無しさん:2006/10/03(火) 18:47:01
在日ってもう本国に帰れないんだろ。
日本でも嫌われて、本国にも帰れず、
確かにないするかわからない危険な奴らだ。
あー、こわい、こわいwww
167デフォルトの名無しさん:2006/10/03(火) 19:00:21
一人で必死に在日をキーワードにしようとしてるけど
誰も乗ってくれないね。

相手を「まっとうな日本人」より下に位置づければ位置づけるほど
それ未満だった自分の位置がえらいことになってしまう構図なのに、
その状況も考えず思いつきだけで抵抗しようとするからこうなる :-)
168デフォルトの名無しさん:2006/10/03(火) 19:10:16
は?何惑わされてんだ?
言語野ぶっこわれた>>121が一人で必死なだけだろ?
169デフォルトの名無しさん:2006/10/03(火) 19:15:29
そうなのか。やっぱり在日だったのか。
2世か?3世か?

それよりも、もう半島人の言い訳見るの飽きたから、
だれかC++の相談ないのか?
170デフォルトの名無しさん:2006/10/03(火) 19:27:23
お前らデスマーチでそんなストレス溜まってんのか
171デフォルトの名無しさん:2006/10/03(火) 19:38:55
>>170
×デスマーチ
○デスニート

デスマーチだったらこんなところで油売ってらんない。
172デフォルトの名無しさん:2006/10/03(火) 20:03:54
template<typename T> struct Outer
{
template<typename T> struct Inner {};
};

こういう風にテンプレート引数の名前が被ってもいいんでしょうか?
173デフォルトの名無しさん:2006/10/03(火) 20:08:03
>>172
ダメ
174デフォルトの名無しさん:2006/10/03(火) 20:13:07
>>171
慣用句「油を売る」の使い方がおかしい気がする。
175デフォルトの名無しさん:2006/10/03(火) 21:23:56
無いところから無理矢理作り上げたプライドを保とうとすると
色々大変なんだなぁと思った。
間違いを認めるって、結構エネルギー要るしね。余計に敷居が高いよね。
176デフォルトの名無しさん:2006/10/03(火) 21:24:21
おそらく環境依存になってしまうと思うんですが、
あるオーバーロードされた関数を呼ぶ時に
どのバージョンの関数を呼ぶようにコンパイルされたかは
どうやって調べるのがいいんでしょうか
今のところcoutして実行してみる方法しか思いつかないです・・

foo(int i){ cout << "int ver";}
foo(hoge f){ cout << "hoge ver";}
177デフォルトの名無しさん:2006/10/03(火) 21:26:19
今ふと思った
きっと>>176のところではオーバーロードを何度も繰り返す仕様の仕様書を書いちゃったんだろうな、と

オーバーロードってバージョン管理までしてくれたっけ?
完全に別個じゃなかった?
178デフォルトの名無しさん:2006/10/03(火) 21:27:22
>>175
「打ち砕かれた妄想設定の続行」という一番痛いパターン(>>169)晒しちゃったしね
179デフォルトの名無しさん:2006/10/03(火) 21:30:54
>>175
自分の事を書きたいならチラシの裏だけにしておけ。
180デフォルトの名無しさん:2006/10/03(火) 21:32:29
>>178は何を言いたいのかさっぱり分からないけど、誰か解読をヨロ
181デフォルトの名無しさん:2006/10/03(火) 21:33:27
>>176
C++ デマングリング
でぐぐるべし。
182デフォルトの名無しさん:2006/10/03(火) 21:33:56
>>180
× は何を言いたいのか
○ が何を言いたいのか
183デフォルトの名無しさん:2006/10/03(火) 21:36:32
>>180
× 分からないけど、誰か
○ 分からないんで、誰か
184デフォルトの名無しさん:2006/10/03(火) 21:39:00
185デフォルトの名無しさん:2006/10/03(火) 22:01:58
>>177
あるライブラリを使用しているんですが、
そのライブラリがテンプレートとオーバーロードを多用していて、
ソースを一見読んだだけでは何が呼ばれるのかさっぱりでして


>>181
ぐぐって来ます
186デフォルトの名無しさん:2006/10/03(火) 22:26:32
>>182-183
修正してニコニコしているみたいだけど、
それはスレと関係ないことだと思ってないのかな?
ねぇ、あらし君!迷惑なんだけど止めてくれるよね。
187デフォルトの名無しさん:2006/10/03(火) 22:43:13
このスレはC++スレではなくて朝鮮人スレなのか。
188デフォルトの名無しさん:2006/10/03(火) 22:57:20
直すな、アラシ!
189デフォルトの名無しさん:2006/10/03(火) 23:01:25
中国人留学生ってやっぱりウザイ
キモイから、早くお国に帰ってくれないかなぁ…
190デフォルトの名無しさん:2006/10/03(火) 23:04:56
朝鮮人スレというより三国人スレ
191デフォルトの名無しさん:2006/10/03(火) 23:27:43
中国人ってよりも在日三世だろ。
「自分は在日三世だ!!」ってみんなにばれたら
次の日から白い目で見られて避けられるだろうな…
細かい事ばかり気にして神経質みたいだし、そもそも友達いないかもな。
あんまり偉そうにしていると、身辺調査されて終いにばれちまうぞ。

でも、マ板だったら仲間が多いだろ。そっちにいけよ。
192デフォルトの名無しさん:2006/10/03(火) 23:30:27
ageてまで語る事じゃないだろ
この手の話題はスルーしろよ
本当にム板はこの手の耐性が低いな
193デフォルトの名無しさん:2006/10/03(火) 23:33:37
日本に帰化しないって事は、朝鮮有事になったら、向こうの側に付くって
事だろ。そんな危険な存在をかくまっておくなんて、政府はどうかしている。
とっとと絞め殺せ。
194デフォルトの名無しさん:2006/10/03(火) 23:44:21
そんなに「在日、在日」って言うな!
これでも俺たちは必死に生きてるんだぞ!!
給料上げて欲しい・・・・
195デフォルトの名無しさん:2006/10/04(水) 00:34:20
何この書きにくい流れ・・
けど気になるので質問するぽ

「もしもdeleteされていなければdeleteする」
というようなコードを書くことって可能でしょうか

Type* t = new Type();
delete t;

こんなコードがあり、後のほうでtが削除されたか気になって
if(t)delete t;
とやってみたけど、玉砕

NULLポインタに対してdeleteは大丈夫なようですが
delete tの後に残ったものはNULLではないのですね
何かよい方法ってあるのでしょうか
196デフォルトの名無しさん:2006/10/04(水) 00:36:34
>>195
・クラスで隠蔽する。
・newを使わない。
・deleteしたらNULLを代入しておく。
197デフォルトの名無しさん:2006/10/04(水) 00:36:59
>>195
自分でgcっぽい仕組みを作る
198デフォルトの名無しさん:2006/10/04(水) 00:37:44
>>196人(・∀・
199デフォルトの名無しさん:2006/10/04(水) 00:50:21
>>196
deleteしたらNULLを代入しておく
 コレ頂きます!感謝
クラスで隠蔽する
 既にクラスなんですが、なんでクラスのポインタにしているかというと
 NEWを返す関数の返り値を代入したりするからです
 (今の代入演算子の実装だとデストラクタが呼ばれないようなので・・)
200デフォルトの名無しさん:2006/10/04(水) 00:54:00
>>197
どもです、ただ俺のレベルでは自作は厳しいっす;
そういう方向だと
BOOSTのスマートポインタを使えば解決しそうだけど
今作っているプログラムで必要な箇所は本当に一部なんで
今回はNULL代入で乗り切ろうと思います
201デフォルトの名無しさん:2006/10/04(水) 00:57:01
スマートポインタ使えよ
202デフォルトの名無しさん:2006/10/04(水) 00:58:18
PS
この方式だと宣言時に初期化しないものにも
全てNULLを代入しとく必要がありますね
これ、クセにしようかな
203デフォルトの名無しさん:2006/10/04(水) 01:00:12
そんな非効率で危険で幼稚な実装すんな
204デフォルトの名無しさん:2006/10/04(水) 01:01:55
スマートポインタ
ttp://www.ne.jp/asahi/yamashita/programming/tips/smart_ptr.html
boostのshared_ptrはCOMと同じく参照カウントなので循環参照が危険かも

ところでマクロでちょっとだけ便利にするのはダメ?
#define delcls(x) delete x; x=NULL
205デフォルトの名無しさん:2006/10/04(水) 01:05:33
こいつ例外安全性とか全然考えてないんだろうな(笑)
だいたいdeleteが散らばってる時点で設計がめちゃめちゃへたくそ
206デフォルトの名無しさん:2006/10/04(水) 01:07:21
>>205
設計と実装を混ぜるクソ発見
207デフォルトの名無しさん:2006/10/04(水) 01:14:02
>>204
>参照カウントなので循環参照が危険かも
知りませんでした、ありがとう

auto_ptrはコンテナ使ってるから避けてます
コピーが発生すると所有権が移るんでしたよね?

マクロいいですね!思いつかなかったです
208デフォルトの名無しさん:2006/10/04(水) 01:17:06
循環参照が気になるなら他のスマートポインタを使えばいい。
それより例外安全性の方が大きな問題だよ。
209デフォルトの名無しさん:2006/10/04(水) 01:17:52
>>207
マクロよりtemplate関数にすべきだと思う。

設計から見直すべきだとは思うけど。
210デフォルトの名無しさん:2006/10/04(水) 01:19:24
そうだね、大きな問題だね
はいはい
211デフォルトの名無しさん:2006/10/04(水) 01:20:25
>>205
すみません
ヘボなんで、まだ例外とか全然使いこなせてないっす^^;
212デフォルトの名無しさん:2006/10/04(水) 01:25:18
例外が発生したらdeleteされなくなっちゃうんだよ。
213デフォルトの名無しさん:2006/10/04(水) 01:29:54
newしたオブジェクトをコンテナに入れるのだったら、ptr_containerもあるぞ。
214デフォルトの名無しさん:2006/10/04(水) 01:31:03
>>208
型安全性って全く詳しくないんだけど
型安全にするか、全く型安全にしないかの2択じゃなかったですか?
そうでないならちゃんと勉強せねば・・

今の例外の知識で作ると、中途半端になりそうなので
ちょっと怖いです、アドバイス頂いたのにすみません

>>209
どもです
テンプレートは、今は可読性もあるのでできるだけ使わないようにしてます
好きなんですけどね、テンプレート
215デフォルトの名無しさん:2006/10/04(水) 01:32:28
>>214
型安全と例外安全は別物だよ。言葉からして違うし。
216デフォルトの名無しさん:2006/10/04(水) 01:33:42
例外安全性はC++の用語なのでしょうか?
どういうことだか教えてください。
217デフォルトの名無しさん:2006/10/04(水) 01:36:05
怖いも何もスマートポインタに入れるだけでいいのに。君のコーディングの方が怖いと思う。
218デフォルトの名無しさん:2006/10/04(水) 01:37:59
>>212
デストラクタで
if(t)delete tをやってみたところメモリリークしてました;
うーん、やっぱり例外学ばないとダメなんかなぁorz
new/deleteだけ気をつけるとかじゃ・・ダメ?w

>>213
それは初耳ですた!
調べてみます
219デフォルトの名無しさん:2006/10/04(水) 01:38:03
>>214
どこに可読性の問題が…?
マクロを奨めないのは副作用の問題があるからだけど。
220デフォルトの名無しさん:2006/10/04(水) 01:38:51
例外安全といえばExceptional C++。

ごめん、言ってみたかっただけ、俺もまだ読んだことない。
221デフォルトの名無しさん:2006/10/04(水) 01:44:40
>>218
趣味でコーディングするならそれでもいいんじゃないか?C++始めたばかりだろうし、少しずつ覚えていけばいい。

まあスマートポインタは簡単に使えるしわざわざ生ポインタ使う理由はないと思うが。
222デフォルトの名無しさん:2006/10/04(水) 01:45:22
>>215
あ、そうですね、プログラマのくせに適当ですません・・

>>217
他に理由をあげると、きちっと動作を理解してから使いたいってのがあります
スマートポインタにも色々あるみたいだし

>>219
そういわれるとちょっと悩みます
実際そんなにたいしたテンプレートにはならないだろうけど
他の人もこのコードにふれる可能性があるので
223デフォルトの名無しさん:2006/10/04(水) 01:48:24
Exceptional C++ Styleの訳本も出たな。
224デフォルトの名無しさん:2006/10/04(水) 01:49:27
>>220
持ってるけど、読んでなかった・・がーん
なんかむずそうだから後回しにしてた
うーむ、読まないと

>>221
ふむふむ
一つのカンタンな解としては
基本的には循環参照ってのだけ気をつけておいて
スマートポインタを使えばええんでしょうか
循環参照は・・これから調べますw

というかみなさんすごいいっぱいアドバイスくれて
ありがとうございます!
225デフォルトの名無しさん:2006/10/04(水) 01:52:35
int a = new int[0];
ってどうなります?確保されないのか1つだけ確保されるのか・・・
226デフォルトの名無しさん:2006/10/04(水) 01:56:54
0個確保される。
227225:2006/10/04(水) 02:01:49
・・・というとこのコードは意味なしということですか?
それとも0個確保されるというのは何か意味があるのでしょうか・・・
228デフォルトの名無しさん:2006/10/04(水) 03:22:52
>>227
実装次第では仮令0個でもdelete[]しないとメモリリークする。
229デフォルトの名無しさん:2006/10/04(水) 03:29:32
アレ? スタック上に生成する配列の場合、
0 だとコンパイルエラーになっちゃうけど、
new の場合は 0 でもいいんだっけ?
230225:2006/10/04(水) 03:33:00
>>228
すいません・・・仕組みが理解できなくて
例えばどういった実装でメモリリークが起こるのでしょう?
231デフォルトの名無しさん:2006/10/04(水) 03:39:29
よかないのが普通だろうが、コード自体は不正でもなんでもない。
mallocにサイズ0を渡してもNULLが返ってくるわけじゃなく、
大抵の場合newもそれに倣った動作をしてよこす。
つまりヒープの管理領域だけは消費されてしまう。
newが実値を返す以上はdelete[]しないとメモリリーク確定。
232225:2006/10/04(水) 03:43:48
なるほど、使えないけど領域だけは食うということですか
deleteが必要というわけですね
233デフォルトの名無しさん:2006/10/04(水) 03:52:48
>>230 >>229
例えば、こんなコードを考えれば0個確保はできないといけない。
int main(int argc, char ** argv)
{
int a = new int[atoi(argv[1])];
delete[] a;
return 0;
}
また、delete[]を実装するためには何個確保できたか記録する必要がある。
その記録をヒープ上に確保するなら、delete[]しないとメモリリークになる。
234デフォルトの名無しさん:2006/10/04(水) 04:11:46
new int[0]がぬるぽを返すのはまずいのかな。
235デフォルトの名無しさん:2006/10/04(水) 08:20:41
>223
マジで出てるし
More Exceptional の方を先にするのが道理だと思うのだが……
236デフォルトの名無しさん:2006/10/04(水) 10:04:27
>>234
new (nothrow) だったら確保の失敗と区別が出来なくなる。
それと
          _
      ミ ∠_)
         /
         /   \\
 ウイーン  Γ/了     | |
  ウイーン  |.@|    | | ガッガッガッ
       | / | .     人
       |/ |    <  >_Λ∩
      _/  | //. V`Д´)/ ←>>234
      (_フ彡           /
237デフォルトの名無しさん:2006/10/04(水) 10:10:17
谷崎潤一郎
238デフォルトの名無しさん:2006/10/04(水) 11:20:52
テンプレートクラスで、その型がfloatならAの処理をして、
それ以外なら何もしないといった処理はどうやればいいでしょうか?

その(floatの)クラスを継承したクラスを作ればいいような気もするんですが、
出来ればfloatの時とそうでないときで、透過的に使えるようにしたいんです。
239デフォルトの名無しさん:2006/10/04(水) 11:23:28
特殊化のこと?
240デフォルトの名無しさん:2006/10/04(水) 11:35:47
>>239
すいません。ちょっと調べてみた所特殊化だと
同一の処理を行う部分も書き直す必要があるのではないでしょうか。
一部のメソッドのみを書き換えたり、メソッドを追加するだけのようなコトがしたいんです。
241デフォルトの名無しさん:2006/10/04(水) 11:41:50
共通の部分をくくりだせばいいよ
242デフォルトの名無しさん:2006/10/04(水) 11:53:40
共通部分を関数テンプレートで書く。
243デフォルトの名無しさん:2006/10/04(水) 12:10:58
>>241,242
どういうことでしょうか?
ベースとなる汎用のクラスFooがあるときに、
Foo<double>で変更部分のみ記述したら
変更部分以外は無かったことにされました。
244デフォルトの名無しさん:2006/10/04(水) 12:13:12
外部に template <class T> void foo2(T param)
などの下請け関数を作り、共通部分はそこで処理する。
245デフォルトの名無しさん:2006/10/04(水) 12:16:41
>>244
そういうことでしたか、大がかりな変更になるんですね。。
一度それでやってみます。ありがとうございました。
246デフォルトの名無しさん:2006/10/04(水) 12:19:33
内容がほとんど同じなら、typeinfo(T) == typeinfo(float) などで
分岐させられないか?
247とおりすがり:2006/10/04(水) 13:10:30
typeinfo はいや。
さしみ
248デフォルトの名無しさん:2006/10/04(水) 14:32:06
>>246
typeinfoなんか使ったらコンパイル通せなくなるかもよ
249デフォルトの名無しさん:2006/10/04(水) 23:16:17
>>243
下のコードを VC2005express で試してみたら期待通り f2() だけ特殊化されたよ。
なかったことにされたっていうのは具体的にどういうことなのか教えて。

#include <iostream>
using namespace std;
template<class T> struct G {
void test() { f1(); f2(); f3(); }
void f1() { cout << "G::f1" << "\n"; }
void f2() { cout << "G::f2" << "\n"; }
void f3() { cout << "G::f3" << "\n"; }
};

template<> void G<double>::f2() { cout << "Special G::f2" << "\n"; }

int main() {
G<int> gi;
gi.test();
G<double> gd;
gd.test();
}
250デフォルトの名無しさん:2006/10/06(金) 00:27:33
UTF-8扱えるようにbasic_string<char>を改良しようと思うんだけど

どこから手をつければいいの?

class ustring : std::basic_string<unsigned char>{

この中に何が書けばいいのか解らない
251デフォルトの名無しさん:2006/10/06(金) 00:32:35
>>250
まずはchar_traits<unsigned char>からなんだろうけど。
しかも、basic_string<>は仮想デストラクタを持ってないし、継承されることを
前提にしてない。
252デフォルトの名無しさん:2006/10/06(金) 00:37:46
>>250
UTF-8 を扱うのに std::string に何の不満がある?
253デフォルトの名無しさん:2006/10/06(金) 01:08:13
254デフォルトの名無しさん:2006/10/06(金) 01:19:35
typedef std::basic_string<unsigned char> ustring;で十分な気がする。
char_traits も特に特殊化する必要があるものはないと思う。
後はwstringとの変換をする関数を作れば十分だろ。
255デフォルトの名無しさん:2006/10/06(金) 01:23:06
>>251
private継承して公開するメンバをusingすれば安全じゃね?
面倒だけど。
256デフォルトの名無しさん:2006/10/06(金) 08:01:25
private継承使うならコンポジションも考えよう
257デフォルトの名無しさん:2006/10/06(金) 08:28:24
コンポジションってなに?
private メンバとして持てばいいじゃないってこと?
258デフォルトの名無しさん:2006/10/06(金) 22:48:14
そう。包含ってやつだ
クラス間にis-a関係が成立しないなら
なるべくそうした方がいいらしいぞ
259デフォルトの名無しさん:2006/10/07(土) 09:00:47
重〜い計算ソフトの2次元版と3次元版を並行して作っており、
悩んでいることがあります。

例えば、2次元版で、
for (Vec2D vec(0, 0); vec[0] < maxVec[0]; vec[0]++)
{
 for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++)
 {
  foo(vec);
 }
}

であった箇所が、3次元版では
for (Vec3D vec(0, 0); vec[0] < maxVec[0]; vec[0]++)
{
 for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++)
 {
  for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++)
  {
   foo(vec);
  }
 }
}

となります。
できれば、2D/3Dのソースの2元管理はしたくないし、
大量の #ifdef をソース中にばら撒くこともしたくありません。

ループの深さの違いをうまく吸収して、
2D/3Dを共用するアイデアはないでしょうか?
(元々、巨大な計算なのでパフォーマンスに影響は与えたくありません)
260デフォルトの名無しさん:2006/10/07(土) 09:16:45
blitz++とかあるでしょ。
http://www.oonumerics.org/blitz/

> vec[0] < maxVec[0]; vec[0]++

とかやばすぎ
261(^-^) ◆MONSOON/qo :2006/10/07(土) 09:50:30
計算量の多いところ(3D)を高速化すれば2Dはそれに含まれそれ以下の速度
262(^-^) ◆MONSOON/qo :2006/10/07(土) 09:56:22
回転とかだったら一度に全部が動くわけではないんだから結局は一次元とかに分割されるでしょ
263デフォルトの名無しさん:2006/10/07(土) 09:58:36
  for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++)
  {
   foo(vec);
  }

だけくくり出してテンプレにでもしたらいいべや
264デフォルトの名無しさん:2006/10/07(土) 11:27:50
>>254
typedef std::basic_string<unsigned char> ustring;
で十分なんだろうけど
operator<<とかこのへんは最低限実装しないとダメだよね?

265デフォルトの名無しさん:2006/10/07(土) 14:00:13
java.util.concurrent にあるような「待機状態のない」FIFOキューの
C++での実装って、どこかにない?
266デフォルトの名無しさん:2006/10/07(土) 14:02:23
>>259 です。アドバイスありがとうございます。

>>260 問題依存のメンバー関数があったりするので blitz++ の利用は
見送りました。
それから、ご指摘の箇所がヤバイ理由はよくわからないのですが...

>>261 2Dでも十分遅いので...(涙)

>>262 最内ループの部分は、行数も含めて可変ですので template 化は
困難かと...
267デフォルトの名無しさん:2006/10/07(土) 14:05:53
引き続き >>259 です。
>>262
class abstract
{
 virtual bool Scan() = 0;
}
class VecXD: public abstractVec
{
 bool Scan();
}
あるいは、
class PolicyXD{ ... }

teplate<typename DimPolicy> Vec: public DimPolicy
{
 bool Scan();
}
と定義しておいて、
while(vec.Scan())
{
 foo(vec);
}
て感じでしょうか?
virtual を使いたくないし、後者もfor ループではなくなると、
無駄なコードが出力されるような予感がします。
268デフォルトの名無しさん:2006/10/07(土) 14:31:43
template<int I>
struct Loop{
template<class T>
void calc(T& vec){
for(vec[I]=0; vec[I] < maxVec[I}; vec[i]++){
Loop<I-1>::calc(vec);
}
}
};

template<>
struct Loop<0>{
template<class T>
void calc(T& vec){
foo(vec);
}
};

Vec3D vec;
Loop<3>::calc(vec);
269デフォルトの名無しさん:2006/10/07(土) 14:33:04
<<245
template<typename T> class Test
{
public:
 Test()
 {
  Val_[0] = 100;
  Val_[1] = 1000;
 }

 T GetVal() { return Val_[0]; }
private:
 T Val_[2];
};
270デフォルトの名無しさん:2006/10/07(土) 14:35:34
(続き)
template<> double Test<double>::GetVal()
{
 return Val_[1];
}
としておいて
 Test<int> testInt;
 Test<double> testDouble;

 std::cout << "Int: " << testInt.GetVal()
  << " Double: " << testDouble.GetVal() << "\n";

とやったら、Int: 100 Double: 1000 とでましたが
271デフォルトの名無しさん:2006/10/07(土) 14:38:42
>>265
std::queue
272デフォルトの名無しさん:2006/10/07(土) 15:02:26
>>270
>とやったら、Int: 100 Double: 1000 とでましたが

で、だから何?
273デフォルトの名無しさん:2006/10/07(土) 15:49:44
>>270
もういい。くんな
274デフォルトの名無しさん:2006/10/07(土) 17:24:02
>>271
std:queue は順列コンテナSequenceを自分では実装していないし
デフォルトのSequenceであるdequeが「 「待機状態のない」FIFOキュー」だなんて話はきいたことがない。
275デフォルトの名無しさん:2006/10/07(土) 17:26:56
「待機状態のない」ってどういう事なの?
276デフォルトの名無しさん:2006/10/07(土) 17:48:32
マルチスレッドで排他なしでちゃんと動くってこと
277デフォルトの名無しさん:2006/10/07(土) 17:50:26
>>276
マルチスレッドを考慮していない現状の C++ 標準にそんなコンテナあるわけ無い。

何をどう考えたら、それが「待機状態のない」なんて表現になるんだ?
278デフォルトの名無しさん:2006/10/07(土) 17:52:48
>>277
誰が「C++標準」なんて言った?
279デフォルトの名無しさん:2006/10/07(土) 17:52:55
ググってみるとこんなのが出てきた。何かの訳語だね。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/concurrent/ConcurrentLinkedQueue.html
280デフォルトの名無しさん:2006/10/07(土) 17:52:55
http://www.google.co.jp/search?q=non-blocking+queue で頭のほうに出てくるPDFで
アルゴリズムは紹介されてる。既存の実装はないんかいな?
281デフォルトの名無しさん:2006/10/07(土) 17:57:26
Lock-free と同義?
282デフォルトの名無しさん:2006/10/07(土) 17:57:49
non-blocking ってことだしょ
283デフォルトの名無しさん:2006/10/07(土) 17:58:28
実際には、要素の追加だけはブロッキング不要で取り出しはブロックかかるはずだけど
まあそれはどうでもいいか。
284デフォルトの名無しさん:2006/10/07(土) 18:08:09
285デフォルトの名無しさん:2006/10/07(土) 18:09:39
Lock-free や Wait-free アルゴリズムを作るには、CPUが専用のアトミックな命令を提供し、それを使う必要がある。最も重要なのは、「比較して交換」(Compare and swap, CASと省略する)である。

つーわけで C++だけではこの機能は実装できない。
286デフォルトの名無しさん:2006/10/07(土) 18:13:23
http://www.audiomulch.com/~rossb/code/lockfree/
ここの "Existing source code and libraries" で、
都合のいい実装が見つかるかもしれない。
287デフォルトの名無しさん:2006/10/07(土) 18:53:24
CPU、コンパイラ別のアトミックな命令の使用例は
boost::shared_ptr の参照カウンタで使われてるのが参考になると思う。
288デフォルトの名無しさん:2006/10/07(土) 20:27:44
LinuxとFreeBSDはカーネル読めばそこそこ悩めば実装できると思うよ
289デフォルトの名無しさん:2006/10/07(土) 21:25:47
Google Code of Summer で Lock-free Container のプロジェクト提案されてたなぁ
結局誰も取らなかったのかな,あれ
290デフォルトの名無しさん:2006/10/07(土) 21:26:26
>289
>Google Code of Summer
間違えた. Google Summer of Code だ
291デフォルトの名無しさん:2006/10/07(土) 22:07:19
標準とやらをすぐに持ち出す規格厨ばっかでマジツマンネーな
292デフォルトの名無しさん:2006/10/07(土) 22:14:41
それがこのスレのいいところ
293デフォルトの名無しさん:2006/10/07(土) 23:51:45
時々規格厨の人につっこんでもらわないと、普段使ってる実装の挙動だけで脳内完結しちまうしな。
モヒカン乙というか。
294デフォルトの名無しさん:2006/10/08(日) 00:33:37
このスレはC++規格票の人力検索エンジンです
295デフォルトの名無しさん:2006/10/08(日) 00:35:49
適当なこと言ったり軽く煽ったりすると、規格を引用してくれるから便利だよねw
296デフォルトの名無しさん:2006/10/08(日) 00:36:39
たまに>>277 みたいな人の話を聞かずにレスするバカもいるけどな。
297デフォルトの名無しさん:2006/10/08(日) 01:42:54
質問よろしいでしょうか……
クラス内クラスのアクセス制御て、クラス内クラスのメンバのアクセス制御には
影響しないんだっけ? とりあえずVC++ 8.0では通ったみたい。

class A {
private:
 class B {
 public:
  void test() { std::cout << "test" << std::endl; };
 };
 B b_;
public:
 B& b() { return b_; };
};

int main()
{
 A a;
 a.b().test(); // ok?
  A::B b(a.b()); //NG
}
298デフォルトの名無しさん:2006/10/08(日) 01:55:29
>>297
影響しないよ。下は VC8 でも NG なんだよね?
299デフォルトの名無しさん:2006/10/08(日) 01:55:32
>>297
そりゃVC8のバグだ。
300デフォルトの名無しさん:2006/10/08(日) 01:56:19
>>297
あ、下はNGなのか。それでいい。
301デフォルトの名無しさん:2006/10/08(日) 02:01:06
何が問題なのか理解するまで30秒かかった。

なんだこりゃwこれ通っちまうのか、VC。見損なったわ!
302デフォルトの名無しさん:2006/10/08(日) 02:08:09
>>301
は?何いってんの?正しい動作だろ
303297:2006/10/08(日) 02:12:33
>298
そうか、OKなのか。サンクス
何かおもしろいことできそうかな……と思ったけど、
 delete &(a.b());
が通っちまうのね……

 class B {
  ~B() {};
  friend A;
 public:
  void test() { std::cout << "test" << std::endl; };
 };
とすりゃいいけど、これはこれで面倒か……

304デフォルトの名無しさん:2006/10/08(日) 02:14:47
俺は関数定義の } の後に ; つける奴は信用しない。
305デフォルトの名無しさん:2006/10/08(日) 02:19:10
いくらprivateにしても、参照を返したら何にもならんだろ。
306デフォルトの名無しさん:2006/10/08(日) 07:51:20
>>297
ややこしいこと書いているが、
> A::B b(a.b()); //NG
< A::B x; //NG
の時点で駄目だぞ。
307デフォルトの名無しさん:2006/10/08(日) 10:33:58
>>306
読解力0のクズは氏ね。去れ。
308デフォルトの名無しさん:2006/10/08(日) 10:56:14
>299 >301 >306
ごめん。誤解しちまったか……
  A::B b(a.b()); //NG
自体はコンパイル通らんです。コメントアウトしとけばよかったな。

>305
確かにそうか。

カスタマイズポイントに使えないかな?と思ったけど、よくよく考えたら
クラス内クラスの時点で継承できない(カスタマイズできない)よね……
309デフォルトの名無しさん:2006/10/08(日) 11:00:52
>>307
プッ
310デフォルトの名無しさん:2006/10/08(日) 11:38:20
ちょいと質問だが、
複数のテンプレート引き数を取るテンプレート関数の、一部引き数だけの特殊化ってできるんだろか。
例えば
template<typename T, int N>inline T factrial(T s = 1){return factrial<T, N - 1>(s * N);}
template<>T factrial<T, 1>(T s){return s;}
みたいなことがしたいんだけど。
template<>double factrial<double, 1>(double s){return s;}
これなら巧くいくんだけどね。
311デフォルトの名無しさん:2006/10/08(日) 11:51:35
できるよ。まぁ、コンパイラによるかもね。
312デフォルトの名無しさん:2006/10/08(日) 11:53:03
>>309
読解力0のクズは氏ね。去れ。
313310:2006/10/08(日) 11:56:00
>>311
にえ〜、gcc@cygwinで通らない〜(TT
314デフォルトの名無しさん:2006/10/08(日) 12:00:16
>>311
なんで嘘をつくの?
315デフォルトの名無しさん:2006/10/08(日) 12:02:08
>310
>template<>T factrial<T, 1>(T s){return s;}
普通に特殊化しているように見えるけど……

template<T>T factrial<T, 1>(T s){return s;}
の間違い?
316310:2006/10/08(日) 12:15:50
いや、それはTが未定義とエラーにされる。
TとNのうちNだけ特殊化ってのはできないのかねぇ。
317デフォルトの名無しさん:2006/10/08(日) 12:27:54
>>315
typenameが抜けてますよ。(これでもダメだけど)
template<typename T>T factrial<T, 1>(T s){return s;}

テンプレート関数の部分特殊化は禁止されてるはず。
テンプレート構造体ならなんとかなる。

template<typename T,int N>
struct factorial
{
T operator()(T s=1){return factorial<T,N-1>()(s*N);}
};

template<typename T>
struct factorial<T,1>
{
T operator()(T s){return s;}
};
318デフォルトの名無しさん:2006/10/08(日) 12:28:57
>>310
関数テンプレートは部分特殊化できない。
(関数テンプレートを部分特殊化できちゃう処理系があるかどうかは知らん)

クラステンプレートなら部分特殊化できるから、
実体はクラスにして入口だけ関数にする感じでがんばれ。
319315:2006/10/08(日) 12:52:57
>317
指摘サンクス

>310
Exceptional C++ Styleにちょうどその話題が載ってるから、買って読んどけ

そういや、More Exceptional C++の邦訳は出ないのか……?
320デフォルトの名無しさん:2006/10/08(日) 13:29:26
D&Eには、関数テンプレートは部分特殊化はしてもいいかもしれないけど、
まだ良く分からないからやめてるんだと書いてあったはず。

頑張ってC++0xには入れてほしい。
321310:2006/10/08(日) 14:13:47
>>317-319
レスTHX、本も探してみる。

で、結局、>317 ではTへのキャストオペレータがなくて巧くなかったのでこうなった。
関数版と名前がぶつかるのも回避。
#include <cstdio>
#include <cstdlib>

template <typename T> inline T factorial(const int n, const T s = 1) {return n <= 1 ? s : factorial(n - 1, s * n);}

template<typename T, const int N> struct Factorial {operator T() const {return Factorial<T, N - 1>() * N;}};
template<typename T>struct Factorial<T, 1> {operator T() const {return 1;}};

int main(int argc, char ** argv)
{
printf("%d\n", factorial<int>(atoi(argv[argc - 1])));
Factorial<double, 10> foo;
printf("%.20g\n", double(foo));
printf("%.20g\n", double(Factorial<double, 21>()));
return 0;
}
テンプレート引き数だと定数性が求められるから、末尾再帰じゃなくても大丈夫ってことですかね。
322デフォルトの名無しさん:2006/10/08(日) 14:32:42
Exceptional C++ Styleにまんま載ってるよ、それ
staticメンバ使ってたけどな
323デフォルトの名無しさん:2006/10/08(日) 16:55:05
質問です
C++でC言語ライクなスクリプト言語を作ろうとしているのですが
まずファイルを読み込み、string scriptに収納します。
次にscriptのコメント(/* */)を削除するのですが、
ここでbool DeleatComment(string &str);という自前の関数を使って
while(DeleatComment(script));と、コメントが全て消えるまでループさせるのですが
なぜかコメントが消えません。/*と*/が消えるだけなのです。
問題のDeleatCommentの部分は

bool DeleatComment(string &str){
 string::size_type com_begin = str.find_first_of("/*");
 if(com_begin != string::npos){
  string::size_type com_end = str.find_first_of("*/",com_begin);
  if(com_end != string::npos){
   str.erase(com_begin,com_end-com_begin+2);
   return true;
  }
 }
 return false;
}

こうなってます。
324デフォルトの名無しさん:2006/10/08(日) 16:56:13
英語勉強しな
325デフォルトの名無しさん:2006/10/08(日) 17:19:40
>>323
find_first_of() ではなくて find() だと思うそこは
326デフォルトの名無しさん:2006/10/08(日) 17:24:25
>>325
ありがとうございます!
なぜだかよく分かりませんが、findにしたら消えました
327デフォルトの名無しさん:2006/10/08(日) 17:25:34
>>324
どこかでdelatCommentを使っちゃったんだろ。
初心者はよくやる。察してやろうZE
328デフォルトの名無しさん:2006/10/08(日) 17:34:11
>>327
>324
329デフォルトの名無しさん:2006/10/08(日) 17:35:04
>>326
std::string::find_first_of(A, B)は文字列Aの中から
「文字列Bの中のどれか一文字が最初に見つかったindexを返す」
のでした
<algorithm>のstd::find_first_of()の説明を見るとなんとなくわかるかもしれない
330デフォルトの名無しさん:2006/10/08(日) 17:37:17
>>324
すみません、deleatではなくdeleteでしたね
今気づきました
331デフォルトの名無しさん:2006/10/08(日) 17:38:21
>>328
まじれすされた(^o^)
332デフォルトの名無しさん:2006/10/08(日) 17:40:06
>>329
ごめん俺が馬鹿
find_first_of(A, B)

A.find_first_of(B)
に置き換えてみると俺が救われます
333デフォルトの名無しさん:2006/10/09(月) 13:05:57
こんな意味不明な警告が出たんですけど、なんのことやらさっぱりです!

warning C4786: 'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,
std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator,std::basic_string<char,std::char_traits<char>,
std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,
std::allocator<char> > *,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。

list<string>を定義したら出たので、その辺の警告なんだと思いますが・・・
334デフォルトの名無しさん:2006/10/09(月) 13:07:08
日本語嫁
335デフォルトの名無しさん:2006/10/09(月) 13:07:51
超FAQ
336デフォルトの名無しさん:2006/10/09(月) 13:13:56
>>334
listの< >内が255文字以上あるということですか?
337デフォルトの名無しさん:2006/10/09(月) 13:17:28
>>336
違います。
338デフォルトの名無しさん:2006/10/09(月) 13:21:33
じゃあlist< >の中に同じSTLのstringとかstackとかが入るとまずいっていうことですか?
339デフォルトの名無しさん:2006/10/09(月) 13:25:27
340デフォルトの名無しさん:2006/10/09(月) 13:28:18
よくわからないので諦めます
341デフォルトの名無しさん:2006/10/09(月) 13:40:20
>>338
違います。
336の方が正解に近いな。
342デフォルトの名無しさん:2006/10/09(月) 13:41:53
>>333
俺にもさっぱりだが、
>339
を見る限り、
・VC++の環境依存っぽい
・キニスンナ
ということは解る。
343デフォルトの名無しさん:2006/10/09(月) 13:45:00
読売
北朝鮮が核実験を実施・・・朝鮮中央通信

産経
北朝鮮が核実験を実施

毎日
北朝鮮:中央通信「核実験行った」報じる プルトニウム型

日経
「核実験を実施」中央朝鮮通信


--------------------ここまで日本の新聞----------------------


朝日
北朝鮮「地下核実験に成功」
344デフォルトの名無しさん:2006/10/09(月) 13:52:15
さっさと核戦争始まらないものかねー
345デフォルトの名無しさん:2006/10/09(月) 14:42:40
>>344

俺らも被爆するぞ
346デフォルトの名無しさん:2006/10/09(月) 18:24:27
STLが多様してあると読みずらいよね?
347デフォルトの名無しさん:2006/10/09(月) 18:29:20
逆に読みやすいです
348デフォルトの名無しさん:2006/10/09(月) 18:38:48
std::だらけになってお願いしますusing使わせてくださいって
思うときはある
349デフォルトの名無しさん:2006/10/09(月) 18:58:46
>>348
上司に
「関数スコープ単位での"using namespace std;"は常識なんだよ」
って言うじゃない。
               ・
               ・
               ・
               ・
そしたら、あんたクビだからぁ〜〜。                 

350デフォルトの名無しさん:2006/10/09(月) 19:05:08
usingとusing namespaceは別物。
351(^-^) ◆MONSOON/qo :2006/10/09(月) 19:24:08
bsearchが正しい値を返さないのですがどこがいけないのかわかりますか?


N=100;
int *d = new int [N]; // dには適当な数値が入る
k=13421030;
q=(int *)bsearch(&k, d, N, 4, f);
x=(int)(q-d)+1; //サーチした番号


int f(const void *a, const void *b)
{return (*(const int *)a - *(const int *)b);}
352(^-^) ◆MONSOON/qo :2006/10/09(月) 19:26:28
あと、比較関数を

int f(const void *a, const void *b)
{return (*(const int *)b - *(const int *)a);}

に変更しても結果は同じになるんでしょうか?
別の番地が返ってくるのですが
353デフォルトの名無しさん:2006/10/09(月) 19:30:47
int [N]はちゃんとソートしてる?
354デフォルトの名無しさん:2006/10/09(月) 19:31:45
>>348
そういう時に export template<> だと実装側にusingが使いまくれて経済的
355(^-^) ◆MONSOON/qo :2006/10/09(月) 19:34:02
>>353
ばっちりしてあります 出力して確認済みです
実際にはN=57928730なんですが
数字が大きいと誤作動したりするんでしょうか
356デフォルトの名無しさん:2006/10/09(月) 19:39:07
んーnewした領域はたかだか220Mほどしかないし、誤動作するとすれば
もしかしたらsizeof(int) != 4の環境かねえ。
357デフォルトの名無しさん:2006/10/09(月) 19:41:58
>>351
C++なんだからlower_boundとか使えじゃ駄目?
358(^-^) ◆MONSOON/qo :2006/10/09(月) 19:44:41
>>356
駄目でした 4でした
どんな値でも、初めの200番代くらいまでの番号しか返してきません

>>357
つかってみます!
359デフォルトの名無しさん:2006/10/09(月) 19:45:01
例えばこれなんかちゃんと動作するよ。何か間違ってないか?

int main()
{
const int N = 100;
int* d = new int[N]; // dには適当な数値が入る
int k = 13421030;

std::fill(d, d + N / 2, 0);
d[N / 2] = k;
std::fill(d + N / 2 + 1, d + N, k + 1);

int* q = (int *)std::bsearch(&k, d, N, sizeof(int), f);
int x = (int)(q - d) + 1; //サーチした番号
std::cout << x << std::endl;
}

int f(const void *a, const void *b)
{
return *(const int *)a - *(const int *)b;
}
360デフォルトの名無しさん:2006/10/09(月) 19:47:23
レス番が飛んでる
361(^-^) ◆MONSOON/qo :2006/10/09(月) 19:55:22
>>359
10個や100個の連番で実験するとうまくいくのですが本番では失敗します
ちゃんとソートされているかどうかをプログラムで確認してみます
362デフォルトの名無しさん:2006/10/09(月) 19:56:57
>>361
んだね。std::qsortとかstd::sortの呼び出し方が間違っているのかもしれん。
363(^-^) ◆MONSOON/qo :2006/10/09(月) 21:04:01
>>362
原因解明しますた 358にヒントがありました
xがunsigned char型だったのを忘れてしまっていたようです
364デフォルトの名無しさん:2006/10/09(月) 21:39:36
そりゃ255までしか……って、何故そんなところにunsigned charなぞ使うw
365デフォルトの名無しさん:2006/10/09(月) 21:45:13
最初っからコンパイルできるソースを貼れってことだな。
366デフォルトの名無しさん:2006/10/09(月) 22:09:19
('A`)
367デフォルトの名無しさん:2006/10/09(月) 22:13:49
(´ω`)
368デフォルトの名無しさん:2006/10/09(月) 22:16:04
さすがにそこまでエスパーレスは出来なかったわ。
369デフォルトの名無しさん:2006/10/09(月) 22:27:54
誰か比較関数の整数オーバーフローについてつっこんでやれよ。
370デフォルトの名無しさん:2006/10/09(月) 22:31:21
>>369 なにそれ?わかんない。
371デフォルトの名無しさん:2006/10/09(月) 23:14:02
>>370
あの比較関数だと a と b が取り得る全範囲の数値の組み合わせの中で
約半数の組み合わせで比較関数が期待されるのとは逆の結果を返すだろ。
372デフォルトの名無しさん:2006/10/09(月) 23:16:19
ifもしくは?:演算子で分岐か。
373デフォルトの名無しさん:2006/10/09(月) 23:18:19
switch〜caseで行ってみよう〜
374デフォルトの名無しさん:2006/10/11(水) 20:54:23
C++ のソースコードのカバレージを測定するフリーのツールってありますぅ?
375デフォルトの名無しさん:2006/10/11(水) 23:59:34
スレ違い
376デフォルトの名無しさん:2006/10/12(木) 00:00:09
ソースコードのカバレッジってなんだろう?
テストのカバレッジならわかるんだが。
377デフォルトの名無しさん:2006/10/12(木) 00:27:27
>>376
PureCoverageみたいなやつのことでしょ?
378デフォルトの名無しさん:2006/10/12(木) 01:24:20
カバチャン
379デフォルトの名無しさん:2006/10/12(木) 03:18:30
誰がカバやねん!
380デフォルトの名無しさん:2006/10/12(木) 05:22:54
ファイル分割し、それぞれのソースである1つのクラスを使用したいのですが、
オブジェクトの生成を何処ですればいいのでしょうか?
381デフォルトの名無しさん:2006/10/12(木) 05:27:38
>>380 好きにしろ。
382デフォルトの名無しさん:2006/10/12(木) 06:00:23
データでかくないなら、起動時がオススメ
383380:2006/10/12(木) 06:25:00
>>381
>>382
レスサンクスです!質問の仕方が悪かったです、すいません。
AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
する場所は何処でするのか?という初心者丸出しの質問なんですが。
やはり共通のヘッダで宣言するといった形でよろしいのでしょうか?
384デフォルトの名無しさん:2006/10/12(木) 07:47:20
そうそう。共有ヘッダーで宣言しないと、とっても、みずらくなっちゃうから、共有ヘッダーで、ぜんぶ、宣言してね
385デフォルトの名無しさん:2006/10/12(木) 08:06:09
>384
こらこら
386デフォルトの名無しさん:2006/10/12(木) 09:31:24
どう考えても「連鎖」って訳はおかしいだろ……
387デフォルトの名無しさん:2006/10/12(木) 10:02:39
誤爆やん
388デフォルトの名無しさん:2006/10/12(木) 10:26:46
>383が>380に比べて質問のしかたがよくなったとは思えんのだが
てか,「生成する場所」を「ヘッダで宣言」て・・・?
389デフォルトの名無しさん:2006/10/12(木) 10:59:19
>>383
extern の使い道を考えてみるといいかもしれません
390389:2006/10/12(木) 11:18:04
>>386
誤爆に正式爆撃先がマジレス
http://pc8.2ch.net/test/read.cgi/tech/1143608073/

外国の単語にも複数の意味がついているのに
特定団体が利便性の為「だけ」で一つの日本の単語にあてはめる姿勢が駄目
だから単語の揚げ足取りばかりに終始して全く議論が進まない

Sequence という単語から複数本伸びている「枝(意味)」のうち私が選んだ一本を
私は日本の単語「連鎖」に当てました
しかし
連鎖という単語から複数本伸びている「枝(意味)」のうち貴方が選んだ一本が
Sequence という単語に当てられるかどうかまでは私には判りません

以降は上記スレで
スレ違い失礼致しました
391デフォルトの名無しさん:2006/10/12(木) 12:02:21
>>390
お前空気読めない類だな。
392390:2006/10/12(木) 12:13:07
>>391
毎日が妄想嫁とのラブラブハネムーンです><
393デフォルトの名無しさん:2006/10/12(木) 15:04:40
GAを使った卒論でFラン大でもできる題材ないですか?
394デフォルトの名無しさん:2006/10/12(木) 20:16:04
>>390
いいから原文のみを貼り、変な訳語は一切付けるな。以上。
395380:2006/10/12(木) 21:33:11
レスして下さった皆様、感謝です。
まだまだ、言葉足らずで申し訳ないです。
1つのオブジェクトを複数のファイルから参照出来るようにしたい、
この場合のオブジェクトの宣言は何処でどのようにしたらいいのか。
と、この様な書き方(言い方?)でいいんでしょうか?うまく伝わるか自信ないのですが。
>>389
externを使えば出来るのですね。有難う御座います。
以前、変数に対してexternを使用した時はすんなり出来たのですが、
記述の仕方が悪かったのか、クラスの場合は出来なかったのです。
もうちょっと頑張ってみます。
396デフォルトの名無しさん:2006/10/12(木) 22:13:30
要するに↓こういうことでっしゃろ?

>AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
>する場所は何処でするのか?
     ↓
AとBという二つのファイルでCというクラスのオブジェクトを使用する際、オブジェクトを生成
する場所は何処のファイルでするのか?
397デフォルトの名無しさん:2006/10/12(木) 22:23:08
>>395
もしかしてこーゆーことがしたかったんかな?

// C.h
class C {
public:
   static C& getInstance();
};

// C.cpp
C& C::getInstance() {
   static C instance;
   return instance;
}
398デフォルトの名無しさん:2006/10/12(木) 22:45:46
ストロー・ストラップマンセー
399デフォルトの名無しさん:2006/10/13(金) 02:00:55
お禿さま
400デフォルトの名無しさん:2006/10/13(金) 02:57:08
>>395
シングルトン?
401デフォルトの名無しさん:2006/10/13(金) 12:24:03
あ〜,>>380は「クラス」と「オブジェクト(→インスタンス)」の区別がついてないのかな?
402デフォルトの名無しさん:2006/10/13(金) 12:29:25
>>401 文脈からfile.objの事でないか?
403デフォルトの名無しさん:2006/10/13(金) 12:53:13
>>401
あらゆる意味で痛いです
404デフォルトの名無しさん:2006/10/13(金) 13:34:32
Exceptional C++ Style日本語版買ってきた。今から読む。
取り敢えずめぼしい書籍はこれ位しかなかった。
405デフォルトの名無しさん:2006/10/13(金) 13:35:22
>>380が意味不明な件は?
406デフォルトの名無しさん:2006/10/13(金) 13:42:37
Exceptional C++とか読むヤツ居るんだな・・・
変態的と評される程ムズいと聞いて以来、
手に取ったことすら無いw
407デフォルトの名無しさん:2006/10/13(金) 13:45:38
Exceptional C++ Styleってどんな内容?
Exceptional C++は読んでるんだが想像つかん
408デフォルトの名無しさん:2006/10/13(金) 13:59:49
そこまで難しいことも無い。
409デフォルトの名無しさん:2006/10/13(金) 14:13:29
>>407
Exceptional C++を読んでいるなら、Exceptional C++ Styleは軽い読み物
だと思う。無理に買う必要はない内容。
410380:2006/10/13(金) 16:48:50
皆様、レスありがとです。度々すいません。
>>396
そうですね。それ+どのようにっていうのがあると助かります。
>>397
これが>>400氏が仰っているシングルトンと言う物(?)なのでしょうか?
ちょっと調べた感じではこれで良いような気がしました。どもです。







411デフォルトの名無しさん:2006/10/13(金) 18:38:34
変態的なのは「Modern C++ Design」だよ。
あれはおもしろい。役に立つかどうかは不明。
412デフォルトの名無しさん:2006/10/13(金) 19:43:23
Modern C++ Desgin は今改めて読むとめちゃくちゃ分かりやすい入門書だと思う。
Boost みたいに変態的な手段を使わず、基礎を知るには非常にいい本。


413デフォルトの名無しさん:2006/10/13(金) 20:02:40
>>380
もしかして以下のようなこと?

//--- foo.h ---
class C {
....
};
extern C c; // どこかにあるグローバル変数cを参照するための宣言

//--- foo.c ---
C c; // グローバル変数cの実体を定義

//----aaa.c---
#include "foo.h"
void func_a()
{
c.meber_func1(100); // cにアクセス
}

//----bbb.c---
#include "foo.h"
void func_b()
{
c.meber_func2(); // cにアクセス
}

上の例はオブジェクトcをグローバル変数で定義しているから改めて生成はしていないけど、
グローバル変数としてCのポインタを定義、宣言するなら、オブジェクトの生成(c = new C)は
aaa.cでもbbb.cでもOK.
414デフォルトの名無しさん:2006/10/13(金) 20:44:21
シングルトンって結局グローバル変数なんじゃないの
カッコいいネーミングしてるが。
っと使ったこと無いが言ってみる
415デフォルトの名無しさん:2006/10/13(金) 20:48:45
シングルdはクラスとインスタンスが必ず1:1の関係になる設計じゃね?
っと使ったこと無いが言ってみる

しかしEffectiveC++ホントに面白いな
ここ数日必携の書になってる(*´ω`)
416デフォルトの名無しさん:2006/10/13(金) 20:54:44
必要があれば複数のインスタンスを生成することも可能なのがSingletonの利点の一つ。
417デフォルトの名無しさん:2006/10/13(金) 21:09:37
>>414
グローバル変数は生成されるタイミングを制御しにくい。

A a;
B b;

で、a のコンストラクタが b を使いたいときなど。
418デフォルトの名無しさん:2006/10/13(金) 21:24:07
Modern C++ DesignのSingletonはいくらなんでも
ライブラリ利用者疑いすぎじゃないかって思えてくるな。
419デフォルトの名無しさん:2006/10/13(金) 21:28:14
atexitに登録された関数から使われたらまずいかも、とか考えてたんだっけw
420デフォルトの名無しさん:2006/10/13(金) 22:45:19
なんか人が書いたソースを見てると、

::AfxBeginThread(略);

みたいな書き方で関数を使ってる部分があるんですが、「::」の意味がわかりません。
こういうのって左側にクラス名も書くものじゃないんですか?
421デフォルトの名無しさん:2006/10/13(金) 22:50:18
ああ、なにも書かないと一番外側
422デフォルトの名無しさん:2006/10/13(金) 22:50:21
namespaceに入っていないグローバルスコープな関数を呼んでる。
(でも多分実際はVSのインテリセンスを動かすため)
423デフォルトの名無しさん:2006/10/13(金) 23:00:02
いや、MFCがWin32APIと同名のメンバ関数作りまくるんで、APIのほうを明示的に呼ぶときには::つきで書く習慣がある。
424420:2006/10/13(金) 23:00:41
大体わかりました。「::」は書かなくてもいいけど、
書いた方が明示的になるし入力候補も出るから便利ってことですね。
425デフォルトの名無しさん:2006/10/14(土) 00:05:19
>>420
書かなきゃならん場合もある。てか、予めそーゆー事態も想定しての明示。
426デフォルトの名無しさん:2006/10/14(土) 00:06:06
>>424
違う。
427デフォルトの名無しさん:2006/10/14(土) 00:08:50
>>420 は namespace を理解できていない気がする。
428デフォルトの名無しさん:2006/10/14(土) 00:17:33
>424
名前解決のやり方が変わるので、明示的にグローバルな名前空間の
関数を呼びたいときはこうすべき。
429デフォルトの名無しさん:2006/10/15(日) 13:36:07
質問です。
仮想関数を持つクラスにはvtblなどの隠れたデータが挿入されますよね?
で、純粋仮想関数をもつクラスには挿入されないと思いますが、それを継承したクラスには必ず隠れデータが挿入されてしまいますか?
430デフォルトの名無しさん:2006/10/15(日) 13:42:02
>>429
純粋仮想関数を持つクラスにも vtable は要るよ。
431デフォルトの名無しさん:2006/10/15(日) 13:48:30
インスタンス化されないのにですか?
432デフォルトの名無しさん:2006/10/15(日) 13:56:02
>>431
継承されたクラスのインスタンスには基底クラスのインスタンスが含まれる。
433デフォルトの名無しさん:2006/10/15(日) 14:00:49
多重継承の仕組み教えて。
434デフォルトの名無しさん:2006/10/15(日) 14:03:43
なるほど。
では、純粋仮想関数と普通の関数のみを持つクラスにはvtableは挿入されないという解釈は正しいですか?
435デフォルトの名無しさん:2006/10/15(日) 14:26:29
>>434
普通の関数の有無に関係なく、(純粋でも、そうでなくても)仮想関数があればvtableは必要でしょ。
436デフォルトの名無しさん:2006/10/15(日) 14:28:56
つ C++STD 10.4
純粋仮想関数を特別扱いする規定は無さそうだから、普通の仮想関数と
同じように扱う必要があるんじゃね?
実際は(vtbl含めて)実装次第だと思うけど。

というか、何でそんなにこだわるのかわからん。
437デフォルトの名無しさん:2006/10/15(日) 14:33:03
実装系に依存するやろ。
vtableは仮想関数(広く言うとメンバ関数)の実装方法だから。

つか >>429 で「隠れた」って自分でいうとるやないか。

アホじゃね?
438デフォルトの名無しさん:2006/10/15(日) 14:55:27
えーと、派生させる予定のないクラスA,Bがありましてそれらの共通するインターフェースを純粋仮想関数をもつクラスIとしてくくりだそうと思ったのです。

このときA,BをそれぞれIから継承したとすると自動的にA,Bも仮想クラスになってしまうのかと思ったのです。

つまり本来必要ない無駄なオーバーヘッドが生じてしまうのではないのかと思いまして、質問した次第です。
439デフォルトの名無しさん:2006/10/15(日) 15:00:06
それならテンプレートでいいのでは?
440デフォルトの名無しさん:2006/10/15(日) 15:03:12
A, Bを実行時多相で扱いたいならvtblのコスト払うのは至極真っ当

A, Bに実行時多相が必要なく単に共通の実装を括り出したいだけなら
vtblのコストを払わずに実装を括り出す方法は他にたくさんある
441デフォルトの名無しさん:2006/10/15(日) 15:10:39
分かりました。違う方法を考えてみます。

テンプレートってのは派生クラスをテンプレート引数にして基底クラスに渡せってことでしょうか。んで基底クラスを派生クラスにキャストすると。なるほど。
442デフォルトの名無しさん:2006/10/15(日) 15:18:59
だから多態したいのは実行時なのかコンパイル前なのかと。
443デフォルトの名無しさん:2006/10/15(日) 15:20:28
>>441
キャストが必要になった時点で何かおかしいと気付くように。
444デフォルトの名無しさん:2006/10/15(日) 15:22:12
>>441
その方法だとインターフェースの継承には向かないと思うよ。
445デフォルトの名無しさん:2006/10/15(日) 15:24:55
thisを派生クラスのポインタ型にstaticキャストしてインターフェースクラスから派生クラスのメンバ関数を呼び出せばよいのではないでしょうか…boostの何かでこんな実装をしてた気がします。
446デフォルトの名無しさん:2006/10/15(日) 15:28:36
こんにちは。Visual Studio 2005 Visual C++ express editionを使っています

#include <iostream>
using namespace std;

int main()
{
int num;
int sum = 0;

cout << "いくつまでの合計を求めますか?\n";

cin >> num;

for(int i=1; i<=num; i++){
sum += i;
}

cout << "1から" << num << "までの合計値は" << sum << "です。\n";

return 0;
}

上記コードがビルドできないんですが何故でしょうか?
447デフォルトの名無しさん:2006/10/15(日) 15:32:27
>>445
それは、インターフェースじゃないでしょ。
見かけ上の基本クラスから派生クラスのメソッドを呼び出すだけなら
それでもいいよね。
448デフォルトの名無しさん:2006/10/15(日) 15:32:53
エラーメッセージを貼れとママに言われなかったかい?
449446:2006/10/15(日) 15:33:04
エラーメッセージは下記です。
Sample34.cp
error C3872: '0x3000': この文字を識別子で使用することはできません
error C2146: 構文エラー : ';' が、識別子 ' ' の前に必要です。
error C2065: ' ' : 定義されていない識別子です。

どなたか原因の分かる方がいればお願いいたします
450デフォルトの名無しさん:2006/10/15(日) 15:36:46
>>447
ああ、そっか。インターフェースっていうからまずかったのですね。すいません。
要は実行時のコストなしで共通する実装を括り出したいだけだったんです。煩わしい言い方してすいませんでした。

iterator_facadeでした今思い出しました。解決しました。
451デフォルトの名無しさん:2006/10/15(日) 15:39:27
全角空白が入っている。エラーメッセージにも書いてあるよ。

なれないうちはエラーメッセージが出たというだけで、
何か分からないことが起きているとすぐ諦めがちだが、
とりあえずメッセージをよく読む習慣をつけるべし。
そのうち分かるようになるよ。
452デフォルトの名無しさん:2006/10/15(日) 15:41:24
ここは本当に役に立たないインターネットですね
453デフォルトの名無しさん:2006/10/15(日) 15:43:59
ダメな奴にはどんな情報も役に立たないからな
454デフォルトの名無しさん:2006/10/15(日) 15:49:02
>450
ポリシークラス使え
protected 非仮想デストラクタにするのを忘れるなよ
455デフォルトの名無しさん:2006/10/15(日) 15:49:27
>>451
446
ありがとうございます!
何度見てもおかしな点がなかったので途方に暮れていたのですが、全角が入っていたとは・・・
エラーメッセージの読み方がまだわからないので、これから勉強したいと思います
ありがとうございました
456デフォルトの名無しさん:2006/10/15(日) 15:50:58
>452
馬を水飲み場まで連れて行くことはできるが水を飲ませることはできない
457デフォルトの名無しさん:2006/10/15(日) 15:59:31
>>454
共通する実装を派生クラスにして異なる実装をポリシーとして渡してそれを基底にするってことですか?

実はコンストラクタが異なるので派生クラスにしないといけないんですよ…う〜む。
458デフォルトの名無しさん:2006/10/15(日) 17:26:21
>>456
「ミネラルウォーターじゃなきゃヤダ!」とか言って
そっぽ向く馬もネットにはたくさん居るしな。
459デフォルトの名無しさん:2006/10/15(日) 17:38:53
template < class _Policy > class Interface
{
public:
  void F()
   {
   policy_.F();
   }

private:
  _Policy policy_;
};

class Policy
{
public:
  void F(){ /* impl */ };
};
こんなの?

>>454
protected 非仮想デストラクタにするのを忘れるなよ
ってのがよくわからんのだが。
460デフォルトの名無しさん:2006/10/15(日) 17:51:56
>459
Policy クラスを継承することを想定しているんでしょう
継承する場合,459のような例ではEBCOが効く可能性があるという利点があります
461デフォルトの名無しさん:2006/10/15(日) 18:22:28
template < class _Policy > class Interface :private _Policy
{
public:
  void F()
   {
   _Policy::F();
   }
};

class Policy
{
protected:
  ~Policy(){ /*ぷろてくてっどっと。*/ };
public:
  void F(){ /* impl */ };

};

継承すれば最適化されてPolicyクラスが0Byteになることがあるよってことね>>459
462デフォルトの名無しさん:2006/10/15(日) 18:27:37
EBCOなんか聞いたことないぜー
ググっても出ないし。
流れからするとEmptry byte class optimizationとかそんなの?
463デフォルトの名無しさん:2006/10/15(日) 18:29:38
_Policy はマズイな。
464デフォルトの名無しさん:2006/10/15(日) 18:30:12
>>462 Empty base class optimization
465デフォルトの名無しさん:2006/10/15(日) 18:34:41
>>464
トン
再びググってみる(・∀・)
466デフォルトの名無しさん:2006/10/15(日) 18:55:47
>>461 みたいな書き方どっかで見かけて
何で継承してるんだろうとか思ってたけど、そういうことだったのか…。

467デフォルトの名無しさん:2006/10/15(日) 18:59:16
どっかで見たことあるなーと思ったらEffectiveC++に書いてあるんね
身についてねえ('A`)
468デフォルトの名無しさん:2006/10/15(日) 19:11:18
>>465
empty base optimization, EBO ともいう。つーかEBOで覚えてた。
どっちの名前も使われてるっぽいね。
469デフォルトの名無しさん:2006/10/15(日) 19:32:53
strlenとかprintfとかはstd名前空間に入ってるのに
assertが入ってないのはなぜなんだぜ?
マクロとかそういうオチですか?
vc8だとstd::assertでエラーだった。
gcc3.2だと通ったけど。
470454:2006/10/15(日) 19:36:01
>457
>461のことですな。詳細はModern C++ Design参照。
カスタマイズポイントをユーザーに提供しないんだったら
単純に包含でもいいかもね?

ポリシークラスてそんなにマイナーだっけ?

>460
いや、「実行時のコストなしで共通する実装を括り出したいだけ」
つうてるから忠告しただけ。
何も言わなかったら非仮想publicデストラクタを使いそうだからね。
詳しくは C++ Coding Standards参照
471デフォルトの名無しさん:2006/10/15(日) 19:41:13
>>469 assert() はマクロ。 std::assert() は不正。
472デフォルトの名無しさん:2006/10/15(日) 22:53:29
ポリシークラスっていう「名前」がマイナーなんじゃね
MC++D前から同じようなのはいっぱいあった
473デフォルトの名無しさん:2006/10/15(日) 22:54:34
>>469

#include <cassert>
でstd名前空間にあった気がする
474デフォルトの名無しさん:2006/10/15(日) 22:54:45
名は体を表す って言うしな
475デフォルトの名無しさん:2006/10/15(日) 22:58:07
>>473
デマを流すな。確認してから書け。
476デフォルトの名無しさん:2006/10/15(日) 23:01:18
画像処理プログラムを組んでいます。
ビットマップを読み込む自作クラスに

class Bitmap
{
public :
bool readBmp( string str ) {}
bool writeBmp( string str ) {}
};

のような感じでファイルを読み込む関数を作っていますが、ファイルの読み込みエラーが起きたときに
上記のような感じでbool型のfalseを返すか、例外をthrowするかで悩んでいます。
どっちでもいいっちゃどっちでもいいんですが、どうしても気になって・・・。。。

bool型を返すと
Bitmap pic;
bool flag;
do {
flag = pic.readBmp( "xxx.bmp" );
}
while( !flag );

のような感じでファイルが読み込めるまで繰り返す、という処理をかけるのですが、
こういった記述は例外処理でも可能でしょうか?
※"xxx.bmp"は、他のプログラムでも使用していて、読み込みのタイミングによってはロックされているため
477デフォルトの名無しさん:2006/10/15(日) 23:04:00
>472 ヒドス
boostでも使われているのに
ttp://www.boost.org/more/generic_programming.html
478デフォルトの名無しさん:2006/10/15(日) 23:05:00
>>476
for(;;) try { pic.readBmp( "xxx.bmp" ); break; } catch (...) {}
479デフォルトの名無しさん:2006/10/15(日) 23:05:58
>>475
すみません、VC8の環境でですが、
cassertヘッダの内部では
assert.hをインクルードしてるだけでした。
よって、std名前空間には入りません
480デフォルトの名無しさん:2006/10/15(日) 23:06:01
>>476
「なんでビットマップにファイルが関係するの?」という些細な問題は端に追いやってしまったわけね
とりあえず俺なら例外を発生させる
わざわざ例外機構があるのに利用しないで条件分岐で対応するのは分が悪い
481476:2006/10/15(日) 23:06:46
>>478
ありがとうございます!
それでやってみます
482デフォルトの名無しさん:2006/10/15(日) 23:07:52
>>479
根本的に、 assert() はマクロだから名前空間に入れることができない。
>>471 で FA 。
483デフォルトの名無しさん:2006/10/15(日) 23:08:55
>>478
せめて必要な例外だけをcatchするようにしようよ……。
484478:2006/10/15(日) 23:11:07
>>483
俺に言うな。必要な例外は >>476 本人しか知らない。
485476:2006/10/15(日) 23:11:48
>>480
他にいい設計の仕方があれば助言をお願いします。
自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
486デフォルトの名無しさん:2006/10/15(日) 23:12:07
>>475
俺もstd::assertで使った記憶がある…
何でだろ…
487476:2006/10/15(日) 23:13:31
>>438,478
ケンカしないで;;
もちろん例外は必要なものだけ実装します
488デフォルトの名無しさん:2006/10/15(日) 23:14:01
>>485
readBmp() の中でループまわせ。
489476:2006/10/15(日) 23:14:25
あっ、↑の>>438>>483の間違いです。。。
490476:2006/10/15(日) 23:17:08
>>488
それだと、ファイルが読み込めなかったときの処理が
読み込むまでループ
に固定されてしまいます。

読み込めなかったときの処理もある程度制御したいので・・・

とりあえず例外を発生させる形で組んで見ます
491デフォルトの名無しさん:2006/10/15(日) 23:25:44
>>485
> 他にいい設計の仕方があれば助言をお願いします。
> 自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
そりゃ当然ファイルから読み込める機能がなきゃ不便に感じる。
でもそれをそのまま実現する必要は無いだろ?

今のBitmapクラスを説明すると次の様になる。
・Bitmap.readBmp(str)=ビットマップがファイル:strから読み込む
・Bitmap.writeBmp(str)=ビットマップがファイル:strに書き込む
本来ビットマップは「Bitmapped data」だけを専門にすればいいだけで、
こういった雑事はBitmapのCreatorさんが担うべき仕事だと俺は思うわけ
つまり
・Bitmap ('utility' , 'createBitmap' , str ) : 'utility'がファイル:strからBitmapを作る
・('utility' , 'writeBitmap' , Bitmap , str) : 'utility'がBitmapをファイル:strに書き込む
みたいな

まぁ、それほど酷使しないつもりならこのままでも悪くは無いかもね、という小さなこと。
492デフォルトの名無しさん:2006/10/15(日) 23:46:38
>>491
わざわざ複雑度を上げることも無い。 YAGNI ってやつだ。
493デフォルトの名無しさん:2006/10/16(月) 00:06:21
>>492
ぉぅぃぇ

まあ小さなことだし、ぶつかって機能分割するのもよしかと思ってる
494デフォルトの名無しさん:2006/10/16(月) 00:19:06
めんどいときこそテンプレートで表現してしまうけどな。

template<IT >
Bitmap::readBmp(IT first,IT last) {}

file_bitmap.readBmp(file::iterator i,file::iterator end);
stream_bitmap.readBmp(&str[0],&str[0] + sizeof(str));
495476:2006/10/16(月) 00:51:19
>>491-494
ありがとうございます。
まだC++使いこなしているわけではないので、とりあえずBitmap::readBmp()で実装してみて、
使いにくいようなら
>>491さんの助言を参考にしてみます
496デフォルトの名無しさん:2006/10/16(月) 03:15:56
char *x = new char[100];

// hogehoge

for (int i = 0; i < 100; ++i)
delete &x[i];

こんな感じに配列として確保したメモリを要素ごとに開放した場合、
正規の動作が保障されるのでしょうか?

サンプルコードを書いて試してみたところ、vc2005では特に問題なく
動いた(ように見える)のですが、やはりdouble deleteされているのでしょうか?
497デフォルトの名無しさん:2006/10/16(月) 03:20:16
未定義
newはdelete
new T[]はdelete[]
これ以外は鼻から悪魔
498デフォルトの名無しさん:2006/10/16(月) 03:32:38
掛かってる梯子の途中を無くしたらどうなるんだろうな?
499デフォルトの名無しさん:2006/10/16(月) 03:41:14
サードパーティーのヘッダーファイルと、
社内のヘッダー内でのtypedefを使った型定義が衝突して困ってます。

1.解決方法として社内ヘッダー側で、
サードパーティー側のヘッダーファイル内にdefineされているマクロシンボルを
チェックして定義を回避する。
しかし、相互チェックではないので、ヘッダーのインクルード順に気を使う必要がある。

2.社内用のヘッダーをnamespaceで囲い、
内部を参照する時はスコープ解決演算子を伴って使用する。
しかし、C用のソースで使用できない。

これぐらいしか対処法が思い浮かばないのですが、他に良い解決方法はないでしょうか?


500デフォルトの名無しさん:2006/10/16(月) 03:42:55
自社製の方を他の型にtypedefして元の型をundefする。
501499:2006/10/16(月) 13:56:58
>>500
C++にtypdefに対するundefや型が存在するかどうかチェックする機能ってありましたっけ?
502デフォルトの名無しさん:2006/10/16(月) 14:11:06
>>501
衝突したtypedefを消去すればいいじゃん。
503デフォルトの名無しさん:2006/10/16(月) 16:43:53
このスレ的にはCを捨てて名前空間使うのが一番では?
C使っていたところもみんなベターCに。

そんなことできるわけないだろうけどさ。
504デフォルトの名無しさん:2006/10/16(月) 18:12:19
質問です。

無名名前空間内で定義するクラスを前方宣言したいんですが、
どうすればいいのでしょうか?
無名名前空間外のクラスから friend 指定したいのですが、よくわかりません。
よろしくお願いします。

505デフォルトの名無しさん:2006/10/16(月) 18:43:32
>>504
無名名前空間内で前方宣言すればいいと思うよ。
506504:2006/10/16(月) 19:06:16
>>505
あー、実際にやっていただければ、一目瞭然なのですが

namespace {
  class Foo;
}
class Bar {
  int i;
  friend class Foo;
};
namespace {
  class Foo // NG. 上記のFoo とは別物
  {
    // ここで Bar::i は使えない。
  };
}

というわけで、アクセス違反が発生してしまいます。
507504:2006/10/16(月) 19:09:51
>>506
あれ、とおってしまった? なんで?
いや、私の勘違いだったようです。しつれいしました。
508デフォルトの名無しさん:2006/10/17(火) 07:36:59
クラス内のクラスのコンストラクタなんですが
class C1
{
private:
class CSub
{
public:
~CSub();
}
};
のC1::CSubのデストラクタCSub()をcppファイルに定義したいのですが
無理なんでしょうか
C1::CSub::C1::~CSub(){}としてもコンパイル不可のようで
509デフォルトの名無しさん:2006/10/17(火) 07:37:59
デストラクタ~CSub()の間違いでした
510デフォルトの名無しさん:2006/10/17(火) 07:38:17
C1::CSub::C1::~CSub
C1が2回でてるぞ。
511デフォルトの名無しさん:2006/10/17(火) 07:38:31
>>508
C1::CSub::~CSub(){}

エラーメッセージ嫁。
512デフォルトの名無しさん:2006/10/17(火) 07:48:58
>>510>>511
もちろんそれもやりましたが無理のようです。
やっぱり出来ないんでしょうか
513デフォルトの名無しさん:2006/10/17(火) 07:50:15
>>512
エラーメッセージ貼れ。
514512:2006/10/17(火) 07:53:27
凡ミスしてましたゴメンナサイ....w
515デフォルトの名無しさん:2006/10/17(火) 12:34:08
あるクラスXと、そのサブクラスが複数(A,B,C)あるとき、
サブクラスの中のどれか一つを生成するメソッドが欲しいんですが、
なにか美しい方法はないでしょうか?
516デフォルトの名無しさん:2006/10/17(火) 12:47:40
>>515
なんだか不思議な実装だけど、
サブクラスの位置にあるクラスをFactoryに見立ててみるといいかも
517デフォルトの名無しさん:2006/10/17(火) 22:33:48
>>515
美しくないと思っている方法を示してもらわないと、話にならん。
518デフォルトの名無しさん:2006/10/17(火) 23:42:29
http://ja.wikipedia.org/w/index.php?title=%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF&oldid=7590807
なんだかおそろしい記事が Wikipedia に挙がっていたので、
僭越ながら削除させてもらった。
519デフォルトの名無しさん:2006/10/18(水) 00:04:41
まぁまて、どうもC++色しかないようにみえるんだが・・・
520デフォルトの名無しさん:2006/10/18(水) 00:08:03
wikipedia:
どうせなら
> virtualにするとメモリリークにならない
っつーのも説明加えちゃえば?
これってC++の項目なんしょ?
521デフォルトの名無しさん:2006/10/18(水) 00:08:12
C++なら普通はスマートポインタでリソース管理するからほとんど問題ないな。
GCでは管理できないハンドルの類まで適切に処理できるし。
522デフォルトの名無しさん:2006/10/18(水) 00:11:21
>>518
> Bの領域分しか解放されない
ワロス
523デフォルトの名無しさん:2006/10/18(水) 00:14:15
C++の場合は、deleteし忘れの問題はメモリリークよりもむしろリソースリークの方だと思うんだ。

>520
Category:C++やCategory:C言語に入っていないあたり、
C/C++以外も対象になると意図されているのではないかと思う。
524デフォルトの名無しさん:2006/10/18(水) 00:14:45
それでもまだ C 言語と同等に扱われてるままだしw
525デフォルトの名無しさん:2006/10/18(水) 01:11:32
>>518
それかいた奴アホ過ぎw
526デフォルトの名無しさん:2006/10/18(水) 01:18:55
>>518
すげぇ、最新版と変更前の版がひとっつも成長してねぇww
527デフォルトの名無しさん:2006/10/18(水) 15:43:42
>>518
なお似たようなものにスマートポインタ(smart pointer)というものがあるが、これはライブラリとして提供されるガベージコレクションの一種である。
528デフォルトの名無しさん:2006/10/18(水) 17:00:10
ところでいっそム板にWikipediaスレを立てたらどうか?
結構あちこちの板でWikipediaスレを見かけるんだが。
529デフォルトの名無しさん:2006/10/18(水) 19:45:16
Javaのfinalのように、派生クラスを禁止させることはできませんか?
530デフォルトの名無しさん:2006/10/18(水) 19:59:48
言語仕様には無いが、そういう事をするテクニックはググれば見つかる。
531デフォルトの名無しさん:2006/10/18(水) 20:02:57
ググったらすぐに見つかった。
http://www.tietew.jp/cppll/archive/10658
http://www.tietew.jp/cppll/archive/10668
そこにも書いてあるが、C++ではデストラクタが非仮想なら、
それは派生するなということを意図すると捉えるのが一般的。
532デフォルトの名無しさん:2006/10/18(水) 20:21:02
すごい初歩的な質問で申し訳ないのだけど・・・

int x[600][400];

と宣言して取り敢えずプリント文だけ書いたら普通に通ったんだけど、

int x[600][400], y[600][400];

と、二つ二次配列を宣言したら落ちるようになってしまった。。何故・・・?
普段はmallocとかやってるから、これを改めてやったら出来ない&分からなくて・・・。orz
533デフォルトの名無しさん:2006/10/18(水) 20:25:36
お前は俺にエスパーになれと言うのか
534デフォルトの名無しさん:2006/10/18(水) 20:27:47
でかすぎるスタックはダメとかじゃなかったかしら?
535532:2006/10/18(水) 20:45:14
スマソ。一応全部載せると、
-----------start-----------------
void main(int argc, const char **argv)
{
 int x[600][400],y[600][400];
 printf("test");
}
------------end-----------------
です。

確かに試しに32とかにしてみたら、バグ吐きませんでした。。
以前もっとでかい値で出来たのは勘違いだったのかな。
かなりC++触ってなかったので、スタック不足とは初歩的なミスを。恐縮です。。
536デフォルトの名無しさん:2006/10/18(水) 20:54:44
>>534
エビステーメーうざぁ
537デフォルトの名無しさん:2006/10/18(水) 21:03:43
>>535
以前はオプションでスタックサイズ弄ってたんだろ
538デフォルトの名無しさん:2006/10/18(水) 21:19:56
デフォのスタックサイズなんてOSやコンパイラ(リンカ)次第。
539デフォルトの名無しさん:2006/10/19(木) 00:52:36
>531
> C++ではデストラクタが非仮想なら、それは派生するなということを意図する
それ古い。
多態を意図しない基本クラスはprotected非仮想デストラクタにするのが
最近の主流。C++ Coding StandardsかExceptional C++ Style読め。
540デフォルトの名無しさん:2006/10/19(木) 01:07:50
>>531
こう、多態とかがやりたいんじゃなく、
ちょっとメンバ関数を1つ増やしたい、とか言う簡単な派生もやっちゃいけないの?
そうなると、継承は多態のために存在することになっちゃうけど、どうも違う気がする。
541デフォルトの名無しさん:2006/10/19(木) 02:02:32
>539
そのクラスのインスタンスが作れなくなりますが
542デフォルトの名無しさん:2006/10/19(木) 02:08:50
>539
何で? 派生クラスは普通にインスタンス作れるよ。

基本クラスはインスタンス作らないほうがいいから、別にインスタンス
作れなくてもOK。
543デフォルトの名無しさん:2006/10/19(木) 02:28:43
>>542
> 基本クラスはインスタンス作らないほうがいい
この前提はどこから出てきたの?
544デフォルトの名無しさん:2006/10/19(木) 02:33:13
派生禁止から派生強制に話がずれとりますがな
545デフォルトの名無しさん:2006/10/19(木) 02:49:35
>544
ごめん。 >539でずらしてた。
派生禁止ならクラス内クラスが簡単で良いと思う。
546デフォルトの名無しさん:2006/10/19(木) 03:18:41
派生禁止云々は抜きにしても、クラス内クラスは便利だよなあ。
ストール万のデコにキスしてやりたい。
547デフォルトの名無しさん:2006/10/19(木) 03:19:28
ストール万?
すまん、ストラップのファッキンハゲと間違えた。
548デフォルトの名無しさん:2006/10/19(木) 03:22:20
549デフォルトの名無しさん:2006/10/19(木) 03:52:41
>>540
「publicな実装継承は悪か?」といわれれば、yesだ。
Liskovの置換原則を満たさないクラスはバグの温床になる。
基底クラスが通常の具体クラスの場合は特に。
面倒でも、private継承して必要なメンバ関数をusingでpublicに昇格させるか、
実装クラスのオブジェクトをデータメンバにして転送関数を書くかするべき。

public継承はおよそ多態のためのものだが、他の継承はそうではない。

多態でないpublic継承の例としては、ポリシークラスが有名。
元来想定されていた使い方ではないが非常に優れたhackではある。
ほかには、STLの反復子タグとかかな。

これらを踏まえて、自分の手の届く範囲内で逸脱すればいいんでは。
もっとも、適当な期間メンテするコードなら、
筋のよいコードを書いた方が結局楽だとは思う。
間違ったコードを書いてもコンパイラにスルーされるなんて面倒だ。
550デフォルトの名無しさん:2006/10/19(木) 04:10:27
C++みたいな汚れ言語にそんな完全性求めるだけ無駄無駄。
ぶっちゃけ実務上の生産性に寄与しない概念なんかシカトでぷーですよ。
そんなネタは言語屋だけでもっと清廉潔白な言語でもってやっとくれ。
551(^-^) ◆MONSOON/qo :2006/10/19(木) 04:44:18
おまいら〜
C++の機能を勉強しない方がいいとおもうよ
なぜならたくさんあって複雑だからだ
コンパイラも大変で間違えるかもしれないからだ
簡単な、よく知られている文で書けるならそっちの方が効率がいいとおもうよ
552デフォルトの名無しさん:2006/10/19(木) 05:57:37
C++ - アカデミズム + 金 = Java
553デフォルトの名無しさん:2006/10/19(木) 10:18:04
>>551
そうやって自分の無知を棚に上げて他人のコードを難解だとほざく馬鹿がいると面倒なんだよね。
554デフォルトの名無しさん:2006/10/19(木) 10:45:44
>>553
同感。
上で話してるような最低限のレベルまで知らないアホが多すぎ
今どきはC#とかjavaが始めての言語って奴がいっぱい入ってきて大変
555デフォルトの名無しさん:2006/10/19(木) 11:54:35
>>549
>>540
>「publicな実装継承は悪か?」といわれれば、yesだ。
>Liskovの置換原則を満たさないクラスはバグの温床になる。

540のは明らかにLiskovの置換原則をを満たしていると思うが。
556デフォルトの名無しさん:2006/10/19(木) 12:27:15
nonderivable、boostのヘッダ検索してもなかった(1.35)
sand-bosにもないんだな
557デフォルトの名無しさん:2006/10/19(木) 12:47:16
>>556
規格上、これができないらしい

template < typename T>
class Foo
{
  friend T ;
} ;

自分には、できない理由が分からないわけだけど。
事実、多くのコンパイラで、この規格を無視しているし。
C++0xでは、規格でも、できるようになるとか聞いた気がする。
558デフォルトの名無しさん:2006/10/19(木) 17:21:02


クラスにすればそのメモリーにアクセスできなくなると聞いたんだが、
チートツールはアクセスしてるんじゃね?

559デフォルトの名無しさん:2006/10/19(木) 17:31:53
ok。みんなスルーで行こう
560デフォルトの名無しさん:2006/10/19(木) 19:56:54
>>557 それ 556 に関係あるの?
561デフォルトの名無しさん:2006/10/19(木) 20:52:13
>>557
つうかできたらカプセル化も糞もなくならね?
562デフォルトの名無しさん:2006/10/19(木) 22:05:06
>549
普通private継承じゃなくて包含(合成)じゃ……
さったーもお勧めしてるよ
563デフォルトの名無しさん:2006/10/19(木) 22:10:59
>>562
private 継承と包含は意味も効果も違うんだから、都合に応じて使い分けるだけだ。
「普通」とかいういい加減な基準は要らない。
564デフォルトの名無しさん:2006/10/19(木) 22:12:36
>>561
Foo が T のメンバにアクセスできるようになるのならそう思うが、
このコードの意図は逆なのでそうは思わない。
565デフォルトの名無しさん:2006/10/19(木) 23:37:13
オーバーロードする時の引数の順番ってどうしてる?
class A,B;
void f(A,B);
//void f(B,A); //これでも同じことはできる
引数がもっと増えると組み合わせ数が爆発するが
良い指針ってあるだろうか
とりあえずデフォルト引数ありの引数は後ろに設定すべきだと思う
566デフォルトの名無しさん:2006/10/19(木) 23:53:39
ん、漏れはオーバーロードしないときと一緒にしてるけど。
567デフォルトの名無しさん:2006/10/20(金) 00:46:37
一時コピーが発生するケースってどんな場合ですか?
どんな書き方だと発生しないの?ルールありますか?
568デフォルトの名無しさん:2006/10/20(金) 00:52:21
>>567
発生するケースはいろいろ。
発生するケースに応じて発生しない書き方は変わる。
ルールは規格として決められている。
ただしコンパイラの実装によって省略しても良いとされている箇所もある。
569デフォルトの名無しさん:2006/10/20(金) 00:59:18
>>568
難しいですねー
まじでどんな書き方するとコピコンと一時オブジェクトできないか見極めるの難しいよ

vector<string>::iteratorとかもコピコン走るの?

570デフォルトの名無しさん:2006/10/20(金) 01:05:10
>>569
いや、別に。普段気にしなくていいし。
vector<string>::iterator がクラスで実装されていれば、
もちろん iterator のコピーコンストラクタが使用される。

何を気にしてるのか、さっぱり伝わってこない。
571デフォルトの名無しさん:2006/10/20(金) 01:16:08
コピコンとか嫌なんですよ
全部ポイントでやり取りしたいのに
勝手にコピーとかされると困るC言語だとそんなことないのに
C++って変ですげー困ってる
572デフォルトの名無しさん:2006/10/20(金) 01:24:33
??
素直にポインタ使えば?
リソース管理が面倒かもしれんけど。
573デフォルトの名無しさん:2006/10/20(金) 01:24:50
Cでも

struct A {
 // なんちゃらかんちゃら
} a, b;

a=b;

コピーされるぞ?
574デフォルトの名無しさん:2006/10/20(金) 01:29:29
>>571
C と同じコーディングをしてればコピーが増えることはない。
C++ 流にコーディングするならコピーコンストラクタの動作は
意識しなければならない。しっかりした知識が身に付けば、
コピーコンストラクタの動作するタイミングにはちゃんと
根拠があることがわかる。そんなに不条理なタイミングで動作はしない。

なんだか自分の知らないことを信用できないだけに見えなくもない。
「すげー困ってる」具体例を説明できる?
575デフォルトの名無しさん:2006/10/20(金) 01:31:44
>>571
コピーコンストラクタのオーバーヘッドを気にしてるのか?
コピーコンストラクタを正しく実装できないから呼ばれると都合悪いのか?

とりあえず、コピコンとかいう俺様用語を使うのをやめてくれ。
576デフォルトの名無しさん:2006/10/20(金) 01:53:19
コピーされて困るなら、そこはポインタを使うしかないじゃん。
そこんとこは C と C++ では何も変わらない。

>勝手にコピーとかされると困るC言語だとそんなことないのに
>C++って変ですげー困ってる

同じコードで C だとコピーされないのに C++ だとコピーされる
なんてあり得ない。
577デフォルトの名無しさん:2006/10/20(金) 02:03:11
>コピコンとか嫌

OK、喪前はC++に向いてない。
縁が無かったと思って次の道に進め。
578デフォルトの名無しさん:2006/10/20(金) 02:03:17
そもそもコピーコンストラクタが自動で生成されるのは
構造体の代入が可能なCとの互換性のため
ポインタでも参照でもお好きなほうをどうぞ
579デフォルトの名無しさん:2006/10/20(金) 02:33:44
>>574
>「すげー困ってる」具体例を説明できる?
よく考えもせずに勢いで書き込んだら激しく突っ込まれてすげー困ってる>571
580デフォルトの名無しさん:2006/10/20(金) 07:56:30
ちっ、
--
>「すげー困ってる」具体例を説明できる?
激しく突っ込まれてすげー困ってる。
--
って書こうと思ったのに……
581デフォルトの名無しさん:2006/10/20(金) 09:55:40
最初にそれが来てたらもっと寒かったから
出遅れて正解。
582デフォルトの名無しさん:2006/10/20(金) 11:47:08
まぁ氏ねってこった
583デフォルトの名無しさん:2006/10/20(金) 12:31:11
「良く分からない(実は理解できない)が、それは無駄なんじゃないか? 最悪だな」病
584デフォルトの名無しさん:2006/10/20(金) 13:12:20
「ポイント」の時点で釣りだと思った
次に行こうぜ
585デフォルトの名無しさん:2006/10/20(金) 16:22:02
質問があります。
Javaの静的初期化子(static { ... })に相当するC++の書きかたってありますか?
586デフォルトの名無しさん:2006/10/20(金) 18:43:49
質問です。
C++で
A *objectA = new A();
.....
delete objectA;

として、Visual C++2005でデバッグしていたのですが、
delete objectAした後でもクイックウォッチでみてみるとobjectAが解放されていないっぽいのです。
それどころかdeleteした後もobjectA内の関数が呼べてしまいます。ふつうは呼ぼうとした時点でエラーが起こる物ではないでしょうか。
呼べてしまったobjectA内の関数の中の途中の処理で結局は落ちてしまうのですが、ふつう呼ぶ段階で落ちるはずのような気が。

delete objectA;
したあとは
objectA = NULL;
587デフォルトの名無しさん:2006/10/20(金) 18:45:24
すみません。書いている途中で書き込んでしまいました。
delete objectA;
したあとは
objectA = NULL;
した方がいいのでしょうか。
また、
delete objectA;
した後でまたdelete objectA;してしまうとどうなるのでしょうか。
また、
objectA = NULL;
の後で
delete objectA;
するとどうなるのでしょうか。すみません、基本がわかってませんね・・・
588デフォルトの名無しさん:2006/10/20(金) 18:51:55
やってみなはれ
589デフォルトの名無しさん :2006/10/20(金) 18:55:12
>>586
マネージコードか? それともアンマネージコードか?
590デフォルトの名無しさん:2006/10/20(金) 19:01:27
>>586
開放されていないんじゃなくて、開放した後にわざわざ
メンバの値を吹っ飛ばす必要がないだけ。
delete後も非仮想メンバ関数が呼べるのは、多くの処理系で
非仮想メンバ関数の呼び出しが第一引数の前に
オブジェクトのポインタを渡すように実装しているから。
591デフォルトの名無しさん:2006/10/20(金) 20:18:05
deleteしたオブジェクトを操作することや2重deleteは鼻から悪魔。
念の為言っとこう。
592デフォルトの名無しさん:2006/10/20(金) 20:26:12
delete NULL;は合法、って誰も言わないの?
593デフォルトの名無しさん:2006/10/20(金) 20:52:20
>>592
ッッガ
594デフォルトの名無しさん:2006/10/20(金) 21:36:44
>>586
>ふつう呼ぶ段階で落ちるはずのような気が。

C / C++ では、解放済みのメモリを利用するのはエラーではなく、
何が書かれているか、誰が使っている場所を上書きするか、
その結果プログラムがどういう動作をするか完全に未保障なだけ。
595デフォルトの名無しさん:2006/10/20(金) 22:33:24
http://blog.livedoor.jp/uegaharatarou/archives/cat_50010787.html
>VC++ は生産性が低いうえ、使用環境が WindowsOS に、ほぼ限定されてしまいます。さらに「安全性」が常に問題となります。(.NETなしの話)
>アマチュアが作った C++ アプリなど、とても自マシンで実行する気になれません。企業ブランド等の「箔付け」が必要でしょう。
C++ってそんなに危険なんですか?
596デフォルトの名無しさん:2006/10/20(金) 22:38:42
>>595
.Net でも Java でも C++ と同じくらい危険なことはできるでそ。
アプレットとか ClickOnce とかと混同してるんじゃない?
597デフォルトの名無しさん:2006/10/20(金) 22:41:03
>>595

書いたヤシは精密なデバッグをやるC++ユーザーを知らんのだろう。
もう一つはスケジュールの管理が重視される企業の製品の実態を知らんのだろう。

時間を湯水のごとく使ってリークを潰していくアマチュアの手法を企業では取れない。
598デフォルトの名無しさん:2006/10/20(金) 22:42:16
むしろ、>>595 のリンク先の奴が作った Javaアプリの方が危険っぽい。
599デフォルトの名無しさん:2006/10/20(金) 23:01:51
というかVC++とC++をうまくすり替えながら話を進めるなと。C++ の UI 面なんて存在しない。
しかも企業ブランド云々とオープンソース云々が脈絡もなく続けて出てくる。わけわからん。
600デフォルトの名無しさん:2006/10/20(金) 23:08:07
>>599
たぶん、WEB見てる時の「Java アプレットは安全である」
「誰が作ったかわからんActiveXコントロールは怖くて実行できん」
という事実を使って、強引に Java >>> C++ と主張したかったんじゃ
ないだろうか。

「街中で包丁振り回してる人がいたら怖いでそ?」
「だから食事は缶詰が一番」
という理屈。
601デフォルトの名無しさん:2006/10/20(金) 23:08:23
ネタなんだけど。
スルーじゃないのか?
602デフォルトの名無しさん:2006/10/20(金) 23:12:13
スルーカが足りないんだよ。スルー力が。
603デフォルトの名無しさん:2006/10/20(金) 23:15:32
> C++ だけでオープンソースコミュニティが今のように大きく育つ可能性は、なかったわけです。
これもどうだろう?
LinuxやGCCはJavaで作られているわけではないし(C++でもなくCだけどさ)。

あと、コメントを受け付けていないあたりがチキンだな。
604デフォルトの名無しさん:2006/10/20(金) 23:17:20
今はC++もCも基本OSも全部JAVAのVMの上で動作しています。
それぐらいJAVAはすばらしい技術です
605デフォルトの名無しさん:2006/10/20(金) 23:32:13
そんなに素晴しい技術なら、なぜ未だにC++を使う人がいるのでしょう。
なぜC#のように新しい言語が出るのでしょう。

Javaの良さを理解できないからでしょうか?違います。
C++にはC++の、C#にはC#の良さがあるからです。

(C#を出したのは例えで深い意味は無い)
606デフォルトの名無しさん:2006/10/20(金) 23:45:34
そう、C++もまた素晴らしい存在なのです。
ってじっちゃが言ってた!!
607デフォルトの名無しさん:2006/10/21(土) 00:07:18
事の発端は誰しもが普通の人であることだ。
普通の人はjavaなりc#に流れる。
でも、時に変人はc++のテンプレートに魅了されてしまって抜け出せない。
何とか抜け出そうとdを始めるが中途半端なできばえに腹が立つ。そして、c++から抜け出せないまま。
608デフォルトの名無しさん:2006/10/21(土) 00:11:58
C#って、C++を含んでいるんだと思っていたが違うん?
609デフォルトの名無しさん:2006/10/21(土) 00:18:08
>>608
ぜんぜん違う
610デフォルトの名無しさん :2006/10/21(土) 00:22:28
なんか、急にレベル低い板になっちまったな・・。
611デフォルトの名無しさん:2006/10/21(土) 01:01:52
ならば旅立つが良い。

つーかゲームだとまだC++以外にほとんど選択の余地無いんすけど。
業務でC#とか使いたいッす。
612デフォルトの名無しさん:2006/10/21(土) 01:35:35
Java並に安全かつC++並に柔軟な言語が出ればいいんだけどな。
現状のJavaは初心者向けのデチューン済み言語としか思えない
613デフォルトの名無しさん:2006/10/21(土) 01:53:44
>初心者向けのデチューン済み言語

それが大事だよ。
C++はその気になれば人を殺せる言語だからなー。
614デフォルトの名無しさん :2006/10/21(土) 01:59:11
Javaは教育用言語だと思ってたけど、違うの??
因みに、C#はJavaに毛の生えた教育用言語だと思ってるが。。。
615デフォルトの名無しさん:2006/10/21(土) 02:16:00
それで教育されて実務で何使うんだ。
C++か?


えー?
616デフォルトの名無しさん:2006/10/21(土) 02:35:37
そこでPythonですよ
617デフォルトの名無しさん:2006/10/21(土) 02:41:42
アナフォリックマクロってすげーエロいの?
618デフォルトの名無しさん:2006/10/21(土) 02:48:25
アフォナクリマックロならあるいは
619デフォルトの名無しさん :2006/10/21(土) 02:49:00
まあ何というか、音楽界に譬えるなら

C=J.S.Bach/C++=Beethoven/Java=小○哲哉/C#=つ○く

といったところか。
620デフォルトの名無しさん:2006/10/21(土) 03:35:12
>>614
C# は違うだろ。生のポインタも自由に使えるし。
621デフォルトの名無しさん:2006/10/21(土) 03:45:14
>>614
Javaが教育用言語だと?あの豊富なライブラリをわざわざ学習用に用意
すると思うのか馬鹿。
622デフォルトの名無しさん:2006/10/21(土) 03:48:01
あ、ちごた
×Javaが教育言語だと?
○C#が教育言語だと?
623デフォルトの名無しさん:2006/10/21(土) 08:25:23
C++はウィザードリィみたく、深く潜れば深く潜るほどいろんなもの(知識・技術)を求めたくなる
まあ趣味での話だけどな
624デフォルトの名無しさん:2006/10/21(土) 09:28:50
ポインタ演算以外に、C++のどこが危険なんだ?
625デフォルトの名無しさん:2006/10/21(土) 09:49:17
>>624
Cでも一緒だがメモリの管理だな、これがちゃんとできる奴以外にコード書いて欲しくない。
626デフォルトの名無しさん:2006/10/21(土) 09:54:15
>>625
その伝で行くと、世のプログラマを名乗っている香具師らの大抵は失職の憂き目に遭うな。
627デフォルトの名無しさん:2006/10/21(土) 10:21:16
>>626
大変ありがたい事だ。
628デフォルトの名無しさん:2006/10/21(土) 11:57:45
C++特有の危険性はないのかな?
629デフォルトの名無しさん:2006/10/21(土) 13:54:18
CからC++まで連続しているので、プログラマが何を習得しているかが一概に言えない点。
とか。
630デフォルトの名無しさん:2006/10/21(土) 14:15:46
スケジュールキツキツでやってる企業のプログラムではC++は非常に危険だ。
リークが起きてても納期が来たら収めないといけないから。
631デフォルトの名無しさん:2006/10/21(土) 14:17:26
char *
632デフォルトの名無しさん:2006/10/21(土) 14:18:32
すみません。char *しか引数として受け付けない関数に
wchar_t *の文字列を渡すとどうなるんでしょうか。
うまくいかない場合は、どうやって変換すればよいのでしょうか。
633デフォルトの名無しさん:2006/10/21(土) 14:40:57
>>632
コンパイルエラー起きるだけだろ
.c_str()してchar*で渡せよ}{age
634デフォルトの名無しさん:2006/10/21(土) 14:53:58
>>633
ここまで大阿呆な回答も珍しいな。

wcstombs()あるいは類似するものを使ってワイド文字列からマルチバイト文字列に変換して食わせるのが常道。
635デフォルトの名無しさん:2006/10/21(土) 15:11:46
単にバイトストリームとして食わせてるだけかもしれないぞ
636デフォルトの名無しさん:2006/10/21(土) 15:43:12
C++でUTF8の文字列ってどうやって扱うの?
libxmlがさへんなxmlCharとかいうので扱ってるんだけど
これってC++のクラス作って変換したいんだけどどうやって
やるの?
サンプルあった教えてください
637デフォルトの名無しさん:2006/10/21(土) 16:55:14
C++のロケールとIO関係って
なんであんなに命名規則が絶望的にわかり辛くて使いにくいの?
638デフォルトの名無しさん:2006/10/21(土) 16:57:54
>>634
ありがとうございます。うまくいきました。
しかし調べてみたらwchar_tって国際化対応には心許ないみたいですね。
それ以外に関しても、C++標準ライブラリのみで十分な国際化を目指すのは無理があるんでしょうか。
639デフォルトの名無しさん:2006/10/21(土) 17:43:25
>>637
設計されたのが10年近く前だからだと思う。
640デフォルトの名無しさん:2006/10/21(土) 17:45:16
>>638
「十分な」って具体的にどういうこと?
641デフォルトの名無しさん:2006/10/21(土) 17:48:16
そもそもC++の標準ライブラリのlocaleで何が出来るのか把握してる奴も珍しい気がするが。
642デフォルトの名無しさん:2006/10/21(土) 18:31:40
国際化という言葉だけでは指している範囲が広すぎるので
具体的に国際化のどの側面が必要なのか書かないと
あまり有用な回答ができそうにない
プログラム内部で扱う文字コードが UTF-8 なのか UTF-16 なのかによっても
国際化の各々の側面についてできるできないの答えが異なるし
643デフォルトの名無しさん:2006/10/21(土) 18:32:54
規格書が高すぎてlocaleの内容が把握できません><
644デフォルトの名無しさん:2006/10/21(土) 18:43:23
645デフォルトの名無しさん:2006/10/21(土) 18:47:57
>>644
失礼シマスタ
646デフォルトの名無しさん:2006/10/21(土) 22:59:00
下記のプログラムでエラーが出ます。本の通りに打ってみたんですけど、エラー表示されます。
エラー内容ですが、二項演算子 '==' : 型 'class D<class A>' の右オペランドを扱う演算子は定義されていません
どこがダメなのか、教えていただけないでしょうか?
お願いします。
#include <iostream>
using namespace std;
class A{public: virtual void f(){cout << "B::f()" << endl;}};
template<class T> class D{
T* pt;
public:
D(T *t = 0) : pt(t){}
T* operator->() const{return pt;}
T& operator*() const {return *pt;}
template<class Y>bool operator==(const Y *py) const{cout << "---非friend関数---" << endl;return py == pt;}
template<class Y>inline friend bool operator==(const Y *py, const D &pd){cout << "---friend関数---" << endl;return py == pd.pt;}
};
void main(){
A *pa = new A();
D<A> sp1 = pa;
sp1->f();(*sp1).f();*sp1 = *pa;
if(sp1 == pa)cout << "sp1 == pa" << endl;
ココif(pa == sp1)cout << "pa == sp1" << endl;
}

647デフォルトの名無しさん:2006/10/21(土) 23:03:58
>>646
gcc3.4.2(MinGW)では通ったが?
648デフォルトの名無しさん:2006/10/21(土) 23:14:09
>>646
VC++2005EE でも問題なくコンパイル、実行できた。
649デフォルトの名無しさん:2006/10/21(土) 23:14:36
>>647
すみません。初心者なもんで、わかりません。
ソフトはMicrosoft Visual C++ 6.0を使ってます。
650デフォルトの名無しさん:2006/10/21(土) 23:18:07
>>646
VC6 はメンバ関数テンプレートが使えないんじゃなかったかね?
651デフォルトの名無しさん:2006/10/21(土) 23:21:20
>>650
そうなんですか?
確かに、VC6を使うとは本には書いてませんでしたw
無理なんでしょうか?
652デフォルトの名無しさん:2006/10/21(土) 23:49:03
なんで未だにVC6使う初心者がいるんかね?
653デフォルトの名無しさん:2006/10/21(土) 23:53:58
無料のExpressEditionあるしな

ところで>>650はマジ? 
煽りとかじゃなくて使ったことないから信じらんない
654デフォルトの名無しさん:2006/10/21(土) 23:57:22
テンプレート周りが弱いのは確か。
つーかそもそも標準に準拠してないし。
655デフォルトの名無しさん:2006/10/22(日) 00:05:17
>>652
え? VC6ってダメなんですか?
今なら何を使ったらいいんでしょうか?
656デフォルトの名無しさん:2006/10/22(日) 00:11:47
スイマセンおしえてもらっていいですか?
プログラミングしたくてBorland C++ Compiler 5.5をダウンロードして
解凍したんですが、そこからどうすれば使えるのか分かりません。
OSはwindowsXPです。
657デフォルトの名無しさん:2006/10/22(日) 00:18:14
VC6も駄目だが、BCCはもっと駄目だ。
658デフォルトの名無しさん:2006/10/22(日) 00:18:35
>>656
bcc32.cfg と ilink32.cfg でググれカス。
659デフォルトの名無しさん:2006/10/22(日) 00:19:56
>>655
商用利用もおkなんだから ExpressEdition を使え。
660デフォルトの名無しさん:2006/10/22(日) 00:20:38
>>656
高校数学の本を買ったのですが
足し算ができないので理解できません
どうしたらいいのでしょうか

って言ってるようなもんだ
プログラムはそんなに簡単なもんじゃないよ
661デフォルトの名無しさん:2006/10/22(日) 00:24:51
古いVCはコンパイラはともかくIDEは全然まともだから
現状に満足してれば無理して乗り換えなくてもいいと思うんだが。

古いBCBは
662デフォルトの名無しさん:2006/10/22(日) 00:28:58
>>661
そういえば VC6 にはあったIDE内蔵のプロファイラがその後のバージョンではなくなってるって
聞いたことがあるんだけど、いまだにプロファイラはなくなったままなん?
663デフォルトの名無しさん:2006/10/22(日) 00:30:53
>コンパイラはともかく
それは致命的だと思うけど。

コンパイラを入れ替えるつう手もあるけど、それよりも
VC++2005 EE使う方が簡単だよね。
664デフォルトの名無しさん:2006/10/22(日) 00:34:29
でも重いからなぁ
665デフォルトの名無しさん:2006/10/22(日) 00:40:07
じゃあDMCでもつっこむ?
666デフォルトの名無しさん:2006/10/22(日) 00:43:13
デロリアンつっこんでどうするんだ?
667デフォルトの名無しさん:2006/10/22(日) 00:43:28
Intel C/C++ Compilerを(ry
668デフォルトの名無しさん:2006/10/22(日) 00:53:16
ICはコンパイルなげえええええええええええ
669デフォルトの名無しさん:2006/10/22(日) 00:57:45
gcc で最適化オプション満載 = Intel C/C++ Compiler

という話をどこかで聞いたことが在るが、ガセだろうな
670デフォルトの名無しさん:2006/10/22(日) 01:30:53
そりゃガセさ。
正直現状のGCCの性能ではVCやICCには到底勝てない。
GCCが極端に劣ってるわけじゃないし、テンプレート周辺ではむしろ勝ってたりもするのだけど、
トータルではやはり金出して買う環境には…
671デフォルトの名無しさん:2006/10/22(日) 01:36:28
うーむ7時間ぐらいいろいろ調べてみたが、
やっぱりUTF扱うにはiconvしかないのかな?
自作したいけどなんかいい資料ないですか?
672デフォルトの名無しさん:2006/10/22(日) 01:37:49
自作するのがいいと思うよ。
UNICODEコンソーシアムからコード表引っ張ってきて、片っ端からstd::mapに突っ込んでしまえ。
673デフォルトの名無しさん:2006/10/22(日) 01:41:22
>>670
>>669の=は代入演算子と考えるんだ。
つまりgccは最適化オプション満載だと判定されると
HDを走査してiccを探し出し、リダイレクトすr(ry
674デフォルトの名無しさん:2006/10/22(日) 02:12:20
675デフォルトの名無しさん:2006/10/22(日) 02:12:26
>>671
こんなのものある。
http://tricklib.com/cxx/ex/babel/

自作するんなら >>672
Windows環境限定でいいならWindows API の MulitByteToWideChar(CP_UTF8,...) とか Mlang
676デフォルトの名無しさん:2006/10/22(日) 02:20:48
>>603
> (C++でもなくCだけどさ)
だからだろ。
677デフォルトの名無しさん:2006/10/22(日) 11:08:11
iccのデフォルトはicc -O2だからね。しかもiccの-O2はgccの-O3相当だし。
678デフォルトの名無しさん:2006/10/22(日) 13:41:45
VC++.NetでVC6のようにネイティブコード吐けるの?
679デフォルトの名無しさん:2006/10/22(日) 13:43:32
リアルにネイティブコードを吐くコンパイラ
680デフォルトの名無しさん:2006/10/22(日) 14:03:52
>>678
.NET Frameworkを使わずに作れば良い。
681デフォルトの名無しさん:2006/10/22(日) 14:06:33
分からなければアンマネージドコード使え。
682デフォルトの名無しさん:2006/10/22(日) 14:09:14
>>680
どういうこと?
683デフォルトの名無しさん:2006/10/22(日) 14:27:24
アンマネージドなプロジェクトで作れってことだろ。
684デフォルトの名無しさん:2006/10/22(日) 15:15:31
アンマネージドはCLI(.Net)じゃなかったか?
685デフォルトの名無しさん:2006/10/22(日) 15:26:59
CLIはマネージドだろ
686デフォルトの名無しさん:2006/10/22(日) 15:36:40
class A{
void func1();
void func2();
}
というようなクラスがあったとしてこのfunc1とfunc2という関数をインライン・アウトラインをうまく分ける方法ありませんでしょうか?
ヘッダに上の記述があって.cppに関数本体があるとしたらそれを.inlとかの拡張子にファイルに丸々コピーして先頭にinlineつけて
マクロでUSE_INLINEとかで.inlファイルをヘッダで読み込むか判断して関数全部入れ替えるのは簡単ですが部分的にうまいこと分ける方法
ありませんか?
687デフォルトの名無しさん:2006/10/22(日) 15:46:31
>>686
その状態で cpp と inl の間で関数を移動させればいいはずなんだが、
「うまいこと」ってのはどういうことだ?何が気に入らない?
688デフォルトの名無しさん:2006/10/22(日) 15:52:02
>686
これもExceptional C++ Styleにあったな。
必ずinline にする / inlineにしない方法はないって。
689デフォルトの名無しさん:2006/10/22(日) 15:54:31
VC8には__forceinlineとかいうお馬鹿なキーワードがあるな。
690デフォルトの名無しさん:2006/10/22(日) 16:55:30
>>689
VC6の頃からあったぞ。
691デフォルトの名無しさん:2006/10/22(日) 17:27:19
inline展開っていまどき流行らないの?
692デフォルトの名無しさん:2006/10/22(日) 17:39:31
>>691
プログラマが無い知恵を絞るよりコンパイラに任せたほうがいいってことじゃない?
693デフォルトの名無しさん:2006/10/22(日) 17:48:12
>>692
そうなのか、オレは10行程度で他の関数呼ばないものはinlineに置いて
たけどやめるか
694デフォルトの名無しさん:2006/10/22(日) 17:55:54
VC7から入った「リンク時コード生成」を使うのなら
最適化を目的としたinline宣言はほぼ無意味
695デフォルトの名無しさん:2006/10/22(日) 18:27:26
>>694
いや、それはべつの翻訳単位でもinlineできるようにするためのものだから。
もろにinlineとかかわってくるわけだが。
まあ、そもそもVCは普通のinlineを無視するがな
696デフォルトの名無しさん:2006/10/22(日) 18:30:02
無視するんなら関わるも糞もないんじゃねーの?
697デフォルトの名無しさん:2006/10/22(日) 18:31:18
どうせiccも事実上無視するし、漏れは寧ろinline指定をソースを読む人間のために書いているよ。
698デフォルトの名無しさん:2006/10/22(日) 18:33:50
おれはむしろ__forceoutlineが欲しい。
implなclassとか、実装も全部その場に書いてしまいたい。
699デフォルトの名無しさん:2006/10/23(月) 02:59:20
クラスん中にぶちまけちまったら、ほっといても全部inlineだしなー。
700デフォルトの名無しさん:2006/10/23(月) 03:18:36
なんでC++の例外はstd::stringしか受け付けないの?
std::wstringがあるのに...
701デフォルトの名無しさん:2006/10/23(月) 07:16:48
>>700
受け付けるのと、あと what() の型が char 固定ってのが問題だな。

なんでかっていうと、標準委員会の日本人メンバーがサボってたからじゃね?
未だにオフィシャルな議題にも挙がってないっぽい。
702デフォルトの名無しさん:2006/10/23(月) 07:17:46
703デフォルトの名無しさん:2006/10/23(月) 10:23:55
真剣に国際化を想定するならば
例外クラスに持たせる std::string はエラーの識別子としてのみ用いて
その識別子から実際の human readable なエラーメッセージへの message catalog を
持て,ということなんじゃないですかね?
ただし標準の範疇で message catalog の機能を担当するのが
恐らく std::messages で,これがイマイチしっくりこないと気が個人的にはしますが.
あと,エラーの文脈に関する情報などもう少しリッチな情報を
例外クラスに持たせたければ実装の側で適当にフォーマット決めて,
という姿勢なんでしょう.
http://tinyurl.com/y5k8ux にある Peter Dimov 氏の投稿の Summary が明快かと.
704デフォルトの名無しさん:2006/10/23(月) 16:43:19
bad_allocなんかはstd::wstringで渡されても困ると思う、標準C++的には。
705デフォルトの名無しさん:2006/10/23(月) 19:34:07
>>704
std::stringだと困らないの?
706デフォルトの名無しさん:2006/10/23(月) 20:04:38
ワイド文字だと出力するときにマルチバイト文字列へ変換しなければならないのが、
メモリにとっても優しくなさそうだと思った。
707デフォルトの名無しさん:2006/10/23(月) 21:27:59
逆だろ
708デフォルトの名無しさん:2006/10/23(月) 22:40:18
find とか使うためにワイド文字使ってるから、
ファイル入出力関係はマルチバイト文字⇔ワイド文字で格闘してる
709デフォルトの名無しさん:2006/10/23(月) 22:40:51
18.6.1 what() の説明のとこに
"Remarks: The message may be a null-terminated multibyte string (17.3.2.1.3.2), suitable for conversion and display
as a wstring (21.2, 22.2.1.4)."
って書いてあるのを見つけた。 wstring に変換して表示できるマルチバイト文字列でもいいと
書かれている。

string を受け取る stdexcept の例外群のコンストラクタには
"Postcondition: strcmp(what(), what_arg .c_str()) == 0."
と書いてあるので、 what() と同じくこちらも wstring に変換して表示できるマルチバイト文字列でもいい
ということになる。

とりあえず、まったく失念していたわけではないようだ。
でもワイドキャラクタからマルチバイトへの変換って、標準で決まってるの?
ロケールによって決まるんだったら、 what() の戻り値にどのロケールを
適用すればいいのかわかんないよね?
710デフォルトの名無しさん:2006/10/23(月) 23:01:50
wcstombsの立場っていったい・・・
711デフォルトの名無しさん:2006/10/23(月) 23:11:38
あれ?じゃぁ入れるときは wcstombs() 使って、出すときは mbstowcs() 使えばすべて解決?
712デフォルトの名無しさん:2006/10/23(月) 23:34:04
>>706
ワイド文字をネイティブで扱う処理系があったっていいじゃない。
UTF-16がネイティブなWindowsとかWindowsとかWindowsとか。
713デフォルトの名無しさん:2006/10/23(月) 23:38:19
STLの代表的なやつをjavadoc形式で表したいんですけど
参考になるサイトとかないですか?
714デフォルトの名無しさん:2006/10/23(月) 23:50:04
>712
そうは言っても、stdio/iostreamはマルチバイトに変換することを前提にしているようだし……。
715デフォルトの名無しさん:2006/10/24(火) 00:05:23
>>710
codecvt
ってのもあったね。
使った事ないけど・・・
716デフォルトの名無しさん:2006/10/24(火) 00:46:41
>>714
たしかにそりゃそうだけど。
VC8だと、wcoutは事実上使えないし。
まあ、コンソールに出力するようなことはないから、どうでもいいんだけど。
717デフォルトの名無しさん:2006/10/24(火) 01:02:06
>712
待って、まだ9xを捨てないで。
718デフォルトの名無しさん:2006/10/24(火) 01:10:06
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/
これ読んでるだが、全然boostの使い方しか説明されてないんだけど
オレはboostと同じようなテクニックが欲しいのになんでだ?
719デフォルトの名無しさん:2006/10/24(火) 01:11:33
>>718
それはBoostを使っての説明本だし、当然。
Modern C++ DesingがLokiを使って説明しているように。

テンプレートに関する知識を身につけたいなら、
「C++ Templates」を読むことをお勧めする。
720デフォルトの名無しさん:2006/10/24(火) 01:19:38
>>716
VCってwcout使えなかったけ?(imbueすれば)
GCCだとだめんなんだが...
721デフォルトの名無しさん:2006/10/24(火) 01:25:48
>>720
2バイト文字を出力しようとすると、おそろしく奇妙なことになる。
ttp://rpgincpp.cocolog-nifty.com/blog/2006/02/_1_be7f.html

ロケールって、絶対足枷になっていると思うんだ。
何かするたびに、現在設定されているロケールを見て挙動を変えないといけないんだから。
722デフォルトの名無しさん:2006/10/24(火) 01:31:58
>>709のような人はエスパー待ちでヨロ
723デフォルトの名無しさん:2006/10/24(火) 01:54:08
>>721
SP1で直ってるといいな...

wcstombsで
::setlocaleじゃなくてC++のロケール使ってるけど
CのロケールとC++のロケールの関係ってどうなってんだろ...
724デフォルトの名無しさん:2006/10/24(火) 15:46:43
templateを使ってコンパイル時に右シフトするか左シフトするかを使い分けたいのですが、
何か方法があったら教えてください。よろしくお願いします。
725デフォルトの名無しさん:2006/10/24(火) 16:17:38
エスパーっぽく

template< bool Left = true > shift_op {
template< typename T, typename X >
T operator()( T t, X x ) { return T << x; }
};
template<> shift_op< false > {
template< typename T, typename X >
T operator()( T t, X x ) { return T >> x; }
};

shift_op<> shift; // 左シフト
int a = shift( 8, 2 );
726デフォルトの名無しさん:2006/10/24(火) 18:24:56
>>723
std::locale::globalを呼ぶと、内部で対応するようにstd::setlocaleを呼ぶと定められている。
727デフォルトの名無しさん:2006/10/24(火) 22:58:17
>>725
レスありがとうございます。

でもコンパイルが通らない…
こういうtemplateの使い方は初めてみたのですが、いろいろ弄ってみようかと思います。
728デフォルトの名無しさん:2006/10/24(火) 23:13:54
>725
関数の中のTはtの間違いだろ。
729724:2006/10/24(火) 23:30:51
>>725>>728のように修正して、さらにshift_op を struct shift_opにするとコンパイルできました。

ありがとうございました。
730デフォルトの名無しさん:2006/10/25(水) 00:13:06
class Cというのがあってハンドルっぽく初期化したい場合を
参照に書き換えたいんだけどどうやってやればいいのですか?

func A(){
C *c;
funcB(&c)
}

funcB(C **c){
*c = new C();
}
731デフォルトの名無しさん:2006/10/25(水) 00:18:55
funcB(c);

void funcB(C*& c) {
c = new C();
}
732723:2006/10/25(水) 00:37:23
>>726

規格書見てみたけど(少し要約)

static locale global(const locale& loc);
の実引数が名前を持っていれば、次を実行する。
std::setlocale(LC_ALL,loc.name().c_str());
そうでない場合は、C現地特性に対する影響は、処理系定義とする。

補足:実引数(locale)に名前がないというのは
loc.name()が"*"のとき。
733デフォルトの名無しさん:2006/10/25(水) 01:18:23
例えばrootkitのように
あるプログラムを使用しているのを隠蔽するには
何をすればいいのでしょうか
734デフォルトの名無しさん:2006/10/25(水) 01:27:20
環境毎に違うし、標準の範囲では無理。
735デフォルトの名無しさん:2006/10/25(水) 01:35:43
返答ありがとうございます。
無理ですかorz
736723:2006/10/25(水) 01:41:01
>>721
デバッグしてわかったけど
Cのロケールをデフォルトのものから変更したときに
wcoutのストリームのサイズが0になってるみたい。

だから
std::global(std::locale(""));
std::wcout.rdbuf()->pubsetbuf(0,10000);
見たいな感じでストリームのサイズを変えてやればVC8でも動いたよ。
737デフォルトの名無しさん:2006/10/25(水) 02:37:28
なんかさー
ノードの深いオブジェクト探査してデータ集めるモジュール作ってるんだけど
エラー処理どうしたらいいものか悩んでる。下ようにC()の中でエラーが起きた場合
Aまでもし伝える必要があってこうゆうときって返り値をエラー番号とかにして
引数で参照渡しをするべき?

A(){
B()
}

B(){
C()
}

C(){
D()
}

738デフォルトの名無しさん:2006/10/25(水) 02:38:57
>>737 throw
739デフォルトの名無しさん:2006/10/25(水) 02:39:10
そこまで深いなら、素直に例外投げたら。
740デフォルトの名無しさん:2006/10/25(水) 02:50:12
やっぱ例外投げるしかないよねー
Cのデータ構造なめてるから下手にオブジェクトにしても
あんまり効率よくないし
741デフォルトの名無しさん:2006/10/25(水) 03:14:29
VC++でWin32だったりすると例外のコストは実はそう大きくないとか聞くな。
742デフォルトの名無しさん:2006/10/25(水) 03:24:37
例外のコストなんて、今となってはほとんど迷信じゃね?
743デフォルトの名無しさん:2006/10/25(水) 03:30:04
コストそのものより、例外安全性の方が…

いや、コストも馬鹿にならんよ?
なんせ片っ端から巻き戻すわけだし。
744デフォルトの名無しさん:2006/10/25(水) 04:01:21
巻き戻すんですか…
JavaとかC#使ったことありますか?
それを使ってみてから巻き戻るかどうか考えてみてはいかがですか。
745デフォルトの名無しさん:2006/10/25(水) 04:12:32
だーかーらー
ガベコレつーか遅延破棄のある言語と一緒にすんなと。
746デフォルトの名無しさん:2006/10/25(水) 04:27:41
いや、違いはスタック上にオブジェクトがあるかどうかだと思うよ。
744が思いっきり外してるのは確かだけど。
747デフォルトの名無しさん:2006/10/25(水) 04:30:16
あ、ごめん。
違い、ってより、コストがかかる原因だな。
748デフォルトの名無しさん:2006/10/25(水) 07:29:39
例外を処理するのにコストがかかるってのは昔から聞いたけど
そもそも例外なんてそんな頻繁に起きるところに使わないでしょ?
そのコストを気にするものなの?
749デフォルトの名無しさん:2006/10/25(水) 07:45:12
例えthrowが行われなくてもtry〜catchブロックがあるだけで性能にペナルティが出る場合もある。
750デフォルトの名無しさん:2006/10/25(水) 09:02:25
そのへんはMSのDeep C++とか読むと結構参考になる記述があったり
理解できなくてどうでもよくなったり('A`)

適当な本買うのが一番なんだろうけどな
751デフォルトの名無しさん:2006/10/25(水) 09:34:07
752デフォルトの名無しさん:2006/10/25(水) 10:05:14
元ネタがそんなにコストを気にしているようなものじゃな無いから、別にいいんでね?
753デフォルトの名無しさん:2006/10/25(水) 10:13:30
>>743
正常系のパスでコストがかからなければ、巻き戻すときに
コストがかかるのは別にいいだろ。

例外安全性は、べつに言語の例外機能を使わなくても、
まっとうなプログラムなら戻り値なりなんなり使って
確保しないといけないしね。
754デフォルトの名無しさん:2006/10/25(水) 14:07:12
だから、正常系でも多少コストがかかるから嫌われるんだよ。

どのローカルオブジェクトが構築済みか等を全部記録しなきゃ
正常に巻き戻せないのはわかるよね。
755デフォルトの名無しさん:2006/10/25(水) 14:17:28
そんなダダっ子は死んでしまえ
756デフォルトの名無しさん:2006/10/25(水) 14:24:28
巻き戻すって言う古い奴だから、そんな時代遅れほっとけよ。
757デフォルトの名無しさん:2006/10/25(水) 14:25:41
>>754

その「多少のコスト」がどれくらいなのか説明しろよ
お前の使ってる処理系でいいから。
758デフォルトの名無しさん:2006/10/25(水) 19:02:45
インライン関数についてです。

.asmファイルを見たときに、
call func
のような記述がある場合、(実際はもっと複雑です)
funcはインライン化されていないのでしょうか?
759デフォルトの名無しさん:2006/10/25(水) 19:05:44
インライン化でぐぐれ。
760デフォルトの名無しさん:2006/10/25(水) 19:31:17
各種のRDBMSに対応するために、DB製品ごとの違いを
ラップしてくれるライブラリというのはありますか?
761758:2006/10/25(水) 19:34:33
>>759
ぐぐったりはしてみたのですが、情報が見つけられないです。
何かインライン化されたかどうかを確認する手段はないのでしょうか?
762デフォルトの名無しさん:2006/10/25(水) 19:52:08
>>761
「インライン関数」を何だと思ってる?
763デフォルトの名無しさん:2006/10/25(水) 21:19:53
call funcってinline化されてるんですか?(*><)
call funcってinline化されてるんですか?(*><)
call funcってinline化されてるんですか?(*><)
764デフォルトの名無しさん:2006/10/25(水) 22:18:14
>>760
Windowsで動く奴ならADO・OLE DB・ODBCから好きなもの選べば?
765758:2006/10/25(水) 22:30:16
call funcは関数呼び出しっぽいなあということは感じていたのですが、アセンブラを調べてみてわかりました。
やっぱりcallは関数呼び出しのときに使われるんですね。

そもそも何故このようなことを言い出したかというと

inline int func(int a) {
return a+5;
}

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vccore/html/_core_.2f.ob.asp
これによると「/O1、/O2、または /Ox を使用するときに、/Ob2 は有効になっています」と書いてあり、
これくらい単純な関数ならインライン展開されるだろうと期待して/O2でコンパイルしたにも関わらず、
call funcが見つかりました。
VCTK付属のコンパイラで試した限り、/O2だけではダメで/Ob2をオプションに含める必要があることがわかりました。
766デフォルトの名無しさん:2006/10/25(水) 22:41:19
そんなくだらない話よりも例外の話の続きが気になるんだが。
767デフォルトの名無しさん:2006/10/25(水) 22:41:34
で、それを気にしてどうする?
768デフォルトの名無しさん:2006/10/25(水) 22:49:14
[]演算子は継承しても、派生クラスから呼び出せるんですが、
=演算子は継承すると、派生クラスから呼び出されていなようです。

仕様ですか?
769デフォルトの名無しさん:2006/10/25(水) 23:09:15
コンパイラが生成するデフォルトのoperator=が、基本クラスのoperator=を隠蔽する
と思った。
770デフォルトの名無しさん:2006/10/25(水) 23:10:07
仕様。
規則上の理由は、暗黙的に定義されるoperator =()が基底クラスのそれを上書きするため。
根本的な理由は、スライシング防止のため。基底クラスのoperator =()が派生クラスの分まで面倒を見れるはずが無いから。
771デフォルトの名無しさん:2006/10/25(水) 23:10:58
つ コピーコンストラクタ
772デフォルトの名無しさん:2006/10/25(水) 23:13:37
>>754
> どのローカルオブジェクトが構築済みか等を全部記録しなきゃ
> 正常に巻き戻せないのはわかるよね。

デストラクタにまかせちゃいけないの?
773デフォルトの名無しさん:2006/10/25(水) 23:14:47
>>770
ありがとうございます!
774769:2006/10/25(水) 23:18:42
(・-;)
775デフォルトの名無しさん:2006/10/26(木) 00:06:39
>>754
時代遅れ。
今は(けっこう前から)正常系ではコスト(命令サイクル)がまったく不要な
テーブルアプローチによる実装が主流。ただし Windows 以外。

このアプローチでは、テーブルのぶんコードサイズが少し多めになる。
キャッシュへの影響が気になるところだが、きっちり正常系のコードと
わけて配置されていれば、そこも問題ないと思う。
776デフォルトの名無しさん:2006/10/26(木) 00:25:05
>>775
テーブルアプローチとかその辺の設計手法載ってる本ってあります?
あとテーブルアプローチって俗称で正式な名前じゃないですよね?
本当はなんて名前なのですか?
777デフォルトの名無しさん:2006/10/26(木) 00:35:42
Windowsは構造化例外がfsセグメントとか使ってるからね。
778デフォルトの名無しさん:2006/10/26(木) 00:48:46
>>776
本じゃないけど。
http://www.open-std.org/jtc1/sc22/wg21/
"ISO/IEC TR 18015:2006 C++ Performance - draft TR"

「テーブルアプローチ」はここに載ってる言葉。
これに対して try ブロックに出入りするたびに追加のコードが
挿入される方法は「コードアプローチ」と呼ばれている。
779デフォルトの名無しさん:2006/10/26(木) 01:00:59
>>778
"Table" ApproachはIEEEの論文にいろいろ乗ってねオレが無知だったよすまね
でもさ、オレ最近昇進して下のやつらのコード見るんだけどforのネストからtryで抜けたり
してるやついるんだけど、こういうやつらにどんなふうに言うのが正しいんだろうか
780デフォルトの名無しさん:2006/10/26(木) 01:02:24
gotoの正しい使い方を教えろ
781デフォルトの名無しさん:2006/10/26(木) 01:04:42
何も言わない
もはや達観と諦めの境地
782デフォルトの名無しさん:2006/10/26(木) 01:30:51
>>779
こいつそろそろウザイな。誰かキャッチしてやれよ。
783デフォルトの名無しさん:2006/10/26(木) 01:42:28
構造化プログラムちゃんと仕込んどけ
784デフォルトの名無しさん:2006/10/26(木) 02:36:36
>>779
>昇進して下のやつらのコード見るんだけど
ダウト。会社から見れば単に押し付ける仕事が増えただけで掃き溜め要員であることには変わりがない。
785デフォルトの名無しさん:2006/10/26(木) 02:51:12
キャッチしちゃってね。
786デフォルトの名無しさん:2006/10/26(木) 03:00:29
>>1
787デフォルトの名無しさん:2006/10/26(木) 04:05:49
>>784
誰も何も言ってない切り口を持ち出して
ダウトもなにも無いと思うが
788デフォルトの名無しさん:2006/10/26(木) 05:38:29
「ダウト」 って、「間違い」 じゃなくて 「疑惑」 って意味だよね?
789デフォルトの名無しさん:2006/10/26(木) 06:15:13
そう。あとに続く断定口調から考えて、>>784は間違って覚えてる可能性大。

ついでにいえばこのダウトっての、ずいぶん前にちょっと流行ったやつだよね。
世間の世知辛さを、勝ち組の傲慢さではなく、負け組の湿気をたっぷり含んだ言い方で
妙に偉そうに語るオーラと合わせて考えるに、ちょっと可哀相な感じのオッサンが想像できる。
790デフォルトの名無しさん:2006/10/26(木) 06:21:54
普通にトランプゲームから来てるんじゃないの>ダウト
791デフォルトの名無しさん:2006/10/26(木) 09:22:31
つまり、「掃き溜め要員であることには変わりがない」のだから、「昇進して」というのは「疑惑」だってことか。
792デフォルトの名無しさん:2006/10/26(木) 09:49:05





















お前ら随分暇そうだな
793デフォルトの名無しさん:2006/10/26(木) 12:29:33
だから、キャッチするなよ。
例外なんだからさ、スルー、スルー
794デフォルトの名無しさん:2006/10/26(木) 13:34:19
>775
>このアプローチでは、テーブルのぶんコードサイズが少し多めになる。
>キャッシュへの影響が気になるところだが、きっちり正常系のコードと
>わけて配置されていれば、そこも問題ないと思う。
少なくとも Itanium に関しては, table 自体と table のルックアップに関する
コードについてこの仕様が明文化されてますね.
http://www.codesourcery.com/cxx-abi/abi.html#unwind
ICC, g++ がすでにこれを実装済みだったと記憶しています.

あと, catch ブロックのコードですら正常系のプログラムテキストとは別の
"coldな" 場所に配置して,正常系のコードサイズを圧迫しないようにする
実装のコンパイラもあったはずです
(ICC が実装していたはずですが今手元に spec. が無いので確認できない).
795デフォルトの名無しさん:2006/10/26(木) 13:42:53
>>790
ページワンだっけ?
796デフォルトの名無しさん:2006/10/26(木) 17:51:25
二次元配列のクラスを動的に確保するために3重ポインタを使って
for(int x = 0;x < X;x++)
p[x] = new Class*[Y];
for(int x = 0;x < X;x++)
for(int y = 0;y < Y;y++)
p[x][y] = new SubClass();
としました
これを解放するために
for(int n = 0;n < X;n++)
for(int m = 0;m < Y;m++)
delete p[n][m];
for(int n = 0;n < X;n++)
delete [] p[n];
delete [] p;
としたらエラーが出ました

何が問題なのでしょうか?教えてください
コンパイラはVC++.NET 2002を使ってます
797デフォルトの名無しさん:2006/10/26(木) 17:59:06
エラーの詳細書いてないのはスルー
798デフォルトの名無しさん:2006/10/26(木) 18:04:26
>>796
ソース全部貼れ
コンパイルエラーなのか実行時エラーなのかくらい書け
799デフォルトの名無しさん:2006/10/26(木) 18:09:10
多次元配列なんぞ使うな。以上。
800デフォルトの名無しさん:2006/10/26(木) 18:29:21
じゃあ何を使えばいいんだよ!
801デフォルトの名無しさん:2006/10/26(木) 18:59:26
p[x + y * x_size]
802デフォルトの名無しさん:2006/10/26(木) 21:13:06
803デフォルトの名無しさん:2006/10/26(木) 22:13:45
っ boost::multi_array
804デフォルトの名無しさん:2006/10/26(木) 22:35:39
C++効率的最速学習徹底入門
この本て詐欺っぽい?
805デフォルトの名無しさん:2006/10/26(木) 22:55:32
>>804 どういう詐欺?
806デフォルトの名無しさん:2006/10/26(木) 22:59:08
>>805
効率的最速学習とかよく
英会話○日で習得できるとか類の怪しい本ですか?
807デフォルトの名無しさん:2006/10/26(木) 23:48:41
スレ違い
808デフォルトの名無しさん:2006/10/27(金) 01:07:42
タイトルが中国の本っぽい
809デフォルトの名無しさん:2006/10/27(金) 01:15:00
810デフォルトの名無しさん:2006/10/27(金) 03:50:07
publicであり、
クラス外部からのアクセスにはconstとして振る舞い、
クラス内部からのアクセスには非constとして振る舞う、
といったメンバ変数を作りたいのですが、どのような方法があるでしょうか。
811デフォルトの名無しさん:2006/10/27(金) 04:16:31
やっぱprivateにしてget()を、、、とかじゃダメだから聞いてるのか(´・ω・`)
812デフォルトの名無しさん:2006/10/27(金) 04:21:32
>>810
真面目に答える気はない。
こういうことができるというだけで……。

class Foo
{
public :
  Foo(int x) : value_(x), value(value_) {}

private :
  int value_ ;
public :
  int const & value ;
} ;

Foo::valueは、クラス外部からはconstとして振る舞う。
クラス内部からは、Foo::value_でアクセスすること。
813デフォルトの名無しさん:2006/10/27(金) 09:21:53
メンバ変数を全部mutableにすればいいとかそんな話?
814デフォルトの名無しさん:2006/10/28(土) 00:44:48
>810
何言ってるのかわからん……
メンバ変数を外部からアクセスするって、一体何のこと?
815デフォルトの名無しさん:2006/10/28(土) 02:36:15
あるオブジェクト A &aがあったとき参照オブジェクトの渡し方として
以下の方法があった場合コピーコンストラクタが行われるのは両方それともどちから片方だけですか?

なぜか自分の環境ではクラスのコンストラクタに渡すと中のオブジェクトが空になってしまいます。

クラスメソッドtestに渡す
void test(A +a)

別クラスhogeのコンストラクタに渡す
hoge(A &a):hogeA(a){}
816デフォルトの名無しさん:2006/10/28(土) 03:24:03
&ついてなけりゃ値渡しだから、テンポラリにオブジェクトが生成される。
その際にコピーコンストラクタは呼ばれるだろう。

中のオブジェクトが空になるのは、単にコードがバグってるだけ。
コピーコンストラクタ云々は関係ない。
817デフォルトの名無しさん:2006/10/28(土) 08:37:46
>>812
ありがとうございます。
参考になりましたが、その方法はメモリ使用量が増加してしまいました。

>>813
クラス実体がconstという訳ではないのでどうにも……

いろいろ考えましたが、
とりあえずconst_castで強引にやってみます。
818デフォルトの名無しさん:2006/10/28(土) 08:44:57
何故メンバ変数をpublicにするの?
819デフォルトの名無しさん:2006/10/28(土) 08:47:04
外からのアクセスはメンバ関数を通せばいいだろ。
820デフォルトの名無しさん:2006/10/28(土) 09:57:47
C++の良書教えて
821デフォルトの名無しさん:2006/10/28(土) 10:23:02
>>820
テンプレにある本でも買っとけ。
822デフォルトの名無しさん:2006/10/28(土) 11:22:10
const *char
const unsigned *charに変換したいけどどうやってするの?
823デフォルトの名無しさん:2006/10/28(土) 12:15:13
まず文法の載っている本を読む。
824デフォルトの名無しさん:2006/10/28(土) 15:05:51
char*からunsigned char*の変換は非常に難しい
やめたほうがいい。
825デフォルトの名無しさん:2006/10/28(土) 15:12:17
すいません、質問させてください。
共用体型の意味って何でしょうか?
同時に値を格納できないのならば、意味が無いような気がするのですが・・・
共用体型を宣言する時にint a; int b;とした場合、結局格納できる値が一つなら、単にint a;で書いてしまえばいいだけではないのですか?
826デフォルトの名無しさん:2006/10/28(土) 15:25:26
>>825
その発想で行くと全部void*でおkになるね
827デフォルトの名無しさん:2006/10/28(土) 15:30:47
unionはあまり使わないほうが……
カリカリにチューンしているのなら別だけど。

boost::anyの方が便利だよ。
828デフォルトの名無しさん:2006/10/28(土) 15:31:32
>>826
えっと、どういう意味でしょうか?
829デフォルトの名無しさん:2006/10/28(土) 15:46:47
>>828
違う型を共用するところに意義がある共用体の存在意義を否定するなら、
違う型へのポインタなんぞを使わずに全てvoid*で済ませばいいだろ、という話。
830デフォルトの名無しさん:2006/10/28(土) 15:53:03
>>824
char がsigned char なのか unsigned charなのかは
環境依存だからとかそういう話?
831デフォルトの名無しさん:2006/10/28(土) 16:03:04
一応、unionは確保したメモリを共用できるというvoid*にはない
特長もあるけど、型安全が犠牲になるんだよね。
C++には合わないよ。
832デフォルトの名無しさん:2006/10/28(土) 16:05:20
union
{
    float f;
    unsigned int n;
}; // sizeof (float) == sizeof (unsigned int)だと仮定して

f = 123.456e7;
するとnからはfのメモリ上のビットパターンが読み取れてウマーなこともあった。
まあunionがなくてもreinterpret_cast使えばいいだろと言う程度のことではあるが。
833デフォルトの名無しさん:2006/10/28(土) 16:08:29
有名っちゃ有名なのは、sockaddr_in構造体とか、windowsのビットマップを表すような構造体とか(バージョンごとに後半のメンバが違う)いうのがある


はず
834デフォルトの名無しさん:2006/10/28(土) 16:09:05
sockaddr_in は sock_addrinだたね
835デフォルトの名無しさん:2006/10/28(土) 16:09:25
SDLのイベントもunionだね
836デフォルトの名無しさん:2006/10/28(土) 16:16:08
もしもし?
837デフォルトの名無しさん:2006/10/28(土) 16:40:08
きりんさんがすきです。
838825:2006/10/28(土) 17:21:42
みなさんレスありがとうございます。
何となく意味がわかりました。
とりあえず今はunionを使うのは控えておきます
まだあやふやな所もありますし。
839デフォルトの名無しさん:2006/10/28(土) 17:22:12
>>829
両方ともint型じゃん
840デフォルトの名無しさん:2006/10/28(土) 17:24:29
で?
841デフォルトの名無しさん:2006/10/28(土) 17:33:33
char *からunsigned char *に変換できませんn。
どうやってやるの?
842デフォルトの名無しさん:2006/10/28(土) 17:38:58
union使ったことない。
int型とdouble型共有したら2.54とか小数点だったらdouble型、2とかだったらint型で事実上格納されるの?
教えて
843デフォルトの名無しさん:2006/10/28(土) 17:48:28
>>841
static_cast<unsigned char *>(static_cast<void*>(x))
844デフォルトの名無しさん:2006/10/28(土) 17:55:39
reinterpret_cast1回でいいだろ。
845デフォルトの名無しさん:2006/10/28(土) 17:59:37
>>842
そういう理解の仕方の人にはお勧めできません。
つーか、>832の意味が理解できていない?

そう言えばXLibのイベント構造体もunion使ってたなぁ。
あちらはイベントの種類ごとに違う構造なのを吸収するのが目的だが。
846デフォルトの名無しさん:2006/10/28(土) 18:43:47
>>844
reinterpret_cast は実装依存。 void* 経由の static_cast は動作について規定されている。
そんなことはないですか?
847デフォルトの名無しさん:2006/10/28(土) 18:49:38
union ARGB {
  unsigned long argb;
  unsigned char alpha, red, green, blue;
};

ARGB color;

color.alpha = 0xFF;
color.red = 0;
color.green = 0xEE;
color.blue = 0xAA;

cout << "ARGB = " << color.argb; // "ARGB = 0xFF00EEAA"
848デフォルトの名無しさん:2006/10/28(土) 18:52:53
>>846
そんなことはないだろう。

俺の記憶では、何かポインタ型のオブジェクトをvoid*へ変換したものを、
元のポインタ型(か互換な型)以外へ変換すると、未定義だか処理系依存だかで、
結局reinterpret_castと変わらないだろということになるはず。
849デフォルトの名無しさん :2006/10/28(土) 19:22:50
人生相談室はこちらで宜しいでしょうか??
850デフォルトの名無しさん:2006/10/28(土) 19:26:11
VC++のstd::basic_stringの実装が短文字列最適化のためにunion使ってる
851デフォルトの名無しさん:2006/10/28(土) 19:27:18
>>846
5.2.10 Reinterpret cast の 7 によると、 char* から unsigned char* に
reinterpret_cast で変換した値は unspecified (なんて訳すんだっけ?)となる。

4.10 Pointer conversion の 2 によると、 char* から void* への変換結果は
char 型オブジェクトの記憶域の開始位置を指すと決められている。そして
5.2.9 Static cast の 6 にこれとは「逆」の変換が可能だとされている。

記憶域を指す void* からオブジェクトを指すポインタへの変換は malloc() の
戻り値に対して必要になる変換なので問題ないと思うけど、規格中に明示的な
記述を見つけることはできなかった。記憶域の開始位置からオブジェクトへの
ポインタを作るということで、 5.2.9 の 6 にある「逆」の変換にあたるのだろうか?

どっちかというと後者のほうが移植性が高いと言えなくもない、というぐらいの違いかな。
852デフォルトの名無しさん:2006/10/28(土) 22:39:09
>>851
任意の型Tについて T* p があったとき、static_cast は
static_cast<T*>(static_cast<void*>(p)) == p を保証するんじゃなかったっけか。

正当な変換が定義されていない別の型に変換するのは、
規格上はどうやっても未定義だと思うが。
853デフォルトの名無しさん:2006/10/28(土) 23:03:45
>>852
元に戻すことができるのは 5.2.9 の最後に書いてある。

「定義されていない」のが「未定義」なのはあたりまえ。
今は正当な変換が定義されているかどうかを論じているんだろ?
854初心者:2006/10/28(土) 23:39:43
どちら様教えて、VC++プログラミングするときにひとつのボタン押して
他の.exeファイル実行できるようにどうすればいいですか??
855デフォルトの名無しさん:2006/10/28(土) 23:42:06
>>854
日本語でおk
856初心者:2006/10/28(土) 23:45:48
>>855
意味わからないですけど、詳しく
857デフォルトの名無しさん:2006/10/28(土) 23:51:25
>>854
マルチは氏ね
858デフォルトの名無しさん:2006/10/28(土) 23:51:53
>>857
マルチだったのかw
859デフォルトの名無しさん:2006/10/28(土) 23:55:01
どりゃ〜〜〜
860デフォルトの名無しさん:2006/10/28(土) 23:59:40
文字数を知る方法を教えてほしいのですが
例えば

char a[20];
cin << "abcd";

とするとき 文字数が4であることを知るにはどうすれば
よいのでしょうか?
861デフォルトの名無しさん:2006/10/29(日) 00:03:22
シュールだ
862デフォルトの名無しさん:2006/10/29(日) 00:19:49
>>860
strchr(a,'\0')-a
memchr(a,'\0',UINT_MAX)-a
strrchr(a,'\0')-a
strlen(a)
863デフォルトの名無しさん:2006/10/29(日) 00:19:52
ちょww
864デフォルトの名無しさん:2006/10/29(日) 00:20:42
>>860
とりあえずコンパイル通そうぜ?
865デフォルトの名無しさん:2006/10/29(日) 00:21:24
>>862
お前全然問題がわかってないw
866860:2006/10/29(日) 00:22:19
すいません。訂正

char a[20];
cin << a;

aにabcdと文字が入っているとすると文字数が4であること
知る方法について教えていただけないでしょうか? 
867デフォルトの名無しさん:2006/10/29(日) 00:22:39
もうどこからつっこんでいいやら・・・
868デフォルトの名無しさん:2006/10/29(日) 00:23:15
>>866
とりあえずコンパイル通そうぜ?
869866:2006/10/29(日) 00:25:01
cin >> a; でした すいません
870デフォルトの名無しさん:2006/10/29(日) 00:26:09
えへ、えへへへ
871デフォルトの名無しさん:2006/10/29(日) 00:26:34
>>869
一文字ずつ終端文字がくるまで数えればいいんじゃない?
872デフォルトの名無しさん:2006/10/29(日) 00:29:51
悪いことは言わんからとりあえず std::string を使うことを覚えろ。
873デフォルトの名無しさん:2006/10/29(日) 00:39:58
#include <iostream>
#include <string>

int main()
{
    std::string s;
    std::cin >> s;
    std::cout << s.size() << ' ' << s << std::endl;
}
874側近中の側近 ◆0351148456 :2006/10/29(日) 00:51:51
>>866
(っ´▽`)っ
もし、charでいきたいなら
strlen(a)でOK。
ただ、C++なんだからstringクラスがお勧め。>>873の通り。
charは危険がいっぱいだからね☆
>>866で、20字以上入力されたらアウトだよ。
875デフォルトの名無しさん:2006/10/29(日) 01:02:58
アウトってなんですか?
876デフォルトの名無しさん:2006/10/29(日) 01:08:14
>>875
よよいのよいっってやつだよ
877側近中の側近 ◆0351148456 :2006/10/29(日) 01:09:22
>>875
(っ´▽`)っ
どんな動きをするかわからないってことだよ。
プログラムが異常終了する、結果が不正になる。とかね。
20文字目以降が、メモリ上の予想していないところに書き込まれるから。
char a[20];と宣言しているように、aには20字(\0含む)しか入れちゃダメ。
878860:2006/10/29(日) 01:15:57
int e = 0;
int mozisu = 0;
a[20];

cin >> a;

while (a[e] != '\0'){
e++;
mozisu++;
}


一応 文字数はわかることができました。
879デフォルトの名無しさん:2006/10/29(日) 01:20:00
>>878
とりあえずコンパイル通そうぜ?
880デフォルトの名無しさん:2006/10/29(日) 01:24:50
>>878
わざわざライブラリ使わんのもあれだがeとmozisuを分ける意味がわからん。
どっちも同じ値じゃん。
881デフォルトの名無しさん:2006/10/29(日) 01:25:54
>>878
strlenを使うようにすると、こうなる。
#include <iostream>
#include <cstring>

int main()
{
    a[20];
    std::cin >> a;
    int mozisu = std::strlen(a);
    std::cout << mozisu << ' ' << a << std::endl;
}
882デフォルトの名無しさん:2006/10/29(日) 01:29:14
>>880
察するにプログラミング自体が、初めてなんじゃね? 細かいことは大目に見てやろうぜ。
俺的には「初心者です」とかって言わないところがとっても好印象だ。
883デフォルトの名無しさん:2006/10/29(日) 01:35:07
俺的には、とっととAccelerated C++読めと言いたいけどな。
std::stringクラス使わん理由がわからん。

マズい設計とは言え、char[]使うより100万倍マシだからな。
884878:2006/10/29(日) 02:08:01
すいませんでした。
知識がないのでstd::stringクラス
というものを知りませんでした。
もっと勉強します。
885デフォルトの名無しさん:2006/10/29(日) 03:02:27
つーか寧ろ、初心者スレに行ってくれ。
886デフォルトの名無しさん:2006/10/29(日) 03:17:09
ツリー構造をC++的に作りたいのですが
参考になるページ教えていただけないでしょうか?
やはりCのようにポインタを繋いで
AddとかDelとそんな関数をたくさん作るイメージでOKなのでしょうか?
887デフォルトの名無しさん:2006/10/29(日) 03:19:43
compositeパターンでググればいいんでない?
888デフォルトの名無しさん:2006/10/29(日) 03:35:00
std::list でも応用しれ。
889デフォルトの名無しさん:2006/10/29(日) 03:35:18
froggerがn-ary木(枝がn本の木)
http://sourceforge.jp/projects/frogger/

ファルシステムみたいにタグの親子関係のツリー作ってる。
890デフォルトの名無しさん:2006/10/29(日) 04:39:42
VS2003+MSXMLでDOMの取り扱いを試みています。
下記サイトのサンプルを実行したところ、出力は正しく出来ました。

ただ、終了時にcomip.hの_Release()で例外が投げられてしまいます。
CoUninitialize()をコメントアウトしたところ、滞りなく終了する事ができました。
このままで良いのでしょうか。アドバイス頂ければと思います。

http://www7a.biglobe.ne.jp/~forte/xml/xmlread.htm
891デフォルトの名無しさん:2006/10/29(日) 04:50:09
>>890
こんな感じで実行してみて、例外消えませんか?
(スマートポインタがCoUninitialize呼ぶ前に開放されるようにする)

CoInitialize();
{
処理をブロックで囲む
}
CoUninitialize();
892デフォルトの名無しさん:2006/10/29(日) 04:51:18
C言語で、あらかじめデータを定義する場合、

char data1[]="aiueokakikukekosasisuseso";

とかって出来るけど、これが、64kバイトとかでかいデータの場合、
どのように書いたらいいですか?
ファイルから読むのではなく。リソースファイルを使うのでもなく。
893デフォルトの名無しさん:2006/10/29(日) 04:52:39
>>892
まずは自分が思ったとおりに書いてみろ。何か問題があるか?
894デフォルトの名無しさん:2006/10/29(日) 04:53:08
それがどんな処理をされるのかによる
895デフォルトの名無しさん:2006/10/29(日) 04:55:41
>>893
自分が思ったとおりだと、データはバイナリなので、

char data1[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,\
0x09,0x10・・・

などと、64kの場合は、0x00 が、65536個続きます。

896デフォルトの名無しさん:2006/10/29(日) 04:59:52
>>891
ご指摘のようにしたところ無事に終了することができました。
ありがとうございました。
897デフォルトの名無しさん:2006/10/29(日) 05:00:47
データの埋め込みで調べて見つけたページ。わらた
http://dream.freespace.jp/perl-bin/puma/lng/joyful.cgi?print+200507/05070008.txt
898デフォルトの名無しさん:2006/10/29(日) 05:15:12
>>897
ワロス。
すげー逸材だw
899デフォルトの名無しさん:2006/10/29(日) 05:19:22
>>895
だから、それで何の問題がある?
900デフォルトの名無しさん:2006/10/29(日) 05:21:07
>>899
1.ヘッダファイルサイズが異常にでかくなる。(データファイルと比較して約5倍)
2.コンパイル時間がすげー長くなる
3.仮想メモリを異常に食う
901デフォルトの名無しさん:2006/10/29(日) 05:27:46
>>900
ヘッダに定義を置くな。
902デフォルトの名無しさん:2006/10/29(日) 05:32:34
>>900
そんだけデメリットが分かってるならファイルから読めばいいのに。
903デフォルトの名無しさん:2006/10/29(日) 06:26:21
>>900
別に1行で宣言しなきゃならん理由はないんだから行末の ¥ はいらんぞ。
それとったらコンパイル時間に関しては多分改善されるぞ。
いくらなんでもコンパイラ屋もそんな糞長い(論理)行を処理することは前提としてないだろうからな。
904デフォルトの名無しさん:2006/10/29(日) 07:06:50
>>903
どゆこと?
まさか、64k個の、0x00を、全部続けて書けといってる?
それやると、テキストエディタでえらいことになるだろ
905デフォルトの名無しさん:2006/10/29(日) 07:55:57
普通に改行こみでコンパイルできるだろ。

char
data
[
]
=
{
0x00
,
0x00
,
0x00
}
;
906デフォルトの名無しさん:2006/10/29(日) 07:59:04
単に、
char data1[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x10・・・
でいいだろ、ってこった。

だがしかし、>895を読む限り全て0と言っている気がするのだが。
それなら更に簡単に、
char data1[65536] = {0,};
でAll0になる。
907デフォルトの名無しさん:2006/10/29(日) 09:07:17
0x00 を 65536 書いたぐらいでえらいことになるテキストエディタって、あるの?
908デフォルトの名無しさん:2006/10/29(日) 09:15:56
>>907
メモ帳とか?w
909デフォルトの名無しさん:2006/10/29(日) 09:31:12
自作クラスに<utility>のoperatorを使おうと思い、
#include <utility>
using namespace std::rel_ops;
を追加しましたが、他の場所で使っているiteratorの演算子と衝突してしまい、
C2593エラー (operator '!='があいましです)
というエラーが出てしまいます。

そのため、自作クラス中だけにutilityのoperatorを使えるようにしたいのですが、
class A
{
public :
operator == () {}
operator < () {}
using namespace std::rel_ops;
}

とすると、今度は
C2059 構文エラー
となってしまいます。

このような場合、どういう風に記述すればよいでしょうか?

ちなみに環境はVC8です
910デフォルトの名無しさん:2006/10/29(日) 09:51:40
>>909
ほほう、そんなものがあるのか。初めて見たが・・・

http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html
"The rel_ops operators are not useful. They were a mistake."

・・・これはひどい。
911デフォルトの名無しさん:2006/10/29(日) 09:57:31
>>909 貴様かな打ちだな。
912デフォルトの名無しさん:2006/10/29(日) 09:59:57
>910

>The rel_ops operators are not useful. They were a mistake. If you
>insist on using them, you will have trouble. Nobody will care, because
>you asked for it.

わかりやすく噛み砕いて訳すと「使うな」ということでFA?
913デフォルトの名無しさん:2006/10/29(日) 10:06:59
valarray, vector<bool> みたいなもんか。他にもなんかあったっけ?
914デフォルトの名無しさん:2006/10/29(日) 10:35:30
>>909
boost::operators使え。
915デフォルトの名無しさん:2006/10/29(日) 11:22:57
>>914
おぉ!boostにもoperatorが!
さっそく調べてみます。

ありがとうございます
916デフォルトの名無しさん:2006/10/29(日) 12:43:33
1 template <class I, class O>
2 O Foo<I, O>::bar(I i1, I i2, O o, bool b) {
3 return o;
4 }

上記コードで

c:\Foo.cpp(2): error C2143: 構文エラー : ';' が '<' の前にありません。

とエラーが出ます。

お詳しい方、教えていただけないでしょうか。
917デフォルトの名無しさん:2006/10/29(日) 12:48:50
コンパイラとバージョンを言え
918デフォルトの名無しさん:2006/10/29(日) 12:59:41
>>779
「tryで抜ける」ってどうよ?
919デフォルトの名無しさん:2006/10/29(日) 13:25:27
すみません。

VC++ 2003 ProとVC++ 2005 Expで試しましたが、どちらも同じ結果でした。
920デフォルトの名無しさん:2006/10/29(日) 13:34:54
struct Foo{
  template <class I, class O> O bar(I,I,O,bool);
};
template <class I, class O> O Foo::bar(I i1, I i2, O o, bool b) {
  return o;
}
ってことか?それとも、
template <class I, class O> struct Foo
{
  O bar(I,I,O,bool);
};
template <class I, class O> O Foo<I,O>::bar(I i1, I i2, O o, bool b) {
  return o;
}
ってことか?
921デフォルトの名無しさん:2006/10/29(日) 13:41:53
スレッド間でint形の変数をフラグとして共有したのですが、
volatileをつけとけばOKでしょうか?
排他機構をつけたintラッパとか書かないとだめでしょうか?
922デフォルトの名無しさん:2006/10/29(日) 14:01:09
>>921 環境による。
923デフォルトの名無しさん:2006/10/29(日) 14:06:43
template <class InputIterator, class OutputIterator>
class MimeCoder {
public:
  virtual OutputIterator filter(InputIterator first, InputIterator last, OutputIterator result, bool fin = false) = 0;
  virtual OutputIterator finish(OutputIterator& result) = 0;
};
template <class InputIterator, class OutputIterator>
class Base64Encoder : public MimeCoder<InputIterator, OutputIterator> {
public:
  Base64Encoder() : len(0), linepos(0) {}
  virtual OutputIterator filter(InputIterator first, InputIterator last, OutputIterator result, bool fin = false);
  virtual OutputIterator finish(OutputIterator& result);
private:
  int linepos;
  unsigned char curr[3];
  int len;
  void encodeCurr(OutputIterator& result);
};
template <class InputIterator, class OutputIterator>
OutputIterator Base64Encoder<InputIterator, OutputIterator>::filter(InputIterator first, InputIterator last, OutputIterator result, bool fin) {
  return result;
}

ということです。


以下サイトのソースを理解してテンプレートの勉強をしようと思ってコンパイルしてみようと考えましたが、
できない理由がわからなくて質問させてもらいました。

ttp://www.s34.co.jp/cpptechdoc/misc/b2a/index.html

924デフォルトの名無しさん:2006/10/29(日) 14:13:03
>>923
それ全体をコンパイルするとエラーにならないぞ。
925デフォルトの名無しさん:2006/10/29(日) 14:13:03
>>923
コピペしたソースは gcc/VC8 で何事もなく通ったぜ?
926デフォルトの名無しさん:2006/10/29(日) 14:34:14
解決しました。

クラスの定義を.hに、実装を.cppに行なっていたのですが、エラーの原因はヘッダをインクルードしていないからでした。

お騒がせしました。
927デフォルトの名無しさん:2006/10/29(日) 14:38:38
馬鹿か
928デフォルトの名無しさん:2006/10/29(日) 14:46:16
>>921
sizeof(int)以下ならvolatileでオッケー。
排他するのは無駄。
929デフォルトの名無しさん:2006/10/29(日) 14:49:07
そうか?mutex使わないとまずいんでないかい?
930デフォルトの名無しさん:2006/10/29(日) 15:07:22
WindowsのInterlocked関数のようにアトミックに実行できることが保証されていれば、
それに関してmutexは要らない。
931デフォルトの名無しさん:2006/10/29(日) 15:19:32
>>928 とか言ってる馬鹿がいたな。
932デフォルトの名無しさん:2006/10/29(日) 17:14:06
任意のクラスのデフォルトコンストラクタを使えなくしたいんですが、
どうすれば良いんでしょうか。
933デフォルトの名無しさん:2006/10/29(日) 17:19:39
>>932
自前でコンストラクタを定義したらいいと思う。
(それも使われたくなければprivateでいいから。)

任煮のクラスというのが既存の改変できないクラスというなら知らぬ。
934デフォルトの名無しさん:2006/10/29(日) 17:22:32
デフォルトコンストラクタをprivateにすればよろし。
singleton, multitonの実装で使われるテクニックなので、
詳しくはそのあたりを調査してちょうだい。
935デフォルトの名無しさん:2006/10/29(日) 17:27:03
>>933
>>934
どうもありがとうございまっすす。
936デフォルトの名無しさん:2006/10/29(日) 17:33:13
>>874
19じゃね?
937デフォルトの名無しさん:2006/10/29(日) 17:57:58
20だろ。
938デフォルトの名無しさん:2006/10/29(日) 18:14:43
20だな。
939933:2006/10/29(日) 18:18:33
どうでもいいが、任煮ってなんだw ぱっと見は似ているけど。
誤字にはそれなりに気を使ってたつもりだから、ちょっとへこんだorz
940デフォルトの名無しさん:2006/10/29(日) 18:21:54
任意:にんい
任煮:にんに?
941デフォルトの名無しさん:2006/10/29(日) 21:23:22
CのプログラムをC++に書き換えてもらえませんか??
942デフォルトの名無しさん:2006/10/29(日) 21:25:09
>>941 断る。
943デフォルトの名無しさん:2006/10/29(日) 21:27:52
>>942
難しいですかね??
944デフォルトの名無しさん:2006/10/29(日) 21:28:33
だがOK
945デフォルトの名無しさん:2006/10/29(日) 21:29:48
>>941
どう書き換えるかによっていろんな答えがあるわけなんだが。
946デフォルトの名無しさん:2006/10/29(日) 21:35:52
・Cは文字定数は自動的に整数とみなされるが、C++はそうではない。
・Cはグローバル変数を何度宣言してもOKだが、C++はそうではない。
・C++はmain関数を直接的にも間接的にも再帰できない。
・C++はCで6ヶ月かかる計画に比べ、1〜2年かかる。
947デフォルトの名無しさん:2006/10/29(日) 21:36:46
・C++ではNULLは0である。
・C++が使える奴は大抵ウザくてキモい。
948デフォルトの名無しさん:2006/10/29(日) 21:39:00
構造化プログラミングされたものをオブジェクト指向のクラス構成にすると妄想。
表向き書き換えるだけと言いながら事実上の再設計だったりと、
人をだまくらかすにもやりようはあるもんだ。
949デフォルトの名無しさん:2006/10/29(日) 21:41:40
>>942
どぉしたらいいでしょうか・・・
950デフォルトの名無しさん:2006/10/29(日) 21:42:25
そのCコードを機械語にしてasmすればOK
951デフォルトの名無しさん:2006/10/29(日) 22:22:57
>>949
とりあえずunko.cをunko.cppにすれば?
952デフォルトの名無しさん:2006/10/29(日) 22:39:43
>・C++が使える奴は大抵ウザくてキモい。

あるあるwwww
953デフォルトの名無しさん:2006/10/29(日) 22:42:40
まあ、C++は完全なる変態言語だからなwww
954デフォルトの名無しさん:2006/10/29(日) 22:50:07
>>953
普通に同意できるから困る。
955デフォルトの名無しさん:2006/10/29(日) 23:14:11
普通の思考回路の人には理解できそうに無い気はするな。
956デフォルトの名無しさん:2006/10/29(日) 23:17:24
Template用いて、コンパイル時にスレッドのデッドロックを検出する方法
ってありますか?
957デフォルトの名無しさん:2006/10/29(日) 23:26:41
なぜTemplateを使えばデッドロックが検出できると思ったのか82回くらい聞きたい。
958デフォルトの名無しさん:2006/10/29(日) 23:28:57
>>956
あなたの思考が読めません。
なぜそんなことが出来ると考えるに至ったのか…
959デフォルトの名無しさん:2006/10/29(日) 23:31:45
Lokiを考えた天才もいるんだから、もしかしたらtemplateで
デッドロックを検出できるかも・・・・?と考えたのかもしれんね。
960デフォルトの名無しさん:2006/10/30(月) 00:00:31
デッドロックってぇのは資源獲得の順番に一貫性がないってぇことだから、
それを template でチェックしてコンパイル時に洗い出すってぇことも、
あながち不可能ではないかもしれん。やり方は皆目見当がつかないけどね。
961デフォルトの名無しさん:2006/10/30(月) 00:21:41
C++が変態言語だと?
962デフォルトの名無しさん:2006/10/30(月) 00:34:53
しょうがないだろ、作ったやつがSM目的(お前らがM)だったんだから。
963デフォルトの名無しさん:2006/10/30(月) 00:39:36
>>949
まずは、何がしたいのかを相手に分かるように質問する。

C++に書き換えるとはどういう意味か。
Cでコンパイルできるソースは多くの場合そのままC++のコンパイラでも
コンパイルできて、正しく動く。
一部の互換性が無い部分については(大抵)ちょっとした修正をすれば対応できる。

もし上記のようなことをしようとしていて駄目だったなら、とりあえずどんなソースを使って、
どう不具合があったか(コンパイル時のエラーとか、実行時の振る舞いがおかしいとか)を
具体的に書けば、答えが貰えるかもしれない。

そうではなく、C++らしいオブジェクト指向的なソースに書き直してほしいという話なら、
自分で基礎から勉強するか、金払って人でも雇え。
964デフォルトの名無しさん:2006/10/30(月) 00:42:49
実は何年も前に書かれたものをC++として再度作り直すことになったんですが・・・

(中略)

最初にこれ作った人はもう死んじゃってて・・・。
965デフォルトの名無しさん:2006/10/30(月) 00:58:56
あっそ。
帰れ
966デフォルトの名無しさん:2006/10/30(月) 05:11:25
>>964
実はCで書かれたものをC++として再度作り直すときの考え方として3つの

(中略)

帰れ・・・。
967デフォルトの名無しさん:2006/10/30(月) 05:52:25
>>962
S は Stroustrup の S かぁぁぁぁぁぁアッー!!
968デフォルトの名無しさん:2006/10/30(月) 07:25:13
SutterのSかもよ
StepanovのSかもよ
969デフォルトの名無しさん:2006/10/30(月) 08:32:31
>>964
例えば、(学校で習うような)古語を現代語に書き換える方法を教えてください!
って漠然とした問いに答えられる人が世の中にいると思うか?
970デフォルトの名無しさん:2006/10/30(月) 09:33:50
 
971デフォルトの名無しさん:2006/10/30(月) 09:37:13
typedef typename vector<int>::iterator vint_itor;
typedef typename list<int>::iterator lint_itor;

この2箇所でエラーが発生します。エラー文は、error C2899: 型名はテンプレート宣言の外側で使用できません。

使用ソフトはVC++EEです

どうしたら良いか、教えていただけないでしょうか?
972デフォルトの名無しさん:2006/10/30(月) 09:41:17
>>971
typenameの目的を理解している?
973デフォルトの名無しさん:2006/10/30(月) 10:36:26
>>971
答えが無いので、一応「どうしたら良いか、教えて」おく。
typenameを書かないこと。以上。

そのエラーメッセージは、
typename cannot be used outside a template declaration
というもので、
typename はテンプレート宣言の外側で使用できません。
とでも訳すべきだと思う。

template < typename T >
void f()
{
typedef typename std::vector<T>::iterator TIter ; //OK

//型か値かは、すでに分かる。
typedef typename std::vector<int>::iterator IntIter ; //ERROR
}
974デフォルトの名無しさん:2006/10/30(月) 11:46:12
>>971
まぁ自然な発想だとは思うが、現行の規格を恨んで >>973 に従い、次を待て。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382
975デフォルトの名無しさん:2006/10/30(月) 12:15:01
>>818
申し遅れましたが、structを部分的にカプセル化したかったということです。
メンバに直接アクセスできる気軽さと軽さを求めていましたので……
structの延長線上にあるのでメモリ使用量が変わるのもちょっと気分のいいものではなかったんで。
976デフォルトの名無しさん:2006/10/30(月) 14:35:46
templateでデッドロック検知は流石に無理じゃね?
977デフォルトの名無しさん:2006/10/30(月) 15:19:55
>>976
だな。デッドロック発生条件が静的に決まっているなら不可能とは断言できないが、
まあ無理だろ。

>>956
ttp://en.wikipedia.org/wiki/Deadlock
ttp://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF
英語の方はよくまとまっていて秀逸。
日本語の方はかなーりいまいちだな…
978デフォルトの名無しさん:2006/10/30(月) 17:08:03
オブジェクトの同期を取ってくれるようなTCPライブラリってないでしょうか。
979デフォルトの名無しさん:2006/10/30(月) 17:10:57
なんか来たな
980デフォルトの名無しさん:2006/10/30(月) 18:26:56
こういう場合は「標準には無い」と答えてあげよう。
981デフォルトの名無しさん:2006/10/30(月) 19:48:58
>>953

わけを教えて〜
982デフォルトの名無しさん:2006/10/30(月) 19:50:53
C++がHaskellを取り込むのはいつですか?
983デフォルトの名無しさん:2006/10/30(月) 19:53:02
984デフォルトの名無しさん:2006/10/30(月) 19:58:10
>>978
探せばある
ググれ
985デフォルトの名無しさん:2006/10/30(月) 20:49:06
VC2003でプロジェクトをビルドする際に
--enable-utf8 を追加したいのですが、IDEのどこに設定すれば良いのでしょう?
986デフォルトの名無しさん:2006/10/30(月) 20:54:03
設定すべき場所に設定すればいいんじゃないでしょうか
987デフォルトの名無しさん:2006/10/30(月) 20:57:28
つーかそれautoconfのオプションだったりしないのか?
988デフォルトの名無しさん:2006/10/30(月) 21:02:23
次はまだ?
989デフォルトの名無しさん:2006/10/30(月) 21:03:35
>>972 >>973 >>974

返事が遅れるすみませんでした。
本の通りに打ってみたのですが、本が間違ってるんですね。
typenameを消すと通りました。
ありがとうございました☆
990デフォルトの名無しさん:2006/10/30(月) 21:05:07
路線バスがすれ違う時に運転士同士が挙手して挨拶するんだけど
あれ見てると危なくて仕方ない。
ここに行って
「挙手反対」

って書き込んであげて。
http://hobby7.2ch.net/test/read.cgi/bus/1161304534/

2ちゃんで世の中動かせると思ってる挙手賛成派が、必死になってレスするから面白いよ
991デフォルトの名無しさん:2006/10/30(月) 21:15:22
>>987
pcre をUnicode 対応にしてビルドしたいのです。

ソースはVC2003用の物です。
http://www.renatomancuso.com/downloads/dpcre61_dll_src.zip
992991:2006/10/30(月) 21:42:38
低レベルですみません。
configure コマンドやautoconf はVC には無いという事でOKでしょうか?
993デフォルトの名無しさん:2006/10/30(月) 21:56:35
低レベルですみません。
次スレってまだでしょうか?
994デフォルトの名無しさん:2006/10/30(月) 22:23:39
なぜ自分で立てない?
995デフォルトの名無しさん:2006/10/30(月) 22:32:46
立ててくる.しばし待たれよ.
996デフォルトの名無しさん:2006/10/30(月) 22:37:50
立てました.

C++相談室 part54
http://pc8.2ch.net/test/read.cgi/tech/1162215248/
997デフォルトの名無しさん:2006/10/30(月) 22:42:20
998デフォルトの名無しさん:2006/10/30(月) 22:57:08
文句があるならD言語やれよ
999デフォルトの名無しさん:2006/10/30(月) 23:05:46
さあ>>1000よ俺を超えていけ
1000デフォルトの名無しさん:2006/10/30(月) 23:07:48
任せろ!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。