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


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

C++相談室 part40
501 名前:デフォルトの名無しさん :2005/05/24(火) 17:08:21
static inline void ff(ostream & os = cout) {os << "hello" << endl;}
static inline void f(const char * filename = NULL) {filename ? ff(ofstream(filename)) : ff();}

502 名前:デフォルトの名無しさん :2005/05/24(火) 17:22:10
inline void f(std::ostream& os = std::cout) {os << "hello" << std::endl;}
inline void f(const char *filename) {filename ? ff(std::ofstream(filename)) : ff();}
inline void f(const std::string& str) {f(str.c_str());}

503 名前:デフォルトの名無しさん :2005/05/25(水) 00:03:33
finalにしたいなら

class final {
 class foo {};
}
つうのはどうでしょう?

504 名前:デフォルトの名無しさん :2005/05/25(水) 00:21:25
C++で手続き型のプログラムって普通はしないものなのか。

505 名前:デフォルトの名無しさん :2005/05/25(水) 00:38:12
>>504 普通ってなんだろー

506 名前:デフォルトの名無しさん :2005/05/25(水) 00:42:54
>>504
実装側で適当にやるのは良いと思う(というかそういう言語だと思う)が
公開するインターフェースはオブジェクト指向にして欲しい

507 名前:デフォルトの名無しさん :2005/05/25(水) 01:59:37
>>505
normal

508 名前:デフォルトの名無しさん :2005/05/25(水) 02:18:48
>>507
トートロジー

509 名前:デフォルトの名無しさん :2005/05/25(水) 10:01:10
ナポリタン

510 名前:デフォルトの名無しさん :2005/05/25(水) 12:18:54
ふつう 0 【普通】

(名・形動)[文]ナリ
(1)いつでもどこにでもあって、めずらしくない・こと(さま)。
「日本に―の鳥」
(2)ほかとくらべて特に変わらない・こと(さま)。
「ごく―の家庭に育つ」「―ならもう卒業している」
(3)特別ではなく、一般的である・こと(さま)。
「―高校」
⇔特殊

(副)
たいてい。一般に。
⇔特殊
「郵便は―三日かかる」
――の体(からだ)でない
病気である。また、妊娠している。

http://dictionary.goo.ne.jp/search.php?MT=%C9%E1%C4%CC&kind=jn

511 名前:デフォルトの名無しさん :2005/05/25(水) 13:11:36
C++の関数の中の書き方(セミコロンで区切って命令を順番に書く)を手続き型というのであって、対義語は関数型もしくは論理型。
オブジェクト指向かどうか(これは設計の問題)とは関係ない。

512 名前:デフォルトの名無しさん :2005/05/25(水) 13:23:56
>>511
手続きを抽象化するスタイル(要は構造化)のことを
オブジェクト指向と対比して手続き型と言うことがあると思う。
plc++3にはこの意味で出てきた。

513 名前:デフォルトの名無しさん :2005/05/25(水) 13:47:32
>>511
> C++の関数の中の書き方(セミコロンで区切って命令を順番に書く)を手続き型というのであって
セミコロン云々はそりゃいくらなんでも違うだろ。
代入を順番に書き連ねて、その副作用を利用していくのが手続き型。

> オブジェクト指向かどうか(これは設計の問題)とは関係ない。
これも間違い。多くのオブジェクト指向プログラミングは、これまでのところ
手続き型言語の枠組で提案されてきてる。その理由としては、特に手続き型の
対極にあたる宣言型、そのなかでも関数型の場合は、状態を保持するオブジェ
クトとの相性があまりよろしくない。そもそもオブジェクト指向のサポートの
一切ない言語(たとえばHaskell)を使うのにオブジェクト指向で設計、などあ
り得ない。


514 名前:デフォルトの名無しさん :2005/05/25(水) 14:09:39
おとなはうそつきだ

515 名前:デフォルトの名無しさん :2005/05/25(水) 16:33:09
>>513
C++では区切り子にセミコロンを使っているというだけの話だろ
セミコロン必須だとはだれも思っちゃいない(お前以外は勘違いすらしない)

516 名前:デフォルトの名無しさん :2005/05/25(水) 16:50:23
>>513
>代入を順番に書き連ねて、その副作用を利用していくのが手続き型。

Lispは手続き型?

517 名前:デフォルトの名無しさん :2005/05/25(水) 18:09:29
>>515
> セミコロン必須だとはだれも思っちゃいない(お前以外は勘違いすらしない)
勘違いしてるのはお前だろ。511も513も「セミコロン必須」なんて話はしてない。

>>516
> Lispは手続き型?
「Lispが関数型」っていうのは「Cが関数型」っていうのと同じくらい正確。


518 名前:デフォルトの名無しさん :2005/05/25(水) 18:58:15
ん?言葉の使い方が悪かったか?
セミコロン必須 = 文と文を区切るためにセミコロンを使うこと
と解釈してくれ

519 名前:デフォルトの名無しさん :2005/05/25(水) 21:54:40
513はセミコロンに拘ってるな

520 名前:デフォルトの名無しさん :2005/05/25(水) 22:23:01
virtual functionを実現するコンパイラの仕組みがよく
わからなかったので教えてください。
実際のクラスの関数へのポインタをデータの中に埋め込んでおいて
それを使用して関数を呼び出すというのはわかったのですが、
その関数に暗黙に渡されるインスタンスへのポインタの渡し方が
よくわかりませんでした。
多重継承している場合はベースへのポインタと派生クラスの
ポインタでアドレスが異なる場合がありますよね?
その場合は実際に渡すアドレスをどこで変換してるんでしょうか?

521 名前:デフォルトの名無しさん :2005/05/25(水) 22:36:09
>>520
thisとvtable

522 名前:デフォルトの名無しさん :2005/05/25(水) 22:52:24
>>520
thisは実際のところ、関数の引数として渡されているだけ(の実装が多い)。

523 名前:デフォルトの名無しさん :2005/05/25(水) 23:00:20
>>520
ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/

524 名前:デフォルトの名無しさん :2005/05/25(水) 23:21:13
>523
>520 に答えようとして途中でわからなくなったんだけど、勉強になった。サンクス。

525 名前:520 :2005/05/25(水) 23:28:51
>>523
なるほど、理解できました。アドレス補正処理も同時に埋め込んでいる
んですね。

526 名前:デフォルトの名無しさん :2005/05/25(水) 23:29:48
おそレスだが
>485
コンストラクタを全部privateにしちまえばいいんでない。
んで、statci A& A::getInstance()とかしておくと

>486
まあ、それで十分な開発体制ならいいんだけど、
現実はマーフィーの法則を超えることがあるわけで


527 名前:デフォルトの名無しさん :2005/05/25(水) 23:34:54
>520
回答はすでにされているので、ほんとにあった怖いコード
クラスをmemsetで丸ごと初期化してる

528 名前:デフォルトの名無しさん :2005/05/25(水) 23:46:56
>513
そりゃぁ、状態を管理するオブジェクト指向と状態を持たない純関数型言語では
相性悪いだろうに……


