[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/16 11:48 / Filesize : 200 KB / Number-of Response : 824
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part61



1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

454 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:56:02 ]
思ったw

455 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:26:41 ]
.netフレームワークを要求する商用アプリで動きが機敏なアプリをいまだかつて見たことないな。

456 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:32:25 ]
多言語からc++を呼ぶインターフェイスで
std::cout
がおかしくなる原因になってるらしくなんとかしたい
#define __streambuf なにか
にできればいいのだけど voidに置き換えるとコンパイルとおらない
何か適当なクラスでもないでしょうか?



457 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:38:17 ]
ios::sync_with_stdio で解決されるような問題じゃなくて?

458 名前:456 mailto:sage [2008/04/10(木) 00:12:16 ]
他言語の処理系がstdcoutをすでにリンクしているのに
さらにその処理系から呼び出すcのプログラム中でもリンクしてるのが
問題なってる可能性があるような気がしています

なので
#define __streambuf Hoge
できると多分うまくいくのではないかと

459 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:17:47 ]
XNAなめんな

460 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:22:13 ]
>>456
多言語から呼び出すってっ、もしかすると他言語からDLL呼び出しすることってことかな?
だったらライブラリの初期化がうまく言ってないんじゃないか?dllmainはこねこねした?


461 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:23:42 ]
あと、DLLはマルチスレッドライブラリでコンパイルだよ。

462 名前:456 mailto:sage [2008/04/10(木) 00:24:19 ]
>>460
正確にはlibhoge.soを呼んでます
libhoge.soがstd::stream関係をリンクしてます



463 名前:460 mailto:sage [2008/04/10(木) 00:27:49 ]
linuxでしたか。>>460はwinの場合の注意事項でした。

464 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 07:50:43 ]
>>461
MTでコンパイルしないといけない決まりでもあるの?

465 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 08:21:08 ]
>>464
ある。
DLLをコンパイルするときはMTでする必要がある。プロジェクトの作成でDLLを選択すると自動的にマルチスレッドランタイムライブラリが選択される。
呼ぶ側はどっちでもいい。

466 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 11:49:02 ]
>>465
何の処理系の話か知らないがVisualC++なら
シングルスレッドのランタイムの静的ライブラリをリンクしたシングルスレッド専用のDLLを普通に作れる

467 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 11:57:21 ]
端で見てて想像した通りの食い違い方w

468 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 12:10:14 ]
初歩的な質問で申し訳ないんだが、他言語から C++ の
ライブラリを使って問題無いはず、という保証はあるんだろうか?

あと、普通に C++ で呼び出すとかなぜしないのだろうか。
(これは状況がわからんとなんとも言えないけど)

469 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 14:18:03 ]
operator==() の定義はクラスの中とクラスの外に置けますがどのように
使い分けるのでしょうか?

std::type_info はクラスの中でその他はクラスの外が多いのですが。


470 名前:デフォルトの名無しさん [2008/04/10(木) 15:34:04 ]
別にoperator==()に限らずメンバ関数は中にも外にも置けるけど。

471 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:04:36 ]
ププ

472 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:05:09 ]
ペペ



473 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:30:44 ]
== どうするかは状況によるんでは。無理無く member にしないで
いいならそうすればいいような気がするが。中身の情報が必要な
場合に member にしてるんじゃないの?普通に生じる状況だと思うけど。

474 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:43:05 ]
メンバに出来るものは中に書く。
メンバに出来ないものは外に書く。
以上。

475 名前:デフォルトの名無しさん [2008/04/10(木) 18:05:52 ]
c++のエラー出力の文字コードがutf-8になっているのですが、
euc-jpにする方法ありますか?
Linuxのeuc-jp環境でプログラミング行っており、
gcc version 4.1.2 です。

476 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 18:18:07 ]
iconv

477 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 18:40:50 ]
ロケール切り替えろとしか

478 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 19:06:32 ]
public 関数だけで実装できる場合は非メンバーにする。
friend を使って非メンバーにすることもある。


