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


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

C++相談室 part45
501 名前:デフォルトの名無しさん :2005/12/24(土) 00:04:36
訳本出すべきだよなーあれ

502 名前:デフォルトの名無しさん :2005/12/24(土) 00:15:40
そういえば、暇つぶしに1/3訳したところでほったらかしてあるなあ……

503 名前:デフォルトの名無しさん :2005/12/24(土) 01:29:02
C++ Template Metaprogramming
Concepts、Tools、and Techniques from Boost and Beyond

とか。これも英文だけど。中身はBoost MPLの解説だし。

504 名前:499 :2005/12/24(土) 11:45:37
英文orz
中学生程度の英語力しかない自分が読んで理解できるかな・・・

505 名前:デフォルトの名無しさん :2005/12/24(土) 12:50:01
リファレンスやマニュアルなら余裕だが教本だとキツイ

っていう俺は低学歴DQNなんだろうか

506 名前:デフォルトの名無しさん :2005/12/24(土) 13:09:52
おいらはリファレンスやマニュアルより簡単なサンプルの方が嬉しかったりする


507 名前:デフォルトの名無しさん :2005/12/24(土) 15:14:59
それは言えている。
英会話でのボディーランゲージに当たるものとしてソースコードがあるという感じ。

508 名前:デフォルトの名無しさん :2005/12/25(日) 01:15:45
スマン質問

const CExtControlBar * CExtMiniDockFrameWnd::GetControlBarExt() const

関数の両方にconstがついてるけども、
左側は返り値に対してCONST。

だけども、右側のconstはどういう意味なの?

509 名前:デフォルトの名無しさん :2005/12/25(日) 01:15:55
あげ

510 名前:デフォルトの名無しさん :2005/12/25(日) 01:22:25
const CExtMiniDockFrameWnd hoge;
hoge.GetControlBarExt();
が呼び出せるようになる。 右のconstがないとconstなオブジェクトに対して呼び出せない。

511 名前:508 :2005/12/25(日) 01:32:40
>>510
ありがとうございます。
constなオブジェクトに対しては、通常のメンバ関数は呼び出せないんですね。
呼び出したい場合は、右にconstをつけると。

512 名前:デフォルトの名無しさん :2005/12/25(日) 01:40:43
結果的にはそうだけど、厳密には自分自身の状態を
書き換えないという意味では?
そのためconstオブジェクトが呼び出せる

513 名前:デフォルトの名無しさん :2005/12/25(日) 02:27:54
512の通り
右にconstをつけたメンバ関数内でメンバ変数を変更してたりすると
コンパイルエラーが出る

514 名前:デフォルトの名無しさん :2005/12/25(日) 02:31:26
そこでmutableですよ

515 名前:デフォルトの名無しさん :2005/12/25(日) 02:41:06
>>514
エラーがでるたび mutable か。カオスだな。

516 名前:デフォルトの名無しさん :2005/12/25(日) 03:01:58
mutable は const HOGE& operatorXXX constな関数内で使いまくってます。
HOGE(BUF) << A << B << C << D << E;
といった感じの、阿呆げな作りにできるのでニッチな人には便利なコです。

517 名前:デフォルトの名無しさん :2005/12/25(日) 03:07:13
goto見たいな物だな。厄介者だけど便利。

518 名前:デフォルトの名無しさん :2005/12/25(日) 04:56:31
>>516
const_cast 一発で済ませたほうがよくないか?

519 名前:デフォルトの名無しさん :2005/12/25(日) 10:14:02
const_castを元からconstのオブジェクトに適用したら結果は未定義だったような。

520 名前:デフォルトの名無しさん :2005/12/25(日) 10:23:54
その通り。
だからmutableが使えない環境で仕方なく使う。fake thisとか

521 名前:デフォルトの名無しさん :2005/12/25(日) 13:33:14
まぁあんまり使うくらいなら設計見直せって誰かがそのうち言うと思うんで俺が言う

522 名前:デフォルトの名無しさん :2005/12/25(日) 15:16:27
惚れた

523 名前:デフォルトの名無しさん :2005/12/25(日) 17:42:39
質問です。