529 名前:デフォルトの名無しさん :2005/05/26(木) 05:53:25
エスケ−ブシ−ケンスはW2000では使えないようなのですが
例えば
printf(”¥x1B[%d;%dH%s”,plin,pcol,str);
での表示はどう直せばよいのでしょうか?

530 名前:デフォルトの名無しさん :2005/05/26(木) 06:04:10
半角に直せばいいと思うよ

531 名前:デフォルトの名無しさん :2005/05/26(木) 06:07:31
つーか、スレ違い。

532 名前:デフォルトの名無しさん :2005/05/26(木) 07:40:18
>>529
SetConsoleCursorPosition

533 名前:デフォルトの名無しさん :2005/05/26(木) 11:26:44
finallyを使うのと、単にtry・catchブロックの次に書くのとでは何が違うのでしょうか?

534 名前:デフォルトの名無しさん :2005/05/26(木) 11:35:31
__finallyはMS拡張であってC++標準ではない。

535 名前:デフォルトの名無しさん :2005/05/26(木) 11:37:21
例えばtryブロック内でreturnしてもfinallyが実行されるんでないっけ

536 名前:デフォルトの名無しさん :2005/05/26(木) 11:50:06
newを使って二次元配列を作り初期化する方法ってどうやればいいのでしょうか?
int (*a)[3] = new int a[3][3] ={
                   {1,2,3},
                   {4,5,6},
                   {7,8,9}
                   }
これはだめでした


537 名前:デフォルトの名無しさん :2005/05/26(木) 12:40:40
finally はめちゃめちゃ欲しい。
デストラクタで処理すりゃいい話だけどそんな細かいニーズのためにクラス作ってらんない。

538 名前:デフォルトの名無しさん :2005/05/26(木) 13:24:02
デストラクタじゃ代用にならないだろ。
クラスは破棄されないんだけど、エラーが発生してエラー処理、って場合に。

539 名前:デフォルトの名無しさん :2005/05/26(木) 14:04:37
スマートポインタのデストラクタで代用できるだろ

540 名前:デフォルトの名無しさん :2005/05/26(木) 15:11:28
エラー処理をfinallyに書いてどうする。

541 名前:デフォルトの名無しさん :2005/05/26(木) 15:58:24
finallyも例外自体もスコープアウト時のガベージコレクトのないレガシー言語の機構。

542 名前:デフォルトの名無しさん :2005/05/26(木) 16:22:55
finally の用途はメモリ関係に限らないんだけどね。


543 名前:デフォルトの名無しさん :2005/05/26(木) 16:34:03
スパートポインタ系のラッパクラスにしてもメモリ以外にも適用できるわけだが。
Rubyみたいにファイルオブジェクト作るたびに例外ハンドラ書かされる糞言語見てるとGCが大して幸福に貢献しないことがよく分かる

544 名前:デフォルトの名無しさん :2005/05/26(木) 16:55:34
>>541
(´-`).。oO(例外自体も?)

545 名前:デフォルトの名無しさん :2005/05/26(木) 18:24:01
>スパートポインタ
>スパートポインタ
>スパートポインタ

546 名前:デフォルトの名無しさん :2005/05/26(木) 19:47:56
>>545
もしかしてスパートポインタも知らないのか?

547 名前:デフォルトの名無しさん :2005/05/26(木) 19:57:04
ダストスパート

548 名前:デフォルトの名無しさん :2005/05/26(木) 20:25:22
>>546
俺は知ってるぞ
http://www.google.co.jp/search?hl=ja&q=%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja

549 名前:デフォルトの名無しさん :2005/05/26(木) 20:29:10
ものすごく初歩的な質問なんですが、
今、C++の参考書を読み終わったのですが、
クラスや関数のことについては大体分かりました。

まずは簡単な住所録をつくろうと思ってたのですが、
コマンドプロンプト上でしか動かせない状況です。

これから先はMFCやAPIを勉強していけば
C++のソフトを作るには十分だといえるのでしょうか?

もし、よろしかったらご教授下さい。


550 名前:デフォルトの名無しさん :2005/05/26(木) 20:51:20
>>536
new int a[3][3]まではいいけどその先が駄目。
newの後で要素へ代入していくしかない。

551 名前:デフォルトの名無しさん :2005/05/26(木) 21:14:54
(int *)(*a) = new (int *)[3];
a[0] = new int[3]; //a[0] = {1,2,3};
a[1] = new int[3];
a[2] = new int[3];

552 名前:デフォルトの名無しさん :2005/05/27(金) 00:14:29
ダライアス継承という言葉をたまに耳にしますがどういった物なのでしょうか?

553 名前:デフォルトの名無しさん :2005/05/27(金) 00:31:05
>>552
>>138

554 名前:98 :2005/05/27(金) 02:09:55
sourceforge以外で実際に作って勉強できそうなところないでしょうか?
なんかどれに参加していいかも良くわからないし。途中から参加しても
ついていけなさそう。

555 名前:デフォルトの名無しさん :2005/05/27(金) 02:48:24
ダイダロス継承という言葉をたまに耳にしますがどういった物なのでしょうか? 

556 名前:デフォルトの名無しさん :2005/05/27(金) 04:18:13
ダルイデス継承という言葉をたまに耳にしますがどういった物なのでしょうか?

557 名前:デフォルトの名無しさん :2005/05/27(金) 06:03:07
BOOST::lexical_castをパクってみたら、
'sw' は 'std' のメンバーではない!とか怒られたんですが
何がマズイんでしょうか?

もちろんsstreamはincludeしてます。
問題部分のソースは

 if(!(s << src) || !(s >> dest) || !(s >> std::sw).eof())

558 名前:デフォルトの名無しさん :2005/05/27(金) 06:19:28
>532
サンクス。
いろいろ書くと、チョット複雑なんだけど
hDCが使えないので、Locate()とか、home()でカ−ソルを動かせると良いのですが・・

元々、画面へ直接アクセスの考えがないから、駄目なんでしょうね。


559 名前:デフォルトの名無しさん :2005/05/27(金) 07:19:45
>>557
ws(white space)

560 名前:デフォルトの名無しさん :2005/05/27(金) 09:28:29
使っているうちに使用メモリが増えていくアプリが、結構ありますが、
deleteしても、その解放したメモリ領域は、アプリが終わるまではOS側で再利用してくれないのでしょうか?

561 名前:デフォルトの名無しさん :2005/05/27(金) 09:34:22
>>560
コンパイラ、ライブラリ、OSの実装による。
疑いを晴らしたいのなら、 new, delete を
OSのメモリ管理を直接使うように再定義して置き換えればよい。

562 名前:デフォルトの名無しさん :2005/05/27(金) 10:06:53
>>558
だからスレ違いだってばよ。
http://pc8.2ch.net/test/read.cgi/tech/1115386557/

563 名前:デフォルトの名無しさん :2005/05/27(金) 10:12:04
>>561
レスありがとうございます。決まってないんですか。
折角隠蔽してくれているなら、こだわらない方が良いのでしょうか。

「OSのメモリ管理」で勉強しなおした所、(スレ違いですが)Windowsの場合は、すぐにでは無いけど、
後で可能ならば再利用してくれているんですね。あまり考えないことにします。

564 名前:デフォルトの名無しさん :2005/05/27(金) 16:12:10
まあ大抵のOSではプロセスが確保したメモリは
プロセスの解放時に全部解放されっから気にスンナ

メモリリークが〜とかいうのはDaemonとか永続的に
走らせるアプリケーションじゃなきゃたいして問題じゃない

というと怒る人がいっぱいいるけどね!

565 名前:デフォルトの名無しさん :2005/05/27(金) 16:47:35
>>560
そういうのは大抵deleteがどうとかいう問題じゃなくて単純にバグでメモリリークしてるか、後で使うかもしれないからと使いもしないゴミを後生大事に抱え込んでるかのどっちか。

566 名前:デフォルトの名無しさん :2005/05/27(金) 17:41:12
C++に限定した話ではないかもと思うのですが、質問です。

友人達と複数のゲームクラスをつくり、最後に一つにくっつけてゲーム完成を目指しています。
ただその際、メインのcppファイルがみんなのheaderファイルをincludeするため
#define での宣言が重なってしまうかもしれません。
例えば

#define DRAW_GAME_WIDTH 640

などです。ゲームによって幅が違うため、他の人が320などで宣言していたらコンパイル(プリプロセス)の際にエラーになってしまうでしょう。
これの解決策としてはどのような方法が一般的なのでしょうか。

それぞれはクラスを作ることになっており、グローバル空間には変数などを作らない約束にはなっています。
なのでstatic intでメンバー変数を
static int DRAW_GAME_WIDTH = 640;
といった感じのものを、クラス内で宣言させればグローバル空間を汚染しないかと考えました。
ですが変数ですので、#defineで置換したものに比べてわずかながら処理が遅いのかなと思います。

もう一つ
enum{
DRAW_GAME_WIDTH = 640,
DRAW_GAME_HEIGHT = 480,
DRAW_XXX = 5
};
というのをクラス内で宣言させることを考えました。
ただ、気になるのはこの場合のスピードです。これは直値に置換されるのでしょうか?
それとも変数扱いなのでしょうか。

初心者な質問ですが、よろしければご教授お願いいたします。(どれも見当違い! を含めて)

567 名前:デフォルトの名無しさん :2005/05/27(金) 17:58:19
> ですが変数ですので、#defineで置換したものに比べてわずかながら処理が遅いのかなと思います。
遅くない。
遅かったとしても、本当にわずかだから気にしなくていい。
それを気にするレベルならC++なんか使うな。

> ただその際、メインのcppファイルがみんなのheaderファイルをincludeするため
ありえない。

568 名前:デフォルトの名無しさん :2005/05/27(金) 18:01:28
>>566
んなもんコンパイラによって違うから吐かれたコード見ろ。
第一そんなとこがボトルネックになるわけない。
最適化の基本は計測。
計測した結果、本当にそこがボトルネックになってるならそれから考える。

enumでやるのはconst staticが使えない環境で
無理矢理同じことを再現するEnam hackという手法。
本来のenumの使い方とは違うのでconst staticが
ちゃんと使えるならconst staticでやれ。

そもそも他人と被るようなウィンドウ幅みたいな定数を
グローバルにおかない事の方が間違いだがな。

569 名前:デフォルトの名無しさん :2005/05/27(金) 18:02:06
>>566
enumはコンパイル時定数なのでろくに最適化をしないコンパイラでも問題ない。
ただし、単にクラス内定数が欲しいだけならenumよりstatic constを使う方が一般的。

ほかにもクラスの枠に縛られない定数が欲しいときには
1人1人が独自のnamespaceを持ち、その中でconstな定数を宣言する方法もある。

570 名前:デフォルトの名無しさん :2005/05/27(金) 18:42:31
そもそも、画面の大きさは定数にするものなの?


571 名前:デフォルトの名無しさん :2005/05/27(金) 20:47:23
>562
スレ違いではないと言う事が解らないほど、あほな奴だな。

572 名前:デフォルトの名無しさん :2005/05/27(金) 21:10:47
#define定数 => コンパイル時に計算される
enum定数 => コンパイル時に計算される、ただし値がint
const static データメンバ定数 => 整数型ならば、コンパイル時に計算される

整数ならば、const staticデータメンバで行けばよい
浮動小数点のばあい、#defineのよい代案はない
インライン関数で定義すれば、コンパイル時に計算する可能性が高いか

573 名前:デフォルトの名無しさん :2005/05/27(金) 21:25:46
#defineはコンパイル前のプリプロセスで置換されるものだが。

574 名前:デフォルトの名無しさん :2005/05/27(金) 21:28:11
プリプロセスを含めてcompilation phasesともいえる。

575 名前:デフォルトの名無しさん :2005/05/28(土) 01:44:34
コンストラクタで何かにメンバ関数のポインタ渡すのって無理なんですか…?
型が違うってエラーの本来クラス名が出るところに_closureとか出てるんですが

576 名前:デフォルトの名無しさん :2005/05/28(土) 01:52:09
>>575
無理。次。

577 名前:575 :2005/05/28(土) 01:57:42
問題のメンバ関数をstaticメソッドにしたら渡せました…
メンバにアクセスできる以上ポインタも取得できそうなものなのに

もしかしてコンストラクタの中で
そのクラスのポインタを受け取る関数にthis渡すのもできないんですか?


578 名前:デフォルトの名無しさん :2005/05/28(土) 02:03:03
>>575 意味がわからん。ソース貼れ。

579 名前:デフォルトの名無しさん :2005/05/28(土) 02:05:36
>>577
> もしかしてコンストラクタの中で
> そのクラスのポインタを受け取る関数にthis渡すのもできないんですか?

できる。が、一般的に危険だと言える。

580 名前:575 :2005/05/28(土) 02:22:39
>>579
危険というのはコンストラクタで例外が起きちゃった場合とかですか?
それともコンストラクタ内でthisが使えるのは特殊な実装になってるんでしょうか

>>578
わかったかたがいるようなので貼りません。

581 名前:デフォルトの名無しさん :2005/05/28(土) 02:27:58
>>575
コンストラクタでなければ渡せるのか?
メンバ関数へのポインタの書き方を知らないだけじゃないのか?

582 名前:デフォルトの名無しさん :2005/05/28(土) 02:38:59
>>580
コンストラクタの中ということは、コンストラクタが完了していないわけで、
その型の完全なオブジェクトを期待している処理に渡された場合に整合性が崩れる可能性がある。

583 名前:デフォルトの名無しさん :2005/05/28(土) 02:50:50
情報小出し厨は逝ってよし。

584 名前:575 :2005/05/28(土) 03:06:37
>>581
>コンストラクタでなければ渡せるのか?
はい
>メンバ関数へのポインタの書き方を知らないだけじゃないのか?
そこまで馬鹿じゃありません

>>582
なるほどそれはそうですね
単純なオブジェクトプールを考えていて
プールクラスのAddメソッドに this を渡したいだけなので
マルチスレッドにでもしない限り大丈夫かな
下位クラスのコンストラクタでプールに検索かけられたらやばそうですが

585 名前:デフォルトの名無しさん :2005/05/28(土) 03:32:29
BCBなヨカン。&つけて渡してみては。

586 名前:デフォルトの名無しさん :2005/05/28(土) 03:43:50
>>584
ム板きっての 大 馬 鹿

587 名前:デフォルトの名無しさん :2005/05/28(土) 07:48:22
> 問題のメンバ関数をstaticメソッドにしたら渡せました…
関数ポインタの使い方を知らないだけの予感

588 名前:デフォルトの名無しさん :2005/05/28(土) 13:05:49
>>575
BCBのVCLは独自拡張で非staticなメンバ関数のポインタを扱えるようになっているが通常のC++では非staticなメンバ関数のポインタは取れない。
ついでにRTTIでもVCLのTObject派生クラスは通常のC++クラスと振る舞いが違う。

589 名前:デフォルトの名無しさん :2005/05/28(土) 13:14:10
>>588
&をつけて明示すれば非staticな関数のポインタも取れないわけではない。
メンバへのポインタだから普通の関数ポインタのようには使えないが。

590 名前:デフォルトの名無しさん :2005/05/28(土) 13:23:55
ここに書いてるのは普通のC++が対象じゃないんかー
http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03057.html

で585でBCBと言ったのは、BCBはコンストラクタの中でだけ
void (CTest::*fpFunc)() = CTest::Func;
と書けなくて、&CTest::Func; としないと駄目だったので。

591 名前:デフォルトの名無しさん :2005/05/28(土) 13:23:58
メンバ関数のポインタはそれぞれのオブジェクトに対するシフトを表しているから、
->*とか.*を使わないとダメですな。
まあ、管理するのも面倒なので、boost::functionとか使いますが。

592 名前:デフォルトの名無しさん :2005/05/28(土) 13:53:15
シフト……。せめてオフセットとかディスプレースメントにしとけ。


593 名前:デフォルトの名無しさん :2005/05/28(土) 14:00:04
メンバ関数のポインタは普通の関数ポインタで実装されてる希ガス

594 名前:デフォルトの名無しさん :2005/05/28(土) 16:09:18
>>593
MSVCでは単なる関数ポインタで実装されています。しかし、
構造体を使って実装されている環境もあります。一般的に、
メンバ関数へのポインタの実装は互換性を持ちません。

595 名前:デフォルトの名無しさん :2005/05/28(土) 17:24:51
>>594
な、なんだって!?
それはかなり初耳だ。

596 名前:デフォルトの名無しさん :2005/05/28(土) 17:54:39
>>590
コンストラクタ以外で CTest::Func が使えるのなら、それは標準とは違う動作だ。

597 名前:デフォルトの名無しさん :2005/05/28(土) 18:30:51
>>596
む、そうでしたか。メンバ関数ポインタはあのサイトで知ってVCも&なしで通ったので、
&なしが普通だと思ってました。ご指摘どうもです。

598 名前:デフォルトの名無しさん :2005/05/29(日) 12:15:20
>>595
Inside The C++ Object Modelでも読めよ。

599 名前:デフォルトの名無しさん :2005/05/29(日) 13:15:09
>>598
その本に書いてることが本当だという保証はないだろ?

600 名前:デフォルトの名無しさん :2005/05/29(日) 13:16:41
お前らあいかわらず下等だな

601 名前:デフォルトの名無しさん :2005/05/29(日) 13:17:13
ヘタレがヘタレをバカにするのを見ていると本当に悲しくなる。

602 名前:デフォルトの名無しさん :2005/05/29(日) 13:19:01
>その本に書いてることが本当だという保証はないだろ?
何だよその子供みたいな反論は・・・


603 名前:デフォルトの名無しさん :2005/05/29(日) 13:37:44
>>599
少なくともお前のようなヘタレの頭の中よりはマシな事が書いてある。

604 名前:デフォルトの名無しさん :2005/05/29(日) 16:46:11
>>599
書籍読んで、逆アセンブルしたコードと見比べればすぐ分かるだろ。

605 名前:デフォルトの名無しさん :2005/05/29(日) 17:12:51
Inside The C++ Object Modelを読むまでも無く、
仕様で決められてないんだから関数ポインタがたとえどんな風に実装されていようが驚くような事じゃないだろ。

606 名前:デフォルトの名無しさん :2005/05/29(日) 22:53:01
C++を勉強するのに
「詳説C++ 標準C++完全理解 第2版 大城 正典 (著)」
ってのを衝動買いしてしまった。
これで勉強して大丈夫か?

607 名前:デフォルトの名無しさん :2005/05/29(日) 22:59:30
推薦図書読むのが一番の近道

608 名前:デフォルトの名無しさん :2005/05/29(日) 22:59:57
詳説とか完全とか書いてある本は避けたほうが無難だよ。
本当にいい本は変な修飾語はつけない。

609 名前:デフォルトの名無しさん :2005/05/30(月) 14:45:11
>604
そのコンパイラが標準に準拠してるほs(略

まぁどうでもいいが('A`)

610 名前:デフォルトの名無しさん :2005/05/31(火) 00:08:07
Cからの移行の場合、どの本がいい?

611 名前:デフォルトの名無しさん :2005/05/31(火) 00:09:47
K&R

612 名前:デフォルトの名無しさん :2005/05/31(火) 00:26:13
逆戻りさせる気かい?

613 名前:デフォルトの名無しさん :2005/05/31(火) 00:28:20
Cがちゃんと使えてるならいきなりC++3rd読んであとはEffectiveシリーズなりModern C++ Designなり。

614 名前:デフォルトの名無しさん :2005/05/31(火) 01:15:27
Cからの移行というより、別物と思ったほうが。

615 名前:デフォルトの名無しさん :2005/05/31(火) 01:25:07
スクリプト系からの移行なら、まずAccelerated C++

616 名前:デフォルトの名無しさん :2005/06/02(木) 10:22:57
自分はいつもクラスを作る時、get_XXX, set_XXX と、パラメータごとに
アクセス関数がずらーーっと、並べちゃうんですが、これは考え方そのもの
が間違っているでしょうか? もうちょっとうまいやり方は、ないのか、
とか思いますが、なにか行き詰まってます。
意味不明なこと書いてるかもしれないですが、アドバイスよろしくお願いします。

617 名前:デフォルトの名無しさん :2005/06/02(木) 10:39:01
>>616
その前に読点の使い方を勉強したほうがいい。

618 名前:デフォルトの名無しさん :2005/06/02(木) 10:53:27
>>616-617
ワロタ

619 名前:デフォルトの名無しさん :2005/06/02(木) 10:55:43
>>616
変数定義が多すぎるか、クラス間のつながりが強すぎるかのどちらかだと思うから、設計から見直す必要あり。

もしそれが変数だけを集めたクラスならアクセサは不要だけど。

620 名前:デフォルトの名無しさん :2005/06/02(木) 11:25:58
class hoge {
 private:
  int FMoge;
  void SetMoge(int value);
  int GetMoge();
 public:
  __property int Moge = { read=GetMoge, write=SetMoge };
};

ただし思いっきりコンパイラ依存

621 名前:616 :2005/06/02(木) 11:32:26
>>619
>>620
どうもありがとうございました。
とても勉強になりました。

622 名前:デフォルトの名無しさん :2005/06/02(木) 13:52:34
ハロー(注意報)。えっと、こんなクラスを用意します。

Hoge1.h--------------------------------------
class Hoge2;
class Hoge1 {
public:
  void Fuga(Hoge2 h);
};
Hoge2.h--------------------------------------
class Hoge1;
class Hoge2 {
public:
  void Fuga(Hoge1 h);
};

Hoge1::Fuga()とHoge2::Fuga()をインライン関数にしようと思ったら
(ここではインライン関数にする意義はあるものとします)

Hoge1.h--------------------------------------
#include "Hoge2.h"
class Hoge1 {
public:
  void Fuga(Hoge2 h) { ... }
};
Hoge2.h--------------------------------------
#include "Hoge1.h"
class Hoge2 {
public:
  void Fuga(Hoge1 h) { ... }
};

では当然コンパイル通らないので、

623 名前:デフォルトの名無しさん :2005/06/02(木) 13:52:47
Piyo.h---------------------------------------
class Hoge1 {
public:
  void Fuga(Hoge2 h);
};
class Hoge2 {
public:
  void Fuga(Hoge1 h);
};
inline Hoge1::Fuga() { ... }
inline Hoge2::Fuga() { ... }

とでもするしかなくて、1ファイル1クラスの原則が壊れてグダグダになるんですが、
何かエクセレントな手は……ないよね、やっぱし? せいぜい、

Piyo.h---------------------------------------
#include "Hoge1.h"
#include "Hoge2.h"
#include "Hoge1.inl"
#include "Hoge2.inl"

くらい?

624 名前:622 :2005/06/02(木) 13:57:05
うあ、あちこち抜けてる。Piyo.h修正

Piyo.h---------------------------------------
class Hoge2;
class Hoge1 {
public:
  void Fuga(Hoge2 h);
};
class Hoge2 {
public:
  void Fuga(Hoge1 h);
};
inline void Hoge1::Fuga() { ... }
inline void Hoge2::Fuga() { ... }

625 名前:デフォルトの名無しさん :2005/06/02(木) 14:15:04
>ハロー(注意報)。

だけ読んだ。

626 名前:デフォルトの名無しさん :2005/06/02(木) 14:45:09
よく読んでないけど、ポインタ・参照を渡すようにする。

っていうか、実体を渡す場面が思いつかない。

627 名前:デフォルトの名無しさん :2005/06/02(木) 15:15:40
>ハロー(注意報)。
何これ?波浪注意報?

628 名前:デフォルトの名無しさん :2005/06/02(木) 16:09:34
ハロー(CV:井上瑤)

629 名前:デフォルトの名無しさん :2005/06/02(木) 18:10:39
C++/CLIは正式に策定されたら別スレになるんだろうか

630 名前:622 :2005/06/02(木) 18:17:31
ハロー(警報)。(好評らしいので)

>>626
実際には参照を渡しとります。
いずれにしても、インライン関数を定義するときに、その関数で使うクラスの定義が必要で、
それが複数のクラスで依存しあう場合にグダグダのガビガビになるんでどうしようかなあと。

631 名前:デフォルトの名無しさん :2005/06/02(木) 18:33:17
波浪(again)

Hoge1の参照しているHoge2, Hoge2の参照しているHoge1を
templateで処理しとけ。

632 名前:デフォルトの名無しさん :2005/06/02(木) 19:28:00
>>622
hallow (ground)

Hoge2のインライン関数の定義に際して、その前にHoge1のインターフェイスが
必要になる。逆も同様である。よって互いのクラス定義が見える状態である
必要がある。よって双方のクラス定義が共にそれぞれの関数定義の前方に
ある必要がある。よって>>624のような形か設計を変更する以外に手はない。

633 名前:デフォルトの名無しさん :2005/06/02(木) 20:15:20
波浪(again)

>632
>よって>>624のような形か設計を変更する以外に手はない。

だから、templateつかって、実体化を引き延ばせって。

class Hoge1 {public:template<class T> void Fuga(T h){ h.Fuga(*this);}};
class Hoge2 {public:template<class T> void Fuga(T h){ h.Fuga(*this);}};
int main() { Hoge1 hoge1; Hoge2 hoge2; hoge2.Fuga(hoge1); }

634 名前:デフォルトの名無しさん :2005/06/02(木) 20:45:40
どれも呼び出し側は綺麗に書けるんだし好きなの選べばいい希ガス。
定義側は五十歩百歩

635 名前:デフォルトの名無しさん :2005/06/02(木) 21:52:03
ファイルストリームからバイナリデータとして入力するには
 ifstream fin(filename, ios::binary);
のように open mode として ios::binary を指定すれば
 fin.read((char*)&(raw[0]), bufsize);
で読み込むことができます。
しかしこの open mode は文字通り open 時のオプションらしく、
開いてしまうと途中でモードを切り替える方法がわかりません。

具体的には、cin からバイナリデータとして読み込んだり、
ひとつのファイルの N バイト目以前をバイナリ、残りをテキストとして
読み込んだりする方法がわかりません。
istream の ios::binary フラグを実行時の任意のときに切り替える方法はありませんか?

gcc-3.3.3 の ios_base のソースコードだと
 static const openmode binary = openmode(__ios_flags::_S_bin);
とあって、絶望的ですが(´д`)

636 名前:デフォルトの名無しさん :2005/06/02(木) 22:02:14
二回openすりゃいいじゃん

637 名前:デフォルトの名無しさん :2005/06/02(木) 22:52:59
>>635
>具体的には、cin からバイナリデータとして読み込んだり、
>ひとつのファイルの N バイト目以前をバイナリ、残りをテキストとして
前者は兎も角、後者は設計の問題。混在させるメリットが乏しい。

638 名前:デフォルトの名無しさん :2005/06/03(金) 00:08:21
コンストラクタについて質問。
//コンストラクタ
Scene::Scene()
: m_pVB(0),m_pTexture(0),m_pTexture2(0) ←この部分について
{
//m_pVB,m_pTexture,m_pTexture2はSceneクラスで定義されてる、変数(ポインタ)
}

上記の矢印の部分なんだけど、一体何をしているんでしょうか?
基本クラスコンストラクタへの引数渡しでもないようなんですが・・

よろしくお願いします。

639 名前:デフォルトの名無しさん :2005/06/03(金) 00:23:25
変数の初期化

640 名前:デフォルトの名無しさん :2005/06/03(金) 00:42:57
>>636
cinは二回openできるの?

>>638
初期化リスト


641 名前:デフォルトの名無しさん :2005/06/03(金) 00:56:42
>>616
単純にプロパティ(パラメータ)が多過ぎるだけでは?
試しにアクセス関数が多過ぎると思うクラスを見せて欲しい
単純に「ずらーと並んでておかしいのかもしれない」と言われたら
メンバ変数とプロパティの区別が付いてない可能性くらいしか思いつかない

642 名前:638 :2005/06/03(金) 01:16:58
>>639 >>640
ありがとうございます。
理解しました。

643 名前:デフォルトの名無しさん :2005/06/03(金) 04:27:47
>>642
どうでもいいことだけど追記
constメンバ変数や、メンバ変数が参照型のときなど、
「代入」ではなく「初期化」しなければならないときには初期化リストを使わなければならない。
そうでなくても、初期化の方がコスト面で優れているので、常に初期化リスト使うのおすすめ。
class X {
int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
double A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
public:
X() {
a = b = c = d = e = f = g = h = i = j = k = l = m = n = o = p = q = r = s = t = u = v = w = x = y = z = 0;
A = B = C = D = E = F = G = H = I = J = K = L = M = N = O = P = Q = R = S = T = U = V = W = X = Y = Z = 0.0;
};
}
のように、初期化リストだと煩雑すぎる場合だけ代入を使えと
えふぇシーに書いてあった

644 名前:デフォルトの名無しさん :2005/06/03(金) 05:17:58
>>643
大丈夫、その例はコンストラクタで代入するのではなく代入用関数を用意すべきだから。

645 名前:デフォルトの名無しさん :2005/06/03(金) 06:14:39
それも込みでの「えふぇシー」。

646 名前:デフォルトの名無しさん :2005/06/03(金) 08:12:56
HogeHogeってどういう意味?ホゲホゲ?
10年経っても解らない

647 名前:デフォルトの名無しさん :2005/06/03(金) 09:16:15
グーグル先生に聞けばいいと思うよ

648 名前:デフォルトの名無しさん :2005/06/03(金) 10:36:53
http://kmaebashi.com/programmer/hoge.html

649 名前:デフォルトの名無しさん :2005/06/03(金) 11:24:59
>>641
C++にプロパティなんて無いのに、
メンバ変数とプロパティの区別ってどうゆうこと?

650 名前:デフォルトの名無しさん :2005/06/03(金) 11:58:10
このhogeとかfoobarとか詳しい説明がどこにもないのは
プログラマーなら誰しも一度は通る道だからだろうか

651 名前:デフォルトの名無しさん :2005/06/03(金) 12:12:02
hogeはプログラマというよりUNIX文化発祥じゃなかろか

652 名前:デフォルトの名無しさん :2005/06/03(金) 12:27:18
>>650
「気になる」のは誰もが通る道だろうけど、「どこにもない」ことはないだろう。
検索エンジンが無かったころじゃあるまいし。

653 名前:デフォルトの名無しさん :2005/06/03(金) 13:30:51
>>649
C++みたいないい加減な言語使う場合こそ、
ちゃんとオブジェクト指向理解して下さい

Setter/Getterが必要なのはそのオブジェクトのプロパティ(特徴)であって
中でどんな変数でもってるかなんてのは問題じゃないです
複数のメンバ変数を合成した結果かもしれないし、そもそも変数じゃないかもしれない
クラスを便利な構造体と思ってるとプロパティ=メンバ変数と勘違いしてしまう

654 名前:デフォルトの名無しさん :2005/06/03(金) 13:52:45
>>653
オブジェクトの状態を表示/設定する手段の一つに
「プロパティ」があるってだけで、それがメンバ関数だろうと
プロキシクラスだろうと、はたまたメッセージ送受信だろうと
んなこたあ問題じゃないです。
そして、C++ には「プロパティ」なるものは存在しません。

>ちゃんとオブジェクト指向理解して下さい

655 名前:デフォルトの名無しさん :2005/06/03(金) 14:01:23
>>653
お前が言いたい「プロパティ」とやらは「アトリビュート」だろ。


656 名前:デフォルトの名無しさん :2005/06/03(金) 14:10:49
>>654
653は、C++にプロパティがあるとは、言ってない。

C++にプロパティという文法はなくても、「オブジェクト指向」(と言っていいのか?)
にプロパティという概念はある。
クラス=プロパティ+メソッドみたいなもの?

C++ではプロパティを明示する方法が文法で区別されていない、
つまり、プロパティとその他のメソッドを同等に扱うことができるが、
それは扱ってもよい、と等価ではない、

と、653はいいたいのだと思う。
俺は同意。

657 名前:デフォルトの名無しさん :2005/06/03(金) 14:17:50
つか、同じ人?

658 名前:デフォルトの名無しさん :2005/06/03(金) 15:17:12
別人じゃないの?
こういうマジレスで他人のフリする必要無いし。

659 名前:デフォルトの名無しさん :2005/06/03(金) 15:44:55
そういう意味のプロパティなんてOOすら理解してないITドカタのORマッピングでしかつかってねーけどな。

660 名前:デフォルトの名無しさん :2005/06/03(金) 16:09:47
またそうやってデタラメを自説の後ろ盾にするw

661 名前:デフォルトの名無しさん :2005/06/03(金) 18:02:31
>オブジェクト指向」(と言っていいのか?)
>にプロパティという概念はある。


662 名前:デフォルトの名無しさん :2005/06/03(金) 18:03:45
たしかD&Eにはいわゆるプロパティをクラスに搭載することを検討したけど、
operator T()とoperator =(const T&)を持つクラスを置いたりGetter/Setterをメンバ関数にしたりすれば
いいから没にしたとか書いてあったような希ガス。

663 名前:デフォルトの名無しさん :2005/06/04(土) 01:24:35
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/multdisp.html
>>635-640あたりのってこれと同じものなの?
さっぱりわからん。

_fmode = _O_BINARY;
_setmode( 0, _O_BINARY );
こういうのってcinとかには左右しないのかな
わからんからサッカー見て寝る。

664 名前:デフォルトの名無しさん :2005/06/04(土) 06:49:58
質問どえす

typedef struct _HOGE_
{
 floatx; floaty; floatz;
}HOGE;

typedef struct _HAGE_
{
 inta; intb; intc;
}HAGE;

typedef struct _HIGE_
{
 HOGEhoge; HAGE hage;
}HIGE;

std::vector< HIGE > m_hige;
という構造体があって

HIGE hige;
hige.hoge.x = 1.0; hige.hoge.y = 2.0; hige.hoge.z = 3.0;
hige.hage.a = 1; hige.hage.b = 2; hige.hage.c = 3;
m_hige.pushback( hige );

m_higeにhigeを入れたとして、
このm_higeの中のhogeとhageの先頭アドレスを得るにはどうしたら良いのでしょうか?
hige構造体の中身がhogeかhageだけだったら&m_hige[ 0 ]でいけるのですが・・・

665 名前:デフォルトの名無しさん :2005/06/04(土) 07:44:10
&m_hige[0].hoge; と &m_hige[0].hage;

666 名前:デフォルトの名無しさん :2005/06/04(土) 08:01:21
>665
それだとなんか上手くいかなかったdeath

glVertexPointer( 3, GL_FLOAT, 0, &m_hige[0].hoge );
glColorPointer( 3, GL_FLOAT, 0, &m_hige[0].hage );

667 名前:デフォルトの名無しさん :2005/06/04(土) 08:15:38
上手くいかないと言われても、何のことやら。

668 名前:デフォルトの名無しさん :2005/06/04(土) 08:45:35
glVertexPointerとやらを調べたけど、3番目の引数はsizeof(HIGE)になるんでないか。
HOGEやHAGEの単純な配列じゃないんだから、少なくとも0じゃないと思うけど。

669 名前:デフォルトの名無しさん :2005/06/04(土) 08:50:54
あでもvectorのstrideがsizeof(HIGE)でいいのかは俺は分からないや。とにかく0はいかんと思う。

670 名前:デフォルトの名無しさん :2005/06/04(土) 09:28:08
>669
それで逝けました。ありがとうございまs・・・

671 名前:デフォルトの名無しさん :2005/06/04(土) 09:52:00
>>669
それはsizeof(HIGE)で大丈夫。
>>670
頼むから2ターン目の質問で新事実を出さんでくれ。
>>666までの流れだと完璧に煽りと同じだよ。

672 名前:デフォルトの名無しさん :2005/06/04(土) 11:33:34
いくらなんでも「ライブラリの仕様を勘違いしてた」はNGだろ

673 名前:デフォルトの名無しさん :2005/06/06(月) 02:02:41
>>408をやってみたんですが
外部シンボル ""public: virtual void __thiscall hoge::Proc(void)" (?Proc@hoge@@UAEXXZ)"は未解決です。
とでてくるんですが、どうすればいいでしょうか

674 名前:デフォルトの名無しさん :2005/06/06(月) 02:08:05
>>673 void hoge::Proc(void) を定義する。

675 名前:673 :2005/06/06(月) 02:18:32
すみません、書き直す前の方送信してしまいました。
正しくは
未解決の外部シンボル "?CreateInstance@hoge@?A0xec65bdf2@@SAPAV12@XZ"
(?CreateInstance@hoge@?A0xec65bdf2@@SAPAV12@XZ)が関数 "void __stdcall Init(void)" (?Init@YGXXZ)で参照されました。
でした。
>>673の方は
virtual void Proc() = 0;とする事で通りました。

676 名前:デフォルトの名無しさん :2005/06/06(月) 02:22:52
>>675 応用効かせろよ。 hoge::CreateInstance の定義をよーく見直す。

677 名前:673 :2005/06/06(月) 02:51:59
ごめんなさい、わかんないです。

CreateInstanceを定義するためには
A* A::CreateInstance() {
return new AImpl;
};
これも公開側に書かないとだめで、そうするとAImplの定義が必要になるから
class AImpl : public A {
 virtual void Proc(int x) { ... ;};
};
こっちも公開側に書かないとダメになって意味なくなっちゃうとおもうんですけど

678 名前:デフォルトの名無しさん :2005/06/06(月) 04:14:26
>677
Windows 上でプラグインを DLL にしようとするなら、公開しないソース相当の部分とどうにかしてリンクする必要が
あるんじゃない?公開しないソース相当部分を DLL にしてインポートライブラリを提供すればできるんじゃないかな。
EXE でもエクスポートできたような気はするが。
いっそのこと COM にしちゃえば?

679 名前:673 :2005/06/06(月) 04:34:39
俺は402じゃないんで、プラグイン開発とかじゃないんですが
プロジェクトを分散して開発するときにもこういう手法が必要なんじゃないかと思ってやってました


680 名前:デフォルトの名無しさん :2005/06/06(月) 07:57:53
>>677
クラスAの宣言は公開するヘッダに必要。
A::CreateInstance()の定義はDLLに必要。(さらにDLLからエクスポートする必要がある)
A::CreateInstance()でAImplをnewしているからDLLにはAImplの宣言と定義が必要。

DLLを使う側にはAの宣言とA::CreateInstance()のDLLからのインポートが必要になる。
しかしAImplは不要。

681 名前:673 :2005/06/06(月) 14:11:02
>>680
って事はその場合だとDll側が本体でそれを呼び出す側がプラグインのような形になってしまうと思うんですけど

Dllを呼び出す側に実操作が入ってて、DLL側でそれを利用するという形にしたい場合は
DLL側でAの宣言とA::CreateInstance()のインポートを行うという形でいいんでしょうか

682 名前:デフォルトの名無しさん :2005/06/06(月) 14:23:14
>>681
いいんじゃないかね。やってみれば?

683 名前:デフォルトの名無しさん :2005/06/06(月) 14:36:31
>>681
そういう場合は、
struct {
 A* (CreateAInstance)();
 ... // その他あれこれ
};

みたいなもの(へのポインタ)をEXE側からDll側に渡してあげるのが
良くあるパターン。

684 名前:デフォルトの名無しさん :2005/06/06(月) 16:02:26
>>683
それをクラスとnewを使って実現する方法ってありますか

typedef struct{
class A;
} B;

int main(){
B b;
A* a = new b.A();
}
見たいな感じで出来ますか。

685 名前:デフォルトの名無しさん :2005/06/06(月) 16:14:14
>>684
自分でやってみるか、ここで聞きたいなら要件を明らかにせよ。
何がしたいのか、何が気に入らないのかわからん。

686 名前:デフォルトの名無しさん :2005/06/06(月) 16:24:01
ExeとDllの両方のヘッダ
class B{
public:
class A{
public:
void act();
};
};
Exe側ソース
typedef void (*C_PROC)(B*);
void B::A::act(){
printf("test message");
}
int main(int argc, char* argv[]){
B* b = new B();
HMODULE m = LoadLibrary("dll.dll");
C_PROC f = (C_PROC)GetProcAddress(m, "C");
f(b);
int i;
scanf("%d", &i);
return 0;
}

Dll側ソース
void __stdcall C(B* b){
B::A* a = new b->A();
a->act();
}

ってやるとDll側で"構文エラー 識別子'b'"っていうエラーがでてaが初期化できない

改めて考えると何がしたいんだろ

687 名前:デフォルトの名無しさん :2005/06/06(月) 16:24:31
>>684
newするには具体的なクラスの情報が必要なので、この件ではAImplを公
開しない限りnewを使うのは不可能。


688 名前:デフォルトの名無しさん :2005/06/06(月) 17:29:09
A* a = new B::A;


689 名前:デフォルトの名無しさん :2005/06/06(月) 17:33:00
>>688
その場合だとa->act();が未解決の外部シンボルになります。

690 名前:デフォルトの名無しさん :2005/06/06(月) 17:37:01
試していないけどおおよそこんな感じで出来ないだろうか。
//共通ヘッダ
class A {
  virtual void hoge();
};
A *CreateA();
void DestroyA(A*&);

//DLL
class B : public A {
public:
  virtual void hoge() {
    MessageBox(0, TEXT("hello"), TEXT(""), MB_OK);
  }
};
A *CreateA() {
  return new(std::nothrow) B;
}
void DestroyA(A*& a) {
  delete a;
  a = 0;
}

//EXE
int main() {
  A *pA = CreateA();
  pA->hoge();
  DestroyA(pA);
};

691 名前:デフォルトの名無しさん :2005/06/06(月) 17:56:41
もうVCスレ逝けよ。

692 名前:デフォルトの名無しさん :2005/06/06(月) 17:57:42
>>690はあれだが
それ以外はVC関係なくないか

693 名前:デフォルトの名無しさん :2005/06/06(月) 18:18:55
cfrontがダウンロードできる所を知ってる方はいらっしゃいますか?
AT&TやBell研やらgoogle先生やらに聞いて見ましたがわかりません(´・ω・`)

694 名前:デフォルトの名無しさん :2005/06/06(月) 18:58:38
>>693
無料でダウンロードできるAppleの旧々開発環境のMPWに
ついてたような気がする。バイナリだけど。

695 名前:デフォルトの名無しさん :2005/06/06(月) 19:41:43
ようやくEffective C++ 3rd(英語版)が手に入った。
訳すの面倒だけど、見出しだけならぱっと見て読めるし、
2ndと内容的に重なっている部分も多いので、読むのはそんなに
苦にならない。

696 名前:デフォルトの名無しさん :2005/06/06(月) 19:52:40
(∩゚д゚)アーアー

697 名前:デフォルトの名無しさん :2005/06/06(月) 20:00:30
(∩゚д゚)イーイー

698 名前:デフォルトの名無しさん :2005/06/06(月) 20:47:34
>>694
ありがとうございます。
でもおいらMac持ってないので、友人のMacに入れて…

699 名前:デフォルトの名無しさん :2005/06/07(火) 00:29:49
>>695
おれも今日手に入れた。
で、なんとなく読んでみた Item 46 が
いきなり知らなかった内容でびっくりした。

700 名前:デフォルトの名無しさん :2005/06/07(火) 06:15:38
質問です
C++を始めたい初心者です
おすすめのフリーのコンパイラとフリーのIDEがあれば教えて下さい

701 名前:デフォルトの名無しさん :2005/06/07(火) 07:13:12
eclipse+cdt+gcc

702 名前:デフォルトの名無しさん :2005/06/07(火) 07:24:53
Dev-C++

703 名前:デフォルトの名無しさん :2005/06/07(火) 11:12:53
>701
それが一番最強な気がするのでそれ試してみます

704 名前:デフォルトの名無しさん :2005/06/07(火) 11:27:15
>>700
mule+gcc

705 名前:デフォルトの名無しさん :2005/06/07(火) 15:14:58
>>700
ttp://blue.sakura.ne.jp/~junnno/ykwk212/wiki.cgi?C%2b%2b%b4%c4%b6%ad


706 名前:デフォルトの名無しさん :2005/06/07(火) 20:51:45
vim+g++

707 名前:デフォルトの名無しさん :2005/06/08(水) 04:37:10
char*const*pってどういうことですか?
こんなところにconstついてるの初めてみました。

708 名前:デフォルトの名無しさん :2005/06/08(水) 09:06:13
double型がとれる最小値は-DBL_MAXでよいのでしょうか?

709 名前:デフォルトの名無しさん :2005/06/08(水) 09:07:06
>>707
その前に char const* p と char *const p の違いは分かる?

前者は「const char へのポインタ」で p 自体は変更可能だが、p が指す先は
リードオンリー。++p は OK だが (*p)++ とか *p = '\0' はダメ。

後者は「char への const ポインタ」で p の値は変更不可能だが、p が差す
先は変更可能。++p はダメだけど *p = 'a' は OK。

710 名前:デフォルトの名無しさん :2005/06/08(水) 09:11:46
*が二度出てくるのは俺も初めて見たw

711 名前:デフォルトの名無しさん :2005/06/08(水) 09:26:35
内側から読めばいいよ。
p is (modifiable) pointer to const pointer to const char

pはポインタ。p自身を書き換えてもいい。
pの示す先(*p)は書き換え不可能なポインタ。*pは書き換えちゃいけない。
*pの示す先(**p)はchar。これは書き換えてもいい。



712 名前:デフォルトの名無しさん :2005/06/08(水) 09:28:21
なんか一個constが増えてる予感。
下の三行だけ読んでくれ。

713 名前:707 :2005/06/08(水) 09:35:53
>>709>>712
なるほど。constにまつわる話ってポインタ自身とポインタが指す先とどっちも考えなきゃいけないわけですね。
d!
ちょっとまだ疑問なんですが、>>709さんの char const * p っていうのは const char * p と比べてどうなんでしょうか・・・?

714 名前:デフォルトの名無しさん :2005/06/08(水) 10:09:46
>>713
char const * p と const char * p はどちらも同じ。
const int foo = -1; と int const foo = -1; も同様。

715 名前:707 :2005/06/08(水) 10:12:58
同じだったんだ・・・orz
どうもです。

716 名前:デフォルトの名無しさん :2005/06/08(水) 10:25:11
>>708
大して違いはないばかりか非効率だと言われればそれまでだが、
 -numeric_limits<double>::max();
の方がいいんじゃない?

717 名前:デフォルトの名無しさん :2005/06/08(水) 11:10:13
別に効率は変わんないんじゃないの?

718 名前:デフォルトの名無しさん :2005/06/08(水) 11:21:53
numeric_limits<double>::min();じゃだめなの?

719 名前:デフォルトの名無しさん :2005/06/08(水) 13:19:43
>>718
min()は「表現できる正の最小値」だから、0に限りなく近い値を示す
(浮動小数点値の場合)

効率についてはパパよくわかんないけど、#defineはコンパイル時定数、
numeric_limits<double>::max()はgcc3.3.3だと
static double max() throw() { return __DBL_MAX__; }
だから実行時定数になる分、パラノイアからしたら効率が下がっているのかもしれない悪寒。


720 名前:デフォルトの名無しさん :2005/06/08(水) 15:55:49
STLのvectorクラスのような動的に確保するもので、
2次元(orN次元)で扱えるものは有りますでしょうか?

721 名前:デフォルトの名無しさん :2005/06/08(水) 15:59:38
vector<vector<T> >

722 名前:デフォルトの名無しさん :2005/06/08(水) 16:37:45
>>716
そういう機能はさ、テンプレートパラメタで渡った型の
プロパティーをテンプレートクラス・関数側で調べるためには
どうしても必要だから標準ライブラリにあるんだけど
そうでなければ、別にどっちつかってもどうでもいいと思うんだが

723 名前:デフォルトの名無しさん :2005/06/08(水) 18:39:15
>>720
boost::multi_array


724 名前:デフォルトの名無しさん :2005/06/09(木) 02:23:09
>>719
numeric_limits<double>::min() (および DBL_MIN )って正の値だったのか。
型として取り得る最小の値を返してくれると思ってたから、
double については負の値だと思ってたよ。

型としての最小値を、テンプレート引数 T から取ろうと思ったら、
numeric_limits<T>::min() だと浮動小数点型の時にダメだし、
-numeric_limits<T>::max() だと整数型の時にダメになるってこと?
場合分けが要るのか?

725 名前:デフォルトの名無しさん :2005/06/09(木) 04:06:13
INT_MINは0?

726 名前:デフォルトの名無しさん :2005/06/09(木) 06:36:29
>>725
そういうことじゃなくて INT_MIN != -numeric_limits<int>::max() ってこったろ。
2の補数的には負の数のが一つ多い。

727 名前:デフォルトの名無しさん :2005/06/10(金) 00:39:28
>724
Effective C++ 第2版の正誤表に関連する記述があるね。
>ttp://aristeia.com/BookErrata/ec++2e-errata_frames.html
>For a floating point type FPT, the minimum representable value is
>typically -numeric_limits<FPT>::max(), though the Standard does not guarantee this.

で、規格をさらってみますと
>ISO/IEC 14882:2003 18.2.1.2-2
> 1 Minimum finite value.181)
> 2 For floating types with denormalization, returns the minimum positive normalized value.
> 181) Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc.
んじゃ、floating types without denormalization はどうやねんと考えると、
18.2.2 から DBL_MIN 等は C 相当。
>ISO/IEC 9899:1999 5.2.4.2.2-10
には FLT_MIN 等は minimum normalized positive floating-point number となって
いるので、結局 floating types については、min() は minimum positive normalized
value を返す、と考えてよさそう。
結局、numeric_limits<T>::is_integer により整数であるかどうかを判別する必要が
あるんじゃないすかね。