479 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 20:50:36 ]
式の対称性が必要なら非メンバー

480 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 20:59:53 ]
自身への参照を返すことが期待されるか、自身を変更する場合は、メンバーにすることが漏れは多いな。
operator=, +=等はメンバに。operator==, <<, +等は非メンバ(場合によってはfriend)にしてる。


481 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:08:54 ]
op == あたりの話はeffective C++に書いてなかった?
もう忘れちゃったけど。
グローバルにop ==を置くことでカプセル化が上がるとか
その話とはまた別?

482 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:20:10 ]
friend はできれば避けた方が良いというの無かったっけ?



483 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:12:02 ]
C++ Coding Standards の 44 には
「できるだけ非メンバーかつ非 friend の関数を書くようにしよう」
というのがありました。

484 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:19:02 ]
C++の本質はやっぱプリプロセッサとテンプレートだろ・・・
オブジェクト指向なんてうんこ


485 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:00:41 ]
プリプロセッサはちょっと違うだろ・・・
現実的にメタプログラミングするのには必要だけど。
個人的にはデストラクタを推すね。

2行目は同意。

486 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:08:04 ]
デストラクタとはいいところをつくね。
RAII 万歳!

487 名前:デフォルトの名無しさん [2008/04/10(木) 23:25:35 ]
friendかな


488 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:58:56 ]
>>485 == >>486 ??

489 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:01:31 ]
デストラクタの価値が分からないうちは
プログラマの資格なしだぜ

490 名前:485 mailto:sage [2008/04/11(金) 00:03:01 ]
>>488
ID出ない板だからどうしようも無いけど、
違うとだけ。

491 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:14:49 ]
デストラクタはクリティカルセクション解除するのに使ってる。
メモリリークどころの騒ぎじゃない

492 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:17:31 ]
Javaとかどーやってんだ?
デストラクタ



493 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:20:23 ]
Javaはcloseとかdisposeとかメソッド作って
呼び出さないといけないんじゃなかったっけ?

494 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:25:56 ]
Javaはデストラクタ勝手に作ってくれるから。
DB接続とかファイルハンドルにクリティカルセクションだの
なんでも閉じてくれる。


495 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:28:48 ]
前スレから
pc11.2ch.net/test/read.cgi/tech/1200044614/496-

496 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:44:30
  つまるところc++ではデストラクタに頼るべき。

497 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:54:04
  C++はつまるところデストラクタのことだからな
  closeさせといてガベージコレクタがあるとか抜かす言語は笑えるな
  intは回収できるが巨大なファイルリソースはリークするわけだ

498 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:06:22
  日本語でおk

499 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:08:34
  >closeさせといてガベージコレクタがあるとか
  禿げあがる程同意。
  
  C#はusing(o1,o2,...){}があるから多少マシだけど、
  forみたいにusing用のスコープ作るから
  スコープ違いが混じるとネストして見辛くなる。
  どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。
  
  javaのtry-finally-closeに至っては論外。
  しかもcloseで例外出たらfinally内で潰さないと
  try内で発生したより重要な例外が消されるし・・・。

500 :デフォルトの名無しさん [sage] :2008/02/15(金) 16:33:04
  >どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。
  そして言語はC++/CLIへと進化するのであった、まる

496 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:34:08 ]
Javaをはじめ、メジャーな言語のGCはメモリ不足しか認識しないから、
明示的にcloseしない場合、メモリに余裕があればfinalizeは呼ばれず、
DB接続も閉じられない

そしてコネクションプールのタイムアウトで死に始める業務アプリ
鳴り始めるサポートデスクの電話機達

497 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:39:21 ]
まぁJavaなんてマーケット戦略で広まっただけのうんこ言語だからな・・・
プログラマと名乗るくらいならC++くらいできる頭を持って欲しい・・

498 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:59:54 ]
finalize()でリソース解放なんて保険でしかないからな