ある機能を薄くラップしたAクラスがあり、その機能の一部を制限し、かつ独自の機能を
追加したBクラスを作成したいとします。このときの実装方法として適切なものはどういうものでしょうか?
特に、制限するところで困ってます(´・ω・`)

プラン1.
class B : public A;
問題点:Aの機能をフルに使えてしまう(制限できない)。
Aに仮想関数xがあったとして、それを制限するために継承したとしてもb.A::x()とすれば呼び出し可能。
まぁコーディング規約としてそういう呼び出し方さえ禁止すれば問題ないんだけど。
なによりも、使用する側に回ったときに、Bのすべての機能についてAからどこが改変されたかを
Aの機能とは別に調べないといけない。

プラン2.
class B{A a;}として、使いたい機能はB::x(){a.x();}としてひとつずつ追加していく。
問題点?:has-a関係って何か間違ってるような気が・・・。

プラン3.
class B : private A;で、使いたい機能だけusing A::xする。プラン2よりは自然な気がする。
問題点:特に無いような気がするけど、ホントに今後困らないかよく分からない。
いいところ:usingしたメソッドはAのものであることが保障されてるのでBの使用者はAのメソッドに
関する知識がそのまま安心して使える。


今のところプラン3で実装しているんですが、なんか根本的に違うような気もしてます。
こういうときに定石としてよく使う方法とかパターンってありますか?よろしくお願いします。

524 名前:デフォルトの名無しさん :2005/12/25(日) 17:47:44
大事なのは、ライブラリとして一貫したスタイルで統一されたI/Fだと思う。
それさえ守られていれば、あたは少しのドキュメントでライブラリの使い方に直感を働かせることができる。

525 名前:デフォルトの名無しさん :2005/12/25(日) 17:55:17
class B : public A pulic if_hoge
{ ・・・ }

として、if_hoge 経由でアクセスさせるとか。

526 名前:デフォルトの名無しさん :2005/12/25(日) 17:57:04
>>523
Bクラスを、「Aクラスによって実装されるクラス」と捉えるならば、
Exceptional C++ 項目22のガイドラインに従って
継承を使う必要がある場合(BがAのprotectedメンバにアクセスする場合や、
仮想関数をオーバーライドする必要がある場合)を除いて
プラン2の包括を使うべき

527 名前:523 :2005/12/25(日) 20:06:36
>>524-526
回答どうもありがとうございます。

526さんのレスを参考にしつつ、EffectiveC++の6章あたりを読んでたのですが、
ラッパクラスを使用して似ているけど別のクラスを作ろうとしていると解釈すれば、
"has-a"か"実装の手段とする"のどちらかの手法をとるようにすべきだと結論付けました。

で、よく考えたら一部機能を実装するためには継承する必要があるのでプラン2は駄目でした。
そんなわけで問題が見つかるまではこのまま3で行くことにしました。

どうもありがとうございました。

528 名前:デフォルトの名無しさん :2005/12/25(日) 21:10:08
>一部機能を実装するためには継承する必要がある

これに何か引っかかりを感じるのって俺だけ?
まー詳細分からないからなんとも言えないけれど

529 名前:デフォルトの名無しさん :2005/12/25(日) 21:42:57
まぁ、俺も3だと思うよ。

530 名前:デフォルトの名無しさん :2005/12/25(日) 22:20:00
>>528
同意。一部機能を実装するだけでは
継承はふさわしくないな。has-aで十分。


531 名前:デフォルトの名無しさん :2005/12/25(日) 22:30:53
template< typename A>
class B{
const &A a;
B(const &A x) : a(x){}
void x(){a.x();}
};

困ったらとりあえずこんな感じにしてるけどな、
使わない実装はコンパイル時に弾いてくれるかもしれないし。


532 名前:デフォルトの名無しさん :2005/12/26(月) 22:26:47
cppllの削除依頼者って誰?
ま、tietewの過去ログ公開はいつかトラブると思ってたけど。
FreeMLで伏せ字にしているメールアドレスまで公開してるんだもんな。

533 名前:デフォルトの名無しさん :2005/12/26(月) 22:33:31
>>532
誰なんだろうなぁ。
しかしメーリングリストに投稿したのに、ログを削除してくれとは・・・

534 名前:デフォルトの名無しさん :2005/12/26(月) 22:35:07
過去ログから削除してくれないかなあ。
そしたら誰だかわかるのに(w

535 名前:デフォルトの名無しさん :2005/12/26(月) 22:39:46
>>532
kwsk

536 名前:デフォルトの名無しさん :2005/12/26(月) 23:30:00
>>534
過去ログの削除完了してる。

537 名前:デフォルトの名無しさん :2005/12/27(火) 00:11:04
>>532
すげー気になる。
どの投稿NOが削除されたか分かるやついない?
過去ログは全部あるから、教えてくれたら晒してもいいぜ

538 名前:道化師 :2005/12/27(火) 00:33:28
>>537
今回の削除依頼人の行動はとても褒められたもんじゃありませんが、
晒すのは勘弁してあげてくれませんでしょうか?m(_ _)m

539 名前:デフォルトの名無しさん :2005/12/27(火) 00:34:41
>>537
なんせこれだろ? もうバカかと!アホかと!
-----------------------------------------------
               通知書

1. 貴殿管理下のメーリングリスト掲示板”C++:language&libraries”(あて先
 cppll@freeml.com)への私の参加においては、「FreeMLユーザー規約
 (http://www.freeml.com/help/sinkiyaku.html)」(以下ユーザー規約)が、
 メーリングリストの運営会社(GMOメディア株式会社、以下運営会社)との
 唯一の合意文書です。

2. 貴殿ご指摘の"一般に公開"については、これが"ML情報"欄
  http://www.freeml.com/ctrl/html/MLInfoForm/cppll@freeml.com
 の"保存メッセージ: 一般に公開"を示すとの意味であれば、上記表示は
 運営会社の表示であり、著作権に関する許諾を意味するものではござい
 ません。

3. 著作物の複製権を貴殿に許諾した事実はございません。著作物の複製
 権に関しては、ユーザー規約第9条(著作権等) 第2項に定める通りです。

4. 従って、貴殿から第三者への複製権許諾が事実ならば、著作権法に基
 づく財産権の侵害にあたる旨を本日警告するものです。

5. 本件に関する違法状態の回復が速やかにはかられない場合、ユーザー
 規約第14条(準拠法および管轄裁判所)にもとづく法的措置をとる旨、
 予めご承知おき下さい。

6. 本状の受領について確認する旨をご連絡ください。確認連絡がない
 場合には別途内容証明郵便にて本内容を貴殿に伝達致します。

平成17年12月26日


540 名前:デフォルトの名無しさん :2005/12/27(火) 00:35:27
>>538
手遅れだと思うな、正直。

541 名前:デフォルトの名無しさん :2005/12/27(火) 00:36:54
>>538
ちょっと……ね。もう遅いと思うよ。

542 名前:デフォルトの名無しさん :2005/12/27(火) 00:37:24
>>540
うん、わかってる。でも出所はひとつでも少ないに越したことはないと思うんで。

543 名前:デフォルトの名無しさん :2005/12/27(火) 00:40:17
ここから他に拡散させなければ良いだけの話だと。
流石にcppllとかしたらばとかに転載したらアレだとは思うが。

544 名前:デフォルトの名無しさん :2005/12/27(火) 00:40:21
でもさぁ・・他のMLならまだしも、
IT系昔から関わってる(と思われる)人たちのMLでこんなこと起きるんだね〜
信じられんよ 漏れは

545 名前:デフォルトの名無しさん :2005/12/27(火) 00:44:30
質問です。

複素数の配列を動的に作りたいのですが、
complexクラスを用いて作る方法って無いのでしょうか…?

std::complex<double> *cstr;
for(i=0;i<10;i++){
 cstr[i] = new std::complex<double>;
}

上のようにするとstd::complex*に二項演算は定義さていない
との旨のエラーが出てしまい上手くいきません。
詳しい方、何卒宜しくお願いします。

546 名前:デフォルトの名無しさん :2005/12/27(火) 00:46:59
>>545
多分君がしたいのはこう

std::complex<double> *cstr = new std::complex<double>[10];

547 名前:デフォルトの名無しさん :2005/12/27(火) 00:47:46
cstr[i]; は complexのインスタンスで
new が返すのはポインタだよな。

二項演算子以前にやってることがおかしい。


548 名前:デフォルトの名無しさん :2005/12/27(火) 00:49:04
>>546
有難う御座いました!

549 名前:デフォルトの名無しさん :2005/12/27(火) 00:50:08
>>545
そのコードはcstr[i]ってどこにアクセスにいってるんだ…

vectorつかえば?

550 名前:デフォルトの名無しさん :2005/12/27(火) 00:53:26
std::vector<std::complex<double> > cstr;

551 名前:デフォルトの名無しさん :2005/12/27(火) 00:58:20
>>549
過去に二次元配列ばかり作ってしばらくプログラムつくってなかったので
エラーが出て悩んでしまったのです。失礼しました。

552 名前:デフォルトの名無しさん :2005/12/27(火) 01:00:18
std::vector<std::complex<double> > cstr(10);
先頭要素のポインタは&cstr[0]
std:vectorの要素はメモリ上で連続してることが保障されています。

関数で一時的に使うバッファとか確保するときにはvector使うと便利
newだと、制御が帰る場所ごとにdelete呼ばないといけないけれど、
vectorでauto変数にしてしまえば関数抜けるときに開放してくれるので。

553 名前:デフォルトの名無しさん :2005/12/27(火) 01:05:25
>>551
二次元配列だろうが何だろうが>>545みたいに
確保してないアドレスにアクセスするのはおかしいですよ?

554 名前:デフォルトの名無しさん :2005/12/27(火) 01:05:32
>>537
削除された投稿って1個なの?
486-496がなくなってるみたいだけど・・


555 名前:252 :2005/12/27(火) 01:08:38
>>538
手遅れだと思う。
こうゆうことがあると必ず複数の人が削除してくれと頼んでこられると困るんだよね。

556 名前:επιστημη :2005/12/27(火) 01:10:37
επιστημη@cppll管理人です。

僕の不行き届きで無様をお見せすることになりました。
無用なトラブルは極力避けたいと考えます。
これ以上の詮索をなさらぬよう、伏してお願い申し上げます。


557 名前:デフォルトの名無しさん :2005/12/27(火) 01:12:23
>>554
ちょっ・・おま・・
消されてもgoogleキャッシュとかで見えちゃうんだよ!
誰だかわかっちゃったじゃねぇか!

558 名前:デフォルトの名無しさん :2005/12/27(火) 01:14:25
そうだね。もうやめようか。

559 名前:επιστημη :2005/12/27(火) 01:18:07
# 火に油を注ぐのは避けたいのですが追記

今回の削除要求は投稿者のmail-adr.が、というわけではなく、
投稿された本文中に個人情報がふくまれているから、という理由でした。
tietewさんとこのログ表示にmail-adr.が含まれていることが直接の
問題ではなかった旨、添えさせてください。

事を荒立てるのは極力避けたいと思っています。
ご理解を賜りたく。


560 名前:デフォルトの名無しさん :2005/12/27(火) 01:18:13
>>554
そうなの
FreeMLと過去ログ両方ないのが252だったので252だと思ってたよ。
削除したのも1つのようだったし。

561 名前:デフォルトの名無しさん :2005/12/27(火) 01:20:55
>>560
252は元々無いよ。

webarchive とか google cache とかどうするつもりなんだろね>投稿者

562 名前:デフォルトの名無しさん :2005/12/27(火) 01:21:20
επιστημηさん、次のカキコからは他のみんなと同じようにメール欄に sage って入れて。
そうしないと書き込みの度に、このスレッドがスレッド一覧でトップに来るから。

563 名前:επιστημη :2005/12/27(火) 01:24:31
>>562

あ、余計に目立たせてしまいましたか。
2chは初めてなもので。失礼しました。


564 名前:デフォルトの名無しさん :2005/12/27(火) 01:24:47
>>562に同意。
余計目立つよ?

565 名前:デフォルトの名無しさん :2005/12/27(火) 01:25:31
っていうかそんな昔の投稿に今更何いってやがんだって感じだよな?
今までずっと公開されて来てるってのに。
ご丁寧にシグネチャに住所とかまで書いてさぁ〜

566 名前:デフォルトの名無しさん :2005/12/27(火) 01:26:29
>>565
会社の宣伝をしたかったんじゃないか。
その後世の中が物騒になったので消してくれと。

567 名前:デフォルトの名無しさん :2005/12/27(火) 01:27:29
こうして悪名を振りまくわけですね

568 名前:デフォルトの名無しさん :2005/12/27(火) 01:28:20
ぶっそうになったのは、世の中ではなく高圧的な態度で法律持ち出してくる
ヤツの方だ、と思ったり思わなかったり。

569 名前:デフォルトの名無しさん :2005/12/27(火) 01:34:08
こいつの名前でぐぐると、vectorとかからこいつの作ったFreewareが
引っかかるけど、ちゃんと作者と連絡先が書いてあるんだよなぁ・・
なんでcppllに対してこんな態度とってんのこいつ?
しかも会社には自分の写真まで載せてるしさぁ〜。わけわかんね。
何が気に入らなかったんだ?

570 名前:デフォルトの名無しさん :2005/12/27(火) 01:38:12
>559
もう多分手遅れでしょう。
あなたの削除の行動は浅慮だったとは思いますけれど、
過去ログの資産としての価値を認識し、削除の伺いを公に問う行動は
きちんと筋が通っているし、削除も迅速に(笑)対応しただけの話。
後はそれが晒されようがどうしようがあなたの管理責任の範疇外でしょう。

正直、後は野となれ山となれ。俺は知〜らないっと。

571 名前:デフォルトの名無しさん :2005/12/27(火) 01:40:22
ttp://www.freeml.com/ctrl/html/MLInfoForm/penterprise@freeml.com
このメーリングリスト用のシグネチャをつけて送信したとかじゃないか。


572 名前:デフォルトの名無しさん :2005/12/27(火) 01:43:37
今回の件とは関係なく重複投稿や投稿先を間違えた投稿なんかも削除されてるから勘違いせんようにね。

573 名前:επιστημη :2005/12/27(火) 01:43:44
>>570

> あなたの削除の行動は浅慮だったとは思いますけれど、
はい、いささか性急に過ぎたかと反省しています。
「いついつまでに削除せんと出るとこ出るぞ」と
先方からの通告を受けてからでも遅くはなかったのかも知れません。

「依頼に応じ、速やかに削除しました」と言い訳も立ちますけれど。


574 名前:デフォルトの名無しさん :2005/12/27(火) 01:45:17
>>573
まぁ、削除依頼主の期待に応えてあげただけなんだから、あんま気ぃを落とすなよw

575 名前:デフォルトの名無しさん :2005/12/27(火) 01:46:01
たとえ個人情報でも、Publicに公開した情報は個人情報保護の対象にはならないんだけど・・
こいつの場合他(会社のWebSiteやvectorなど)のPublicな場所に<自分から>公開しているので、
たとえcppllでその情報が公開されても、警告を受ける筋合いはないんだが・・

576 名前:デフォルトの名無しさん :2005/12/27(火) 01:47:44
>>572
つーわけで、比較用に置いておく。
http://web.archive.org/web/*/http://www.tietew.jp/

577 名前:デフォルトの名無しさん :2005/12/27(火) 01:49:10
>>575
それってここに晒されても無問題ってことでFA?

578 名前:επιστημη :2005/12/27(火) 01:49:46
>>576

いや、だから、勘弁してくださいって。


579 名前:デフォルトの名無しさん :2005/12/27(火) 01:52:17
>>577
C++相談室の内容じゃないぞ、それは

ところで、聞いてるとその方は会社を持ってたり、
フリーソフト作ったり結構C++の技術力がありそうですね?
技術的な参考にしたいので、その方の作ったフリーソフトを
紹介してもらえませんか?

580 名前:επιστημη :2005/12/27(火) 01:54:04
>>579

すんません、せめて"内々"にお願いします。
いやホント、勘弁してください。 _o/L


581 名前:デフォルトの名無しさん :2005/12/27(火) 01:55:26
>>579
うむ。その質問は That's make sense.
無問題ですな。誰か教えたったり。

582 名前:デフォルトの名無しさん :2005/12/27(火) 01:55:44
おまえら勢ぞろいで板違いだな

583 名前:Addicted to C++ ◆nrBjarne.g :2005/12/27(火) 01:57:06
おまえら勢ぞろいで意地悪だなw

584 名前:デフォルトの名無しさん :2005/12/27(火) 01:58:13
>>580
なんにしても cppll のログはお蔵入り、次に ML を建てるときには
入会申請時に「投稿したメールは公開されます」と明記して、承諾
してもらう方向ですわな。

早めに引っ越し先が見つかることを期待しとります。

585 名前:デフォルトの名無しさん :2005/12/27(火) 01:58:45
おまえら勢ぞろいで脳タリンだなww

586 名前:デフォルトの名無しさん :2005/12/27(火) 03:02:55
>580
で、規約見直しはしたの?
CCの帰属 - 非営利 - 同一条件許諾 2.0 日本に同意させてから
投稿させるようにしたら?


587 名前:デフォルトの名無しさん :2005/12/27(火) 03:06:27
>>539
こんなん送られてきたらそりゃ、ビビッて相手の言う通りに削除するわなw

588 名前:デフォルトの名無しさん :2005/12/27(火) 03:17:48
彼らを一掃する標準関数を教えてください。

589 名前:デフォルトの名無しさん :2005/12/27(火) 05:26:55
>>588
残念ながら非標準だが
int deleteKorean(Person *target);

590 名前:デフォルトの名無しさん :2005/12/27(火) 05:30:12
persons.erase(std::remove_if(persons.begin(), persons.end(), _1 == any_of("厨房"));

591 名前:デフォルトの名無しさん :2005/12/27(火) 06:08:03
#include <kimuchi.h>

592 名前:デフォルトの名無しさん :2005/12/27(火) 06:17:00
>>591
そのヘッダを入れたプロジェクトは、必ず失敗します。法則の発動。

593 名前:デフォルトの名無しさん :2005/12/27(火) 08:50:31
漏れのいない間に祭りがw

594 名前:デフォルトの名無しさん :2005/12/27(火) 10:34:54
おまいらまとめてしたらばの方に行ってこいw
ttp://jbbs.livedoor.jp/computer/5651/

595 名前:デフォルトの名無しさん :2005/12/27(火) 12:28:28
痛い人って、

「横浜市緑区」

の人かい?

596 名前:デフォルトの名無しさん :2005/12/27(火) 12:49:07
>>595
いや、お前。メル欄含めて。

597 名前:名無し募集中。。。 :2005/12/27(火) 16:37:47
VCMLな方々はcppllにいらっしゃったのですか?
今からでも入会させてくださいませ

598 名前:デフォルトの名無しさん :2005/12/27(火) 16:54:07
delete >>597;

599 名前:デフォルトの名無しさん :2005/12/27(火) 17:41:04
arrest(>>598,TRUE);

600 名前:デフォルトの名無しさん :2005/12/27(火) 18:07:14
逮捕してどうする

601 名前:デフォルトの名無しさん :2005/12/27(火) 21:37:09
>>599.setTukkomi(>>600);

602 名前:デフォルトの名無しさん :2005/12/27(火) 22:22:53
2chの「削除依頼は公開」ってのはいいよねぇ

603 名前:デフォルトの名無しさん :2005/12/27(火) 22:31:39
で、ここは何のスレだっけ

604 名前:デフォルトの名無しさん :2005/12/27(火) 22:52:59
Hoge* create_hoge()
{
listHoge.push_back( Hoge() ); //listHogeはHoge型リスト
Hoge* created_hoge = &(listHoge.back());

sort(); //内部ではswap等を使ってコムソートしてます
return created_hoge;
}

今がチャンス。リストにHogeを追加し、追加したHogeへのポインタを返す関数を作りたいのですが、
上のだとsortした時に、created_hogeの内容が変わっちまって悩んでます。
なにか上手い手はないでしょうか。

605 名前:デフォルトの名無しさん :2005/12/27(火) 23:02:56
>>604
× std::sort
○ list::sort

606 名前:デフォルトの名無しさん :2005/12/27(火) 23:22:24
自分も過去ログのメアドは非公開にしてほしいな。

こんなご時世(spam他)なのにいつまでも公開したままなのは
申し訳ないが過去ログサイト管理人の怠慢としか思えないですよ。


607 名前:デフォルトの名無しさん :2005/12/27(火) 23:22:48
>今がチャンス

ここの意味がわからないんだがw

608 名前:デフォルトの名無しさん :2005/12/27(火) 23:29:02
>>563
> >>562
>
> あ、余計に目立たせてしまいましたか。
> 2chは初めてなもので。失礼しました。
>

ありぁ、このスレで答えてんのは全部επιστημηさんだとずっと思ってたよw

609 名前:デフォルトの名無しさん :2005/12/27(火) 23:32:19
クラス内のメンバ関数で、_beginthreadを使いスレッドを作ろうとしています。
同じクラス内のメンバ関数を呼ぶにはどう書けば良いのか、教えて欲しいです。
普通に呼び出そうとしても、ポインタを取ってきてもだめ・・・

610 名前:デフォルトの名無しさん :2005/12/27(火) 23:34:53
>>609

class Hoge {


static void fugo(void* hoge) {
Hoge* self = hoge;
self

Hoge hoge;
_beginthread(Hoge::fugo, hoge)

611 名前:デフォルトの名無しさん :2005/12/27(火) 23:35:37
>>605
すんません、どういう意味かよく…
sortはこちらのを使わせて貰ってます
ttp://www.s34.co.jp/cpptechdoc/article/sort/

>>607
いやー、ずっと書き込みづらい話題だったので>>603で待ってましたと

612 名前:デフォルトの名無しさん :2005/12/27(火) 23:36:31
途中で送ってしまった。。。orz

class Hoge {
static void fugo(void* hoge) {
Hoge* self = hoge;
self->func()
}

Hoge hoge;
_beginthread(Hoge::fugo, &hoge);

やりようはいくらでもある。

613 名前:デフォルトの名無しさん :2005/12/27(火) 23:47:37
>>612
ありがとうございます。
見せて頂いたのはクラス外から呼び出した、スレッドのメンバ関数"の中"から
別のメンバ関数を呼ぶというコードだと思いますが、
class Hoge {
void fugo(void* p) {}
void hoge() { _beginthread(Hoge::fugo, 0, 0); }
};
このようにクラスのメンバ関数から、
別のメンバ関数を_beginthreadに使う方法がありましたらお願いしたいです。
上記だと、void (void *)からvoid(__cdecl *)(void*)に変換できません、と。。

614 名前:デフォルトの名無しさん :2005/12/28(水) 00:12:54
ぐぐってみたらありました。申し訳ないです。
ttp://www.hey-to.net/ML-archive/vcppML/1999/msg10223.html
スレッドの中からまたメンバ関数を呼び出そうとも思っていたため、
>>612さんのはとても参考になりました。ありがとうございます。

615 名前:デフォルトの名無しさん :2005/12/28(水) 05:40:46
>>608
奴は逆にこのスレでは質問する立場になるだろうな。
正直なところ、このスレのほうが cppll よりも話題のレベル、
反応速度、最近では S/N 比までが優れていると思う。

616 名前:デフォルトの名無しさん :2005/12/28(水) 10:42:56
えっと、まとめフラッシュまだ?

617 名前:デフォルトの名無しさん :2005/12/28(水) 11:00:33
てーか最近cppllの過疎化が著しい気がする。
なんか策ない? >えぴの人とか道化の人とか

618 名前:デフォルトの名無しさん :2005/12/28(水) 11:05:26
>>617
いい加減他所でやれって。
知育発達不全なのか?

619 名前:デフォルトの名無しさん :2005/12/28(水) 12:02:56
知育発達?

620 名前:デフォルトの名無しさん :2005/12/28(水) 14:40:18
ttp://www.google.co.jp/search?complete=1&hl=ja&q=%22%E7%9F%A5%E8%82%B2%E7%99%BA%E9%81%94%E4%B8%8D%E5%85%A8%22&lr=

621 名前:デフォルトの名無しさん :2005/12/28(水) 19:41:10
テンプレートクラスの定義のほとんどは同じで
一つのメンバ関数の定義だけを特殊化したいんですが、どうしたらいいんでしょうか?

622 名前:デフォルトの名無しさん :2005/12/28(水) 19:50:09
>>621
template<typename T>
struct a
{...}//ここに共通の機能
template<typename T>
struct b : a
{...};//bに差分の機能
みたいに書いてbを特殊化させるとか

623 名前:622 :2005/12/28(水) 19:50:55
×struct b : a
○struct b : a<T>


624 名前:デフォルトの名無しさん :2005/12/28(水) 20:12:20
>>622
やっぱそういう風にするしかないんですかね。ありがとうございます。
普通に一つづつの関数について特殊化できてもいい気がするんですけどね。

625 名前:デフォルトの名無しさん :2005/12/28(水) 20:17:54
やっぱり、共通の機能のところで差分の機能を使いたいので aとbを逆にした方がいいかもしれないです。

626 名前:デフォルトの名無しさん :2005/12/28(水) 20:26:32
>>621
定義を特殊化するのではなくて、
実装を特殊化するという方法なのでやりたいこととは違うかもしれんが。

#include<stdio.h>
template<typename T>struct A{void foo();};
template<typename T>
void A<T>::foo(){printf("foo\n");}
void A<int>::foo(){printf("int foo\n");}
int main(){
    A<int*> c;
    A<int> d;
    c.foo();
    d.foo();
}


627 名前:デフォルトの名無しさん :2005/12/28(水) 20:43:52
>>626
正にそういうことがやりたいです。

#include<cstdio>
template<typename T, class M>struct A{void foo();};

template<typename T, class M>
void A<T, M>::foo(){std::printf("foo\n");}

template<class M>
void A<int, M>::foo(){std::printf("int foo\n");}

//template<>
//void A<int, int>::foo(){std::printf("int foo\n");}

int main(){
A<int*, int> c;
A<int, int> d;
c.foo();
d.foo();
}

こうするとエラーなんですよね。コメントアウトしてるところは大丈夫なんですが。

628 名前:デフォルトの名無しさん :2005/12/28(水) 22:31:08
>>627
それがコンパイルエラーになるのはクラステンプレートの部分特殊化が抜けているからでは。

template<class M>struct A<int, M> {void foo();};
これを追加したらコンパイルできた(VisualC++2005Express)。

コメントアウトしてるのが大丈夫なのは関数テンプレートの特殊化と解釈されるからだと思う。
関数テンプレートの部分特殊化は出来ないというのが今の言語仕様だったはず。

629 名前:デフォルトの名無しさん :2005/12/28(水) 22:39:47
>>628
それはクラスごと特殊化してるんですよね。
一つのメンバ関数だけ特殊化したいので >>622みたくやるしかないですかね。

630 名前:628 :2005/12/28(水) 22:59:25
>>629
関数テンプレートの全パラメータを特殊化するのであればメンバ関数でもできるけど、
部分特殊化を使いたいならクラス定義が必要ということです(これはC++文法の話)。

629さんの要求を推察するに、622さんのレスどおり継承ベースの手法があってるように思えます。

631 名前:デフォルトの名無しさん :2005/12/28(水) 22:59:56
>>629
メンバーテンプレート関数にすればいいだけでは。

632 名前:デフォルトの名無しさん :2005/12/28(水) 23:54:42
ここら辺のテンプレートの文法について詳しく説明した本ってないですか?
入門書の解説は適当だし他の本はそこら辺の知識を前提として書かれてて・・・
Cのポインタ本みたいにテンプレートについてもりもり書かれて比較的やさしい
ちょうどいい感じのないのかな

633 名前:デフォルトの名無しさん :2005/12/29(木) 00:04:43
>>632
C++Primer第3版(日本語)

英文でもよかったら、絶対お勧めなのが、
C++ Templates

634 名前:デフォルトの名無しさん :2005/12/29(木) 00:42:21
Modern C++ Designでも軽く触れていたな


635 名前:デフォルトの名無しさん :2005/12/29(木) 05:16:43
Modern C++ Design 読み始めたときは
テンプレートの文法、型を置き換える程度のことしか知らない状態だったけど、
一通り読んだ後はテンプレートのコード見るのも苦にならなくなったな

まえがきでCTAssert見たときは、サッパリ意味不明でどうなることかと思ったものだが
template<cool>とか書いてあるし

636 名前:デフォルトの名無しさん :2005/12/29(木) 13:29:38
Modern C++ Design読んでみたらしょっぱなから
クラステンプレートの継承とか引数にテンプレートとかやっちゃってて
理解不能・・・
やっぱり>>633の挙げてる本読んでおかないとダメなのかな

637 名前:デフォルトの名無しさん :2005/12/29(木) 15:16:12
あの、調べ方が悪いと思う出のですが
C++のクラスの継承についてお願いします。。

例えば
class A{ ... }と宣言され
class B:public A{ ... }としますと、
Aのコンストラクタ及びデストラクタ(もちろんprivateメンバもです)はコピーされませんよね?

638 名前:デフォルトの名無しさん :2005/12/29(木) 15:22:12
>>637
コピー?

639 名前:デフォルトの名無しさん :2005/12/29(木) 15:22:36
>>637
コンストラクタがコピーされるって何のこと?

640 名前:デフォルトの名無しさん :2005/12/29(木) 15:25:03
言葉が悪かったです
"継承"ですね

641 名前:デフォルトの名無しさん :2005/12/29(木) 15:25:26
仮想デストラクタの機能について、具体的に何がうれしいのか教えてほしいです。

642 名前:デフォルトの名無しさん :2005/12/29(木) 15:28:36
>>640
調べ方
・コンストラクタの中で cout してみる
・B に A と同様の初期値を与えてみる

643 名前:デフォルトの名無しさん :2005/12/29(木) 15:32:08
>>642
一応動作検証して
BにはAのコンストラクタは継承されてない事は確認したのですが、仕様としてはどうなのかなーと

644 名前:デフォルトの名無しさん :2005/12/29(木) 15:39:44
>>643
http://www.jisc.go.jp/

645 名前:デフォルトの名無しさん :2005/12/29(木) 18:07:31
>>641
Base* b = new Derived;
...
delete b;
としたときに、~Derived()を呼び出してくれること。

646 名前:デフォルトの名無しさん :2005/12/29(木) 18:09:05
>>643
Bの構築時にAのコンストラクタは呼ばれるよ
あなたの言っている「継承されてない」が何を意味しているかによるけど


647 名前:デフォルトの名無しさん :2005/12/29(木) 18:23:11
こういう事じゃないの
struct A
{
A(int){}
};
struct B : public A
{
};

B(1);//エラー

648 名前:デフォルトの名無しさん :2005/12/29(木) 18:28:50
エスパー杉(゚д゚)

649 名前:デフォルトの名無しさん :2005/12/29(木) 18:29:10
で、コンストラクタとデストラクタ(と代入演算子もだっけ?)は明示的に宣言しなければ、
継承とか関係なく、デフォルトの実装が暗黙的に実装される。
じゃなかったっけ?

650 名前:デフォルトの名無しさん :2005/12/29(木) 18:57:36
>>648
この時点でまだそんなこと言ってる奴は鈍すぎ

651 名前:デフォルトの名無しさん :2005/12/29(木) 19:20:08
>>649
確か、そんな感じ。
無ければ自動で生成される類は、継承されない。

652 名前:デフォルトの名無しさん :2005/12/29(木) 19:41:00
646の2行目

653 名前:デフォルトの名無しさん :2005/12/29(木) 20:19:14
参照渡しの

int hoge(int *hogehoge)



int hoge(int &hogehoge)

はどう使い分けるんですか?

654 名前:デフォルトの名無しさん :2005/12/29(木) 20:25:21
>>653
ポインタが必要なら前者、そうでないなら後者。

655 名前:デフォルトの名無しさん :2005/12/29(木) 20:28:13
nullを許容するなら前者、違うなら後者

#まぁ、後者にも無理やりnullを渡せますけどね

656 名前:デフォルトの名無しさん :2005/12/29(木) 20:39:06
今月号のCマガに、明示的に管理責任を移動させる場合には
参照でなくポインタを使うってのがあったな。

657 名前:デフォルトの名無しさん :2005/12/29(木) 20:52:11
値渡しと見た目が一緒だから、出力用引数に参照を使うな。
って案もあるな。

658 名前:デフォルトの名無しさん :2005/12/29(木) 20:55:47
>>656
すんげー曖昧な指針だな
参照カウントとか使うケースほどでもなく
値で渡すのも何だからみたいな
ある特定の事情ってことか?

もっと単純にガッする場合のあるなしじゃね?

659 名前:デフォルトの名無しさん :2005/12/29(木) 21:02:10
>>658
NULLを扱う場合の有無ももちろんだけど、それに加えてってことだろ。

660 名前:デフォルトの名無しさん :2005/12/29(木) 22:12:17
質問です。
クラス内のプライベートな配列メンバを作るのはよくないでしょうか?
そのドライバルーチンからそのメンバを読み(書きはしない)たいのです。
こういう設計自体が間違ってるのかな?
超初心者の質問ですが、よろしくお願いします。

661 名前:デフォルトの名無しさん :2005/12/29(木) 22:21:32
ドライバルーチンとは、サブルーチン群を呼び出すmain()ルーチンのことです。
この場合はドライバとは言わないですよね・・・すみません。

662 名前:デフォルトの名無しさん :2005/12/29(木) 22:26:56
>>660
まともな日本語で書け。main()ルーチンって何だ?routineは
“関数”じゃないぞ?

663 名前:660 :2005/12/29(木) 22:31:19
サブルーチンに対するメインルーチンのことです。
main()とは限らないですよね・・・


664 名前:デフォルトの名無しさん :2005/12/29(木) 22:32:48
>>660
>クラス内のプライベートな配列メンバを作るのはよくないでしょうか?
何でそう思ったの?


665 名前:660 :2005/12/29(木) 22:39:08
一般に、プライベートなデータメンバは外部からアクセスする時、
パブリックメンバ関数のreturnしかないからです。メンバへのポインタを外部に持たせて云々
とかは言わないで下さい。
配列の場合、CやC++では、インスタンスをそのままreturn できないので、
ポインタを返すしかありません。
そのポインタを介して読み書きするのは、エレガントとはいえないです。
(っていうか、できない?)
こういう場合は、どんな方法を取ったらいいのでしょうか?

666 名前:デフォルトの名無しさん :2005/12/29(木) 22:40:33
イテレータでも作れば?

667 名前:666 :2005/12/29(木) 22:42:52
ポインタと大差ないか・・・

668 名前:デフォルトの名無しさん :2005/12/29(木) 22:48:25
>>667
おーい、頭元気か

669 名前:デフォルトの名無しさん :2005/12/29(木) 22:48:43
>>665
1. boost::array
2. 配列への参照を返す。
3. std::vector
4. 素直にポインタを返す。
5. ポインタを返さなくて済むように設計を見直す
6. その他
どれでもどうぞ


670 名前:660 :2005/12/29(木) 22:51:11
ありがとうございます。
5:設計を見直します。
お騒がせしました

671 名前:デフォルトの名無しさん :2005/12/29(木) 22:53:26
まぁ、やりたいことはイテレータなんだろうけど、自前で配列云々するのはおろかだな。
STLのコンテナクラスをそのクラスのメンバにしておいて、アクセスしたい場面ではそ
のイテレータをそのまま返すなりすればいいだろ。

672 名前:デフォルトの名無しさん :2005/12/29(木) 22:54:43
std::vectorなら、インスタンスをコピー渡しでreturnできるよ。

673 名前:デフォルトの名無しさん :2005/12/29(木) 22:56:39
>>672
せめてconst参照を返そうよw

674 名前:デフォルトの名無しさん :2005/12/30(金) 00:30:41
汎用コンテナ作っているならともかく、普通のホルダ作っているんだったら
設計やり直したほうがいいわな。
メンバ変数を晒すなんて、責任分担がおかしくなっている兆候だろうし。



675 名前:デフォルトの名無しさん :2005/12/30(金) 00:55:56
ここってネタスレじゃなかったの?

676 名前:デフォルトの名無しさん :2005/12/30(金) 00:59:28
>>657
その指針からoperatorは除かねばならんな。

677 名前:デフォルトの名無しさん :2005/12/30(金) 01:03:33
operatorを例外とした>>657の指針って結構一般的じゃないの?

678 名前:デフォルトの名無しさん :2005/12/30(金) 01:18:13
>>677
そう言う人は確かに結構多いけど…では実際変更するものをポインタで、
というのも、関数書く側としては一々*を付けるのは面倒くさいわけで。

679 名前:デフォルトの名無しさん :2005/12/30(金) 01:28:43
>>678
*付ける程度の労力を惜しむなら関数設計しなくていいよ

680 名前:デフォルトの名無しさん :2005/12/30(金) 01:34:21
値渡しがデフォってのはまだ C を引きずってるんだろうな
参照渡しがデフォならコピコンを明示的に使うって立場もあろうが

681 名前:デフォルトの名無しさん :2005/12/30(金) 02:12:55
>>680
値渡しがデフォってスタイルでなんかいいことひとつでもあんの?

そんなスタイルは、どこで変数が変更されるのか追いかけるのが大変に上に、
そーゆー用途で(必ずしも必要ではないかもしれない場面で)コピコンを呼ぶのは
パフォーマンス的に全くの無駄だし、テラ嫌ス。

682 名前:デフォルトの名無しさん :2005/12/30(金) 03:09:06
>>681
???

683 名前:デフォルトの名無しさん :2005/12/30(金) 03:57:48
C++の参照はちょっと中途半端で使いづらい。
無ければ無いでよかったのに。

684 名前:デフォルトの名無しさん :2005/12/30(金) 08:29:47
>>681
>値渡しがデフォってスタイル
>どこで変数が変更されるのか追いかけるのが大変
矛盾。それとも参照渡しがデフォならどこでも変更される
可能性があるから追いかける意味がないとでも言いたいのか?


685 名前:デフォルトの名無しさん :2005/12/30(金) 10:19:26
>>683
MyClass x,y,z;
...
z=x+y;
などと書けるようにするためでは?

686 名前:デフォルトの名無しさん :2005/12/30(金) 10:34:50
>>683
参照がないと値渡し以外で使うときにoperatorが使いにくい罠ってこったな。

Hoge hage(Hoge *p)
{
  Hoge kami(0);
  Hoge fusa;
  fusa = p->operator *(kami) ;  //これ以外呼びようがない!
  return fusa;
}

これはつらいっしょ。


687 名前:デフォルトの名無しさん :2005/12/30(金) 10:35:43
>>665
bcc32.exeなら__propertyで読み出し専用配列つくれるよ!

                 ハ_ハ  
               ('(゚∀゚∩ つくれるよ!
                ヽ  〈 
                 ヽヽ_)


688 名前:デフォルトの名無しさん :2005/12/30(金) 11:07:07
  fusa = *p * kami ;  //これ以外呼びようがないか?

689 名前:デフォルトの名無しさん :2005/12/30(金) 11:12:55
>>687
VCにも__declspec(property())があるよ!

                 ハ_ハ  
               ('(゚∀゚∩ あるよ!
                ヽ  〈 
                 ヽヽ_)


690 名前:デフォルトの名無しさん :2005/12/30(金) 11:31:12
移植性が必要なときが問題だな

691 名前:デフォルトの名無しさん :2005/12/30(金) 11:42:40
ttp://homepage3.nifty.com/catfood/up/src/up0290.txt

こういうことではないかと。


692 名前:デフォルトの名無しさん :2005/12/30(金) 11:43:27

  環   立  イ_i_  ┼─
     土見   | イ ヒ  イ 子

                                    /\___/ヽ
    (.`ヽ(`> 、                         /''''''    '''''':::::\
     `'<`ゝr'フ\                 +   |(●),   、(●)、:| +
  ⊂コ二Lフ^´  ノ, /⌒)                   |  ,,,ノ(、_, )ヽ、,, .:::|
  ⊂l二L7_ / -ゝ-')´                +  |   `-=ニ=- ' .::::::| +
       \_  、__,.イ\           +     \   `ニニ´  .:::/    +
        (T__ノ   Tヽ        , -r'⌒! ̄ `":::7ヽ.`- 、   ./|
         ヽ¬.   / ノ`ー-、ヘ<ー1´|  ヽ | :::::::::::::ト、 \ (  ./ヽ
          \l__,./       i l.ヽ! |   .| ::::::::::::::l ヽ   `7ー.、‐'´ |\-、

class Cool
{
public:
 __declspec(property(get=GetX, put=PutX)) int x[];
              :
              :
};

693 名前:デフォルトの名無しさん :2005/12/30(金) 11:47:54
あ、変数宣言かぶってしまった。
その部分は脳内修正お願いします。
アク禁うざいOTL

694 名前:デフォルトの名無しさん :2005/12/30(金) 12:05:52
  千タ   千十   | 牛
  木タ   木旧  小 ⊥
          ̄
                                    /\___/ヽ
    (.`ヽ(`> 、                         /''''''    '''''':::::\
     `'<`ゝr'フ\                 +   |(●),   、(●)、:| +
  ⊂コ二Lフ^´  ノ, /⌒)                   |  ,,,ノ(、_, )ヽ、,, .:::|
  ⊂l二L7_ / -ゝ-')´                +  |   `-=ニ=- ' .::::::| +
       \_  、__,.イ\           +     \   `ニニ´  .:::/    +
        (T__ノ   Tヽ        , -r'⌒! ̄ `":::7ヽ.`- 、   ./|
         ヽ¬.   / ノ`ー-、ヘ<ー1´|  ヽ | :::::::::::::ト、 \ (  ./ヽ
          \l__,./       i l.ヽ! |   .| ::::::::::::::l ヽ   `7ー.、‐'´ |\-、

class Cool
{
public:
#ifdef __MICROSOFT_C__
 __declspec(property(get=GetX, put=PutX)) int x[];
#endif
#ifdef __BORLAND_C__
 __property int x[int] = { read=GetX, write=PutX };
#endif
              :
              :
};

695 名前:デフォルトの名無しさん :2005/12/30(金) 13:46:31
論理的な定数性について、説明して欲しいです。
ぐぐってもヒットしません。

696 名前:681 :2005/12/30(金) 14:44:17
あ、ゴメン。
「参照渡しがデフォってスタイルでなんかいいことひとつでもあんの?」
の間違い。orz

697 名前:デフォルトの名無しさん :2005/12/30(金) 14:50:49
もう、コンスト参照がディフォルトってことでいいよ。

698 名前:デフォルトの名無しさん :2005/12/30(金) 15:13:01
>>695
「ビットの定数性」に対する語としての論理的定数性のこと?

699 名前:デフォルトの名無しさん :2005/12/30(金) 15:23:43
>>696
蒸し返して悪いけど、そうじゃないかと思ったのだが、それだと
後半の値渡しを批判しているっぽいくだり『コピコンを呼ぶのは
パフォーマンス的に全くの無駄だし』と矛盾しない?

700 名前:デフォルトの名無しさん :2005/12/30(金) 15:26:57
標準で定められている例外は次の通りです。
exception から直接派生しているもの
bad_alloc, bad_cast, bad_exception, bad_typeid,
ios_base::failure, logic_error, runtime_error

logic_error から派生しているもの
domain_error, invalid_argument, length_error, out_of_range

runtime_error から派生しているもの
overflow_error, underflow_error, range_error

例えばメモリアロケーションに失敗したり、
その他浮動小数点演算で数値として表すことができない結果が出たり、
といろいろと例外処理したいシチュエーションがありますが、
そういう例外クラスの事実上の標準なクラスライブラリってあります?

701 名前:デフォルトの名無しさん :2005/12/30(金) 16:08:47
処理系依存です
処理系依存です
処理系依存です
処理系依存です
処理系依存です


702 名前:700 :2005/12/30(金) 17:03:49
そうですか、その辺は処理系依存ですか。
ISO規格に含まれている >>700 の例外だけは
ポータブルってことですね。

703 名前:デフォルトの名無しさん :2005/12/30(金) 17:27:45
>>700
メモリアロケーションの失敗は bad_alloc でいいんじゃないの?

704 名前:700 :2005/12/30(金) 17:31:12
>>703 いわれてみれば or2

705 名前:デフォルトの名無しさん :2005/12/30(金) 19:47:26
>>684
Generic なアルゴリズム書くのが激しく面倒になるが。

706 名前:デフォルトの名無しさん :2005/12/30(金) 19:48:53
>>705
テンプレートなら特殊化があるね

707 名前:デフォルトの名無しさん :2005/12/30(金) 20:10:12
>>699
それは >>680 の言うコピコンの使い方(値を変えられると困る場面で、const の代わりに引数を変更
されてもいいようにコピーを渡す)を受けての話。

708 名前:デフォルトの名無しさん :2005/12/30(金) 21:47:48
ClassA a;

if( ClassA b = a )
 b.func();

今気付いたんだけど、ifの条件式でこんなことできるんだね。
知らなかった。

709 名前:デフォルトの名無しさん :2005/12/30(金) 21:52:18
bool に変換できる型である必要があるけど

710 名前:デフォルトの名無しさん :2005/12/30(金) 21:54:34
条件式と見間違えやすいからけっこう危険だよ。
dynamic_cast用にしといた方が無難だと思う。


711 名前:デフォルトの名無しさん :2005/12/30(金) 21:55:41
条件式の中で代入を使うのは、間違いって教わった人は
気づかないかもしれないね

712 名前:デフォルトの名無しさん :2005/12/30(金) 22:00:33
ぼけらんどの功罪

713 名前:デフォルトの名無しさん :2005/12/30(金) 22:03:11
>>708
たしか、while でもできるよ。

714 名前:デフォルトの名無しさん :2005/12/30(金) 22:06:45
for でもできるっしょ
条件式を持っているなら、どれでもできるような気が・・・

715 名前:デフォルトの名無しさん :2005/12/30(金) 22:07:29
if( int i=0, j=1) { }
は合法?

716 名前:デフォルトの名無しさん :2005/12/30(金) 22:08:39
>>714
do whileじゃ無理っす
まぁ、正直出来ても活用性0ですけどw

717 名前:デフォルトの名無しさん :2005/12/30(金) 22:09:25
switchも可能だったはず。

718 名前:デフォルトの名無しさん :2005/12/30(金) 22:10:31
昔のCの本に1["string"]とか書けるっていう記述があったな。
さすがにC++じゃ無理だろうが

719 名前:デフォルトの名無しさん :2005/12/30(金) 22:14:14
>>718
a[b] は*(a+b)と同じ意味なので
1["STR"] = *(1 + "STR") = *("STR" + 1) = "STR"[1]
という事やね。
C++でも出来た気がする。

720 名前:デフォルトの名無しさん :2005/12/30(金) 22:14:32
なんでfor(int i, int j; 1; ++i, --j);
のように、変数導入宣言が二回以上使うことができないのだろうか?
C#ではできるのかな?

721 名前:デフォルトの名無しさん :2005/12/30(金) 22:22:34
for( int i=0, j=1;;)

722 名前:デフォルトの名無しさん :2005/12/30(金) 22:24:34
局所的に制御変数を二つ導入したいことは結構あるのに...

723 名前:デフォルトの名無しさん :2005/12/30(金) 22:25:51
沢山条件がある場合は
構造体にパックしたりすればいいんでない?
またはcharとか1byte変数配列を必要な数だけ宣言して、型キャストするとか

724 名前:デフォルトの名無しさん :2005/12/30(金) 22:26:01
っていうか、for(;1;)なら制御もクソもないかw

725 名前:デフォルトの名無しさん :2005/12/30(金) 22:35:16
二項演算子 [] は可換

726 名前:デフォルトの名無しさん :2005/12/30(金) 22:37:44
std::vector<int> v;
FOREACH( v, int i){ printf("%d",i); }
みたいなことのできるマクロ書いてた頃(素直にboost使う気になれなかった頃)
for(int i=0, v::iterator it=v.begin;
と実装できなくて困った覚えがあるなぁ

727 名前:デフォルトの名無しさん :2005/12/30(金) 22:38:04
operator[]()

728 名前:デフォルトの名無しさん :2005/12/31(土) 05:11:09
template <class Type> class A{
public:
Type &func1(){return data1;}
Type data1;
};

template <class Type> class B : public A<Type>{
public:
void func2(){
data2 = A<Type>::func1();
//data2 = func1();
}
Type data2;
};

gccで上記はコンパイルできますが、//でコメントアウトしている書き方では
エラーがでてしまいます。
この例ではなぜベースクラスまで指定しないといけないんでしょうか?

729 名前:デフォルトの名無しさん :2005/12/31(土) 08:06:11
>>728
テンプレートは、引数が与えられていない定義そのものと、引数を与えられた時点の
2回構文がチェックされる。

クラス・テンプレートのメンバは、あとで明示的特殊化によって御破算にされる可能性が
あるから、最初のチェックのときには名前検索の対象にならない。だから修飾されていない
"func1"はその定義が見つからず、エラーとなる。

ただし、その名前がテンプレート・パラメータに従属している基底クラスのメンバである
可能性が示されたら、2回目のときまでチェックを遅延することが許されている。
それで A<Type>::func1() はコンパイルを通る。

ちなみに
data2 = this->func1();
と書くことも可能。

ここいらへんは、テンプレートの機能の中でもややこしいところだから、詳しく解説した
本を読んだほうがいい。
C++ Templates とか



730 名前:デフォルトの名無しさん :2005/12/31(土) 14:32:52
 ・・・・・・・
>>詳しく解説した
>>本を読んだほうがいい。
>>C++ Templates とか
どの本をさしますか。
ルキーの解説書ですか。
ブーストの取説ですか。
教祖の本では不十分ですか。


731 名前:デフォルトの名無しさん :2005/12/31(土) 14:36:57
>>730
>>9

732 名前:デフォルトの名無しさん :2005/12/31(土) 15:17:39
ちょっと質問させてください。
C++で中国と戦えるでしょうか?

733 名前:デフォルトの名無しさん :2005/12/31(土) 15:19:24
>>732
おまいあきらかにC#スレからきただろ!!!

734 名前:デフォルトの名無しさん :2005/12/31(土) 15:33:00
731 名前:デフォルトの名無しさん :2005/12/31(土) 14:36:57
>>730
>>9
ずばり言ってよ。
今の時間読めん

735 名前:デフォルトの名無しさん :2005/12/31(土) 15:37:43
なんで読めないのか分からないけど、
C++ Templates: The Complete Guide
http://www.amazon.com/gp/product/0201734842/102-0872632-8435348?n=283155
でいいんじゃない?

736 名前:デフォルトの名無しさん :2005/12/31(土) 15:43:05
それで戦えるんですか?答えてください。

737 名前:デフォルトの名無しさん :2005/12/31(土) 16:07:04
あと、全裸でお台場を走り回ることが必要不可欠

738 名前:デフォルトの名無しさん :2005/12/31(土) 16:08:51
>>C++ Templates: The Complete Guid
規約無視して、変体書式で書いてある事を貴方は
どの様にお考えですか。初めてテンプレ学ぶ人には
変換することが難題だと思いますが。ソースは↓
http://www.josuttis.com/tmplbook/
The only gripe I have against this book is a very very minor one:
the authors for some inexplicable reason decided to write
"T const* p" instead of "const T* p" in function prototypes.
Both are correct and both mean the same thing but nobody uses
the first convention whose major fault is

that it's too close to "T *const p" - a different thing entirely.
Plus the second convention is such an ingrained idiom that fighting
it is pure nonsense which makes the book initially hard to read.
Example: what does "char const* const& a" mean?
(p. 17) On top of that the reader cannot simply substitute one convention for the other,
as the 25,000 C++ books already in print are
still going to *be* there plus the x billion lines of legacy C++ code is
not leaving any decade soon! So one has to keep *both* conventions
in mind in order to read the text. It's really not much of a big deal
but I wonder: what were they thinking?

739 名前:デフォルトの名無しさん :2005/12/31(土) 16:15:44
人は、テキストを読むために両方の
コンベンションを覚えておかなければなりません。
本当に、大したことの多くではないのか。
私が不思議に思うのは、 彼らは何を考えてたのか
ボケ?


740 名前:デフォルトの名無しさん :2005/12/31(土) 16:42:37
>>730 >>734 >>738-739
何かの病気?

741 名前:デフォルトの名無しさん :2005/12/31(土) 16:57:05
>>738 そんな qualifier の置き方がそんなに重要かよ。
main の argv の型だって、
const char * const char * const argv と書くやつもいれば
const を変なところに(意味が変わらない範囲で)くっつける奴もいる

742 名前:デフォルトの名無しさん :2005/12/31(土) 17:17:59
>>738
const char* と書く人に文字列リテラルの配列を定義させると、半分以上は
const char* table[] と書く。
char const* を使う人は
char const* const table[] と書く。

Windows や Linux など、すべて RAM 上で動かすプログラミングをしていると、
前者と後者の違いが重要だとは思わないだろう。
しかし ROM 環境で、さらに RAM の少ない環境でプログラミングしていると
これらの違いに神経を使う必要が出てくる。

故に、普段から ROM 環境でプログラムしてる人
または偏執的な const マニアは後者に落ち着く可能性が高い。

743 名前:デフォルトの名無しさん :2005/12/31(土) 17:33:46
>>742 偏執的な const マニア(笑
マニアかどうかわかんないが、俺も
const できるところは全部 const にしないと気持ち悪いな。
結構潜在的なバグを発見できたりするし。
const つけまくったからと行ってどの程度最適化に
反映してくれるかはわかんないけど。

744 名前:デフォルトの名無しさん :2005/12/31(土) 17:40:09
>>742
ちなみに違いを教えてくれ。


745 名前:デフォルトの名無しさん :2005/12/31(土) 17:47:31
>>744
俺もどっちがどっちだか分からなくなった。
まぁ宰相ググレカスだな

746 名前:728 :2005/12/31(土) 17:54:14
解説下さった皆様ありがとうございます。
いままでVC++使いだったけど、>>728みたいなのは
ベースクラス指定無しで通ってたんで、なんかめんどくさい、、、。
ぐぐる先生に聞いたところ、他の複雑なテンプレートの例でも、「VC++ならOK」
というのがあるようですね。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html
LINUX環境で開発することになったので、そのへんのところ
元の言語仕様をよく確認しなきゃいけない。

747 名前:742 :2005/12/31(土) 17:57:36
>>744,745
わかりやすい話だと table[0] = "modified" が、前者だと通り、後者だとエラーになる。

前者では table を書き換え可能な RAM に置く必要があり、後者ではその必要が無い。
起動時に全部 RAM にロードされる環境だと、それらの違いはほとんど無視できる。
( OS による最適化で const な table をプロセス間で共有してくれる可能性はある。)
ROM 環境では必要な分だけ RAM を使うことになるので、
table[] のサイズがそのまま RAM の消費量の差になる。

748 名前:デフォルトの名無しさん :2005/12/31(土) 18:02:33
Q1:すべて RAM 上で動かすプログラミングをしていると、
前者と後者の違いが重要だとは思わないだろう
誰のことですか。発言者の出典箇所は?

Q2:普段から ROM 環境でプログラムしてる人
PICとか組み込み系の人のことですか。

Q3:世界中の人の前に広く出回る本であっても貴方は後者の
書き方で問題ないと寛容にお考えですか。
この本は、英語、中国語、アラビア語で翻訳されてます。

関東圏内で会話していると
標準語と関西弁の違いが重要だと思わないだろう。
しかし大阪でさらになんばで会話をしていると
これらの違いに神経を使う必要が出てくる。
私は、東京のど真ん中で偏執的な関西弁マニアが巻くし立てらたら
必ず違和感を持つ。そして、日本の公用語は関西弁に
は絶対にならないと考える。

749 名前:デフォルトの名無しさん :2005/12/31(土) 18:02:53
>>742
俺はconst char *派だけど、typedefする。

typedef const char *PCSTR; //大抵<windows.h>で済ます
const PCSTR *table[];

750 名前:デフォルトの名無しさん :2005/12/31(土) 18:08:37
でも、const char * と char const * に違いなんてないよね?
てか、const char * って形の宣言ができることがそもそも間違いの始まりなんだよなぁ。
てな、話は↓こっちでやれ・・・
って、「const だけでメシが3杯喰えちゃうスレ」がいつのまにかなくなってる。(´;ω;`)


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