C++は難しすぎ 難易度 ..
[2ch|▼Menu]
357:デフォルトの名無しさん
04/09/13 01:36:37
>>355
本流ってよくわからんが、洗練されたC++コードにはポインタは登場しないよ。
ポインタが飛び交うなら、それはC++の顔をしたCだと思う。

358:デフォルトの名無しさん
04/09/13 01:38:54
っつうか355みたいなのは若い(よね?)ならいいけど
年くってたらヤバいと思いなされ。

359:デフォルトの名無しさん
04/09/13 01:47:40
>>358
何か言いたいならはっきり言えよ

360:デフォルトの名無しさん
04/09/13 02:06:50
>>357
それはおまいがC++が書けないからだよ w

361:デフォルトの名無しさん
04/09/13 02:13:48
>>357

すまん。自分はポインタつかいまくり。
スタックに積むオブジェクトとヒープに確保する
オブジェクトは明確に区別している。

それでヒープに確保するためのオブジェクトはどうしても
ポインタになる。スマートポインタはつかっているけど
生のポインタのほうが適切だと思う場所もあるので
それで生のポインタをつかっている。


362:デフォルトの名無しさん
04/09/13 09:04:59
>>361
> 生のポインタのほうが適切だと思う場所もあるので

そういう場所がほとんどなくなるのが、最近のC++のやりかただと思うのよ。

特殊な例を特長なんかにしないほうがいいよ。

363:デフォルトの名無しさん
04/09/13 14:18:22
>>362
どうやって?

364:361
04/09/13 16:54:41
自分の場合、ヒープに確保するタイプのインスタンスは
以下のような管理の使い分けをしている。
(依存、関連、集約、コンポジションぐらいは理解しているよね)

[依存]

ケース1 :
あるメソッドローカルでつかわれるインスタンスで
メソッドをぬけるとインスタンスが不要になる場合。
auto_ptrかscoped_ptrをつかう。

ケース2 :
あるメソッドの引数として渡されるインスタンス。
渡されたインスタンスはそのメソッドの中でしかつかわれない。
この場合は生ポインタ。理由はインスタンスの寿命にメソッドは
関知しないためスマートポインタにする意味がない。

[単項関連]

ケース1 :
格納するクラスがインスタンスの寿命の管理をしないといけない場合。
この場合はauto_ptrかscoped_ptrかshared_ptr。

ケース2 :
格納するクラスがインスタンスの寿命に関知しない場合。
この場合は生ポインタかweak_ptr。


365:361
04/09/13 16:55:34
[集約]
基本的な方針は単項関連と同じ。集約のコンテナにはSTLコンテナ
をつかい、スマートポインタをつかう場合にはshared_ptr
(これじゃないとコンテナに格納できないから)をつかう。

[コンポジション]
問答無用にSTLコンテナ+shared_ptr。

こんな感じ。依存のケース2のような場合はスマートポインタを
つかう意味がないし、別に特別なケースでもなくてよくあるんだけど。


366:デフォルトの名無しさん
04/09/13 17:01:42
洗練されたC++の流儀とは、boostを使う事だったようです。
最近使えるようになったんでしょうね、うれしくてたまらないみたいです。

367:デフォルトの名無しさん
04/09/13 17:08:53
↑Boost分かってない香具師の僻みキタ━━━(゚∀゚)━━━!!

368:デフォルトの名無しさん
04/09/13 17:17:20
標準がしょぼいせいでいろんなもんが乱立する事態になってる

369:デフォルトの名無しさん
04/09/13 17:23:25
なんたらptrとかほにゃららptrとか確かにウザィよね。
ライブラリレベルでやるもんじゃねえよ。

370:デフォルトの名無しさん
04/09/13 17:29:55
>>367
と言う事にしたいのですね。

自分の場合とか言いながら、長々と何を言うかと期待すれば
boost入門ページの最初の方に書いてある事を書いてみただけ。
ヤレヤレ

そんな事はboostの名前を知ってるような人間は誰でも(活用しているかはともかく)承知している事で、
それでもあえて生ポインタを使っているケースは多々あるのに、それを否定するだけの説得力(代案)が
先の文章には無い。

371:デフォルトの名無しさん
04/09/13 17:37:11
とりあえず否定だけしてみて自分の意見は無い香具師キタ━━━(゚∀゚)━━━!!

372:361
04/09/13 17:44:29
だからスマートポインタ最大限に利用したとしても
生ポインタをつかうケースがあるって例をあげてみた
んだけど。

>そんな事はboostの名前を知ってるような人間は誰でも
>(活用しているかはともかく)承知している事で、
>それでもあえて生ポインタを使っているケースは多々あるのに、
>それを否定するだけの説得力(代案)が先の文章には無い。
361の発言みれって。自分も生ポインタつかいまくりだって。


373:デフォルトの名無しさん
04/09/13 18:01:12
>>372
使いまくったらダメだろw

374:デフォルトの名無しさん
04/09/14 00:56:19
>>364
依存のケース2で生ポインタ使ってるところは参照が適切だと思うが、いかがか?

375:デフォルトの名無しさん
04/09/14 00:58:55
話の途中で悪いが、今の「ポインタを使いまくる」の意味は、
自力でnew/deleteしまくるって意味だよな?

376:デフォルトの名無しさん
04/09/14 00:59:47
>>375 ちがうだろう。

377:デフォルトの名無しさん
04/09/14 00:59:58
void******** (********a)(void******** (********)(void********));
なんて普通に使ってますが、何か?

378:361
04/09/14 01:19:12
>>374
ヒープに確保するオブジェクト限定の話なので、生ポインタです。
個人的にヒープに確保したインスタンスの参照をとるのは
抵抗があるかな。

たしかにスタックに積むオブジェクトや構造体ならむしろ参照の
ほうが望ましいと思います。


379:デフォルトの名無しさん
04/09/14 01:49:54
>>378
その抵抗には何か根拠がある?
まるで意味の無い区別だと思うが。

ヒープ上の(動的)オブジェクトを引数に取る関数と
スタック上の(自動)オブジェクトを引数に取る関数とで
オーバーロードでもするつもりか?

