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


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

C++相談室 part53
501 名前:499 :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
無名名前空間内で前方宣言すればいいと思うよ。

506 名前:504 :2006/10/16(月) 19:06:16
>>505
あー、実際にやっていただければ、一目瞭然なのですが

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

というわけで、アクセス違反が発生してしまいます。

507 名前:504 :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
エラーメッセージ貼れ。

514 名前:512 :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
でかすぎるスタックはダメとかじゃなかったかしら?


535 名前:532 :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
ウホッ!いい Article
http://sourceforge.net/forum/forum.php?forum_id=624660

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
>>643 >>2

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
>>671
http://rfc-jp.nic.ad.jp/rfc/rfc2279.txt
http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
http://kamoland.com/comp/unicode.html

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
こういう話ね。
http://pc8.2ch.net/test/read.cgi/tech/1142667446/358-

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の間違いだろ。

729 名前:724 :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();
}

732 名前:723 :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

736 名前:723 :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`)

適当な本買うのが一番なんだろうけどな


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