ところで有理数型なんてものがあった場合、min() は minimum positive number を
返すべきなんでしょうかね。

728 名前:デフォルトの名無しさん :2005/06/10(金) 01:23:15
template<typename T>
T minimum_value_of()
{
 typedef std::numeric_limits<T> limits;
 return limits::is_integer ? limits::min() : -limits::max();
}

これでいいのか?
判定を is_integer でやるのは、隙があるように思うが、
どうやって判定すべきかわからんな。

729 名前:デフォルトの名無しさん :2005/06/10(金) 15:43:38
boost::multi_arrayを使用したソースをコンパイルしたところエラーが発生したんですが、
エラーメッセージはboost/mpl/aux_/integral_wrapper.hppでエラーが発生したとなっており、
どういった経路でインクルードされたのかを調べるだけでも嫌になりそうです。
こういった分かりにくいエラーメッセージに対処するいい方法はないでしょうか?

730 名前:デフォルトの名無しさん :2005/06/10(金) 16:08:14
>>729
エラーメッセージ貼れよ。長くて貼れないなら、zipに固めてどこかのロダにうp。
STL/Boost関連のエラーメッセージはとにかく複雑でグチャグチャなので、
使用したコンパイラと(エラーメッセージを見ればコンパイラは見当が付くが)、
エラーメッセージがないと何とも言えない。