380:デフォルトの名無しさん
04/09/14 02:44:40
いつのまにかスレタイに沿った話題になってる

381:デフォルトの名無しさん
04/09/14 02:47:18
>>375
「生の」な。

生のポインタを渡したり、受け取ったり、コピーしたり、
インクリメントしたり、引き算したり、足し算したりすることかなあ。
そういうCみたいなコードはさすがにメンテするのも疲れる。

382:デフォルトの名無しさん
04/09/14 02:48:46
それはおまいが`使えない'香具師だからだYo

383:デフォルトの名無しさん
04/09/14 02:50:29
む、「Cみたいな」は禁句か?

384:デフォルトの名無しさん
04/09/14 04:32:03
>>382
話についていけないお馬鹿さんが
無視して書き込まなくてもいいのでは? ;-)

385:デフォルトの名無しさん
04/09/14 05:22:30
無視して書き込む? ;-)

386:デフォルトの名無しさん
04/09/14 07:03:25
つーかね、
システムコールがiteratorに移行しない以上、
ポインタ(アドレス渡し)は永遠に不滅です。

387:デフォルトの名無しさん
04/09/14 09:05:47
システムコールなんてwrapされる最たるもんだろ

主パスの処理にシステムコールが出てきたりするなら、C以前だなそりゃ

388:361
04/09/14 09:53:58
>>379

設計の段階でヒープに確保するオブジェクトとスタックに積む
オブジェクトは「明確に区別している」ので、同じクラスの
インスタンスがヒープに確保されたりスタック積んだりとまちまちに
なることはないので、オーバーロードする必要はない。
クラスによってヒープに確保かスタックに積むかが決定している。

ヒープに確保するオブジェクトの例をあげればポリフォーリズムが
必要なクラス、スタックに積むクラスは通貨型やベクトル型、
複素数型、クォーターニオンなど。

C++ではオブジェクトをヒープで確保することを強制できないので
とりあえずコピーコンストラクタや代入演算子をprivate属性に
するぐらいはやっているが、最終的にはドキュメントに書いている。

Compositeパターンのように子ノードの削除の責任が親ノードにある
場合、delete演算子かスマートポインタで破棄するんですが、
これがスタックにつまれていると親ノードの都合で削除できない
ので問題になる。こういうのは仕様できっちりきめるしか
回避方法がないのはC++の欠点だと思っている。

...というか、こういうガイドラインって一般的ではないのかな。
とりあえずつかいわけとしてはC#の値型と参照型に近い
感じなんですが。


389:デフォルトの名無しさん
04/09/14 10:15:27
>>388
> 設計の段階でヒープに確保するオブジェクトとスタックに積む
> オブジェクトは「明確に区別している」ので、同じクラスの

クラスを使う側のローカルな操作なら自分の決定を前提とできるだろうけど、
クラスや関連関数を提供する側では、どちらに確保されるかと言う前提は持てないだろう。

> ヒープに確保するオブジェクトの例をあげればポリフォーリズムが

"polymorphism" な。

> C++ではオブジェクトをヒープで確保することを強制できないので

コンストラクタを protected にして、ヒープに確保するstaticな
生成関数を用意すればできるよ。

> これがスタックにつまれていると親ノードの都合で削除できない
> ので問題になる。こういうのは仕様できっちりきめるしか
> 回避方法がないのはC++の欠点だと思っている。

他の言語なら仕様でキッチリ決めないで回避できるの?

> ...というか、こういうガイドラインって一般的ではないのかな。
> とりあえずつかいわけとしてはC#の値型と参照型に近い

C#は詳しくないけど、それを表したいなら、
 C#:値型 → C++:メンバを並べたクラス型
 C#:参照型 → C++:実装へのスマートポインタひとつをメンバに持つクラス型
こんな感じの対応付けにならないか?

390:361
04/09/14 10:40:07
>"polymorphism" な。
すんまそん。typoです。マジで恥ずかしい。

>コンストラクタを protected にして、ヒープに確保するstaticな
>生成関数を用意すればできるよ。
そういえばそうだった。忘れていました。

C#だと構造体は必ずスタックにつまれる(ボキシングするとヒープに
移るけど)し、クラスはヒープに確保される。まあC#の場合はも
ともとGCがあるからインスタンスの破棄のことは考えなくていいんだけど。


391:361
04/09/14 11:13:37
>C#:参照型 → C++:実装へのスマートポインタひとつをメンバに持つクラス型
これって俗にいうHandle-Bodyだよね。これも設計ポリシーによってはアリですね。
昔の(今は知らん)xerces-cもそうだったような覚えがある。


392:デフォルトの名無しさん
04/09/14 14:17:40
横槍ですが...

>>388
>Compositeパターンのように子ノードの削除の責任が親ノードに
>ある場合
むしろ私の場合は、Compositeパターンによる関連性と寿命管理を
分離する設計が殆どです。Compositeパターンにより関連付けられた
オブジェクト群を利用するオブジェクトと同じ寿命を持った
オブジェクトを用意し、それに保持させるって感じです。

そういった意味では、ライブラリがクライアントの用意するオブジェクト
の寿命を管理する設計よりも、ライブラリはあくまでもそのオブジェクト間の
関連性だけを利用するようにし、その関連性の利用期間を外部に通知できる
ようなインターフェースを用意します。オブジェクトの寿命が本質的に
あいまいな場合のみshared_ptrを使いますが、稀なような気がします。


393:361
04/09/14 14:48:48
>むしろ私の場合は、Compositeパターンによる関連性と寿命管理を
>分離する設計が殆どです。Compositeパターンにより関連付けられた
>オブジェクト群を利用するオブジェクトと同じ寿命を持った
>オブジェクトを用意し、それに保持させるって感じです
イメージとしてはFlyweightのようなオブジェクトプールを
つかうって感じでしょうか?ちがったらすみません。
一応、GoFの本を確認したところ「component を削除するのは誰か」
という段落で「通常は親ノードが子ノードを削除するのが最もよい」
とは書いてありますが、そうでなければいけないとは書いてないですし、
例外のケースもあげられています。

>あいまいな場合のみshared_ptrを使いますが、稀なような気がします。
個人的にもshared_ptrをガーベージコレクションのかわりに
つかうことは殆どないです。thisポインタ問題(shred_ptrの
thisポインタはスマートポインタで管理されていない。
一応回避策はありますが)や循環参照でメモリリークが
発生したりするので意外とつかいにくいです。むしろ
コンテナに入れることができる唯一のスマートポインタ
というつかいかたが多いです。

クライアントが生成したインスタンスをライブラリ側で
寿命を管理する必要があるかどうかは議論の余地がありますね。


394:デフォルトの名無しさん
04/09/14 14:49:56
とりあえず、俺に責任は無い。

395:デフォルトの名無しさん
04/09/14 23:50:16
C++でポリモーフィズムを使う時って、ヒープに実態確保して、ポインタ使うしかないの?

396:デフォルトの名無しさん
04/09/14 23:56:41
スタックに確保して参照を使うのもアリです。

397:デフォルトの名無しさん
04/09/15 01:24:57
で、361よ。
> 個人的にヒープに確保したインスタンスの参照をとるのは
> 抵抗があるかな。
これは具体的な根拠があるわけじゃない、ってこと?

398:361
04/09/15 12:58:23
ヒープに確保したインスタンスを参照にすると削除するときに&演算子で
ポインタに戻してやらないといけないのと、スマートポインタをつかう
ことも多いので、参照をつかっているところとスマートポインタを
つかっているところで表記がまちまちになって好きじゃない。
一貫性のある表記が好きという個人的な好みの問題。でも本当に
わざわざヒープに確保したインスタンスを参照にする人って
いるの?

ポリモーフィズムは別にスタックに確保したオブジェクトでも
できるけど、スタックに確保しちゃうとインスタンスの寿命の
管理の自由度が下がる。それにスタックに確保しちゃうと
Factoryメソッドのようなメソッド内部で生成したインスタンス
をメソッドの外部に提供するときにコピーコンストラクタが
必要になるのでそういうときに困る。例えばオブジェクトが
ビットマップのような巨大なデータをもつ場合、コピーコン
ストラクトのコストは大きいし、コピーコンストラクタを
書くのが難しいオブジェクトもある。なので必要のない
コピーコンストラクタはprivateにして使用禁止にして
つかわないようにしている。巨大なデータを持つオブジェクトは
前にもいった人がいるようにHandle-Bodyなんかでもいい
(実際にHandle-Bodyをつかっていたり、文字列クラスなんかは
CopyOnWriteをつかっている実装も多い)が、自分はHandle-Bodyを
つかうスタイルではない。これもスタイルの問題。


399:デフォルトの名無しさん
04/09/15 13:42:11
>>398
どこを縦読みすればいいのですか?

400:デフォルトの名無しさん
04/09/15 14:16:46
ポリフォーリズムをポリホと略すスレはここです

401:デフォルトの名無しさん
04/09/15 17:20:36
|  ポリフォーリズム の検索結果のうち 日本語のページ 約 7 件中 1 - 3 件目 (0.54 秒)

あるからびっくりだ。

402:デフォルトの名無しさん
04/09/15 19:32:31
全部同一人物?

403:初期不良
04/09/15 21:23:16
>>400
モーフィングとフォーミングを勘違いするなら分かるけど
フォーリングと勘違いするというのは飛んでるなと思う。
3カウント入れちゃうよ

404:361=別名ポリホ
04/09/15 21:35:53
だからマジtypoだって...。まだいりじるのか...。
本気で恥ずかしいんだからいじめんなよ。



405:361=別名ポリホ
04/09/15 21:36:44
>>いりじる
いじるの間違いだ。またtypo。もう嫌...。

406:デフォルトの名無しさん
04/09/15 21:38:17
ていうか、ポリフォーリズムをモリモーフィズムと間違えるのって恥ずかしすぎ。

407:デフォルトの名無しさん
04/09/15 22:06:55
イリジウムのことね

408:デフォルトの名無しさん
04/09/15 22:12:54
はずかしすぎ。
アンテナでかすぎ。

409:デフォルトの名無しさん
04/09/15 22:24:30
どうtypoったらそうなるのか分からん

410:デフォルトの名無しさん
04/09/15 22:47:57
typoだけに突っ込んでいる人は、
そうやって話をはぐらかそうとしている
厨房なので無視するべし。

411:374
04/09/16 00:56:53
>>394
なんか、どちらかに誤解があるようだな。
>>364の [依存]ケース2 で言っていることは、
たとえば「あるメソッド」foo について、
 foo(T*);
というふうに引数の型として生ポインタを使うということじゃないの?
それに対して、
 foo(T&);
のほうが適切ではないかと言う突っ込みを>>374で入れている。
これは引数の型の話で、確保したインスタンスを
保持するための型は関係ないと思うんだけど、
漏れが>>364を誤読しているの?

412:374
04/09/16 00:58:09
レスアンカー間違えた。
>>411>>398 宛てね。

413:361=別名ポリホ
04/09/16 08:34:22
>>414

何度も同じようなことを書いてすまんけど、
1.クラス設計時にヒープかスタックか決めている
2.ヒープに確保するオブジェクトは常に(スマートポインタを含めた)
ポインタとしてつかいたい
3.参照をつかわないのは参照とポインタが混ざって表記の揺れに
なるからという好みの問題
別に参照をつかっちゃまずいっていう決定的な理由はない。
設計ポリシーとしてメソッドの引数は一貫して参照をつかうの
であればそれはそれでいいんじゃないでしょうか?っていうか俺が
文句いうことじゃないけど。

逆にちょっと質問。setterのようなあるインスタンスを引数の値とって
それをインスタンス変数に保持するメソッドで、かつ削除の権限が
そのsetterを持つインスタンスにある場合、これも参照で渡すの?
そうだとするとどこかの段階で参照からポインタに変換しないと
削除できないような気がするんですが。それともこの場合は
特別にポインタで渡すんでしょうか?


414:361=別名ポリホ
04/09/16 08:38:54
すまんレスの先が411だった。

質問の意図は指摘しているところで参照をつかうと、
setterうんぬんのケースと一貫性を保とうとすると
無理がある場所がでるんじゃないかってことです。



415:374
04/09/17 09:34:20
>>413
最初に突っ込みいれた箇所(>>364の[依存]ケース2)では
「渡されたインスタンスはそのメソッドの中でしかつかわれない」状況となっている。
「インスタンス変数に保持するメソッド」なら状況が違うんじゃないの?
これらの異なる二つの状況の間で一貫性なんてあるはずがない。

生ポインタ使う場所の例として挙げられた箇所に
参照のほうが適切だと突っ込みいれたのに、
スマートポインタ使う場所を挙げて反論されても困る。

416:デフォルトの名無しさん
04/09/17 12:25:53
> 削除の権限が そのsetterを持つインスタンスにある場合
どういう状況だかよく分からんが、std::auto_ptrみたいなものを
作ろうとしてるなら、素直にコピーを作成したオブジェクトが責任を持って
オブジェクトを破壊すべきだ。
参照渡しされたものを受け取った側で破壊するのは、分かりづらい。

とりあえずスマートポインタ勉強してから出直せ。


417:デフォルトの名無しさん
04/09/17 12:56:51
漏れはリアルタイム画像処理をよくやるんだけど、
画像のピクセルデータにアクセスするときはなんとなく生ポインタ使っちゃうな。

あったり無かったりするものを引数にしたいとき、T* 型の引数にして 0 渡すと
「無し」みたいなこともたまにやるし。C# や Java のライブラリでも null 渡せる
メソッドは結構あるから、実装面ではポインタ型の使いどころはそこそこあるん
じゃねーの?

418:デフォルトの名無しさん
04/09/17 15:26:19
まあ、あれだ

参照渡しでもポインタ渡しでもコピー渡しでもなんでもいいけど、
参照剥しをするのは控えた方がいいな。

あとでdeleteするオブジェクトはポインタで保持しとけ。


419:ポリホ
04/09/17 17:46:25
>参照渡しされたものを受け取った側で破壊するのは、分かりづらい。
からポインタつかえっていってんだろ。

>「渡されたインスタンスはそのメソッドの中でしかつかわれない」状況となっている。
>「インスタンス変数に保持するメソッド」なら状況が違うんじゃないの?
>これらの異なる二つの状況の間で一貫性なんてあるはずがない。
状況が違うから一貫性がなくてもよいという判断なら別にいい。
自分はポインタにすると2つの状況で整合がとれるから好きなだけだ。

メソッドの引数はポインタうんぬんという話はヒープに確保した
インスタンスに限定の話だ。しかもコーディングスタイルの問題
だから人のことはとやかくいうつもりはない。

ヒープに確保したインスタンスの参照剥がしが好きじゃないといったら
根拠を求められるし、好きじゃない理由をいったらなぜか参照剥がしは
わかりずらいっていう謎のつっこみが入るし、わけがわかりません。

いったい自分にどうしてもらいたいんだろう。


420:デフォルトの名無しさん
04/09/17 20:42:41
>>411
foo を書いていて引数にnull 値のようなものを許したいとき、
foo(T*) にするか、foo(T&) にして T::Null を提供するかっていうと、
漏れはメンドクサイから大抵前者だけど。


421:デフォルトの名無しさん
04/09/17 21:28:32
>ポリホ
もうちっと日本語勉強しろよ

422:デフォルトの名無しさん
04/09/18 11:32:18
>>419
>いったい自分にどうしてもらいたいんだろう。
いじられ役に徹してくだちい。

423:デフォルトの名無しさん
04/09/23 02:34:10
とりあえずC++ではヒープではなく「フリーストア」って呼ぶんじゃなかったっけ?
まぁ、データメンバを「メンバ変数って呼んじゃダメなの?」くらいの勢いだけど。

424:デフォルトの名無しさん
04/09/23 22:05:22
int* a,b; と int* a; int* b; って違うんだな・・・

425:デフォルトの名無しさん
04/09/24 00:10:23
>>424

いや、それは違いすぎだから…。
両方ポインタにするなら

int* a, *b;

じゃないとね。
だけどこういう書き方になるから型の後にアスタを付けるスタイルは好きではない。

int *a, *b;

のほうが美しいじゃん。好みの問題かもしれないけど。

426:デフォルトの名無しさん
04/09/24 00:14:44
>>424
所詮C++はC言語のころの呪縛から逃れられてないのよ。

>>425
int* a;
int* b;
と2行に分けることを推奨。

427:デフォルトの名無しさん
04/09/24 04:48:24
>>426
>所詮C++はC言語のころの呪縛から逃れられてないのよ。

だがそれが(・∀・)イイ!!
というか、仕様変更するとコンパイルエラーが発生するレガシーコードが
混在してしまう可能性があるから仕方ないっしょ。








・・・レガシーという単語を使いたかっただけだ。気にしないでくれ。orz

428:デフォルトの名無しさん
04/09/24 08:39:01
int* をtypedefして違う名前を与える
さらにはintを変えられるようにtemplate化

429:デフォルトの名無しさん
04/09/24 09:23:41
C言語の型とは何か。

typedef int *iptr;
int *は ptr->int
iptrも ptr->int
int *[]はarray->ptr->int
int (*)();はptr->function as int
int *();はfunction as ptr->int
struct { int a,b;} *;はptr->struct{int a;int b;}


構造が同じなら互換性があると言う。

iptr a;
int *b;
a = b; // ok

しかし
struct { int x,y;} a;
struct { int x,y;} b;
b = a; // error '=' : 互換性のない型が含まれています。


これはいったい、どうしたことか。

430:デフォルトの名無しさん
04/09/24 10:25:14
>>429
b=a;

b.x=a.x;
b.y=a.y;
と同義であるとはいえない。
直感的にはそうであるが。
同義であるなら同義であるとoperator=なりで
コンパイラに教えなきゃわからん。


431:デフォルトの名無しさん
04/09/24 10:43:24
>>429
struct A { int x,y;} a;
struct B { int x,y;} b;

名前を省略しただけの扱いなんだろ。
別々の構造体で、たまたまメンバの並びが同じになっただけで代入ができたら困る。

432:デフォルトの名無しさん
04/09/24 11:45:46
C++スレでC虫臭い話を続けるな

433:デフォルトの名無しさん
04/09/24 17:58:58
>>424-425
こんな解決法もある。
typedef int *PINT;
PINT a, b;


434:デフォルトの名無しさん
04/09/24 18:03:42
それ終わってる。
とっくに。

435:デフォルトの名無しさん
04/10/07 00:13:22
>>429
基本的に別の型に代入はできない。当たり前だけど。Java だって C# だってそうでしょ。
typedef は単なる別名で、新しい型を作る訳では無いって、仕様で決まってますから。

436:デフォルトの名無しさん
04/10/26 17:24:17
メンバの並びが同じな別々の構造体を作る必要性はあるのか?

437:デフォルトの名無しさん
04/10/26 18:09:29
あたりまえ

438:デフォルトの名無しさん
04/10/26 19:18:18
>>436
「今はたまたま同じメンバだけど、将来的には拡張されるかも知れない」
ってことはありそう泣きガス

439:デフォルトの名無しさん
04/10/26 19:56:30
>>438
その場合、直接代入できる必然性はないよね。

440:デフォルトの名無しさん
04/10/27 11:48:39
>>439
ふむ。そりゃそうだ。

441:デフォルトの名無しさん
04/10/29 01:42:08
ふと思ったんだけど、構造体やクラスの(データ)メンバを
while文のようなループ文でくるくる回しながら順番に取れたら便利かも?
名前とか個数とかデータ型を意識せずにクルクル…。
そういうのってうまいこと出来ないかな?

442:デフォルトの名無しさん
04/10/29 01:46:03
>>441
意味が判らない

443:デフォルトの名無しさん
04/10/29 01:53:58
>>441
型の違うデータメンバのいったい何が取得したいのか? ってことだね。
たとえば各メンバの文字列表現が取得したいのなら
そのような関数を用意すればすむ。

444:デフォルトの名無しさん
04/10/30 03:34:49
うっ、わかりにくかったか…。orz 例えば擬似的なコードを書いてしまうと…。

struct TEST_STRUCT
{
 int mInt;
 long mLong;
 char mChar[255 + 1];
};

void main()
{
 vector<VARIANTのような型> dstArray;
     ^^^^^^^^^^^^^^^^^^^^^
 TEST_STRUCT srcData; //適当に初期化済みの状態とする
 int i = 0;
 while( 1 )
 {
  dstArray.push_back( srcData.○[ i ] );
  i++;                ^^^^^^
 }
}

こんな感じで、データメンバを「名前ではない方法」でアクセスできれば、
結構便利な使い方ができそうだなぁと思ったのでつ。
「○[ i ]」の部分って必ずデータメンバの名前で指定しなければならないから…。

dstArray.push_back( srcData.mInt );
dstArray.push_back( srcData.mLong );

…のように一つ一つ全部指定しなきゃいけないし、型に「VARIANTのような型」が無い以上、
そういうやり方すら出来ないではないでつか…。
関数にしても結局はすべて名前で指定しなければならないし…。

445:444
04/10/30 03:37:25
>>444

しまった、ループの脱出条件を書いてないから無限ループケテ〜イだ…。orz
まぁ、その辺は突っ込み入れないでちょ。

446:r
04/10/30 08:20:36
>>444
offsetof

使った事無いけど。多分。

447:r
04/10/30 08:25:36
>>444
つーか

TEST_STRUCT srcData[] = ...;

for( int i = 0; i < ...; i++ )
    dstArray.push_back( srcData[i] );

じゃなくて?



448:デフォルトの名無しさん
04/10/30 09:57:07
>>444
実体でなくポインタを維持すればいいなら、
std::vector<void *>dstArray;
dstArray.push_back(reinterpret_cast<void *>(&srcData.mInt));
dstArray.push_back(reinterpret_cast<void *>(&srcData.mLong));
dstArray.push_back(reinterpret_cast<void *>(srcData.mChr));
構造体のメンバの列挙は誰かがやらないといけないからねぇ。
static const unsigned sOffsets[] = {
offsetof(TEST_STRUCT, mInt),
offsetof(TEST_STRUCT, mLong),
offsetof(TEST_STRUCT, mChr),
};
for (unsigned i = 0; i < sizeof(sOffsets) / sizeof(*sOffsets); ++i) {
dstArray.push_back(reinterpret_cast<void *>(reinterpret_cast<char *>(&srcData) + sOffsets[i]));
}
これでもなんとかなるかな。

449:デフォルトの名無しさん
04/10/30 19:41:55
>>446
「offsetof」なんて初めて聞いた!
…と思ったらひょっとしてC++の言語仕様にはないものですよね?
ぐぐってみたらどうやら「.NET Framework」なのかな?

>>448
ふむふむ、ポインタを駆使すれば結構なことが出来そうですね。
しかしなんていうか難しいというかちょっぴり複雑に…。(^^;

基本的に私もメンバを一つ一つ指定することになんの抵抗も無かったんですが、
最近職場でBorlandC++Builderに慣れた同僚が、

「構造体のメンバって一つ一つ名前でアクセスしないといけないんですかねぇ?
 面倒くさいですねぇ」

…などと話していたので、興味を持った次第でつ。
これができるとどういうメリットがあるかという話ですが、
(C++Builderの話限定になってしまうのですが)
DBの不特定なテーブルから、フィールド名を指定せずに
不特定の構造体のメンバにデータを突っ込めるため、
プログラムの汎用性が高まるということらしいです。


450:デフォルトの名無しさん
04/10/30 22:20:56
offsetofを知らないだけならともかく(それも問題だが)、C#って・・・
絞り込みも出来ない、googleのトップしか見ないで、2番目は無視する人かね

451:448
04/10/31 01:07:37
>>449
offsetofなんて、Cでもマクロで簡単に書ける代物なんだけど。
標準ヘッダを探してみることもできないのかな?

452:デフォルトの名無しさん
04/10/31 02:37:42
うわ〜ん、そんなにいじめるなぁ〜。ヽ(`Д´)ノ
簡単にできるというのがいいのだよ。
めんどっちいのはイヤ。

