17/11/24 16:52:50.43 WoNXR2ax0.net
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part132
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
URLリンク(codepad.org)
URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2:デフォルトの名無しさん
17/11/24 16:53:45.38 WoNXR2ax0.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
---- テンプレ ここまで ----
3:デフォルトの名無しさん
17/11/24 17:23:34.21 tVS6N6Kc0.net
>関数内で作ったベクターやマップは関数を抜けたらメモリ解放されると考えてよかです?
だって今回の話はmove関係ないし
質問とは関係ない余計なことを言って知識をひけらかしたかっただけの人でしょ
今回の話であれば
「自動変数であればスコープを抜けるときにデストラクタが走って解放される」
というだけの話
それ以上の話はまた別の話
>うん、信じていい
>XXから抜けるときにムーブコンストラクタでtmpへ移動され
>createmapから抜けるときに解放される
>このときoperator deleteが呼び出されるが
>operator deleteがどのようなタイミングで解放しているかには依存すべきでない
>我々が関心を持つべきはoperator deleteが呼び出されるタイミングで実装の詳細ではない
↑依存すべきでは無い、と言っておいて、関心を持つべき、と言ってみたり
実装の詳細に関心を持つべきでない、と言っておいて、vectorの実装詳細を語ったり
言ってることやってることが支離滅裂で、意味不明だろう
ついでにバージョンによってRVOどうのこうのも、質問には関係が無い余談だし
そもそもバージョンの話するんなら昔のC++はmoveセマンティクス無いし
しかし、どうであれ、どのみち質問には関係が無い
4:デフォルトの名無しさん
17/11/24 19:29:11.47 FCfoZStM0.net
何故建てたし
5:デフォルトの名無しさん
17/11/24 20:40:51.17 X0HwtQDQa.net
保守
6:デフォルトの名無しさん
17/11/24 20:43:34.75 06etO6GG0.net
>>2
いつまでこの糞テンプレ張り続けるんだおい
7:デフォルトの名無しさん
17/11/24 22:22:42.08 l1+FhW7v0.net
v(^・^)vはどこ行った?
8:デフォルトの名無しさん
17/11/24 22:59:15.71 9/UAKu4i0.net
前スレ995
スレリンク(tech板:995番)
おまえは何を言っているんだ?
= delete;が03でNGになるのは当たり前だろ
9:デフォルトの名無しさん
17/11/24 23:01:10.76 9/UAKu4i0.net
>>3
おまえも何を言っているんだ?
operator deleteが呼び出されるタイミングを
vectorの詳細とでも言っているなら病院へ行ったほうがいい
10:デフォルトの名無しさん
17/11/24 23:25:11.19 tVS6N6Kc0.net
前スレのおバカさんか
>このときoperator deleteが呼び出されるが
>operator deleteがどのようなタイミングで解放しているかには依存すべきでない
>我々が関心を持つべきはoperator deleteが呼び出されるタイミングで実装の詳細ではない
↑これの説明してみ?
好意的に解釈することもできるが、どのみち意味不明すぎる
11:はちみつ餃子
17/11/24 23:43:36.87 lG8HVUMw0.net
>>8
そっちこそ何言ってるんだ?
今は RVO の話だろ?
12:デフォルトの名無しさん
17/11/24 23:59:00.33 tVS6N6Kc0.net
まぁ、>>10の意味不明な文章の解釈などどっちでも良いんだが
質問者はvectorな自動変数の寿命に関して、RAIIが正しく行われるか
不安だから聞いているだけなのに、moveがどうとかドヤッた挙句
RVOが働いたらmoveされないんじゃね?ってのはお粗末すぎる
return vec;で、RVOが働くか、ムーブコンストラクタになるか、コピーコンストラクタになるか、は
コンパイラの銘柄とバージョンと最適化のオプションによるだろうし
もしかしたら、コンパイラの気分で変わるかもしれないし
なんだったら、関数がインライン展開されたらまた前提が変わってくるだろうよ
なんで、こんなことは考えるだけ無意味であるし
というか、考えなくてよいように作ってあるし
むしろ、考えてはダメというか、依存させてはいけないという意味で
余計なこと(悪いこと)は考えないほうが良いし
結局、質問者には
vectorな自動変数はスコープを抜けると寿命が尽きてデストラクタが呼ばれて解放される
というC++の根底のDNAである、RAIIのルールだけ言えばよいわけで
13:デフォルトの名無しさん
17/11/25 00:07:29.16 gBFdbUKG0.net
vectorな自動変数 という表現はちょっとアレだったかもしれん
まぁ、vector型として宣言された自動変数 のこと・・
14:デフォルトの名無しさん
17/11/25 00:10:16.37 5IwBrrUdr.net
「コンパイラの銘柄とバージョンと最適化のオプションによる」
少なくとも991の置いたC++17の前提ではムーブコンストラクターやコピーコンストラクターは有り得ないのだが、
ひょっとして前提をすり替えられたのだろうか
15:デフォルトの名無しさん
17/11/25 00:27:25.13 gBFdbUKG0.net
それは>>991が言ってるだけで
質問者はC++17とは言ってない
質問者に対して、もしC++17の場合は必ずRVOになるので~~という説明をしたとして
これもあまり意味が無いというか、関係が無い
質問者はvectorがRAIIを徹底していのるか心配になったから聞いているだけ
その意味ではRVOだろうがムーブだろうがコピーだろうが、関係が無い
16:デフォルトの名無しさん
17/11/25 00:33:53.19 Sg1k8TV00.net
991がC++17のことを言っているのはちょっと脱線しただけであって、
話の前提でもないし質問の意図に沿ったものでもないよな
17:デフォルトの名無しさん
17/11/25 09:33:20.80 +Jz8ZPqE0.net
なけなしの知識でドヤってるだけやろ w
18:デフォルトの名無しさん
17/11/25 21:47:56.71 fPJ/ssThM.net
const参照を返す関数があるのだけど、autoで効率よく戻り値を受け取るには
const auto&とか書かなきゃいけないの?
それともdecltype(auto)とかするの?
19:デフォルトの名無しさん
17/11/25 23:24:46.27 afKc1pIZ0.net
↑嘔吐するから漏れには関係ない
それよか想定上はconstメソッドなのだが実際のところ実装がどうされるかわからない抽象仮想関数にconstをつけて良いものかどうか
いつも悩む
20:デフォルトの名無しさん
17/11/25 23:33:46.79 mxSpQEHX0.net
autoで受けて余計なコピーを発生させちゃう困ったちゃん
21:デフォルトの名無しさん
17/11/26 03:45:55.11 I/ckFlEt0.net
>>19
良い。
22:デフォルトの名無しさん
17/11/26 03:58:55.87 DFCtUaBX0.net
>>20
考えたこともなかった困ったちゃん参上!
正直スマンかった以後気をつけるわ
23:デフォルトの名無しさん
17/11/26 04:29:20.65 g3197Gxk0.net
最近勉強始めたばかりで100までの範囲の数字を入力したらそれが1~10,11~20,・・・91~100のどの範囲にあるか判定したいけどif文10個用意する方法より綺麗にするにはどうしたらいい?
24:片山博文MZ
17/11/26 04:32:18.07 KjdhQPtsd.net
-1
25:片山博文MZ
17/11/26 04:33:56.38 KjdhQPtsd.net
switch ((x - 1) / 10)
26:デフォルトの名無しさん
17/11/26 04:42:41.92 Dn1yAmWU0.net
>>23
pair<int, int>の配列を用意してループする
URLリンク(ideone.com)
27:デフォルトの名無しさん
17/11/26 09:12:00.52 8WHK08hV0.net
>>23
(x-1)/10
28:デフォルトの名無しさん
17/11/26 10:40:50.63 q1KSvIhfM.net
>>23
sys/param.h
howmany
29:デフォルトの名無しさん
17/11/26 11:43:40.48 OJziPoG6M.net
>>19>>20
結局どうしたらいいの...
30:デフォルトの名無しさん
17/11/26 11:56:21.91 OeykFUMSr.net
>>29
auto &&unko = f();
31:デフォルトの名無しさん
17/11/26 17:24:53.04 +CosUOwya.net
Win32とかだとフラグ管理でビット演算利用してるけど、今どきのc++17だとどのようにするのがベスト?
32:デフォルトの名無しさん
17/11/26 17:30:11.12 DaGrByo80.net
C++入門書でよく勉強したはずなのにautoとかconstexprとか知らんもんが一杯…
33:デフォルトの名無しさん
17/11/26 17:31:42.72 CoQMqJ/C0.net
何年に発売した入門書なんだ
34:デフォルトの名無しさん
17/11/26 17:33:33.90 mkIW06Zo0.net
変わらず std::bitset 使い続けてる ベストかは自信ないけど不便もないので
35:デフォルトの名無しさん
17/11/26 17:38:44.74 DaGrByo80.net
>>32
やさしいC++第3版
大体9年前に買ったのを寝かしといて最近になって勉強し始めたが、そんなに仕様変更ないと思ってたが間違いだったようだ
36:デフォルトの名無しさん
17/11/26 17:39:04.93 DaGrByo80.net
>>33だった
37:デフォルトの名無しさん
17/11/26 17:42:35.83 LgT/GDJu0.net
CはそれほどでもないけどC++は11以降どんどん変わるようになったね
38:デフォルトの名無しさん
17/11/26 17:46:59.07 n7ZC4ZKm0.net
Effective Modern C++を俺は使ってる
でもC++17が出たらまた新刊出るね
これC++11/14対応版だしすぐに古くなる
39:デフォルトの名無しさん
17/11/26 17:52:39.37 DaGrByo80.net
Effective Modern C++17出たら買ってみるわ
40:デフォルトの名無しさん
17/11/26 17:56:44.90 kRx46ugP0.net
もうC++を本で勉強するのは無理なのではないだろうか
41:デフォルトの名無しさん
17/11/26 18:04:02.71 rgo+yBBa0.net
C++を始めようと思うんですがおすすめの参考書知りたいです。Cの知識はありませんがPythonでプログラミングは経験したのでプログラミング初学者ではないです。
42:
17/11/26 18:09:15.89 rNgJnhxq0.net
>>41
accelarated c++
c++11 以前の古い本だが、C を経由せずに C++ をある程度マスターできることを評価したい
43:デフォルトの名無しさん
17/11/26 18:09:43.82 wYDDxvKDd.net
今は規格から追ってった方がいいと思う
規格書そのものの通読は大変だろうから、cpprefjpとか眺めてわからなくなったら規格に当たってコード書いて試してが一番早いよ
プログラミング完全初心者はそうも行かないだろうけどPython知ってるなら大丈夫だろ
44:デフォルトの名無しさん
17/11/26 18:12:38.67 rgo+yBBa0.net
>>42
英語の本ではなく日本語の本で何かありませんかね?
英弱なもので^^;
45:デフォルトの名無しさん
17/11/26 18:14:59.44 rgo+yBBa0.net
>>44訂正
日本語版もありますね
すいません(^^;;
46:デフォルトの名無しさん
17/11/26 19:17:54.77 C7WBrdWqM.net
>>39
残念ながら、続編はもうないんだ…
47:デフォルトの名無しさん
17/11/26 20:18:30.38 po9rLop30.net
C++ の定本は、ロベールだけど、ものすごい分厚い
これは、ちょっと古めの本だけど、
ドワンゴ江添などの新しい規格の本は、古い規格を知っていないと読めない
猫でもわかるC++プログラミング 第2版
数言語知っているなら、簡略なこの手の本で、お茶を濁す
とにかく、C++は言語の最高峰だから、
スッキリJava で、オブジェクト指向をマスターしていないと、取得できない。
理解できるまでに数年以上掛かる
まずこの本で、オブジェクト指向を学ぶ
スッキリわかる Java入門 第2版、2014
その後、この2冊をこの順に読む
たのしいRuby 第5版、2016
みんなのPython 第4版、2017
48:
17/11/26 20:45:07.56 rNgJnhxq0.net
>>47
>とにかく、C++は言語の最高峰だから、
いや、関数型の諸言語の方が、わけわからなくてすごい、と思うときもあるのでした。最古参の lisp とか…
49:デフォルトの名無しさん
17/11/26 20:52:23.29 I1XRhGjPM.net
>>30
thx!
50:デフォルトの名無しさん
17/11/26 20:54:50.87 po9rLop30.net
関数型は、コンセプトが難しいだけだが、
Elixir みたいに分かりやすい言語もある
一方、C++ はポインタとか、実装が難しい。
実装に直面させられるから
Rust では、実装の詳細をどう回避しようとしてるのか、よくわかる
51:はちみつ餃子
17/11/26 21:10:38.95 lLN9GSgU0.net
>>48
うーん、 Scheme スレ住人の私からすると、 LISP はS式表現の考え方で引っかかってる人の方が多い印象があるな。
関数型たって、副作用にややこしい手順が必要なのは Haskell くらいで、 LISP に「関数型」であるが故の難しさはそんなにない。
52:デフォルトの名無しさん
17/11/26 21:13:13.79 T8jkbpd5a.net
>>47
なんでc++の勉強するのになんでrubyやpythonの本を読まなきゃいけないんだよ?
53:はちみつ餃子
17/11/26 21:17:17.78 lLN9GSgU0.net
>>52
必須ではないにせよ様々なパラダイムについて見識を持つのは無駄にはならないと思う。
ただ、入門者が色々手を出すと混乱する可能性も大きいんじゃないか。
54:デフォルトの名無しさん
17/11/26 21:38:23.19 po9rLop30.net
C++ は、エベレストみたいなもの。
まず、色々な山で練習しろってこと
スクエニなんて、社員が何千人もいるのに、C++ を募集してるだろ。
社員の平均勤続年数は、7年だけど誰もできない
最近では、言語の募集をしても、全然できない。
言語を知っていても、何もできない
コンピューターリテラシー、つまり環境・OS を含めて、
すべてを知ってる人でないと、無理
C++ では、Ruby などの関数型とか、勉強できない。
ビジネスロジックの話ができない。
メモリとか、余計なものが付きまとってくるから
C++ で勉強していると、ものすごい時間が掛かって、非効率
55:デフォルトの名無しさん
17/11/26 21:40:21.18 T8jkbpd5a.net
>>53
pythonスレでもrubyの宣伝しててうるさいからつい。
無駄にはならないけどc++への理解は遠ざかるんじゃないかな?
56:デフォルトの名無しさん
17/11/26 21:46:20.31 SBifPocB0.net
>>54
足切り点がちょっと高めで、落ちるやつは容赦なく落ちるというだけ
いつぞや足切り点を低くしようというCOBOLとかいう試みがあったが
結果は周知のとおり
落ちたやつにはエベレストに見えるのかw
57:
17/11/26 21:57:16.96 rNgJnhxq0.net
>>54
うーん Ruby/Python/Java で実装した例を読むと、即座に C++ に直す、というか、どうしてもそうしたくなってしまうんだよ
薄い本なのにぜんぜんはかどらない
58:はちみつ餃子
17/11/26 22:01:25.91 lLN9GSgU0.net
Ruby/Python/Java の薄い!?
59:デフォルトの名無しさん
17/11/26 22:05:23.77 po9rLop30.net
OS 周りの事は、Python よりも、Ruby の方が楽。
Vagrant, Chef で、仮想OS もできるし
Python は、AI とか数値計算用。
次世代は、Elixir, Rust �
60:フ2択 社員数何千人の大企業が、C++ を募集すること自体が、そもそもおかしいだろ。 何千人もいて、できる奴が、1人も見つからないなんて そもそも、そんなに簡単だったら、皆、こんなに挫折しないって。 こんなに本屋に、難しい本が並ばないから 何十年も、C で手続き型をやってる老害どもが皆、 C++ のオブジェクト指向で、討ち死にしてる
61:
17/11/26 22:07:18.82 rNgJnhxq0.net
>>58
いやいや 言語自体の話ではなくて、応用例の話で
いまはまっているのは URLリンク(www.amazon.co.jp) で、こういうのを読むと c/c++ で書いてみたくなるという…
62:デフォルトの名無しさん
17/11/26 22:13:20.12 po9rLop30.net
Go は老害が作っているから、結局、手続き型から言語から、抜け出せなかった。
C から、C++ へ移行できない、老害と同じ
一方、Elixir, Rust とかを見れば、どの概念を抽象化したのか、よくわかる
63:デフォルトの名無しさん
17/11/26 22:21:12.28 po9rLop30.net
C++, Rust を比較すれば良い。
どの概念を抽象化したのか、よくわかる
ニコ生も今、Rust で作り直してる最中
64:デフォルトの名無しさん
17/11/26 22:26:56.58 tkabk1y3a.net
C++を勉強したいという人にrubyやpython,javaの本をすすめるなんて
遠回りな事言うんだなと思ったら>>59だもんな・・・
65:デフォルトの名無しさん
17/11/26 22:33:03.00 A1ZwwN/70.net
難しい難しいと言って「ポインタとか」という例が出てくるところで察し
66:デフォルトの名無しさん
17/11/26 22:33:41.66 po9rLop30.net
素人がエベレストを目指しても、ダメ。
レベル5 の冒険者が、レベル50 のモンスターを倒せない。
小学生が大学数学を解けない
実際に大企業では、プログラマーが何十人来ても、即日サヨナラが続いてる
漏れは、C++ のプロジェクトに採用された事があるけど、
派遣から来ても、ほとんどが即日サヨナラ
何十年も、C をやってる老害でも、C++ は全くできないし
67:デフォルトの名無しさん
17/11/26 22:37:49.56 okic0QgR0.net
できるとかできないとかどのくらいのレベルのことを言っているのか気になる
68:
17/11/26 22:39:44.04 rNgJnhxq0.net
>>65
どのくらいの C++ スキルが必要とされるの?
69:デフォルトの名無しさん
17/11/26 22:48:32.43 SBifPocB0.net
>>66
> 小学生が大学数学を解けない
ちゃんとこう言ってるじゃないかw
70:
17/11/26 23:13:47.64 rNgJnhxq0.net
>>26
うーん、auto、よくわからんなあ…
71:デフォルトの名無しさん
17/11/26 23:35:44.48 okic0QgR0.net
>>68
例えが分かりにくいのでC++で例えてほしい
72:デフォルトの名無しさん
17/11/26 23:39:50.10 po9rLop30.net
最近の大企業では、言語の募集をしても、全然できない人が来る。
言語を知っていても、何もできない
だから、コンピューターリテラシー、
つまり環境・OS・アルゴリズムなど、すべてを含めて必須
OS のコマンドを知らないとか、アルゴリズムを知らないとか、
仮想OS を構築できないとか、Vagrant, Chef, Docker を知らないとか、
LLVM, MFC を知らないとか
C++ なんて、ほぼすべてが必須だろ。
だから求人票には、コンピューターリテラシー必須って書いてある
言語の知識ぐらいでは、何もできないから、派遣から来ても、即日サヨナラとなる
Emacs を使えない人は、お断りっていう会社もあるほどw
プロなら、自分が使うツールにも、こだわりがあるはずだから
73:デフォルトの名無しさん
17/11/26 23:49:41.52 SBifPocB0.net
>>70
チンパンジーに因数分解みたいな話に例えもへったくれもねえだろ
74:デフォルトの名無しさん
17/11/27 00:33:44.81 1bUH4ri10.net
>>69
この場合はstd::inializer_listになるよ
75:デフォルトの名無しさん
17/11/27 00:34:52.25 1bUH4ri10.net
◯std::initilizer_list
だからstd::beginとかstd::endが使える
76:デフォルトの名無しさん
17/11/27 01:16:09.67 4bHQN/8na.net
>>71
趣味でやってるから企業の事などさっぱりだがそれはc++以外だと不要なのか?
77:デフォルトの名無しさん
17/11/27 01:26:50.56 fAclYYwOM.net
>>75
>>63>>64
78:デフォルトの名無しさん
17/11/27 01:52:56.54 x+zk8UEy0.net
最近の大企業では、言語の募集をしても、全然できない人が来る。
言語を知っていても、何もできない
だから、コンピューターリテラシー、
つまり環境・OS・アルゴリズムなど、すべてを含めて必須
だから募集要件が、コンピューターリテラシーがある人になる
確かに、何の言語でも、そうなる
79:はちみつ餃子
17/11/27 02:14:06.37 GAML79c/0.net
>>60
あ、すまん、それは薄い本 (同人誌のことをいうスラング) に反応してしもうたというジョークなので気にしないで。
80:デフォルトの名無しさん
17/11/27 02:36:02.00 T7rLcZV0d.net
>>77
C言語できますって言って2進数知らない人とか来るもんね
81:デフォルトの名無しさん
17/11/27 03:58:40.54 x+zk8UEy0.net
まあ簡潔に言えば、C++ を学びたい場合、直接C++ を学ぼうとしても無理。
文法だけを学んでも、全く何もできない
周辺知識(コンピューターリテラシー)から埋めていかないと、どうにもならない
高山列車が直接、真上に進めないのと同じ。
切り返ししながら、徐々に上がっていく感じ
何十年も、手続き型言語のC をやってる老害が、
オブジェクト指向に移行できないのも、そう
平山尚のセガ本もあるけど、文法を学んでも、オブジェクト指向が理解できない。
やっぱり「スッキリJava」から始める必要がある
82:デフォルトの名無しさん
17/11/27 04:39:24.98 /nBMg24u0.net
Javaみたいなオペレータもテンプレートも使えない糞言語薦めるな
83:デフォルトの名無しさん
17/11/27 04:41:34.85 /nBMg24u0.net
ヒエラルキーのトップC++にはなにもかも無駄な知識
Javaもrubyもpythonも
84:デフォルトの名無しさん
17/11/27 06:30:05.16 O6svWDNK0.net
C++を使うのにオブジェクト指向に対する理解が必要、という意見にはある程度賛成できる。
しかしながら、そのために先にJavaの本を読め、てのはどうなんだろ。
C++の入門書でオブジェクト指向の解説までカバーした本、てのは存在しないのかな。
C++の本を書くような人はオブジェクト指向の説明をするのは沽券に関わると思っているのか、
あるいは「C++の専門家」にはオブジェクト指向を教える能力がないのか。
85:デフォルトの名無しさん
17/11/27 06:41:19.35 /wh5qHzF0.net
オブジェクト指向言語じゃないので。
86:デフォルトの名無しさん
17/11/27 06:42:27.76 /wh5qHzF0.net
C++の学び方はパタヘネを読むところから始まる。
87:デフォルトの名無しさん
17/11/27 08:33:19.56 x+zk8UEy0.net
オブジェクト指向をわかりやすく説明した本は、世界中にない。
だから「スッキリJava」が出た 2011年は、オブジェクト指向にとって、エポックの年
この本以降、C++ を学ぶのに「スッキリJava」から始めるという道筋ができた。
この道筋で学べるのは、日本だけ
他国では、もっと苦労してるはず。
まあ、漏れの勝手な意見だけど
88:デフォルトの名無しさん
17/11/27 08:42:09.94 T6hD1Djz0.net
いや意見というより妄想
89:デフォルトの名無しさん
17/11/27 08:46:30.99 U9yOEuDb0.net
Javaみたいなゴミ薦めるな。ソフィーの世界の方がマシ
90:デフォルトの名無しさん
17/11/27 09:19:29.64 tczRDnba0.net
いろんな言語のおいしいとこだけ使って個々の言語に深入りしないのが得策
おいしいところを繋ぎ合わせる能力のほうが大事
91:デフォルトの名無しさん
17/11/27 09:19:54.22 aghVPiEK0.net
better Cとして使うのはいかんのか?
92:デフォルトの名無しさん
17/11/27 10:06:43.21 AedLfSQl0.net
イカンことはないと思うが、C の環境に行った時に困るぞ。
まあ最近の C には大体取り込まれてるみたいだけど。
93:デフォルトの名無しさん
17/11/27 12:03:50.36 pjE3KxE70.net
例の約一名入ってることがおかしくて
まず初心者というか入門で、C++の文法などを覚えたいという話なのに
コンピュータリテラシーが無いと現場では使えない、とか
今それ関係ないし
94:デフォルトの名無しさん
17/11/27 12:14:01.72 889bi2PQa.net
他の言語の本は無しとしてオススメの本ある?
c++11以前だったら独習C++が良かった。
95:デフォルトの名無しさん
17/11/27 12:45:48.74 O7ueEetiM.net
c++ プライマー第5版くらいしかないと思う。
c++の基本的な文法から解説してあってc++11対応。他の言語を学んでいるなら読めると思う。
96:デフォルトの名無しさん
17/11/27 12:49:42.23 vi7VqSly0.net
遠回しに他の言語の本読めって言っとるようなもんだ
97:はちみつ餃子
17/11/27 12:51:23.55 GAML79c/0.net
C++11 が成立するより前だと「詳説 C++ 第2版」が良かったと思う。
URLリンク(amzn.asia)
98:デフォルトの名無しさん
17/11/27 13:10:56.02 O7ueEetiM.net
>>95
説明が悪かったけど、プログラミングの全くの初心者が読むにはちょっと難しいかもってこと。
99:デフォルトの名無しさん
17/11/27 13:23:45.26 vi7VqSly0.net
>>97
ああそういうことね
100:デフォルトの名無しさん
17/11/27 20:00:43.82 pbeBNwkp0.net
>>83
> 入門書でオブジェクト指向の解説
ここがそもそも間違っている。
オブジェクト指向は肥大化(10k行以上)するソフトウェアを整理して記述するための方法論であって、
肥大化してない(1k以下)ものすら書けない初心者(入門書を読む層)には不要だからだ。
だから、ない。要らないから、無いんだよ。
少し考えれば分かるはずだが、世界中の誰も出来ないと思うかい?そんなわけないだろ。
ただし、日本のシステムでは必要なんだよ。
日本では大量の馬鹿(新入社員)でもプロジェクトの足しにする方向だから、
せいぜい100行しか組めないド新人にもオブジェクト指向を強いる。それが日本のJavaだ。
既に稼働中の大規模システムに組み込むコードは、
それが新人が書いたものであっても、正しくオブジェクト指向してないと困るから。
言い換えれば、大量の馬鹿が少しずつ組み上げることに日本は特化している。
これは平均的ド素人の最低レベルが保証される社会だから出来る方式でもある。
逆に海外はおそらくそんな馬鹿が大規模システムに組み込むコードを書く前提にしてない。
熟練し、正しくオブジェクト指向できる奴だけでメンテする前提であり、馬鹿は死ね、だ。
これはITドカタの給与の平均値からも分かる。だいたい海外は日本の2倍だ。
だから初心者にオブジェクト指向を教える意味がないんだよ。
オブジェクト指向自体は別段難しいものではなく、また、手続き型(Cスタイル)と(実は)地続きだから、
十分に熟練すれば自然と理解できるし、「手続き型だ」と言い張ったところでどうしても中身は似てくる。
Java鹿は、オブジェクト指向と手続き型が別物だと勘違いしている。
ド新人に「オブジェクト指向(キリッ」と洗脳し、その意味すら理解できない馬鹿が教える側に回って、悪循環してる。
普通に考えれば、C++の仕様でstructとclassがほぼ同じことからも、
また、未だにインスタンスメソッドとクラスメソッドの区別が文法以外にほぼ無いことからもこれは分かる。
(instance.method()とstaticMethod(instance)の実行時の違いがほぼ無い、
或いは、結局はレシーバをどう記述するかだけの話だ、と言った方が分かりやすいか。
Goに至ってはこの点、どっちでもいいです、という仕様にしてしまっているし)
101:デフォルトの名無しさん
17/11/27 20:02:10.31 pbeBNwkp0.net
Cで大規模なシステムを組むと、どうしてもstruct*を多用することになる。
これ自体がオブジェクト指向そのものだ。
ただしCにはこれをサポートするための文法が無く、全部自分でやらないといけない。
だからちと辛いし、class構文欲しい、というのは自然な流れだ。
おそらくLinusがC++erを毛嫌いしているのはこの辺で、(彼が嫌っているのはC++ではなくC++erね、念のため)
Cにはサポート構文がないだけであって、
自前でやる気なら正しくオブジェクト指向できるし、
それが昨今の「継承イラネ、全面委譲で」なら実は大して手間は変わらない。
この場合、「C文法で組め」と言われても、「ああ、これならまあ」程度でしかない。
これについてグダグダ言う奴は理解できてない馬鹿だからイラネ、ってのは当たってる。
そもそも、入門者の言う「オグジェクト指向が難しい」の理由は、
「オブジェクト指向で組めない」ではなく、
「オブジェクト指向の利点が分からない」「なぜこんな記述方式にする必要があるのか?」だろ。
元々大規模のコードを整理するための手法なんだから、
大規模なコードが書けない新人には理解できないのは当たり前。
それを理解しろ、という日本方式に無理があるんだよ。
あと、Javaの問題は、かなり制限された言語だから、
他言語だとすごく単純に記述できることを
デザインパターン(キリッをこねくり回して意味不明な構造にしないといけないことが多いこと。
だからC++入門者にJavaを勧めるというのはやっぱりキチガイだよ。
そしてこの意味で老害が一番多いのはJavaだと思うよ。
と言うか、ちょっと逝っちまっていることを言う奴はたいていJava鹿だ。>>86もそうだろ。
例のスタティックおじさんの話もJavaだし。(あれは双方の言い分も分かるが)
102:デフォルトの名無しさん
17/11/27 20:03:35.06 pbeBNwkp0.net
C++の問題は、「何でも出来る最強言語」を目指しているのか、本当に何でもありすぎる点だ。
だから新人が戸惑ってしまうのも分かるし、無駄に覚えることも多すぎる。
例えば、継承した場合に隠蔽できるが、あれなんてマジで要らないだろ。
(virtualでないメソッドをoverride(とは言わないが)して隠蔽、って奴ね)
この辺、バランスが取れているのはC#だ。そもそもそこが狙いのようだし。
Cに関しては、老害ではなく、「老」が多い。これは古い言語だから。
ただしC++への移行はいつでも出来たし、既に書いたがオブジェクト指向とは地続きだから、
文法的にオブジェクト指向してないだけで中身はオブジェクト指向そのもの、ってのはよくある話だ。
そしてCは元々関数ポインタを扱えた。これはものすごく大きい。
Javaが糞なのは、全く関数ポインタを扱えず、
その結果デザインパターン(キリッする糞言語になっている点だ。
ただしあの頃はまだ「関数ポインタの有用性」がさほど理解されておらず、致し方なかった面もある。
C#もこの辺、記述方式が二転三転しているし、C++もやっとラムダを取り入れたばかりだ。
K&Rも「関数ポインタも使えるよ」としか書いて無い。あれはもっと力説されて然るべきだった。
でも、今新しい言語を作るとして、関数ポインタが使えないのはマジで糞だろ。
そしてこの点、文法的にではなく、
「社内ルールで」関数ポインタの使用を制限する「老害」が多いのは圧倒的にJavaに決まっている。
Cは元々使えたし、C++は(読みやすくはないが)ファンクタを使えたので、有用性は「老」でも理解している。
Javaにはそもそも関数ポインタの使い方を理解している「老」がいない。
Java8で文法的には取り入れられたものの、おそらく大半の職場では相当期間制限されるはず。
103:デフォルトの名無しさん
17/11/27 20:05:06.84 pbeBNwkp0.net
海外の連中の話だと、「プログラミング自体」を学ぶのに一番早いのはPythonだと言われてる。
(俺はPythonを使ったことがないから分からんが)
例えば、入門者のよくある質問、
「元データがこういう配列で、このうち○○を含むものだけを抜き出したい」等、
どうプログラミングするか、という所から学ぶケースだ。
この辺の本当の初心者に対しては、
C++の、よし、ここはスマポだ、とか、
Javaの、そこはオブジェクト指向で云々、とかは邪魔なんだよ。
本当にフォーカスすべき案件に集中できない。
この意味ではC++は最初の言語には向いていない。
だからド初心者用の入門書の良書は少なく(需要がない)、逆にeffective系が多いのだと思う。
ただしPython自体も古くてゴミな部分もあるから、(ラムダに制限がある)
基礎を組めるようになったら早く卒業し、
C/C++やJavaScript等の「無制限な」言語で色々やったほうが上達するとは思うが。
この意味ではJavaやPythonは制限されすぎていて駄目で、
C#は適切に制限されているから、現実解としてはかなりありで、
C/C++やJavaScriptは自由すぎて(上達はするが)大規模システムを組むには怖く、
だからこそJavaが現代版COBOLとしてのさばっている、という構図だが。
だから、C++erが大規模システムの為に安全なJava言語を選ぶ、というのはありなのだが、
Javaしか出来ないJava鹿が知ったような口を利くからおかしなことになる。
Javaがどれほど制限されているのか理解していればそんなことは言えない筈なんだがな。
この辺、新しく出てきたGoは色々整理されているはずだと期待したんだが、
かなり糞だったので逆に驚いた。あれではC+GCでしかない。
今更Generic出来ないとかマジで糞過ぎる。
逆に言えば、今でもC文法そのままでよく、GCだけ欲しい人にはGoは向いているが。
104:はちみつ餃子
17/11/27 20:24:50.03 GAML79c/0.net
>>102
Go はさっぱりあかん言語だというのには同意するが、
現実にはその程度で良かったという話なんだよ……
105:デフォルトの名無しさん
17/11/27 20:46:19.07 FoS8Dw4c0.net
全くの初心者なら、まずはC言語の勉強をしてから>>94のc++ プライマー第5版などを読むのがいいかもしれないね
俺の知っているC言語の本で一番分かりやすかったのは、アスキーラーニングシステムの「入門C言語 新装版」と「実習C言語 新装版」だけど、さすがに古いかな?
同じ著者の本で2008年に出ている「Cプログラミング講座」というのもあるけど、これは読んだことがないな
というか、こっちもすでに絶版になっているっぽいな...
106:デフォルトの名無しさん
17/11/27 21:02:33.36 u8FYnIqP0.net
発狂しやがったw
107:デフォルトの名無しさん
17/11/27 21:58:25.69 x+zk8UEy0.net
ゲームプログラマになる前に覚えておきたい技術、平山 尚、2008
この本は賞を取ってるけど、セガの平山は、
1冊で、C++ の文法と、ゲームプログラミングの2つを、
同時に習得できる本を目指したけど、無理だった
結局、C++の文法だけで、2007年のロベールの分厚さが必要。
人間の読める限界を超えている。
それでも、日本にはロベールがあるだけマシ。
外人は、やさしい本が無いから、もっと苦労してる
結局、1冊でJava の文法と、オブジェクト指向の2つを説明したのが、
2011年の「スッキリJava」
ここまで、待たなければならなかった。
外人は、スッキリも無いから、もっと苦労してる
外人の場合、専門書しかないから、偏差値70未満は、単純に振るい落とされるだけ。
日本のように、学ぶことはできない
108:デフォルトの名無しさん
17/11/27 22:04:03.51 pbeBNwkp0.net
>>103
あれは言っちゃあ悪いがC++のオブジェクト指向が暴走した反動だよ。
C++が無駄に複雑化しなければ全くのゴミだったはず。
それ以前にC++はGC嫌いが宗教じみてる。
無駄にスマポで頑張るのではなく、VC++/CLIのgcnewを導入した方がましだったと思うよ。
Goは全く新しい機能がなくてびっくりした。
ただ、C++が複雑化しすぎてWeb系(というかバックグラウンドがない初心者�
109:jに厳しいのは事実。 そしてゆとり版C++=Goってのも分からなくもない展開だ。 ただ、持ち上げている連中の非力感は否めない。 あれは関数型()と同様に大騒ぎしてポシャる可能性もあると思う。
110:
17/11/27 22:37:12.11 b0u4s5jJ0.net
>>93
独習c++ いいね、ハーバード・シルトは要点を押さえてさえている、独習Java がダメダメだったのとは一線を隔しているね
演習問題に std::string を再実装する、という山場があるが、それを乗り越えると c++ の初級者になれると思う
111:デフォルトの名無しさん
17/11/27 22:38:46.80 c8zZNJxQa.net
>>70
明確な強い理由がない限り言語なんて大概何でもいいだろ
どこの現場でも出来る奴ってのは、モジュール設計のセンスとネーミングセンスのある奴じゃなかろうか
112:
17/11/27 22:55:46.68 b0u4s5jJ0.net
>>99
Java のいいところは、一文字一文字丁寧に読んでいければだれでもわかるように書けるところにあるのでは?
それは一つの到達点だと思う
BigInteger.ONE とか、ちょっと嫌だな、と思う書き方はあるが、仕方がない
(gmp なら 普通に 1 と書けば文脈を読んで BigInteger(1) というコンストラクタが働くのだが、昔の Java はそもそもオートボクシングがなかったくらいだし)
C/C++ ならスタックにデータを置けても規模が大きくなると、new/delete する方向になるのを見込んで、Java が最初からクラスをスタックに置かないことに徹したのも、
定石どおりでいい感じ、Java は尖がったところがないので好感をもっている
昔はアルゴリズムの教科書といえば pascal で記述されたものだが、最近は Java で記述されているものもよくみかける
私は Java を非難したくはないな…
113:デフォルトの名無しさん
17/11/27 23:07:39.99 ot/xhhe10.net
unique_ptrとshared_ptrのことちゃんと解説してる日本語本ってないだろ(C++1xのマニア向け本除く)
レガシーコードのメンテするんでもない限り生ポインタで一生懸命あーだこーだしてる古い本なんて役に立たないしむしろ有害だよ
規格書読んだほうがまし
114:デフォルトの名無しさん
17/11/27 23:08:39.40 u8FYnIqP0.net
>>107
じゃあ、おまえの主張どおりC++にGCを実装するなら
どんな実装になっていたんだ?
俺はベアメタルのROM屋だが
今でさえ例外だのRTTIだのでさえ殺意を覚えているんだが
115:デフォルトの名無しさん
17/11/27 23:26:49.34 gwom9yQZ0.net
マニア向けも何もunique_ptrもshared_ptrも1x以降に実装されたんだから当たり前やろ
116:デフォルトの名無しさん
17/11/27 23:28:11.32 x+zk8UEy0.net
unique_ptr, shared_ptr などは、たぶん、Boost の本に載ってるかな?
C++ は、Rust, Elixir へ移行している
C++ では、多重継承も難しいから、Java, C# では単一継承だけになった
117:デフォルトの名無しさん
17/11/27 23:32:43.41 pbeBNwkp0.net
>>112
だから書いたろ。gcnewだよ。
URLリンク(msdn.microsoft.com)
動きとしては、C#やJavaのnewと同じ。
ただしnewだと予約語で被るのでgcnewになってる。
C++はランタイムが無いから、std::GCを作って、
gcnewを1回でも呼んでいるようならそれをリンクしてやればいいだけ。
まあ今からでもできる拡張だからやってくれ、とも思うが。
ただ、GCは絶対に入れない宗教なんだろC++は。
118:デフォルトの名無しさん
17/11/27 23:34:27.97 gwom9yQZ0.net
いくらなんでもGCはいらんやろ
119:デフォルトの名無しさん
17/11/27 23:37:10.60 Tgpr/JpE0.net
リソースを全部GCで管理してくれるならいいんだけど
自分で解放しないといけないリソースもあってなんだそりゃっていつも思う
120:デフォルトの名無しさん
17/11/27 23:38:00.85 /nBMg24u0.net
GCなんて負の遺産だろ
崇高なC++にそんなもん混ぜんな
121:デフォルトの名無しさん
17/11/27 23:39:22.69 gwom9yQZ0.net
>>117
ほんこれ
んで結局usingだのwithだのって、ええ…って感じ
122:デフォルトの名無しさん
17/11/28 00:15:26.24 MNvbCMHv0.net
>>111
c++プライマー第5版で解説してる。
123:デフォルトの名無しさん
17/11/28 00:27:26.85 S7QzL+/B0.net
>>110
Java自体はオブジェクト指向の完成形になるはずだったのは認める。
問題は、Javaに関数ポインタがなく、それが致命的だったことだよ。
というかあの頃のC++/C#/Javaの連中は誰も関数ポインタの有効性に気づいてない。
だからC++でも匿名関数をサポートしてなかった。
関数ポインタ=オブジェクト指向(多態)を手動でやるときに必要=クラス構文でサポートしたからイラネ
という判断だったのだろう。C#のdelegateもまずクラス(thisの受け皿)ありき、だからね。
あとはcallback出来ればいいや、位か。
関数型のように関数ポインタを常用する事になるとは思ってもいなかったはず。
ところがLisp-Erlang-Haskellの連中は匿名関数の有効性に気づいていて、
おそらくJavaScriptでそこに日が当たってしまった。
そして匿名関数のサポートがないのは間違いだったと気づき、C++/C#/Javaの全てはこれを導入した。
(後は関数がfirstClassObjectになるかどうかだが、
今のC++の雰囲気なら、じきに何らかのサポートを入れると思う)
ここで問題なのは、C++/C#は以前から関数ポインタを(見やすくはないが)使えたから、
ユーザも使えるし、コードも必要ならそう記述してあること。
一方、Javaはユーザ側にその知識がないし、
関数ポインタが無い為に継承等で無理に実装してあるコードが既に大量にあること。
Javaユーザが勉強熱心だとはお世辞にも思わないし、何周も他言語ユーザから遅れてしまっている。
そして大量に居るJava鹿の為、すぐにJava8を導入できるとも思えない。
ただしC#は進化し続けた=ユーザーに勉強を強い(時間を奪い)、
また環境にも負荷をかけ続けた(いちいち新しいコンパイラ等を整備する必要がある)為、
結果的にエコシステムの構築が遅れ、
下位互換でしかないJavaに対してかなり出遅れている感じは否めない。
ここら辺は結果論でしかないが、分からん物だね。
単純にいい言語が繁栄するわけでもないし。
124:デフォルトの名無しさん
17/11/28 00:41:52.09 +e31yHtn0.net
ワッチョイ便利だね。
125:デフォルトの名無しさん
17/11/28 01:00:11.14 g1MyZtTV0.net
煽りカスさん乙
126:デフォルトの名無しさん
17/11/28 01:05:09.69 4Z4gLCZka.net
匿名関数はラムダやろ?
127:デフォルトの名無しさん
17/11/28 01:10:37.08 pJ0hWez80.net
古典的な同期プログラムなど、いまどき何で書いても同じ
問題になるのは
非同期処理やら
例外安全(処理の巻き戻し)やら
マルチスレッドでデッドロックしない云々やら
いわゆるトランザクションのようなものをどう実現するかやら
そのへん
超高級言語で、いわゆるスクリプトなどなど
高級なくせに上記のサポートが何もないのが真の糞言語で
無駄に重たいだけで、「今まで何やってたの?」状態
動的型なんか何も意味無かったし、本当に何やってたんだろうな
128:はちみつ餃子
17/11/28 02:18:11.95 1OfFiaid0.net
Go はランタイムごと新しく作ったからな。
129:デフォルトの名無しさん
17/11/28 05:29:42.55 VD3vPh0F0.net
>>115
おまえアンカーミスったか?
俺の問いに対して一言も答
130:えていないんだが
131:デフォルトの名無しさん
17/11/28 06:46:20.76 RUZbaLWb0.net
new自体ほぼ使わないのにgcnewを導入しろとかアホか
132:デフォルトの名無しさん
17/11/28 07:49:07.52 tl7kMs1v0.net
一連の投稿(同一ワッチョイによる)を一通り読んだけど、
マトモに議論(賛成にしろ反論にしろ)できるほど理解できなかったわ。
自分の読解力というか、多くのプログラミング言語を比較評価できるだけの
知識の欠如が原因で、投稿者を批判するわけじゃないんだが。
ただ一応は読んだ、という証拠を示す意味で一言。
>>102 にある「Javaしか出来ないJava鹿」って言い回しは気に入った。
意識して書いたか分からないけど、ウマくかかってる。
133:デフォルトの名無しさん
17/11/28 08:26:28.34 Qe8OZN310.net
他の言語のスレに行ってJAVAを薦める「Javaデモ」はいらん。
デモもピケもお断り
134:デフォルトの名無しさん
17/11/28 11:27:26.73 QyLugM0S0.net
Javaはいいぞう~。
135:デフォルトの名無しさん
17/11/28 12:26:15.71 +ODnZXKO0.net
Java原人がいるようだね
136:デフォルトの名無しさん
17/11/28 20:00:44.77 w5+ReiF20.net
煽っても無駄ですよ!
137:デフォルトの名無しさん
17/11/28 20:32:34.90 yKt6vWJv0.net
D言語はなぜ流行らなかったのか・・・・・・
138:デフォルトの名無しさん
17/11/28 20:33:55.36 HaaNvQJm0.net
俺、D言語の方が好きなんだ
139:デフォルトの名無しさん
17/11/28 20:43:15.23 Zbhkl8PP0.net
規格の更新速度が遅すぎた
140:デフォルトの名無しさん
17/11/28 20:56:09.01 VZsT4wzqd.net
pairを戻り値とする関数内でmake_pairを返そうとしてる
pair<string, string>( vector<string> vec)
{
return make_pair<string,string>(vec[0],vec[1])
}
要素数が2より小さいときにペアが作れないから他のものを返したいのだけど
こういう場合は何を返せば良いのだろうか?
受けてる先では
map<string,string>にinsertをしてる
141:デフォルトの名無しさん
17/11/28 20:59:58.28 VZsT4wzqd.net
>>137
見直して意味わからんかったので直しました
pair<string, string> XXX( vector<string> vec)
{
return make_pair<string,string>(vec[0],vec[1])
}
int main()
{
map<string,string> map:
map.insert(XXX(vector))
}
142:デフォルトの名無しさん
17/11/28 21:14:23.08 /W89QHRM0.net
>>137
C++17の std::optional を使うところかな
戻り値をstd::optional<std::pair<string, string>>にして
意味論的に不正な場合は std::nullopt を返す
C++17以前なら boost::optional もあり
143:デフォルトの名無しさん
17/11/28 21:16:00.33 RUZbaLWb0.net
>>137
しらんがな。返したいもの返せよ
144:デフォルトの名無しさん
17/11/28 21:17:15.47 nsdKAlOZ0.net
tupleじゃあかんの?常に2以下なんかね
145:デフォルトの名無しさん
17/11/28 21:27:48.71 elkBwSAY0.net
あぁスマンmapに入れるのか
でも1つしか無かった場合もmapに入れたいのかエラーにしたいのか??
あとmake_pairは関数だからテンプレート引数は省略できるよ
146:デフォルトの名無しさん
17/11/28 21:59:35.14 S7QzL+/B0.net
>>127
キチガイ死ね
韓国人死ね
>>128
それはCへの回帰だぞ。お前は多分理解して無いと思うが。
147:デフォルトの名無しさん
17/11/28 22:39:29.70 lP6TeLLOM.net
>>137
nullobjectパターンかね
mapで絶対検索されないキーを突っ込んでおくとか
148:デフォルトの名無しさん
17/11/28 22:45:01.20 VD3vPh0F0.net
>>137
何を返しても嘘になるので、返してはダメ
if (vec.size() < 2) throw logic_error{"runt vector"};
149:デフォルトの名無しさん
17/11/28 22:46:39.17 VD3vPh0F0.net
もしくはassert(vec.size() >= 2);
150:デフォルトの名無しさん
17/11/28 22:54:08.70 HaaNvQJm0.net
name=valueみたいなのを分割してmapに入れる感じ?
俺も例外投げて止めてしまった方が�
151:「いねと思うね
152:デフォルトの名無しさん
17/11/28 23:41:38.36 w5+ReiF20.net
だが待ってほしい。
例外を投げるということは誰かに責任を押し付けることではないだろうか。
153:デフォルトの名無しさん
17/11/28 23:44:58.64 KluQKWh40.net
上位処理「ハンコ押してください」
154:デフォルトの名無しさん
17/11/28 23:53:44.75 S7QzL+/B0.net
>>129
C++より簡単でお気軽な言語が大量にある今、C++で全くの初心者用の環境を要求すること自体が間違い。
それはトレーラやユンボでド初心者を教習するのに近い。
そうではなく、まず普免を取ってからこれらの特殊車両だろ。
お前は「俺はトレーラー乗りになりたいから、最初からトレーラーでやってくれ」とゴネている教習生なんだよ。
C++のオブジェクト指向でいい本が「世界中に」ない=C++やるような奴にはそんなもの需要がない
でしかない。お前はそれすら理解出来ない馬鹿なのに、
> C++の本を書くような人はオブジェクト指向の説明をするのは沽券に関わると思っているのか、
> あるいは「C++の専門家」にはオブジェクト指向を教える能力がないのか。
ってのは自意識過剰すぎる。世界はお前を中心に回っているわけではない。
C++を使う必要がある局面でC++を使う人たちには、今更オブジェクト指向なんて教える必要がないんだよ。
それは自明だから。
そして本を書いている奴らも別段崇高な精神を持って布教しようとしているわけでもない。
いや、そういう奴もいるかもしれないが、当然「売れるから書く」という下俗な奴も世界には必ず居るはずであり、
そういう奴らすらいない=売れない=需要がない=みんな既に知っているから、でしかない。
だいたい、オブジェクト指向ってのはプログラミング手法であり、
言語とは別の軸なのだから、「『C++の専門家には』オブジェクト指向を」ってのも論理的におかしい。
155:デフォルトの名無しさん
17/11/28 23:54:34.49 S7QzL+/B0.net
そもそもオブジェクト指向がさも特別で崇高な存在だ、なんてのはJava教団がそうしたがっているだけで、
実際のところは、Cで大規模コードを扱うと、最初はstruct*、次に関数ポインタの嵐になり、
これらをどうにかしてコンパイラに自動的にやらせよう、として生まれたのがC++のオブジェクト指向だ。
だから既に言ったがC→オブジェクト指向は完全に地続きなんだよ。
これは出自からしても当然で、
Cの典型的な問題点を新たな言語サポートにより解決することを目指したものがC++だから。
逆に言えば、C++98で搭載されている機能はほぼ全てCの問題点の克服であり、
Cを使いこなしていた連中にとっては当たり前に「その気持ちは分かる」ものでしかない。(なお同意するかは別)
そしてオブジェクト指向もこの中に入っている。
だから当初からオブジェクト指向の有効性をわざわざC++で語る意味はなかったし、
他お手軽系言語が乱立している現在、さらに輪をかけてその必要性がなくなっている。
156:デフォルトの名無しさん
17/11/28 23:55:33.62 S7QzL+/B0.net
それでも初心者が「オブジェクト指向自体を学びたい」ときにはどうすればいいかと言えば、
俺個人は「まず3k行程度なら平気で書けるようになってからでいい。そうすればおのずと分かる」という立場だ。
しかしそれでもHellowWorld直後のド初心者に教えようってのならJava教団みたいに洗脳していくしかない。
どう見ても実行に直接関係ない記述の嵐であり、ド初心者にとっては「無駄じゃね?」としか見えないだろうし。
だからこの意味ではJava教に入信しろ、というのもありではあるのだが、
問題はJava教団はJava教の不備は絶対に認めないというか、気づいてないことだ。
関数ポインタさえあれば非常に単純に実装できることを、無理に継承を導入したおかしな構造で対応し、
しかもそれをデザインパターン(キリッと公式化しようとしている所が滑稽だ。
しかし、Java教信者は関数ポインタの存在を知らないから、この教義がおかしいとも気づけない。
また、Javaのオブジェクト指向は今既に邪道で、オブジェクト指向するのが目的化してきてる。
例えばprivateにすること、イテレータを実装することが目的になってるだろ。
だから実際に前スレ896みたいな事
157:も平気でやる。本当に全く意味が無い。 (これについてはLinusはC++erも同様だと言っているが) だからJava教でオブジェクト指向を学ぶのは、邪教というか、 邪オブジェクト指向を学ばされる可能性がかなり高いのでオススメしない。
158:デフォルトの名無しさん
17/11/28 23:56:37.90 S7QzL+/B0.net
結局、オブジェクト指向は「学ぶ」物ではなく、本来は「悟る」物なんだよ。
そしてそれは涅槃の境地で解脱しろ、みたいな崇高なものではまったくなく、
「この交差点、信号無いと危なくね?」位の、普通に運転してりゃ分かるだろ、程度の物でしかない。
だからわざわざ解説するほどのことでもないんだが、結果的に、
「オブジェクト指向しろ」と言われる割には解説本がなく、初心者にとってはなんだかよく分からん状況になっている。
そしてお前みたいな馬鹿は「幼稚園で『どこに信号を立てるべきか』きっちり教えるべきだ!
俺は教わっていないから分からない!教えられる先生もいないのか!」
と主張するわけだが、完全にモンペ通り越してキチガイだろ。
オブジェクト指向は幼稚園で教えるべき内容ではないし、教えなくとも自然と理解できる物だし、C++は幼稚園ではないし。
そして脱線すると、「結局オブジェクト指向はよく分からんね」というゆとりが逃げ出した結果が関数型祭りだ。
いや結果的にはC++/C#/Javaの全てがラムダを導入したのだから、一定の成功を得た、と評すべきかもしれんが。
しかしErlangみたいに「オブジェクト指向での限界を突破する」為の明確な方策がなく、
単に馬鹿な連中がより簡単な関数型に逃げ出しただけであり、そこで何か新しい境地が拓けるものではなかった。
そしてGoも俺はこれに似た匂いを感じてる。C++出来ないゆとりが集まっただけじゃんこれ、みたいな。
ただし、確かにC++は無駄に複雑化しているのも事実だが。
> Java鹿
それ、読み方は「Ja馬鹿」ね。ただ表記上分かりやすいので「Java鹿」にしてるが。
159:デフォルトの名無しさん
17/11/28 23:57:04.62 7WoPw74F0.net
HellowWorld
160:デフォルトの名無しさん
17/11/28 23:59:42.90 layR/96s0.net
また長文ウンチ君かよ
161:デフォルトの名無しさん
17/11/28 23:59:58.99 +ODnZXKO0.net
ワッチョイって神だわ
162:デフォルトの名無しさん
17/11/29 00:05:12.43 LrQLLGRZ0.net
まあ俺はゆとりは死ねとしか思って無いからな。
つか、この程度の文も読めないのなら、お前ら仕様書や本も読めないだろ。
向いて無いからプログラマ辞めろよ。
163:デフォルトの名無しさん
17/11/29 00:13:55.97 jItlzFQF0.net
>>148
そこはまぁその関数の仕様として、呼び出す側が確実にcatchする責任があるわけだな。
それを忘れると例外が呼び出し階層を突き抜けていっちゃう。
そういう事態を防ぐために考えられたのが検査例外だけど、これはこれで使いづらい面があるんで
Java以外にはあまり採用されなかった。
そんなことを考えてみると>>137程度の目的で例外などという暴力的な仕組みを使うのがそもそも
適切なのかどうか。Goの選択もそういうことなんだろう。
164:デフォルトの名無しさん
17/11/29 00:19:11.17 gRQoJ5CS0.net
URLリンク(nekko1119.hatenablog.com)
main関数の最後にあるstringへのキャストでエラーがでるのですがなぜですか。
エラー C2440 '型キャスト': 'Any' から 'std::string' に変換できません。
コンパイラはvc++2017です。
165:デフォルトの名無しさん
17/11/29 00:22:57.10 LrQLLGRZ0.net
>>158
> Goの選択もそういうことなんだろう。
Goのって「自分でthrowしないといけない例外」だろあれ。
あれなら普通の例外のほうがよかったんじゃ…と思ったけどね俺は。
166:デフォルトの名無しさん
17/11/29 00:29:49.23 +gz4D8Lj0.net
>>159
(string)をany_cast<std::string>にすれば通りそうだが
167:デフォルトの名無しさん
17/11/29 00:36:37.38 gRQoJ5CS0.net
>>161
通す方法ではなくてなぜ
168:通らないのかが聞きたいのですが template<Type> operator Type() で暗黙の型変換のオーバーロードを定義しており、 int型やHoge型に対して代入する際にそれが使われているのに std::stringに対してだけうまくいかない理由はなぜかが知りたいです。
169:デフォルトの名無しさん
17/11/29 00:44:30.01 +gz4D8Lj0.net
>>162
intのとこもHogeのとこもキャストは使われてないように見えるが…
でもまぁ確かに呼ばれてほしい気もするね
static_castでもだめ?
170:デフォルトの名無しさん
17/11/29 00:45:54.72 gRQoJ5CS0.net
すいません。勘違いしてる部分がありました。
std;;stringだけじゃなくて他の型でもダメみたいですね。
質問取り下げます。もう一度自分で考えてみます。
>>161
失礼しました。
171:デフォルトの名無しさん
17/11/29 00:51:28.18 AJHdDibY0.net
>>162
gcc 7.1.0とclang 6.0.0では通った
ただしstd::type_infoと書くべきところをただtype_infoと書いてる個所があるので、それは直したけど。
それより下のコンパイラバージョンだとエラーになった。(ambiguous conversion)
そして
(string)val
の代わりに
(const string&)val
と書いたらclang 4.0.1でも通った。
172:デフォルトの名無しさん
17/11/29 01:02:17.23 gRQoJ5CS0.net
(int)valはいけますけど
(Hoge)val, (std;;string)valはダメのようですね。
で、ご指摘のとおり
(Hoge&)val, (std::string&)valは通りました。
前者と後者の違いは分からないですが。
173:デフォルトの名無しさん
17/11/29 01:27:40.52 /RfTzpPk0.net
& の意味が分からないなら、プログラミングできない
(int)val
普通、こういうキャストの書き方は、しない
static_cast など数種類あるキャストの書き方の中から、
キャストの種類を指定してキャストする
君は、入門書を読んでいないだろ
174:デフォルトの名無しさん
17/11/29 02:04:04.04 qCLwkY6K0.net
>>143
newの代わりにmalloc使ってるとか思ってるアホ?
今時new使うやつは以下のどれか
* Javaから来たC++初心者
* 化石コンパイラ使わさせられてる可哀想なやつ
* 自身が化石な可哀想なやつ
* パフォーマンスのために用意されてない構造の実装が必要なライブラリ設計者
お前は1番目と3番目の複合型だろうね。
175:デフォルトの名無しさん
17/11/29 02:17:56.38 gRQoJ5CS0.net
template<class Type> Any::operator Type() const
上をやめて、下の2つを定義したらmain関数の記述そのままでうまくいきました。
template<class Type> Any::operator Type&() const
template<class Type> Any::operator const Type&() const
理由は分からないです。分かる方がいたら教えてください。
176:デフォルトの名無しさん
17/11/29 03:01:43.02 /RfTzpPk0.net
& の意味が分からないなら、プログラミングなんて出来ない。
初歩の初歩なのに
まず、入門書を読むこと
177:デフォルトの名無しさん
17/11/29 03:06:58.25 l2Be3tXA0.net
質問の意味わからんでレスしてる奴うざいわ
178:デフォルトの名無しさん
17/11/29 04:38:58.34 llo+D0tpd.net
>>144
>>139
>>145
基本的には2以下は存在しないから例外処理組み込もうと思ったけどnullobjectってのがあるのね
おそらく俺の理想的にはこいつが適してそうだからこいつを調べてみるよ
>>145の言うとおりに絶対に呼ばれないキーをいれておくのも検討違いな気はしてる
179:デフォルトの名無しさん
17/11/29 04:50:10.36 llo+D0tpd.net
>>147
まさにそれをしようとしてる
そこのロジック的には空文字入れる予定だから必ず2以上になるのだけど
関数分割していて関数としては何が返ってくるか不明なため
問題が起きたときのコードを記載しようとしてる
vectorのsizeが0や1の時にアクセス違反になってしまうからどうやれば回避できるのかなぁと悩んでる
例としてはこんなん
=value
key=value
key=
==value <
180:デフォルトの名無しさん
17/11/29 07:52:20.02 o9GGe8w4d.net
>>171
確かにそうだね
それにclangの最新だと通ることから、それなりにややこしい話かと思う
181:デフォルトの名無しさん
17/11/29 08:27:09.91 WoWbjmOBM.net
>>173
> key=value
これは正常ケースだよね
> key=
仕様によるけどvalueに空文字入れときゃいいんじゃね?
> =value
> ==value
エラーでしょ?
例外発生させるなり、ログ採ってnullptr返すなりしなよ
そんなものを無理矢理 map に突っ込もうとするのがおかしいと思うぞ
182:デフォルトの名無しさん
17/11/29 08:58:03.16 p7HSt6hG0.net
>vectorのsizeが0や1の時にアクセス違反になってしまうからどうやれば回避できるのかなぁと悩んでる
vectorの要素数が不確定の場合はatで取り出せばいいよ、なんかあったらout_of_rangeが飛んでくるから
183:デフォルトの名無しさん
17/11/29 09:33:07.40 llo+D0tpd.net
>>175
空文字入れるのはできてる
ただベクターの生成は別関数が行うから引数に渡されるベクターにいくつ値が入っているか不明
だからマップ作成側で個数を意識する対策する必要あるよね?って話
ベクターの生成に関しては実際問題ない
>>176
try catchするしかないのかな
nullopt返そうとしたけど実装無理だったわ...
184:デフォルトの名無しさん
17/11/29 10:42:28.73 IulhJnoW0.net
例外投げるかなにかしとけばよいって
ロジック的に要素数2未満はあり得ないし想定してないんでしょ?
余計なことする必要ないって、以降の処理が余計ややこしくなるだけだから
エラー処理が適切
185:はちみつ餃子
17/11/29 10:50:41.36 nr0c2ixN0.net
あってはいけないことなら assert で止めてしまえよ
186:デフォルトの名無しさん
17/11/29 10:58:33.93 IulhJnoW0.net
assertは良いがリリースビルドで消えてなくなるから
それがあってるかどうかだな
よほど条件に自信があればassert
187:デフォルトの名無しさん
17/11/29 11:00:19.45 VlCz8ge40.net
複雑なことをせずに設計しなおせばいいんじゃね?
188:デフォルトの名無しさん
17/11/29 11:28:13.62 CqyTJd2aM.net
>>178
おいおい、例外をエラー処理以外に何に使うってんだよ
189:デフォルトの名無しさん
17/11/29 11:33:09.98 51eC79nG0.net
メッセージの通知に!
190:デフォルトの名無しさん
17/11/29 12:07:51.67 IulhJnoW0.net
>>182
だから、エラー処理が適切だから
例外投げてエラー処理でもしとけば?と書いてあるはずだが・・・
ただこの手合い、例外投げて、それを受け取ったからと言って
リカバリーしてプログラムを再開できるかはわからないよなぁ
プログラム本体の状態を一切汚さずに(書き込まずに)
新規領域のみで何か処理をして
例外が飛んで来たら全てを無かったことにする・・・とか
例外でやる場合は例外安全を確保するのが結構面倒なんで
プログラムの末端から例外投げるのは最後の手段にしたい
だから「実際に実行してみないとエラーが出るかわからない」系のエラーが無いのであれば
早期の段階で入力データにエラーがあるかどうか精査して、エラーがあればその旨返して
以降はエラーが発生しない前提で処理する(ので巻き戻すことは考えない)
もし不慮のエラーが発生したら、バグであるからログ吐いて異常終了
可能なかぎり、なるべくこちらで行きたいわけで
191:139
17/11/29 12:10:47.10 /Yd3ZvxU0.net
>>177
optionalを挙げたものだけど 惑わせたようで申し訳ない
insert 前にチェックして不正ならそもそもinsertしない設計を考えてました
結局 optionalを返す insert / find を自前実装することになるから
そんな面倒な事せずに 素直にXXXで例外投げても全く構わないと思う
一応詫び代わりに書いてみたけど 鵜呑みにはし�
192:ネいでください C++17 例外なし 読みやすさのためにautoなし https://wandbox.org/permlink/rag4d7YPqwPKQpNq
193:デフォルトの名無しさん
17/11/29 12:13:09.20 f8CPZ7/S0.net
182=184
同じ臭いがする
194:デフォルトの名無しさん
17/11/29 12:14:34.01 o9GGe8w4d.net
検査可能な事前条件はそりゃ呼び出し側の責務にしたいわな
195:デフォルトの名無しさん
17/11/29 12:52:35.24 WoWbjmOBM.net
>>177
> ただベクターの生成は別関数が行うから引数に渡されるベクターにいくつ値が入っているか不明
.size で取ればいいだけだろ
そもそも name=value のパース結果をベクターで渡してくると言うの設計もどうかと思うが
> だからマップ作成側で個数を意識する対策する必要あるよね?って話
そうだよ、その対策を>>175にかいたつもりだが...
もしかして
name=
と
=value
の両方とも vec[0] にしか入れてこないとかなってるんじゃないよね?
だとしたら生成部分を直さないとどうしようもないけど
196:デフォルトの名無しさん
17/11/29 13:49:04.14 51eC79nG0.net
ヴェクターノズル搭載。
197:デフォルトの名無しさん
17/11/29 14:47:34.47 llo+D0tpd.net
色々とありがとう
最終的には呼び出しもとでtrycatchすることにしました
>>188
両方とも0 1の要素に値いれてるね
もう一個別件なのだけど
ファイルの存在チェックとファイルのオープンエラーについて教えてほしい
ある設定値は特定の設定ファイルが存在するにも関わらず読み込めなかったときに有効になるものとしたい
且つ設定ファイルが存在しないときもある
(設定する値が二つある。ひとつはkey=valueの形のvalue、もう1つは正常にファイルから値がとれたか否か)
ファイルが存在しないときはvalueの値をデフォルトで扱う必要があるので、
単純にファイルオープン処理を用いて一度で処理できなかった
(ファイルがなくて開けないのか、あって壊れていて開けないのか判断できないので)
そのため
statでファイル存在有無チェック→ファイルオープンとしたのだけど
タイミングが一致してないので刹那のタイミングでのファイル焼失を担保できないと言われている
どうすればファイルがなくて開けないのか、ファイルが壊れていて開けないのかを判断できますか
198:デフォルトの名無しさん
17/11/29 15:03:14.59 IvqqBLy1M.net
ファイルオープンの開けませんでした例外をキャッチしたらええやろ
199:デフォルトの名無しさん
17/11/29 15:30:10.25 CqyTJd2aM.net
keyにデフォルト値が存在するなら、最初にデフォルト値のmapを持つ。
ファイルを読み込んで存在したキーだけ上書き更新する。
だけでいいだろ。ファイル読み込まれなければ全部デフォルト値のままだ。
200:デフォルトの名無しさん
17/11/29 18:22:28.81 U+t8Y71p0.net
例外見ろよ
std::ifstreamならstd::ios_base::failureだからcode()の戻り値見ろ
何のために投げてると思ってるんだ
201:デフォルトの名無しさん
17/11/29 20:17:29.87 LrQLLGRZ0.net
>>168
ゆとり死ね
お前は何も分かってないし、学ぶ知能もない
>>190
> 刹那のタイミングでのファイル焼失を担保できないと言われている
てかそいつに聞けよ。
課題として与えられてるのなら、そいつは「考えさせることに意味がある」と思っているのだから、
こんな糞上司に付き合ってられるか、と思ってないのなら自分で考えろよ。
ここで聞いているのは宿題の答えだけ写しているようなもので、全く上達しないぞ。
202:デフォルトの名無しさん
17/11/29 20:25:15.41 U+t8Y71p0.net
ファイル存在チェック→オープンがアンチパターンなのは常識だろ何言ってんだお前
203:デフォルトの名無しさん
17/11/29 20:31:50.13 6NgtQx/F0.net
相変わらず持論展開ウザ杉るの自覚してないな
アスペウンチ君
204:デフォルトの名無しさん
17/11/29 21:17:19.68 6HlzpX8E0.net
ハローワールド逝け
205:デフォルトの名無しさん
17/11/29 21:43:44.23 LrQLLGRZ0.net
C++スレすらゆとり汚染ひどいのかよ
世も末だな
206:デフォルトの名無しさん
17/11/29 21:47:36.72 ZCDC/+v90.net
実際にスレ汚しとるのはお前だけどな
207:デフォルトの名無しさん
17/11/29 22:29:25.62 IulhJnoW0.net
割とタイムリーな話題というか、
208:ここ一週間ぐらい、実行時エラーやら例外やらが発生したとき どうやったらプログラムを安全に再開するか考えてた で、至った考えは、ひとまとまりの一連の処理を二つに分割して まず前半はread onlyセクションで、プログラム本体の状態を書き換えてはならないが そのかわり例外が発生したら、無かったことに出来る(なのでread onlyにしておく) 後半はwritableセクションで結果をプログラム本体に反映させるが、その代わり例外(失敗)は許さない bool func(){ hoge_type result; try{ result = sub1(); sub2(); }catch(...){ /*リカバリ可能*/ return false; } try{ hoge = result; }catch(...){ /*リカバリ不可*/ abort(); } return true; } ただこれでもあまりうまくいかなくて、sub1()とsub2()が上記ルールに従ってたとしても sub1()は成功してsub2()は失敗した場合に困る 全体としては失敗だけどsub1()は既に成功していて結果も反映されているので sub1()の実行を無かったことにして巻き戻すのは難しい sub1()をsub1_read_only()とsub1_writable()に分解するという方法もあるかもしれないが データの受け渡しで苦労するし、可読性が落ちるうえ、複雑なことはしにくくなる もう一つの別の要求もあって、重たい処理は別スレッドで実行して即座にGUIスレッドに制御を返したい ということはユーザーは重い処理のキャンセルが出来るだろうが 処理のキャンセルは例外からのリカバリと本質的には全く同じこと また、先ほどのread onlyセクションはプログラム本体の状態を書き換えない前提なので 別スレッドで実行したり非同期に同時並行で実行したりが出来る (ただし、誰かがwritableセクションを実行したら、そいつ以外の処理結果は無効になる 古いデータに基づいて処理した結果ということになるので・・)
209:デフォルトの名無しさん
17/11/29 22:30:19.77 IulhJnoW0.net
上記のようなことを総合的にまとめると
void func(){
// read only セクション
barrier();
// writable セクション
}
という結論に至った
ただし、func()はコルーチンから呼び出す
read only セクションでは、必要であれば処理を別スレッドで処理を実行することが出来、自身はyield_returnする
投げた処理が終わるとメインスレッドにて続きから再開してもらう
read only セクションでは、新たなコルーチンを作成することが出来、作成元のコルーチンと親子関係を構築する
親子関係を持つコルーチンの全てがbarrier()に到達するか終了してからでないとbarrier()以降は実行されない
親子関係を持ついずれかのコルーチンがread only セクションにて補足されない例外を発生するか
もしくは外からキャンセルされると、無かったこと扱いになって
全ての親子関係を持つコルーチンにおいてbarrier()以降は実行されない
(親子関係の有る複数のコルーチンの処理が一端barrier()で止まって、全てが成功したのを確認してからbarrier()以降が再開される)
コルーチンにはグループNoを設定することが出来る
違ったグループNoを持つコルーチンを同時に実行することはできない(終わるまで待つ)
同じグループNoを持つコルーチンは同時に実行できるが
いずれかのコルーチンがyield_returnした段階で、それと親子関係のあるコルーチン以外はすべてキャンセル扱いになる
たとえばボタンAを押して処理Aが始まったが処理Aが終わる前にボタンBが押されたら
処理Aはキャンセル扱いになって処理Bが反映される
キャンセルされると困るような処理は別のグループNoにしておく
というような感じでひとまず落ち着いた
グループNo周りはかなり暫定的な感じだが・・・
以上日記
210:デフォルトの名無しさん
17/11/30 00:09:19.12 fhhh9IM80.net
32 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG
211:)[sage] 投稿日:2017/11/26(日) 17:30:11.12 ID:DaGrByo80 [1/4] C++入門書でよく勉強したはずなのにautoとかconstexprとか知らんもんが一杯… 35 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:38:44.74 ID:DaGrByo80 [2/4] >>32 やさしいC++第3版 大体9年前に買ったのを寝かしといて最近になって勉強し始めたが、そんなに仕様変更ないと思ってたが間違いだったようだ 36 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:39:04.93 ID:DaGrByo80 [3/4] >>33だった 39 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:52:39.37 ID:DaGrByo80 [4/4] Effective Modern C++17出たら買ってみるわ 95 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/27(月) 12:49:42.23 ID:vi7VqSly0 [1/2] 遠回しに他の言語の本読めって言っとるようなもんだ 98 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/27(月) 13:23:45.26 ID:vi7VqSly0 [2/2] >>97 ああそういうことね 132 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/28(火) 12:26:15.71 ID:+ODnZXKO0 [1/2] Java原人がいるようだね 156 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/28(火) 23:59:58.99 ID:+ODnZXKO0 [2/2] ワッチョイって神だわ 199 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/29(水) 21:47:36.72 ID:ZCDC/+v90 実際にスレ汚しとるのはお前だけどな さすがゆとり、これらが役立つ投稿のつもりらしい。
212:デフォルトの名無しさん
17/11/30 00:38:22.38 trGz4Mxl0.net
いつの間にかIP信者になったんだ・・・W
213:デフォルトの名無しさん
17/11/30 01:15:02.77 aDlGM/9P0.net
バックアップの、3-2-1 ルール
同じデータをコピーして、3つ持つ。
2つの媒体に保存する。
1つは、離れた場所に持つ
214:デフォルトの名無しさん
17/11/30 02:04:31.87 fhhh9IM80.net
>>200
SQLite3使ってみろ。
>>201
C++はyeildも入れたのか?と思ったがstd::yieldはただのsleep(0)か。
まああまり凝ったことしても、とも思うし、そもそもGUIはC++で無理に組む意味無いぞ。
それも含めて自由にやればいいとも思うが。
>>125
君は何が言いたかったのだ?
分かると思うが俺がゆとり死ねと言っている奴だ。
見る限り、君は話す気はあるようだ。
125は唐突過ぎてスルーしたが、相手してもいいぞ。
ただし125はバラけ過ぎているからテーマを絞れ、と言いたいところだったが、
その日記を読む限り上段落の話は一連のテーマか?
だったらWeb系の連中ならそこは「DBを使う」って事になっている。
C++は自前で何でもできるから、無意味なほど精神論で速度を追求するわけだが、
そこらへんをサクッと割り切るあいつらのやり方にも学ぶ物はあるぞ。
そもそも自前でトランザクションを実装するとか、検証の手間まで含めたらありえんだろ。
精神論でゴリゴリではなく、上手く手抜きするコツも覚えるべきだ。
215:デフォルトの名無しさん
17/11/30 03:11:44.92 b5fP6Zaz0.net
実際問題、メモリやデータだけを復元の対象とするとしたら
DBなど使わなくとも原本を保存しておけば何があっても元に戻せるのだが
そういう話ではないし
どのみち非同期処理にC#よろしくコルーチンが使いたいわけで
ただしそのままでは並行して細切れに処理が走って危険なので
書き込む前にbarrierを設けようというアイデアがまずあって
そうすることでついでに例外安全性も確保できるし
ならばキャンセル処理もできますわなぁという巡り合わさった面白い話
216:デフォルトの名無しさん
17/11/30 06:56:30.13 XcXaihxMd.net
>>194
確かにそうだね
ありがとう
自分なりに調べて回答も出たのでそれでいくことにします
217:デフォルトの名無しさん
17/11/30 07:37:52.31 fhhh9IM80.net
>>206
> 巡り合わさった面白い話
まあ俺は単に張り切りすぎだと思うけど、
そういうところを含めて無駄に熱いのがC++erのいいところでもある�
218:ニは思う。 Web系の奴らは上手くこなすことだけを考えていて、自分で考えることを止めてしまってる。 あれでは上達しないのも分かる。 >>200 一応捕捉しておくと、SQLite3はDBだが鯖形式ではなくCのライブラリ(DLL)だからC++から直接呼べる。(はず) ソースはパブリックドメインだからDLできるし、もちろんincludeしても使える。 (https://www.sqlite.org/quickstart.html // サンプルが extern "C" ではなく include かよ!) DBはメモリ上にも置け、当然爆速だ。自前でトランザクション/ロールバックの仕組みを作るよりだいぶ楽。 公式に素晴らしいドキュメントがあるから詳しくはそこを読みまくったほうがいい。 C++erなら問題はSQL位だが、どうせいつかLINQもC++に導入されるだろうし、予習だと思ってやっとけ。
219:デフォルトの名無しさん
17/11/30 10:44:54.02 YoaAbc9R0.net
例外投げるってのは自分の責任の範囲外の事象が起きたときじゃないのかね
有効無効の意味合いならブール値返したほうがいいと思う
220:デフォルトの名無しさん
17/11/30 11:49:07.85 /QNJXUpA0.net
>>209
禿本4thのP.351あたり読んだ?
221:デフォルトの名無しさん
17/11/30 12:26:19.48 b5fP6Zaz0.net
一応いまのところこんな感じで書けるようになってる
やってることが非同期処理なので多少ややこしいのは本質的に仕方がない
int func_async( int n ){
if( n == 0 ){ return 0; }
a_wait() << [&]{ sleep( 10*1000 ); };
//↑非同期で何か重たい処理
//↑別スレッドに投げたのちyield_return;
int resunt;
a_sync() << [&]{ //コルーチン作成
resunt = func_async( n - 1 ); //再起呼び出し
};
//throw nanika;
//↑仮に誰かが例外を投げれば親子関係のあるすべてのコルーチンの処理が
//↑キャンセルされて、どのコルーチンもbarrier以降は実行しない
//barrier前なのでresultの値は不定
barrier();
//barrier後なのでresultの値が決まる
return n + result;
}
int main(){
a_sync() << [&]{ //コルーチン作成
int result;
a_sync() << [&]{ result = func_async( 10 ); }; //コルーチン作成
barrier();
printf( "%d\n", result );
}
message_loop();
return 0;
}
222:デフォルトの名無しさん
17/11/30 19:19:19.63 fhhh9IM80.net
>>211
なんか無駄に複雑化してるだけに見えるが、、、
> どのみち非同期処理にC#よろしくコルーチンが使いたいわけで
なおVC++2015からはasync/yieldは使えるらしいぞ。
URLリンク(msdn.microsoft.com)
URLリンク(espresso3389.hatenablog.com)
223:デフォルトの名無しさん
17/11/30 20:12:10.25 OtOqgvDg0.net
C++の名前空間と呼ばれるのがあまり理解出来ないんだが
Javaでいうパッケージ的なやつ?
それともそれを使うためのパスワード的なやつですか?
224:デフォルトの名無しさん
17/11/30 20:42:22.43 b5fP6Zaz0.net
>>212
複雑っていうけど、元から非同期処理なんか、どう書いたって複雑だろ
>>211はお遊びでワザとコルーチン作りまくってるだけだし
あの程度の事なら本当はこれでいけるわけで
int func_async( int n ){
if( n == 0 ){ return 0; }
a_wait() << [&]{ sleep( 10*1000 ); }; //非同期処理
return n + func_async( n - 1 );
}
int main(){
a_sync() << [&]{ printf( "%d\n", func_async( 10 ) ); };
message_loop();
return 0;
}
別に複雑と言うほどでもないし
非同期処理を同期処理みたいにかけるというだけ
あとはキャンセルと例外安全のためにbarrierの機能を追加しただけ
225:デフォルトの名無しさん
17/11/30 20:59:54.72 +psSmwi50.net
>>214
<future>のasync,futureじゃダメ? C++11で標準になりましたけど
URLリンク(wandbox.org)
wait_for_allが欲しかったのでBoost使ってます
元は URLリンク(gist.github.com)
226:/8666426 で これを少し改造
227:デフォルトの名無しさん
17/11/30 21:03:11.80 fhhh9IM80.net
>>214
まず、君が書いているんだから君が好きなようにやるべきだし、
実験的な意味合いも含めて色々やること自体はいいと思うが、、、
非同期にしてるのは何故?GUIからの呼び出しでC#のasync Taskと同じ状況か?
それなら確かにどうしようもないが、しかし今見てみるとC#のasyncもだいぶ筋が悪いとは感じるね。
そのケースなら、普通にマルチスレッドした方がすっきり書けるはず。
あと、コルーチンからのthrowって、君の意図しているようにドミノ倒し的に回収できるものなのか?
これは俺が仕様を知らないだけではあるが、普通はコルーチンってそういう使い方しないと思うし。
228:デフォルトの名無しさん
17/11/30 22:29:42.54 b5fP6Zaz0.net
>>あと、コルーチンからのthrowって、君の意図しているようにドミノ倒し的に回収できるものなのか?
そういう風にコルーチンを実装した
具体的にはコルーチンのメンバにキャンセルフラグを持たせておいて
コルーチンを外部からキャンセルしたいときはそのフラグを立てる・・・だけ
コルーチンがyieldから再開したら真っ先にそのフラグを読みに行って
もし立ってたら自発的に例外を投げてスレッドを巻き戻す
>そのケースなら、普通にマルチスレッドした方がすっきり書けるはず。
あくまでこれは例だからなぁ
上で書いた内容もそうだけど、ひとつコルーチンがシングルスレッドというのがミソになってて
マルチスレッドだと排他処理が非常に面倒なことになる場面でも
コルーチンはシングルスレッドだから問題にならない
ただ、yieldの前と後ろで時間的につながりが無いことが問題になるので
誰かが何かを書き換える前にbarrier()を設けるルールを作って、他のコルーチンを無効にする
非同期処理なんかまともにやったら頭がおかしくなるに違いないので
横断的に静的に管理したいなぁと
今までコルーチンは全然使わなかったし、完全にマルチスレッド脳だったんだが
コルーチンはかなり脳の負担が少なくてよい
自分が動いているときは必ず他人は止まっているという性質が良い
yieldの前後だけ気を付ければ後は完全にシングルスレッドのノリで排他処理が要らない
ただ逆に同期オブジェクトをLockしたままyieldしたら終わるという
>C#のasyncもだいぶ筋が悪いとは感じるね。
正直、あれの使いどころは俺もよくわからないんよなぁ
複数のコルーチンが同時並行で走ったら危ないから結局画面をロックせざるを得ないんじゃないかとか
キャンセルを受け付けられるようにするためには例外安全についても考えないとダメなんじゃないかとか
色々思うところは有るが、実はよく知らん
229:デフォルトの名無しさん
17/11/30 23:00:20.60 oM5vIjZA0.net
>>216
async/awaitのしくみはawaitするタスクの完了時に呼ばれるべきコールバック関数登録の糖衣構文にすぎないとかそんな感じ、
URLリンク(qiita.com)
(まんまC#の関数で説明したページもあったはずだがどっかいったのでJavaScriptの例↑
で、ネイティブスレッドX上でasync/await呼び出しをいくつ書いても上記コールバック関数は単一スレッドで実行されるので
Xに対して同期的なデータへのアクセスはロック不要
ウィンドーズホンのGUIをぬるぬる動かすのがほぼ唯一の存在意義
230:デフォルトの名無しさん
17/11/30 23:07:19.56 oM5vIjZA0.net
つまり同一スレッド内であればasync/awaitをいっぱい書いても複数のコルーチンが順不同でresumeされる感じにはなるが真に同時並行で実行されることにはならない
231:デフォルトの名無しさん
17/11/30 23:13:29.49 oM5vIjZA0.net
なお順不同なresumeというシチュは、関数A内でawaitされるasyncタスクB内でタスクCをawaitする…とかいったケースで容易に生じる
この場合A内のawaitに引き続くのコードと、B内のawaitに引き続くコードのは順不同でどっちが先にresumeされるかわからん
しかし真に同時並行ではなく、同期的
232:デフォルトの名無しさん
17/11/30 2
233:3:19:09.22 ID:AS96YR/U0.net
234:デフォルトの名無しさん
17/11/30 23:40:55.16 fhhh9IM80.net
>>217
> あくまでこれは例だからなぁ
もしかしてコルーチンを自動的にマルチスレッド展開して加速させる為のラッパを用意してるってことか?
それならまあそのコードの感じになるのかもしれん。
ちなみに言っておくと、俺が普通に実装したら>>215と同じようなものになる。
単純に、「ディスパッチして、joinを待って、commitする」としか読めないコードにする。
ただこれは君ももちろん分かっていて、あのコードなのだとは思う。
なお俺はC#のasyncは設計ミス、
・UIコンポーネントがUIスレッドからでしか触れないこと
の対策だと思っている。あれが無いと毎回invokeするとか、ちょっと回りくどい書き方をするしかない。
実際、Thread->backgroundWorker->Task->async Task だったっけ?何度も変更されていて、
こういう場合は通常、
・修正している奴が馬鹿だから修正のたびに新たなバグを仕込んでしまい、収拾がつかない
わけだが、ヘルズバーグとMSがそこまで馬鹿なはずも無く、もう一つのケース、
・根本の問題を修正せずに表面的に対策をしているから、収拾がつかない
のだと思っている。そして、根本の問題は、最初に書いたUIガー、って奴。
これについて「根本のUIスレッドの問題直せやボケエ」ってをずいぶん前にC#スレで議論した覚えはあるが、
UIをマルチスレッドにして悲惨だった歴史が既にあるらしく、
「オメーがラップすりゃいいだけだろボケエ」と返され、あ、確かにそうだな、と思って終わった。
ま、とにかく、UI関係のコードをスッキリさせる為の物だから、気になってないのなら放置でいいと思う。
> yieldの前後だけ気を付ければ後は完全にシングルスレッドのノリで排他処理が要らない
コルーチンの方がいいケースについてか。
うーん、どうなんだろうなあ?俺もコルーチンはほぼ使ってきてないが、
マルチスレッドする場合にはほぼ干渉しない場合に限っていたから、
逆に言えば、コルーチンを使えばもっと並列化できるということか?
235:デフォルトの名無しさん
17/12/01 09:48:37.54 eHCFERDK0.net
Eigenで透視投影変換行列を作るのは次の書き方でいいんでしょうか?
なんか結果をみても微妙にずれているのですが...
Eigen::Matrix4f perspectiveMatrix(float left, float right,
float bottom, float top,
float near, float far)
{
Eigen::Matrix4f m;
m << 2.0f*nearZ/(right-left), 0.0f, (right+left)/(right-left), 0.0f,
0.0f, 2.0f*near/(top-bottom), (top+bottom)/(top-bottom), 0.0f,
0.0f, 0.0f, -(far+near)/(far-near), -2.0f*far*near/(far-near),
0.0f, 0.0f, -1.0f, 0.0f;
return m;
}
236:デフォルトの名無しさん
17/12/01 09:59:25.68 Do
237:XCr8LG0.net
238:デフォルトの名無しさん
17/12/01 10:56:33.99 HkxgtxKmM.net
>>224
今日もA-10学校に、まで読んだ
239:デフォルトの名無しさん
17/12/01 11:05:05.82 Y7mfb9sId.net
exec execve などいくつかあるけど
こいつらの違いを理解できない
ここの人たちはmanページを読んで理解できるもんなの?
240:デフォルトの名無しさん
17/12/01 11:40:18.96 ZhxOnODbp.net
>>223
URLリンク(msdn.microsoft.com)
これを参考にしてみては
右手系の場合はRH、あと行列の扱い方によっては転置が必要だけど
241:デフォルトの名無しさん
17/12/01 15:52:06.92 Xp3BajG00.net
>>227
解決しました。あれで合ってました。
間違ってのはモデル変換行列の方でした。
242:デフォルトの名無しさん
17/12/01 18:53:54.97 1uEPS/Zvr.net
C++17が出たけど既にN4700しか読んでない
243:デフォルトの名無しさん
17/12/01 19:27:41.27 quTLstwT0.net
>>224
最終的に何をしたいんだ?
俺にはそこが見えない。
一つずつ詰めると、頭三行
> await/asyncのコルーチンは並列化じゃなくて非同期処理を同期処理っぽく書くための物だとおもうよ
> 「これを実行して、終わったらこれを実行してね」
> っていうときに、スタックの内容がそのまま残ってるからデータの受け渡しが楽というだけだろう
については同意する。これは>>218-220含めて3人の共通理解でいい。
(ただし俺には逆に、君自身は「並列化の為に」async/awaitを使おうとしているように見える)
> ただ>>220が言ってるように順不同のresumeが起こったらアブナイので
これについては、一般的には逆だ。順序が逆になったら危ないような物を非同期にしてはいけない。
違う言い方をすると、非同期の結果をbarrierを張ってキャンセルするのではなく、
barrier後に非同期にして、結果は必ずcommit出来る構造にする。
ちなみにJavaScriptの連中はここら辺が分かっていなくて、
(というより連中は制御構造云々を議論できるレベルではないのでこれ以前なのだが)
同期前提の制御構造で非同期を扱おうとするからおかしなことになる。
JavaScriptには非同期しかないんだから、選択の余地もないんだが。
C#のasyncはこれとはちょっと違って、イベントで起動するから必ずUIスレになるんだが、
それにジョブをやらせるとUIがカクつくから他スレッドを起動しろ、
しかしそれだと結果を画面に表示できないからそこだけUIスレッドを呼び戻せ、
ただこれだとソースが汚いから、asyncというキーワードをつけ、あたかも全てUIスレッドが処理しているように見せる、
みたいな、なんだかなあ、という状況になっている。
つまり処理順と処理スレッドを入れ替える為の糖衣構文のようなものであって、
本来のasync/awaitのように、非同期を同期的に書くための物自体ではない。ただしそうとも使えるから流用してるが。
それで話を戻すと、君は非同期部分に一般とは逆の「非同期の結果を普通にキャンセルできる構造」を作ろうとしているよう�
244:セが、 これは何故?或いは何のメリットがあると考えている?
245:デフォルトの名無しさん
17/12/01 19:37:06.05 BNKPu+/90.net
Java厨はハードの基本がわかってないニワカなんちゃってPGが殆どだからな
246:デフォルトの名無しさん
17/12/02 00:35:41.73 i2vG1ua/0.net
最近長えレスが多くて辛えぞえ
247:デフォルトの名無しさん
17/12/02 00:43:05.07 fU6v9rJN0.net
予告犯でホリエモンもどきがシンブンシにそんな事言っていたな
248:デフォルトの名無しさん
17/12/02 01:17:01.05 Ppnhc3/B0.net
コルーチンをキャンセルとか意味わかんない事言ってるから途中から読んですらない。
249:デフォルトの名無しさん
17/12/02 02:10:43.54 YZ0QjRT20.net
漏れはもう説得をあきらめたゾ
250:デフォルトの名無しさん
17/12/02 03:07:38.26 UE7qzU9L0.net
>>226
引数が違うだけで、内部的には、どれも同じだろ。
つまり、ラッパー関数
OS をすべて知っている奴は、いない
だから皆、神の書と呼ばれる、この本を枕にして寝ている。
著者は、man ページの作者。
この本が翻訳されているのは、日本だけ
Linux プログラミング・インタフェース、2012
251:デフォルトの名無しさん
17/12/02 17:32:32.90 oDhEkD2+r.net
>この本が翻訳されているのは、日本だけ
もうだめだこの国
252:デフォルトの名無しさん
17/12/02 20:34:54.85 UE7qzU9L0.net
Linux 資格の、LPIC 取得者も、半分以上は日本人だろ
日本は、Linux 大国
253:デフォルトの名無しさん
17/12/02 20:40:02.69 hpEyyDG+0.net
pthreadとかPOSIX系は扱い易い
254:デフォルトの名無しさん
17/12/02 21:04:09.64 TmTI6KJY0.net
Linuxは日本に入ってきたのが早かったし、最初期に一気に広まった。
日本がLinux王国というのは間違いではない。
しかし、それを生かせなかった。
なんでだろ。
255:デフォルトの名無しさん
17/12/02 21:06:05.55 IxwO1O770.net
PC98がMSDOSを採用し続けたせい
256:
17/12/02 21:14:00.87 4pmjT1Fk0.net
>>240
PC98 のリソースが freebsd に注がれ、linux への移植が遅れたため
257:デフォルトの名無しさん
17/12/02 21:25:07.65 TmTI6KJY0.net
当時書店でBoWとか売ってたけど、そのせいで遅れたような感じはしなかったけどなあ。
むしろLinuxでX11動かすのに四苦八苦してた頃、すでにコンソールで日本語が使えてたのは、
UNIXの人たちのおかげのような気がする。
258:デフォルトの名無しさん
17/12/02 21:38:52.02 TmTI6KJY0.net
検索してみるとコンパックショックが1994年なんだな。
DOS/V機自作したのが1993年だからもうちょっと前かと思ってたけど。
正規流通前にショップが輸入して売ってたんだろか。
259:デフォルトの名無しさん
17/12/02 22:17:42.90 UE7qzU9L0.net
その当時、漏れは、Windows 3.1 で、UNIX プログラミングやってた。
テキストエディタ MIFES を使っていた
Oracle で、銀行とか、新幹線とか
260:
17/12/02 22:46:06.08 4pmjT1Fk0.net
>>245
>銀行とか、新幹線とか
暗号方式はなにを使っていましたか?
261:デフォルトの名無しさん
17/12/02 23:44:03.24 fU6v9rJN0.net
PANIXの遅さはすごかったな
262:デフォルトの名無しさん
17/12/03 01:07:06.72 ti2y6lW/0.net
NECは当時経営陣が自社の社員が開発したソフトを押し退けてMSのソフトをごり押ししてたからな
終わっているよな
263:デフォルトの名無しさん
17/12/03 01:40:24.23 MtUE51Zo0.net
>>248
そんなに糞だったのか自社製ソフト
264:デフォルトの名無しさん
17/12/03 08:02:49.76 YKcJD0pm0.net
派生クラスのデストラクタでなにもしないなら、
基底クラスのデストラクタを仮想にしなくてもいいですか?
265:デフォルトの名無しさん
17/12/03 08:56:43.57 I8IEjg5G
266:0.net
267:デフォルトの名無しさん
17/12/03 09:05:51.65 pXIsIngK0.net
>>251
頓珍漢すぎて笑えない...
268:デフォルトの名無しさん
17/12/03 09:26:11.28 hz5Rl7cd0.net
うん、これは頭悪い発言スレでやればウケてた
269:デフォルトの名無しさん
17/12/03 09:31:06.52 MtUE51Zo0.net
>>250
規格は知らんが問題が発生するコンパイラは存在しないと思う。が、デストラクタで何もしないというのはデータメンバーも含まれるからね。
派生クラスにstd::stringのメンバーが居るだけでアウト
そんな事を気にするより素直にvirtual付けるか基底クラスでdeleteされないようにする方が有意義に時間を使えると思うよ。
270:デフォルトの名無しさん
17/12/03 09:49:40.40 lnc2VqP30.net
>>254
>派生クラスにstd::stringのメンバーが居るだけでアウト
それだけでアウトなのではない
DerivedがBaseの派生だとして、実体はDerivedなのにコンパイラからはBaseにしか見えないケースで問題になるだけ
DerivedをDerivedとして宣言したらスコープを抜けたらちゃんとDerivedのデストラは呼ばる
問題なやつの例:
Derived g_d;
void foo() {
Base* p = (Base*)&g_d;
/*...*/
delete p; // Base::~Base()は呼ばれるがDerived::~Derived()は呼ばれない
}
271:デフォルトの名無しさん
17/12/03 09:53:01.97 lnc2VqP30.net
ごめ、一点抜けた
誤: 実体はDerivedなのにコンパイラからはBaseにしか見えないケース
正: 実体はDerivedなのにコンパイラからはBaseにしか見えない状態で当該オブジェクトが破棄されるケース
なお、(規格でどういう言葉使いをしているかわ知らんが、)
Derivedが多態性をきちんと実装してあるなら、Derivedは「コンパイラからはBaseにしか見えないケース」には該当しない
272:デフォルトの名無しさん
17/12/03 09:53:10.45 lnc2VqP30.net
ごめ、一点抜けた
誤: 実体はDerivedなのにコンパイラからはBaseにしか見えないケース
正: 実体はDerivedなのにコンパイラからはBaseにしか見えない状態で当該オブジェクトが破棄されるケース
なお、(規格でどういう言葉使いをしているかわ知らんが、)
Derivedが多態性をきちんと実装してあるなら、Derivedは「コンパイラからはBaseにしか見えないケース」には該当しない
273:デフォルトの名無しさん
17/12/03 09:57:14.66 MtUE51Zo0.net
>>255
だから
「基底クラスでdeleteされないようにする方が」
って言ってんだろ
274:デフォルトの名無しさん
17/12/03 09:58:13.14 lnc2VqP30.net
大事なことなので2回ry
まあ一般論として、>>255の問題なやつがプログラム内に存在しないことの確実で安価で
ウザく無い検出方法というものはこの世に存在しないので、
継承関係を使うならデストラクタを見たらvirtualにするパブロフの犬に徹するべきではある
275:デフォルトの名無しさん
17/12/03 10:48:30.75 YKcJD0pm0.net
>delete p; // Base::~Base()は呼ばれるがDerived::~Derived()は呼ばれない
~Derived()が呼ばれないけど、
呼ばれたとして何も仕事をしないのであれば、呼ばれなくても不都合ないのでは?
276:デフォルトの名無しさん
17/12/03 11:01:45.65 YKcJD0pm0.net
なにも仕事をしないデストラクタという前提がおかしいのですか?
277:デフォルトの名無しさん
17/12/03 11:06:05.82 OF+rgUqYd.net
メイヤーズが言ってる
ポリモーフィズムを目的とした基底クラスはvirtualデストラクタにする
それ以外はしないってルールでいいだろ
278:デフォルトの名無しさん
17/12/03 11:12:49.55 TXqrw7wLr.net
>>261
Yes
デストラクターの仕事はプロクラマーの書いたコードだけではない
279:はちみつ餃子
17/12/03 13:16:36.90 15ZXM/fw0.net
>>260
このあたりで話題になったことがある。
スレリンク(tech板:651番)-
結論から言うと不都合は有る。
少なくとも言語仕様上は未定義に踏み込むのでクラッシュしても泣かない強い心を持ち合わせているのでなければやらない方が良い。
280:デフォルトの名無しさん
17/12/03 13:39:28.04 JZXkgVF
281:zd.net
282:デフォルトの名無しさん
17/12/03 13:42:24.66 MtUE51Zo0.net
>>265
お前質問読んでないだろ
283:デフォルトの名無しさん
17/12/03 13:52:29.29 nekR+Iu8p.net
>>259
その考えはどうかと思うけどな
vtblが邪魔になるような、メモリ上では純粋にデータしか持たないクラスとか作れなくなるぞ
284:デフォルトの名無しさん
17/12/03 16:06:00.67 pXIsIngK0.net
>>267
> 継承関係を使うなら
285:デフォルトの名無しさん
17/12/03 16:29:14.83 gYv1de+4r.net
継承関係を使う=vtbl
と考えてしまうような無知な者には理解するのは難しい
他人の作ったものも構わずナマポをdeleteしておいて「virtualにしておけば安全」というのはマッチポンプと言えよう
286:デフォルトの名無しさん
17/12/03 16:39:32.89 pXIsIngK0.net
正直何を言いたいのかはよくわからん w
まあ>>251みたいな頓珍漢野郎なんだろう...
287:デフォルトの名無しさん
17/12/03 17:09:40.29 bFUfg9md0.net
>>270
いや、この件に関してはお前の方が無知だぞ
288:デフォルトの名無しさん
17/12/03 17:12:44.51 YKcJD0pm0.net
結局のところ
何も仕事をしないデストラクタはあるが、(空のデストラクタかつメンバ変数なし)
基底クラスのデストラクタだけで派生クラスをdeleteすることが未定義だから
基底クラスのデストラクタは仮想にしないとダメという理解でよろしいでしょうか。
289:デフォルトの名無しさん
17/12/03 17:28:04.25 ti2y6lW/0.net
デストラクタは仮想にしておくことにより通常の仮想関数と違って継承元辿って全自動ですべて呼び出されるから基底はやることなくても以後継承で実装を変更することがあるのなら空の{}で括っておいたほうが良いよ
290:デフォルトの名無しさん
17/12/03 17:49:35.39 PHD8+7P20.net
=defaultじゃだめなん?
291:デフォルトの名無しさん
17/12/03 17:50:12.92 pXIsIngK0.net
>>271
まあそう思ってりゃいいんじゃね? w
292:デフォルトの名無しさん
17/12/03 19:52:12.45 bFUfg9md0.net
もしかして本当に継承使ったPOD型に思い至ってないのか
293:デフォルトの名無しさん
17/12/03 19:55:36.14 lnc2VqP30.net
くそー>>254の簡潔すぐる日本語のせいで暗黒の日曜日になってしまったわ、
だいたい質問者の>>250も簡潔すぐる
初心者質問と思ったし、だいたい理解している上で確認の意味で質問しているのならそう書いてホスイ、
294:デフォルトの名無しさん
17/12/03 20:15:25.15 mwO2JS4O0.net
もうここ完全に初心者様質問無しにしろよ
上級者様もそれで満足だろ
295:
17/12/03 20:16:39.17 lZQcP+Ql0.net
>>278
それは困ります…
296:デフォルトの名無しさん
17/12/03 20:21:06.32 lnc2VqP30.net
>>278
漏れのように語りたい初心者は一体どうすれば…orz
297:デフォルトの名無しさん
17/12/03 21:05:16.05 hz5Rl7cd0.net
>>278
自殺乙
298:デフォルトの名無しさん
17/12/04 12:17:24.94 gpGY1qga0.net
祝・C++17発行!
299:デフォルトの名無しさん
17/12/04 12:38:47.34 vRsxBueGM.net
これまでinlineを関数に適用するとインライン展開されるんじゃなかったでしたっけ?
c++17の説明を読むと翻訳単位で共通のアドレスになるって書いてあるのだけど仕様が変わった?
300:デフォルトの名無しさん
17/12/04 12:45:21.76 i0vOJ/Wzr.net
何を言っているんだお前は
ISO/IEC 14882:1998 7.1.2/p4
An inline function with external linkage shall have the same address in all translation units
301:デフォルトの名無しさん
17/12/04 12:56:42.17 vRsxBueGM.net
>>284
ナンダッテー
302:デフォルトの名無しさん
17/12/04 13:08:03.78 VjK2Ds3GM.net
以前void f(A &a, int num)をa.f(num)みたいに呼べる機能が追加されるとかされないとかを見た気がするんだけど知ってる人いたらURLか機能名を教えてほしい
303:デフォルトの名無しさん
17/12/04 13:10:08.18 zqEI2rJ60.net
unified call syntax
304:デフォルトの名無しさん
17/12/04 13:22:55.68 VjK2Ds3GM.net
>>287
ありがとう
305:デフォルトの名無しさん
17/12/04 14:58:45.86 gpGY1qga0.net
ウニファイドコールシンタックスは死んだのだ。
よみがえれ!