STLfiltというツールもあるが、Perlを入れて動かしてみる手もある。
http://www.bdsoft.com/tools/stlfilt.html

731 名前:729 :2005/06/10(金) 16:55:27
>>730
すみません、環境はBCC5.5.1とBCC Developerを使っていて、エラメッセージは
エラー E2489 c:\boost_1_32_0\boost/mpl/aux_/integral_wrapper.hpp 45: オプションコンテキスト応答深度の上限を超過: 再帰をチェックしてください

これが25回連続出ます(26個目は「エラーあるいは警告が多すぎる」)。

STLfilt落としてみましたが、英語が読めなく使い方が分からないので、あとで翻訳かけながらじっくり読んでみます。


732 名前:デフォルトの名無しさん :2005/06/10(金) 17:04:17
bccじゃあかんのでは
http://engineering.meta-comm.com/boost-regression/CVS-HEAD/developer/multi_array.html

733 名前:デフォルトの名無しさん :2005/06/10(金) 17:20:56
>>731
そりゃ、templateで再帰展開してる場合が多いしな。
>>732のリンク先見たらfailと書いてあるし、だめみたいだね。
VC7.1かgccが他に有名だからそういうのにすべし。
gccをMinGWにしてSTLport入れれば、BCCなんて不要だし、
Dev-C++を入れればBCC Developerと同じような環境に出来る。