499 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:00:32 ]
リソース管理で似た話を読んだことある気がしてたけど思い出せた
ttp://mag.autumn.org/Content.modf?id=20050506023118

500 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:00:40 ]
でもね、C++は巨大で複雑怪奇だからね。Cを引きずってる面もあるし。
無駄を削ぎ落として細部を明確にした言語が望まれるというのもわかるよ。
それとGCの有用性とは別の話だが。

501 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:03:52 ]
実はVBなんかも
リソース周りは優秀だったりする

502 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:26:11 ]
continuationを明示的に扱えない言語はうんこ



503 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:26:35 ]
scheme習いたてですか?

504 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:55:30 ]
>>503
C++習いたてです。

505 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 07:46:34 ]
C#のusingの使いづらさは異常
scopedとでもして識別子が入ってるブロックの最後でdisposeしてくれたほうがよかった

506 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:50:00 ]
素朴な疑問です。

#include <iostream>
struct S { virtual void hoge() = 0; // 純粋仮想のみ };
struct S1 : public S { void hoge() { std::cout << "S1" << std::endl; }};
struct S2 : public S { void hoge() { std::cout << "S2" << std::endl; }};
int main()
{
 S1 s1;
 S2 s2;
 S& r1 = s1;
 S& r2 = s2;
 r1.hoge();
 r2.hoge();
 r1 = r2; // 基本クラスの参照を代入
 r1.hoge();
 r2.hoge();
 return 0;
}

VC8で上記のコードを実行すると
S1
S2
S1
S2
と表示されました。
r1 = r2;はS::operator=を呼ぶだけなので何も変わらない、と理解したのですが、
これはC++的に正しい挙動なのでしょうか?
それとも未定義でたまたまこうなっているだけなのでしょうか?

507 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:55:40 ]
あ、改行を削ったらコメントをミスりました。
> struct S { virtual void hoge() = 0; // 純粋仮想のみ };

> struct S { virtual void hoge() = 0; /* 純粋仮想のみ */ };
です。

508 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:56:43 ]
単純に、自動生成されたoperator=(S, S)で仮想関数テーブルが書き換わらないようになってるだけ。

509 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:57:18 ]
s1, s2のうちSの部分だけがコピーされた、と解釈すればわからんでもない

510 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 09:00:15 ]
とりあえず解決するには自分でS2 operator=(S, S)を定義すればいいように思えるが、
それはS = Sの一般的な代入に関して考えるとかなり狂っているから諦めろって言う話でっていう

511 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:27:47 ]
>>498
同意。finalizeって呼ばれるとは限らないとか。ほんとに気休め程度だね。


512 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:29:20 ]
>>506
代入や他オブジェクトでの初期化でvptrは変更されない。




513 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 15:56:17 ]
class A { friend class B; int x; };
class B { class C {}; };

VC8.0 では class C から class A の x が参照できますがこれは C++ の仕様ですか?


514 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 19:00:01 ]
Cのreadableなプログラムを自動生成するメタ言語みたいなの
ないでしょうか?
readableじゃないのならあるのですが、読めないと意味ないのです

515 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:01:17 ]
具体例を。

516 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:08:22 ]
まともなCソースも >>514 には、readable じゃなさそうだ...。

517 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:17:27 ]
vector<int>で何個か反復子を進めたあと、
それが今何番目の要素なのかを知る関数はないですか?

518 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:20:51 ]
>>517
std::distance

519 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:21:19 ]
i - v.begin();

520 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:55:08 ]
できました、ありがとうございます。

521 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:34:09 ]
mag.autumn.org/Content.modf?id=20050506145337
ここ読むとC++よりもJAVAのほうがリソース管理に関して
優れているように思えるんだけど

522 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:42:17 ]
だから何だよ



523 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:46:30 ]
優れているというかパフォーマンスを犠牲にしてリソース管理の安全性を高めたという方が近いかな。
そんな事いったらC++も保守性を犠牲にパフォーマンスを高める余地のある言語と言えるけど。
ただJavaの場合は“余地”どころかプログラマに選択をさせない完全な“切捨て”であるけどね。
だからプログラマが手段を選択できる余地の残っているC++の方が優れている。終了。