453:デフォルトの名無しさん
04/10/31 02:45:31
しかし、とりあえずoffsetofというマクロが
標準的に用意されてることを教えていただき、
ありがとうございますた。m(_ _ )m

454:r
04/10/31 17:05:43
クラスのメンバを、別々に、同じベクタに入れる意味がわからん

455:デフォルトの名無しさん
04/11/25 02:44:24
最近書き込みがないね。

456:デフォルトの名無しさん
04/11/25 04:01:13
重複スレだからな。

457:デフォルトの名無しさん
04/11/26 03:07:57
C言語とJavaとRuby使って,そこそこ書きました.
次はC++にチャレンジするかと,プログラミング言語C++を買ってきました.
難しいです.何書いてるのかわかりません.
俺の頭が悪いのが原因でしょうが,C++の難しさに挫けそうです

458:デフォルトの名無しさん
04/11/26 08:15:19
ヽ(冫、)ノズコーッ
何処が難しいか言ってみて。
十分習得出来る知識あるように見えるけど…

459:デフォルトの名無しさん
04/11/26 10:26:54
>>458
>十分習得出来る知識あるように見えるけど…
んな事が >>457 読んで解るのか!ESPer でつか?

460:デフォルトの名無しさん
04/11/26 10:52:23
>>459
Yep