734 名前:729 :2005/06/10(金) 18:47:28
>>732 >>733
そういうことだったんですか。
gccに乗り換えることにします。
どうもありがとうございました。

735 名前:デフォルトの名無しさん :2005/06/10(金) 19:11:52
>>734
あーそうだ、gccは日本語対応してないので、ソ系ダメ文字の問題が
あるので(「ダメ文字」でぐぐるとわかる)、それだけは気を付けてくれ。
コメント欄に書いただけでエラーになる。解決法はその文字の後に'\'
を書くだけなんだが。

前に // 一覧表 と書いてエラーになり、何度調べてもプログラムに
間違いが無く、困っていたが、「表」がダメ文字だとわかり、// 一覧表\
と書いて解決した。

736 名前:729 :2005/06/10(金) 19:15:07
>>735
thx

737 名前:デフォルトの名無しさん :2005/06/11(土) 00:11:31
コメント欄に関してなら、行末に空白や*を入れるだけで充分だと思う。
文字列リテラルはエスケープしなくちゃいけないから、要注意という点はその通りだけど。

738 名前:デフォルトの名無しさん :2005/06/11(土) 00:18:39
そこまで頑張ってWinでgcc使うぐらいならVC++使へ

739 名前:デフォルトの名無しさん :2005/06/11(土) 00:21:06
金があったらVC7.1買え。それが本当はいい選択なんだが。
秋には2005出るぞ。VC7.1買っておけば多分安く買える。

740 名前:デフォルトの名無しさん :2005/06/11(土) 00:26:38
金がなくてもコンパイラ部分だけはタダで使えるしな

741 名前:デフォルトの名無しさん :2005/06/11(土) 01:08:42
effective c++ 読んでて疑問に思ったんだが、
const Foo foo() { return Foo(); }
っていう const オブジェクトを返す関数の戻り値を
Foo f(foo());
みたいに非 const オブジェクトで受けた場合、RVOってできるものなの?

742 名前:デフォルトの名無しさん :2005/06/11(土) 01:34:39
出来る

743 名前:741 :2005/06/11(土) 02:16:54
あ、すいません。勘違いしていました。
聞きたかったのは RVO の次の段階で、
foo() の戻り値である一時オブジェクトをも
最適化で消すことができるかということでした。

ネタ元の記事を発見したので読み返してみます。
お騒がせしました。
http://www.cuj.com/documents/s=8246/cujcexp2102alexandr/

744 名前:デフォルトの名無しさん :2005/06/11(土) 04:25:00
最近のgccはコマンドラインで指定すればiconv使ってくれるしデフォルトでutf-8
を仮定する(もしくはロケールから推測する)と思うんだが。



745 名前:デフォルトの名無しさん :2005/06/11(土) 16:03:42
日本語を使うときは、wchar_t や wstring って
使ったほうがいいんでしょうか?
使わなくても困ったことがないんですけど。