524 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:49:22 ]
手段を選択する必要のある場面においては、だけどな。

525 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:15:33 ]
javaってfinallyの書き方間違えると死ねるしなあ
という話が >>495 にあるよ

jdbcでoracle使ったことがある人は知ってると思うけど、
closeし損ねるとリークしてそのうち動かなくなるんだよね

これを注意深く追ってると、「なんだかCでやってんのと変わらんなあ」
と思うぜ、実際。

526 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:27:32 ]
だってメモリしか管理してくれないもの


527 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 07:08:37 ]
>521
「RAIIが発明されるまでのC++」については、Javaのほうが
リソース管理が優れていた、と云わざるを得ない、けどねぇ。

528 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 07:25:04 ]
他のリソースも管理してくれればいいのになあ。
ファイルハンドルが足りない時には
ファイルクラスのインスタンスへのガベコレを
優先的にやってくれるとか。

529 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 10:47:50 ]
>>527
> 「RAIIが発明されるまでのC++」

って具体的に何を指すの? RAII ってプログラミング
ポリシーだと思うんだけど。「発明」されたっていまいちピンと来ない。



530 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 11:04:02 ]
RAII が浸透してない C++ って感じのことを言いたいんじゃないか?
未だに RAII を取り入れない C++ があるとは信じられないのかもしれないが。

531 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:21:55 ]
>>528
デストラクタを活用するべき

532 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:25:18 ]
javaの話だろ



533 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:50:09 ]
>>527
C with class の話ですか?
C++は初期のARMがかかれた頃から散々言われていますけど。

534 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:05:47 ]
>>529
強いて言えば、テンプレートがなかった頃には、
auto_ptrや(削除子付きの)boost::shared_ptrのような
汎用的なものは作りづらかったと思う。

それでも、fstreamみたいに個別に作っていく手があったはずだけど。

535 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:38:58 ]
なんでそこで糞設計のstreamを持ち出すかなー

536 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:33:50 ]
とりあえずデストラクタでcloseしてくれるからいいだろ。
今は糞設計かどうかなんて関係ない。

537 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:13:37 ]
自分のクラスにiteratorをアタッチ
するにはどうすればよいの?

538 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:45:20 ]
>>537
クラスって新しい container 作ってんの?
普通に vector とかにオブジェクト入れて iterator 使うとかいう話
じゃないんだよね?

539 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 02:36:34 ]
>>537 アタッチの意味がわからん。

540 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 07:56:33 ]
Rubyみたいにアタッチしたいんだけど
なんでできないの?

541 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 08:59:06 ]
だからアタッチって何だよ

542 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 09:20:53 ]
ウラララララーって叫ぶやつじゃね?



543 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:55:57 ]
それは、アパッチ

544 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:56:46 ]
>>543
叫ぶやつはジェロニモだ

545 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:24:27 ]
だってオラは人間だから

546 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 21:52:48 ]
テンプレートクラスとクラステンプレートの違いを教えてエロい人!!

547 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 21:58:18 ]
クラステンプレートを使って作られたクラスがテンプレートクラス

548 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:09:23 ]
何か詳しく書かれたサイトがあれば貼っていただきたいです。

549 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:14:51 ]
お前誰だよ

550 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:20:43 ]
つーか言葉にこだわってどーすんの
テンプレート勉強すりゃわかることだろうに

551 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:32:59 ]
ヒントがあれば十分だろ。
自分で考えて解決する楽しさを知らないやつは(ry

552 名前:551 mailto:sage [2008/04/15(火) 22:33:53 ]
>>551
誤爆しました。ごめんなさい、




553 名前:デフォルトの名無しさん [2008/04/15(火) 22:36:31 ]
輪講で必要なんです。
わかりにくかったので聞いてみました。

554 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:43:22 ]
>>552
流れとしてはわりと的を射ている気がするw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef