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


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

C++相談室 part62



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

前スレ
C++相談室 part61
pc11.2ch.net/test/read.cgi/tech/1205059063/

520 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:41:40 ]
>>517
先生方のルールを参考にしてはどうかな
www.boost.org/doc/libs/1_35_0/boost/multi_array.hpp

521 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:53:51 ]
一応>>520のを書いておくと

クラス名        :小文字+アンダーバーの組み合わせ(例:multi_array)
ネームスペース名 :クラス名同様
ローカル変数名  :クラス名同様のルールで短めに
メンバ変数名    :クラス名のルールに加えて最後にアンダーバー
             短くなくても良い(例:allocated_elements_)
関数名        :クラス名同様
テンプレート型引数名:パスカルケース(例:NDims)
マクロ名       :大文字+アンダーバーの組み合わせ
             (BOOST_STATIC_CONSTANT)

522 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:54:58 ]
typedef enumはどうすれあいいの?

523 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:03:51 ]
typedefはクラス名同様
enumはメンバ変数名と同じ

ただ、boostの中で完全に統一されてるわけでもないみたい

524 名前:デフォルトの名無しさん [2008/06/30(月) 01:04:28 ]
>>517
unko_t unko;

525 名前:デフォルトの名無しさん [2008/06/30(月) 01:16:04 ]
Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。
その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、
VCで作成することはできますか?
検索してもgccばかりが見つかってしまって。

ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。

526 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:20:46 ]
>>525
dll と同じようなものです
UNIX系では shared object
Windows系では dynamic link library

527 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:41:04 ]
>>517
>438で出てたGoogleのルールのまとめ:
●ファイル名
ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc
●クラス名
各語の先頭を大文字にする。 FooBar
●名前空間名
ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar
●変数名
ぜんぶ小文字で、単語は_で区切る。 foo_bar
●メンバ変数名
ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_
●関数名
クラス名と同じ。アクセサだけは変数名と同じ。
●定数
先頭にkを付けて、単語区切りは大文字。 kFooBar
●マクロ名
マクロなんて使うな。

アクセサと定数が妙だなあ。


528 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:07:19 ]
定数の接頭語のkって何の意味?



529 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:43 ]
konstant。なぜかこれだけドイツ語。

530 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:47 ]
koteiのk

531 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:16:10 ]
>>518-521,527
細かくありがとうございます
いろいろな方法があるんですね
検討して、しっくりくる方法を選びたいと思います


532 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 03:23:02 ]
constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな
マクロ禁止なら全部大文字でもよさそうだが・・・

533 名前:デフォルトの名無しさん [2008/06/30(月) 03:40:28 ]
メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい

534 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 07:48:41 ]
>>533
boostにもあったりするよw
www.boost.org/doc/libs/1_35_0/boost/regex/v4/regex_format.hpp
> const traits& m_traits;
> const Results& m_results;
> OutputIterator m_out;
> ...

535 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:36:05 ]
標準的な識別子のプレフィックス一覧みたいなのなーい?
てか、どこの会社でもまちまちなんだろうけど。

536 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:41:49 ]
プレフィックス一覧って?
命名ルールなら上で出てるgoogleかboostので十分だと思うけど。

537 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:27:37 ]
なんか、なんちゃら記法みたいなのなかったっけ?
ポインタはpを付けるとか。C言語の時代か?

538 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:49:34 ]
ジャンガリアン



539 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:50:56 ]
ハンガリアン記法
ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95

ただし、ポインタにpを付けたりするのは
システムハンガリアンと呼ばれる間違ったハンガリアン記法。

本当のハンガリアン記法は
アプリケーションハンガリアンと呼ばれてる。

540 名前:デフォルトの名無しさん [2008/06/30(月) 19:08:04 ]
禿リアン

541 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:30:34 ]
>>539
おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。
けっきょくプレフィックスなんてないほうがいいのかね……


542 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:44:44 ]
プレフィクスの使い方を間違わなければ有用らしいよ

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B


543 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:29:03 ]
つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す
プレフィックスを付けるって感じ?
システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?

544 名前:506 mailto:sage [2008/06/30(月) 21:13:12 ]
>>508
ごめん。眠かったから間違えた。 by498

545 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:01:10 ]
void hoge(const std::vector<foo>& foos);
という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している
ヘッダもhoge.hでインクルードしないといけないでしょうか?
それともhoge.hでは
class foo;
と書くだけでおkでしょうか?

546 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:50:55 ]
データを線形リストでアクセス可能かつキューのように
扱えるデータ構造ってありませんかね?

data[3].hogeみたいにアクセスもしたいし
dequeue(data)みたにもアクセスしたい

547 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:58:57 ]
>>546
std::dequeが火を噴くときが来たな

548 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:19:19 ]
なんという出番w



549 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:09:47 ]
>>545
標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。
つまり class foo; だけじゃダメ。

550 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:33:31 ]
forkについて

1プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく

そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?

551 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:59:33 ]
>>550
まずスレ違い。OSの話で言語と関係無い。
で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。

552 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:05:57 ]
>>550
fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1213466622/l50

>そんな課題
C/C++の宿題を片付けます 111代目
pc11.2ch.net/test/read.cgi/tech/1214563642/l50

>解説して
www.google.com/search?q=fork

553 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:25:56 ]
質問です。
newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。

554 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:33:52 ]
>newでメモリを動的確保する場合失敗するとNULLが返るのですが
返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない

555 名前:デフォルトの名無しさん [2008/07/01(火) 13:11:01 ]
>>554
先生、失敗しないんですけど

556 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 13:24:11 ]
ワロタ

557 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:00:19 ]
struct test_type{ char mem[0x7FFFFFFF]; };

test_type *a = new test_type[0x7FFFFFFF];
if(a == NULL) printf("%s", "print format");

558 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:28:44 ]
>>555 for (;;) で囲め。



559 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:19:53 ]
コンパイラのバージョンを聞いたほうがいい
古いやつとか組み込み用は標準と違う動作をするだろ

560 名前:553 mailto:sage [2008/07/01(火) 16:19:49 ]
ご回答ありがとうございます。
コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?

561 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:27:37 ]
10年くらい前なら NULL を返したかもしれない
今はみんな bad_alloc を投げる

562 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:37:37 ]
msdn.microsoft.com/ja-jp/library/kftdy56f(VS.80).aspx
>In Visual C++ 2005, the C Runtime Library's new function will also
>throw a std::bad_alloc exception if the memory allocation fails.
>If you still want the non-throwing version of new for the C Runtime Library,
>link your program with nothrownew.obj. However, when you link with nothrownew.obj,
>new in the Standard C++ Library will no longer function.

563 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:03 ]
失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。

564 名前:デフォルトの名無しさん [2008/07/01(火) 19:52:48 ]
>>557
数学的に破綻してるコード嫌い

565 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:57:04 ]
今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、
最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。

566 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:00:24 ]
>>564
数学的に破綻って?

567 名前:デフォルトの名無しさん [2008/07/01(火) 20:18:41 ]
>>566
失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない

568 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:43:06 ]
大抵の環境で失敗するだろうから細かいことはいいんだお!



569 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:44:11 ]
size_tの最大値じゃん。

570 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:56:07 ]
>565
Express Edition は無料でいいんだが、MFCが使えん。

お偉いさんは、見た目が一番なんだよ。

571 名前:デフォルトの名無しさん [2008/07/01(火) 21:53:20 ]
>>570
見た目を気にするなら、なおさらMFCはダメだろ

572 名前:デフォルトの名無しさん [2008/07/01(火) 22:11:16 ]
>>569
何が?

573 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:35:10 ]
size_tは符号無し整数だよ。サイズは処理系定義だけど。
それはともかく、普通に2Gも確保出来るってのが・・・w

>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry

>>570
WTL+ATL使おうぜ

574 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:19 ]
>>573
メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。

これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。

575 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:04:33 ]
UNIX系はそうなんだっけか
まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし

576 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:04 ]
>>574
デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?

577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ]
>>574
単にスワップメモリで足りただけじゃね?

578 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:24:19 ]
>>576
典型的にはいらないページをスワップアウトしにいく

>>577
確保だけならスワップは発生せずに即終了する



579 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:35:06 ]
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
>>578の世界はLinuxだけで出来ている模様。

あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。

580 名前:デフォルトの名無しさん [2008/07/02(水) 01:31:51 ]
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが

だから、何でそうなる

581 名前:578 mailto:sage [2008/07/02(水) 01:42:20 ]
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな

あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから

582 名前:デフォルトの名無しさん [2008/07/02(水) 12:26:21 ]
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな

やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな

583 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:35:24 ]
std::size_t

584 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:36:06 ]
SIZE_MAX

585 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:03:07 ]
VC++のスレから来ました。相談させてください。

以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。

---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。

711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---

で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
 のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。

586 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:27:04 ]
template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){
   struct check{ void f(){ T* a=NULL; parent* b = a; } };

   ...
}

587 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:29:52 ]
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?

588 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:34:46 ]
class Tree {
Tree[] subtrees;
}



589 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:36:01 ]
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};

590 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:55:38 ]
template<typename T> struct node<T> {
  T value;
  node* prev;
  node* next;
  node* parent;
  node* first_child;

  static node* tree_next(node* n){
    if(n==NULL){ return NULL; }
    if(n->first_child!=NULL){ return n->first_child; }
    return tree_next_no_child(n);
  }
  static node* tree_next_no_child(node* n){
    if(n==NULL){ return NULL; }
    if(n->next!=NULL){ return n->next; }
    if(n->parent==NULL){ return NULL; }
    return tree_next_no_child(n->parent);
  }
};

for(node* it=n; it!=NULL; it=node::tree_next(it)){
  
}

591 名前:デフォルトの名無しさん [2008/07/02(水) 18:27:09 ]
>>587
C++を使う
できない人は他のスレで聞く

592 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 18:47:12 ]
>>591
ここってC++スレじゃないのか??

593 名前:デフォルトの名無しさん [2008/07/02(水) 20:33:00 ]
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ

594 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:53:29 ]
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…

595 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:01 ]
class Hoge {
const char msg="nullpo";
}

これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。

596 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:35 ]
大体型がおかしいだろ。
staticつけとけ

597 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:22:21 ]
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×

598 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:23:55 ]
どうも、static付けてみます



599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:40:22 ]
enumが便利だよ

600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:45:09 ]
あ、なるほど。すっかり忘れてました。

601 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 00:45:52 ]
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。

602 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:10:26 ]
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?

603 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:14:11 ]
Javaじゃあるまいし

604 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:29:34 ]
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん

605 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:34:25 ]
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?

606 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:45:21 ]
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?

もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。

windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。

607 名前:606 mailto:sage [2008/07/03(木) 01:47:54 ]
うーん・・・

msdn.microsoft.com/ja-jp/library/cc440193(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。

developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。

例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?

608 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:55:31 ]
>>605
209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton



609 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:56:59 ]
鼻から悪魔という言葉があってな

610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:05:31 ]
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。

パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。

611 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:18 ]
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
 オプションなしの場合C++例外は一切使わない。
 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
 /EHa  同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。

612 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:23 ]
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。

613 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:26:36 ]
>>610-611
ありがとうございます。

VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。

実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?

614 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 03:24:19 ]
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。


615 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:55:32 ]
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?

616 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:59:33 ]
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?

617 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 06:33:36 ]
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。


618 名前:デフォルトの名無しさん [2008/07/03(木) 09:30:37 ]
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが



619 名前:585 mailto:sage [2008/07/03(木) 10:09:51 ]
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。

620 名前:デフォルトの名無しさん [2008/07/03(木) 12:12:50 ]
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
  shared_ptr<BBB> bbbptr;
public:
  AAA() {
    bbbptr = new BBB;
  }
  shared_ptr<BBB> getBBB1() {
    return bbbptr;
  }
  shared_ptr<BBB>& getBBB2() {
    return bbbptr;
  }
  BBB* getBBB3() {
    return bbbptr;
  }
};







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

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

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