746 名前:デフォルトの名無しさん :2005/06/11(土) 16:05:56
>>745 困ってないなら使わなくていい。

747 名前:デフォルトの名無しさん :2005/06/11(土) 16:17:47
>>745
boost::regexを使うときとかに困る。
困ってから使えばいい。

748 名前:745 :2005/06/11(土) 16:58:59
問題がでたら、その所で、変換すればOKってことですか?

私が以前使ったのは、半角と全角文字がまざっていて、
全角文字を1文字としたとき wchar_t に変換すると、
便利でした。
これが正常な使い方かどうかは、知りません。

あと、unicode を使うときは、wchar_t を使ったほうが
よさそうな感じがして、悩んでます。
UTF-8 なら使わずにすむかなぁとか。

wchar_t や、wstring について解説してあるよいページってないですか?
見てみたんですが、どういうときに使うべきかっていうのは
見つからなくて。


749 名前:デフォルトの名無しさん :2005/06/11(土) 18:45:00
>>748
UTF-8はマルチバイト文字の1種みたいなものだから
プログラム内部で使うのにはあまり向いていないと思う。

750 名前:デフォルトの名無しさん :2005/06/11(土) 19:12:50
wchar_t使ってもエンコードがUTF-16だったりすると(以下略なわけだが。


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