461:デフォルトの名無しさん
04/11/26 14:05:17
>>457
CからC++に移ったばかりの人
for (int i = 0; i < 10; i++) {
v[i] = 1;
}

C++を使い慣れてきた人
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
*it = 1;
}

C++が「使える」と言えるレベルの人
std::fill(v.begin(), v.end(), 1);

これでやっと中級に入門です。先は長いです。くじけそうです。

462:デフォルトの名無しさん
04/11/26 14:07:40
C++のことがある程度わかってくると、++、--は前置にするもんです。

463:デフォルトの名無しさん
04/11/26 16:44:04
運置

464:デフォルトの名無しさん
04/11/26 21:17:08
>>462 どうして?

465:デフォルトの名無しさん
04/11/26 21:20:14
>>464
前置の方がコピーのコストがかからないから

466:デフォルトの名無しさん
04/11/26 21:27:04
>>465 どうして?


467:デフォルトの名無しさん
04/11/26 21:32:47
>>466
More Effective C++の項目6を嫁

468:デフォルトの名無しさん
04/11/26 21:36:34
>>467
読んでみた。ありがとう。
インライン展開されるような場合は別に気にしなくていいね。

469:デフォルトの名無しさん
04/11/26 22:23:28
>>461
それ見てC++の方がタイプ量多い割にたいしたこと出来ない。
Cの方が1000万倍マシと悟った。

470:デフォルトの名無しさん
04/11/26 22:24:18
>>469
それはちょっと勘違いだ。
C++ は C より便利だよ。

471:デフォルトの名無しさん
04/11/26 22:24:53
>>467
んじゃ、これから
Effective ++C
と書くことにしちくりマンボ

472:デフォルトの名無しさん
04/11/26 22:28:36
>>471
山田君、座布団一枚持ってっちゃって

473:デフォルトの名無しさん
04/11/26 22:32:14
>>468
テンプレートでの汎用プログラミングのために常に
前置にしておくと後々組み込み型をクラスにしたくなった
とき修正量が減る。

474:デフォルトの名無しさん
04/11/26 23:07:05
>>473
組み込み型かクラスかは別に関係ないような?

475:デフォルトの名無しさん
04/11/26 23:35:39
>>474
クラスだとテンポラリオブジェクトが生成されるよ。
インライン展開されてもね。

476:457
04/11/27 02:51:11
思ったよりレスが…ありがとうございます.

>>458
最初は俺も楽勝だろーとか思っていたのですが,何故か頭が受け付けません.

>>461
今の俺の書き方だと,モロ最初の書き方ですね…

477:デフォルトの名無しさん
04/11/27 03:07:44
>>461
C++を究めた人はアセンブリに戻る。

478:デフォルトの名無しさん
04/11/27 03:10:04
>>477
そういう内容のメガデモ作品があったな

479:デフォルトの名無しさん
04/11/27 06:47:22
>>461の二番目みたいに、全く抽象化されてもいないのに
無理やりイテレータ使う意義って、全くないように思えるんだが

480:デフォルトの名無しさん
04/11/27 09:02:51
インポラリ

481:デフォルトの名無しさん
04/11/27 09:22:04
>>457
> C++の難しさに挫けそうです
「プログラミング言語C++」の難しさに挫けそうなだけだろ。

482:デフォルトの名無しさん
04/11/27 09:34:42
>>479
そんなことはない。
少なくともコンテナを差し替えられる。

483:デフォルトの名無しさん
04/11/27 23:14:25
そんなこといったら、最初の書き方ならば
vectorを配列にさしかえれるという利点があるなw

484:デフォルトの名無しさん
04/11/27 23:16:08
>>483
vectorを配列に差し替えても、あまり嬉しくはないだろう。

485:デフォルトの名無しさん
04/11/27 23:37:44
速くなるやん

486:デフォルトの名無しさん
04/11/28 04:04:31
>>485
そういう用途なら、boost::arrayがあるから利点とはならない。

487:デフォルトの名無しさん
04/11/28 04:36:03
boost::rangeでcontainerとbuilt-in arrayが汎用に扱えるようにもなったしね

488:デフォルトの名無しさん
04/11/28 11:09:50
後からコンテナを差し替えやすいってのが利点。

489:デフォルトの名無しさん
04/11/28 17:27:41
コンテナの差し替えなんかするのか?ホントか?

テンプレート引数で型を受け取るときに、
どのコンテナでもOKなのは、確かに意義があるといえるが

前述の例はそういうわけでは全くないし、
正直、三つある例のどの書き方でも、優劣はないと思うが

490:デフォルトの名無しさん
04/11/28 20:57:16
前述の例だけみればたしかにどれでもいいレベルの話だけど、
意識の持ち方のことを言ってるんじゃないの?
できるだけSTLコンテナやSTLアルゴリズムを使おうという。

491:デフォルトの名無しさん
04/11/28 21:39:47
しっかし、組み込み型(intとかdoubleとか)のコンテナならSTLのアルゴリズムは
教科書通りに使えるんだが、クラスになると途端に使い物にならなくなるのは
どういうこと?
STLの範囲で済ます場合、メンバ関数ならアダプタでなんとかなるが、メンバ変数は
叙述関数・関数オブジェクトを用意しなければならない。
正直、boost::bindやboost::lambdaが無かったらやってられないよ。
でもこれも一長一短で、boost::lambdaは動かないコンパイラもあるし(bcc32)、
boost::bindは遅いし。

492:デフォルトの名無しさん
04/11/28 22:55:18
> boost::bindは遅いし。
なんで?

493:デフォルトの名無しさん
04/11/28 23:17:06
>>492
なんでだろう? 俺が聞きたいよ。
アセンブリコード見たけどよく分からん。あまり最適化されてない様子。
lambdaは早いんだけどな。
単純なlambda式なら、イテレータをループで回すより早かったりする。

494:デフォルトの名無しさん
04/11/28 23:47:31
>>493
テストコード出せる?

495:デフォルトの名無しさん
04/11/28 23:49:47
boostの一部のライブラリを見てると、素直にC++にクロージャを足した
新しい言語を作って使えよと言いたくなる。

496:デフォルトの名無しさん
04/11/28 23:55:10
boost使ってる時点で負け組み

497:デフォルトの名無しさん
04/11/28 23:57:22
>>496
何を使うと勝ち組みになれるの?
boost のめざそうとしているものを使わなくてもいいってこと?

498:デフォルトの名無しさん
04/11/29 03:52:25
>>495
C++Builder言語

499:デフォルトの名無しさん
04/11/29 08:41:38
C++が難しいのは、テンプレートのがポリモルフィズムより速いからだと思う。

500:デフォルトの名無しさん
04/11/29 08:55:56
URLリンク(pc5.2ch.net)
スレリンク(tech板)

501:デフォルトの名無しさん
04/11/29 09:53:18
>>495
templateの良し悪しはともかくとして、
言語のコアとしてそういった概念のシンタックスを
持つのではなく、メタプログラミングによって後から
追加できるのっていいなと思うけど。


502:デフォルトの名無しさん
04/11/29 11:15:07
このスレ見てるとげんなりしてくるなw

503:デフォルトの名無しさん
04/11/29 11:19:09
>>501
同感、クロージャーなどを突っ込むよりtemplate機能をもっと整理して
この種の機能はライブラリとして実装してもらいたい。
クロージャー以外にもデザパタ一式ガベコレ一式程度は自働ジェネレートできるくらいがいい。
言語のコアはあくまでシンプルで高速な物がいい。

504:デフォルトの名無しさん
04/11/29 12:55:33
VC++で計算した数値を引数で表示したいんですが、printfで表示されません。だからMessageBoxを使って表示したいんですがエラーがでます。どうしたらいいんでしょうか?どなたか分かる人教えてください。


505:デフォルトの名無しさん
04/11/29 13:10:08
( ゚Д゚)ポカーン

506:デフォルトの名無しさん
04/11/29 15:55:09
505うぜーよ!!
知らないならくるな!!!
消えちまえーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

507:モウモウ
04/11/29 21:13:40
>>504
とりあえず、現状のソース見せて。

508:デフォルトの名無しさん
04/11/29 21:15:44
質問した本人はそのスレ全てを覚えてるとは思えないが…(笑)

509:デフォルトの名無しさん
04/12/04 16:22:48
「ファイアーエムブレム」は難しすぎ
URLリンク(game.2ch.net)
Linuxは難しすぎ
URLリンク(pc.2ch.net)
三連複は難しすぎ
URLリンク(cocoa.2ch.net)
メモ帳は難しすぎ
スレリンク(win板)

510:デフォルトの名無しさん
04/12/13 13:46:51
C++はSTLと継承を使いこなし始めた辺りが
生産性・理解向上の分水嶺だった記憶がある。

511:釣られたか(w
04/12/13 14:01:00
>504
ConsoleとWinアプリは違うから。
デバイスコンテキストをキーワードに勉強しる。

あとこの手の質問はVC++のスレ・・・って適当なの無いな今は MFC限定しか


512:デフォルトの名無しさん
04/12/13 14:44:57
>>511
★初心者にVisual C++を教えるスレ★ Part16

513:デフォルトの名無しさん
05/01/01 23:35:39
C++には、他に類を見ない自由と絶対的な○○が与えられている。

514:デフォルトの名無しさん
05/02/15 18:08:52
C++の機能限定版とか無いの?

515:デフォルトの名無しさん
05/02/15 18:32:19
>>514
例外、クラス、関数オーバーロードや
デフォルト引数などの機能を取り除いた
C というものがあります。

516:デフォルトの名無しさん
05/02/16 18:00:21
>>514
EC++なんてものもある。
Wikipedia項目リンク

517:デフォルトの名無しさん
05/02/17 00:39:05
>>516
だがしかし、はっきり言ってウンコだ。

518:デフォルトの名無しさん
05/02/19 00:11:41
>>516
例外処理が省かれてるのが最大の問題だな。

519:361=別名ポリホ
05/02/19 00:26:05
>>518

テンプレートも名前空間もない。
実際にEC++環境があったのでコーディングしてみたことがあるけど、
全然C++らしくない。


520:デフォルトの名無しさん
05/02/19 06:54:53
まああくまでもembeddedだからねえ。

521:デフォルトの名無しさん
05/02/22 15:21:43
時々、ECMAScript をバイナリに落とすことが出来ればと考えることがある。

obj = new Object;
obj["Method"] = function( a, b )
{
 echo("OK");
}

obj.Method(); // OK

441 がやりたいことも、プロトタイプ取得で簡単OK

522:デフォルトの名無しさん
05/02/23 14:30:47
漏れの考えはこうだ!

>461 様の例で「CからC++に移ったばかりの人」の書き方は
いかにも効率が悪そうな印象を受けるけど、
漏れが「仕事で」プログラムを作るなら、
迷わずこのやり方を取る。
(かなり馬鹿にされるだろうけど…。)

そして趣味で(個人的な事情で)プログラムを作るなら、
「C++を使い慣れてきた人」や「C++が『使える』というレベルの人」のような
書き方ができるように努力するだろう。

なぜなら仕事でプログラムを作り、それを他の技術者に引き継ぐ場合、
単純な書き方がもっとも無駄な手間を省くからだ。

そして多くの場合、理解しにくいバグの発生を予め抑制することができる。
また、改修を加えるときや、
不幸にしてプラットフォームの異なる環境へ移植する場合にも、
少ないコストで作業を終えることができるであろう。

スレ違いで申し訳ないけど、
引継ぎ作業によるコストって、
プログラムの書き方で随分変わるんですよ。

「凄いC++技術者」の書いたプログラムを引き継いだ場合、
「凄くないC++技術者の私」が改修を加えるのは大変なんですよ。

523:デフォルトの名無しさん
05/02/23 15:30:38
>>522
ごく普通なC++プログラマな私からすれば、他人のソースを引き継いだときに
ループが書いてあったらそれだけで要注意項目になります。
std::fillならそのまま読み飛ばせる分だけ、引き継ぎコストは抑えられるわけですな。
構造体も然り。初期化処理をその構造体を利用する側でやらなければいけないよりは
コンストラクタを書いておいてくれたほうがよっぽど確実。
まぁ、「凄くないC++技術者=C++をベターCとしてしか使えない技術者」というなら別ですが。

524:デフォルトの名無しさん
05/02/23 18:11:34
ようするに522が凄いC++技術者になればいいだけ。

525:デフォルトの名無しさん
05/03/12 16:40:27
なんで一時オブジェクトは非const参照に変換できないんだ
template<typename E, typename T, typename A, typename Value>
inline std::basic_string<E, T, A>& ToString(std::basic_string<E, T, A>& rstr, Value t) {
  return rstr = static_cast<std::basic_ostringstream<E, T, A>&>(std::basic_ostringstream<E, T, A>() << t).str();
} //static_castしないとエラーを吐く。これはコンパイラのせいだと思う。
#define ToStr0(t) ToString(std::string(), t)

template<typename E, typename T, typename A, typename Value>
inline std::basic_string<E, T, A>& ToString(std::basic_string<E, T, A>* pstr, Value t) {
  return *pstr = static_cast<std::basic_ostringstream<E, T, A>&>(std::basic_ostringstream<E, T, A>() << t).str();
}
#define ToStr1(t) ToString(&std::string(), t)

int main() {
  cout << ToStr0(5) << endl;  //エラー:一致するものが見つからない
  cout << ToStr1(.125) << endl; //OK
  return 0;
}
って書こうと思ったんだよ。
そしたらふと思いついてこうしたら動くんだよ。
#define ToStr0(t) ToString((std::string&)std::string(), t)
頼むからこんなのキャスト無しでも適当にやってくれよ。

そもそもオブジェクトを値渡しで返そうとするとインライン展開できない
ってのがなけりゃこんなことで悩む必要は無かったんだよ>Borland

526:デフォルトの名無しさん
05/03/12 17:34:19
それはインライン展開しない方がいいと思うが。

つうか、boost::lexcal_castとか素直に使った方がええんじゃないの?

527:デフォルトの名無しさん
05/03/12 19:06:53
>>526
lexcal_cast.hppをインクルードするとエラーになってしまうもんで。

528:デフォルトの名無しさん
05/03/13 04:15:03
>>525
> //static_castしないとエラーを吐く。これはコンパイラのせいだと思う。

ostream に対する operator << の戻り値は ostream& だから、
コンパイラに依らずエラーになるはず。
一時オブジェクトで処理しようとしているのが間違い。

529:デフォルトの名無しさん
05/03/13 11:35:07
>>523
for ( xxx i = foo.begin(); i != foo.end(); ++i.) {
 nannka(*i, arg1, arg2, arg3);
 kannka(*i, arg4, arg5);


こんなのは、NGで
一回しか使わんつまんねえファンクタわざわざ宣言して
for_eachなりつかわんとNGなんだよな?

アンタがそうゆう主義なのはかまわんが
それがごく普通かねえ?

つうか、実務経験なさそうなふいんき

530:デフォルトの名無しさん
05/03/13 13:12:54
>525
形式的には、一時オブジェクトは右辺値なので非 const 参照に変換できない。

非 const 参照→呼び出された側で変更される

一時オブジェクト→もともと定数だった可能性がある / すぐに破棄される
=定数のものを変更しようとしている / 変更された値が破棄される
ということでデフォルト安全側に倒してるんじゃないでしょうか。

531:523
05/03/13 15:09:14
>>529
んにゃ、一々ファンクタ書くまでもない処理ならループでもいいんでない?
ただ、ファンクタもいらんような単純な処理まで一々ループを書くなって話。
適切な比較オペレータを持っているクラスだというのに一々findループを書く神経は疑うってことね。
まぁ、>529の例ならファンクタ書かれるよりはループで書かれた方がよっぽどまし。
更に言えば、for (int i = 0; i < foo.size(); i++) なんて書かれるよりずっとまし。

532:デフォルトの名無しさん
05/03/15 02:44:42
そこでlambdaですよワラ

533:デフォルトの名無しさん
05/03/19 05:54:34
>>531
しょーもないことにこだわってるあたり覚えたての学生とみた(遠い目

534:デフォルトの名無しさん
05/03/19 10:29:39
「まし」とか繰り返して、さも自分にはもっといい案があるかのように匂わせておいて
結局そのまま書かずに退散するのが「らしい」ですよね ;-)

535:523
05/03/19 10:41:38
んー、ないよ〜
単にどっちがいいかって書いただけだし。
ファンクタを作らなくてもalgorithmのfind使えるケースで自分でループ書くのや
iterator使わずに制御変数でループを回すのが要注意だって話で。
>529の例ならそれでなんも問題ないんでない?
#そもそも私自身がファンクタ作るの苦手だw

536:デフォルトの名無しさん
05/03/21 12:01:02
C++よりMLの方がいいよ。

537:デフォルトの名無しさん
05/03/24 05:34:21
まあバランスが大事だよな


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5374日前に更新/241 KB
担当:undef