【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2016/11/06(日) 22:58:02.60ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
2017/05/23(火) 15:16:19.75ID:0tdmeFKn
htmlとその解釈に悩まされるよりはマシ
660653
垢版 |
2017/05/23(火) 15:21:53.55ID:Ek6JChT/
>>656
俺もworking draftしかないけどn3690の5.3.5の3段落目

In the first alternative (delete object), if the static type of the object to be deleted is different from its
dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the
static type shall have a virtual destructor or the behavior is undefined.
2017/05/23(火) 17:00:54.34ID:EZJXMIkJ
C++があまりに不安な要素をたくさん抱えているお陰で未だに新生言語が多数出てくると
思えばいいじゃん?
2017/05/23(火) 19:47:58.75ID:rsJqfxq0
継承すんなよ
663デフォルトの名無しさん
垢版 |
2017/05/24(水) 00:55:48.61ID:WEdzXALv
>>658
意図して作った。
悪しき方法とは思いつつも、stringクラスにsprintf 的な機能のメンバ関数作ったった。
その時、stringクラスの全機能を実装するのがめんどくさかったんで public 継承で。
メモリレイアウトは一切変わらない事を見切った上でだが、未定義だとすると…ヤベ。
664デフォルトの名無しさん
垢版 |
2017/05/24(水) 00:56:49.58ID:WEdzXALv
ん、まあ、deleteは使わないからセーフか?
665デフォルトの名無しさん
垢版 |
2017/05/24(水) 01:00:58.95ID:WEdzXALv
>>657
ドラフトしか持ってない…
delete 使う事は頭になかったから気付かなかった。
ありがとう。

>>660
おぉ、ピンポイント情報あざす。早速確認してみる。
2017/05/24(水) 12:01:47.91ID:/RGvDc8r
メモリレイアウトが変わらない範囲で既存のクラスを再オープンして機能を追加する方法の提案だけは出てたような気がする。
2017/05/24(水) 12:06:31.74ID:/RGvDc8r
>>663
例外関連のなんたらかんたらの処理 (stack unwinding) がかかわってくるんじゃなかったっけ。
正常系では普通に動いているように見えても何がどうなってるかわからんぞ
2017/05/24(水) 13:51:37.65ID:OqDgfclu
>>658の話の場合、別に”string *のポインタで”継承したやつをdeleteしない限り大丈夫でしょ
>>651で言うところの
・B* を A* にキャストしたものを delete
これが問題になるんであって

B*からdeleteして中身もBなら問題にならないと思うけど
2017/05/24(水) 14:15:44.36ID:ttKQmf2U
>>668
std::vector<std::string>に入れたら死ぬってことだよね??
2017/05/24(水) 14:47:39.17ID:/RGvDc8r
>>669
ポインタを std::string* に入れてなおかつそれを std::string* のままで delete したらあかんという話。
値を std::string にキャストする分にはなにも問題はない。
2017/05/24(水) 15:58:36.11ID:ttKQmf2U
>>670
だからstd::vector<std::string>にいれらんないよね?
2017/05/24(水) 17:02:32.05ID:/RGvDc8r
>>671
何を言いたいのかよくわからんが……。
std::string を継承した型は、レイアウトが変わらないようにしたからと言って (キャストなしで) std::string には入らないよ。
言いたいことを具体的にコードで示してくれんか
2017/06/03(土) 20:46:07.15ID:/cDPk3Lb
>>672
http://ideone.com/akrJQA
674デフォルトの名無しさん
垢版 |
2017/06/04(日) 05:01:25.52ID:a4MXR2y0
テンプレート構造体を作りその配列をクラスのメンバに含めたいのですが上手くいきません。

作りたいクラスはスタックとして使えるもので、
主な作りたいメンバは、二つの型のメンバ変数を持つ上記のテンプレート構造体の配列。
引数としてテンプレート構造体を持ち、上記の配列に順次プッシュしていく関数。
最後にプッシュされた構造体をポップする関数、という3つです。

どのようにすればテンプレート構造体をクラスのメンバにすることが出来るのでしょうか?
もしくは、このような機能を持つクラスを実装するためにはどうすればいいのでしょうか?
よろしくお願いします。
2017/06/04(日) 08:23:07.29ID:7To+hzFq
まず
using テンプレート構造体の型 = 構造体テンプレート<型パラメーター>;
をします
2017/06/04(日) 11:02:02.70ID:4s9JqZC9
>>674
http://ideon.com/EmULAG
2017/06/04(日) 11:02:24.41ID:4s9JqZC9
http://ideone.com/EmULAG
2017/06/04(日) 21:12:43.78ID:0J0aNZ4Z
質問への回答はいいとして
たった100行のコードによくもここまでUNKOを詰め込めるものだと感心
2017/06/04(日) 21:24:21.29ID:4s9JqZC9
>>678
どこ?教えて
2017/06/04(日) 22:06:48.73ID:0J0aNZ4Z
>>679
細かくは見てないがぱっと見て気になったのは、
殆どが「= default」で済むものを自前で定義する所とか
K,Vの左辺値が渡せないunkoコンストラクターとか
左辺値が渡せないpush関数とか
key_value_pair_stackの外で定義されたdefault_max_sizeとか
禁断の「value_type pop()」とか
ムーブ代入だけ何故か無いとか
例外安全を考慮しないswapとか
constexprの付いていない関数が多数とか
constが付いていないsize関数とか
質問者が「テンプレート構造体」と「クラス」の言葉を使い分けているのにわざわざクラステンプレートにする所とか
「value_type::value_type」の二つのvalue_typeの意味が違うとか
スワップする気皆無の「swap(key_value_pair&& other)」とか

あと
何故付いているのかわからない「const auto」のconstとか
キーバリューペアをシーケンシャルコンテナーに詰める例も地味にUNKO
2017/06/04(日) 22:21:08.74ID:4s9JqZC9
>>680
ありがとう
見直してみる
2017/06/04(日) 23:59:40.42ID:4s9JqZC9
>>680の指摘を受けて修正したやつ
https://ideone.com/4PDU5a
2017/06/05(月) 07:13:59.57ID:dSqD3vhj
>>682
20秒ほど眺めたがとりあえず3つほどなおした方がいい
・key_のメンバー宣言に{}が付いていないと、修正前と同じ動作にならない
・popの戻りはvoidにした方が無難
・clear()しても要素のデストラクターが呼ばれないのでstatic_assert(std::is_trivial_destructible<element_type>::value,"未対応")しとくのが礼儀
2017/06/05(月) 08:02:20.82ID:SbeuyTlX
>>683
一つ目だけ意味がわからない…28行目のこと??なんで?
2017/06/05(月) 08:16:13.98ID:dSqD3vhj
>>684
その通り28行目
struct X {
 some_type m1 /* {} */;
 X() = default;
};
ここでsome_typeの初期化{}が無いとm1は未初期化になるし、
some_typeにデフォルトコンストラクターが無ければX()の「=default」が「=delete」扱いになる
2017/06/05(月) 08:25:22.25ID:CMNJImQI
>>685
なるほど…これってデフォルトコンストラクタ自前で書いてメンバイニシャライザに書いても同じだよね?
valueも同様にイニシャライズしなきゃだめだよね?
2017/06/05(月) 12:04:31.71ID:dSqD3vhj
>>686
1:Yes, 2:Yes

struct X {string m; X()=default;};
struct X {int m{}; X()=default;};
struct X {int m; X() : m() {}};
はmが初期化される
struct X {int m; X()=default;};
が初期化されない
2017/06/05(月) 12:34:51.89ID:CMNJImQI
>>687
ありがとう
2017/06/05(月) 21:07:12.97ID:YRHwBsQU
空のvectorをpop_backした時の仕様がクソ過ぎるC++
2017/06/05(月) 23:54:31.67ID:vnQWBbWO
亀レスで申し訳ありません、>>674です
とりあえずレベルが足りないことが分かったので、もう少し勉強してからいただいたコード解読してみます。
答えてくださった方ありがとうございました。
2017/06/06(火) 07:02:51.57ID:ueF+TYcD
気にすんな
簡単なことすんのにもこの難易度な言語がおかしい
2017/06/06(火) 17:35:50.84ID:zF6NOqag
というかほとんどがムーブとかconst版とかconstexprとか、とことん丁寧にやろうとした場合の作法まで
含めた突っ込みだから、初心者が気にするような話ではないなw

そもそも、最近右辺値参照使ったコードを「書かないといけない」と誤解してる人が多い気がするんだが
あんなもん「ポインタのすげ替えで済む場合」にそれを出来るようにするための仕組みで、
まず左辺値版を書いた上で、右辺値版も書けば速くなるよ、ってだけだよね?

上記に該当しようがしまいがまず左辺値版は必須だし(左辺値を弾きたいならともかく)
該当する場合に高速化したければ右辺値版も書けばいいというだけで
これまた初心者が気にするような話ではないw
2017/06/06(火) 18:16:24.12ID:uCSRK7Ay
>>692
>右辺値版も書けば速くなるよ、ってだけだよね?
お前の中ではそうなんだろうな
2017/06/06(火) 18:58:32.67ID:zF6NOqag
違うというなら例ぐらい挙げてくれよ
2017/06/06(火) 19:28:29.10ID:+mNKSnZM
そういうのはスルーでok
2017/06/06(火) 22:23:00.44ID:uCSRK7Ay
>>694
こういうのはワンポイントTipじゃなくて概念の理解だからね
『ムーブセマンティクスのため』と答えを言ったところで
君は理解できないんだろう?
2017/06/06(火) 23:19:35.94ID:zF6NOqag
>>696
ドヤ顔で用語を挙げろなどとは一言も言っていないのだがw
2017/06/07(水) 00:10:56.23ID:xZGjq0dG
>>697
『ムーブセマンティクス』が君の求めた
例そのものなんだよ
でも君の頭脳では概念を理解できないから
説明する気もないし
わからなくても心配しなくていいよ
2017/06/07(水) 00:22:15.23ID:2ipgwMGH
教える側界隈の高度なやり取りだけで終始しないでほしいんですけど、、
2017/06/07(水) 00:27:13.62ID:gn2mDiBA
>>699
ヒント:unique_ptrのムーブは性能目的ではない
2017/06/07(水) 00:54:38.14ID:CXRZvrBM
>>698
こっちは疑問形で書いてんだから普通に指摘してくれりゃいいんじゃねーの?
なんかコンプでも抱えてんのかね

unique_ptrみたいな所有権の移動の実現(を楽に実装する)は確かに気付いてなかったが
初心者が気にするような話ではない&いつも書かなければならないものではない、に対する反論になってないよな
ちょっとした指摘をそこまで煽って書ける神経が理解できん
702700
垢版 |
2017/06/07(水) 06:42:56.76ID:gn2mDiBA
ちなみに俺は>>698ではない
そうぞうで書いた
2017/06/07(水) 08:16:07.46ID:PxDlVTZD
>>701
君は概念を理解できないだろうけど
コピーされては困るから「ムーブ」「セマンティクス」
なんだよ
性能に余裕があってもね
右辺値参照がなかったらスマポをvectorに入れることすらままならないよ
2017/06/07(水) 18:47:00.97ID:CXRZvrBM
>>702
いや自分も軽く調べてすぐ見つかった例がunique_ptrだったからそれだろうと思った

>>703
偉そうに言う割に自分もいい加減なこと言ってるな
C++03以前を知らない学生か何かだろうけど、お前みたいに偉そうにドヤ顔する癖のあるやつで
使い物になるコード書くやつを俺は見たことない
恥ずかしいからその辺にしとけ
2017/06/10(土) 17:42:01.48ID:SxYi4azU
>>683
>・popの戻りはvoidにした方が無難
なぜなんだ?pop の戻りがナルなら空であることを示せてべんりだろう?
2017/06/10(土) 20:12:18.00ID:JqmNS/A3
>>705
topとpop作れってことが言いたいんだろう多分
2017/06/11(日) 22:14:52.88ID:iu5DR0Hy
「なぜなんだ?pop の戻りがナルなら空であることを示せてべんりだろう?」
 ↓
「topとpop作れ」

これがアスペというやつか
2017/06/11(日) 22:35:45.30ID:q49UmmFG
お前アスペ言いたいだけだろ w
2017/06/12(月) 01:27:35.05ID:M0cidITY
std::queue では pop と front に分けられてるからその習慣に合わせた方がいいってことじゃない?
ただ、 queue のデザインが出来たときはムーブがなかったから先頭要素にアクセスするために
(参照でなく) 値を返すと同時にコンテナから削除するのはコピーが発生して非効率ってこともあってこうなってると思う。
今ならもっと別の選択肢はあっていいと思う。

まあ、古いデザインを引き摺っている部分はあるとは言っても標準ライブラリはすごくよく考えられてるから、
どうしてそうなっているのかを考察したり真似したりするのは良いと思う。
2017/06/12(月) 01:48:34.70ID:E1Ahh3IF
はつみつ
2017/06/12(月) 17:36:41.84ID:t42bNJ0A
>>709は健常者
ただ理由は性能でなくて例外安全だろう
2017/06/17(土) 07:59:16.34ID:bupTq8cx
クラスの演算子オバーロードの
書き方全種類教えてください。
operator (*)やoperator ""や
operator ->()辺りが特に解説が少なくて
理解するのに困ってます。

よろしくお願いします。
2017/06/17(土) 09:10:34.91ID:a/4tSU3I
>>712
ユーザー定義リテラルについてはこのあたりが詳しいと思う。

https://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal
https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html

名前空間名で修飾することができないので、
namespace 内で定義されたものについては using してからでないと使えないという規則が微妙に気持ち悪い。
あまりお勧めしない。
標準ライブラリが提供している complex 型のリテラルや時間のリテラルもそんなに頻繁には使わなさそうだし、
よく使うのは string 型のリテラルくらいかなぁ。
2017/06/17(土) 11:23:50.84ID:cPfPWWru
まずウェブブラウザーで
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/
をアクセスします。
次に「N4660」のPDFをダウンロードします。
右下に336と書かれたページ(16.5 Overloaded operators)を開きます。
そこから5ページほどスクロールしながら、英文を見ずにコードだけ眺めます。
2017/06/17(土) 11:24:51.65ID:cPfPWWru
oops...
× N4660
○ N4659
2017/06/17(土) 12:02:12.82ID:ir1eTLN6
>>712
ユーザー定義リテラルについては書かれていないが、それでも演算子オーバーロードについては
http://stlalv.la.coocan.jp/
が詳しいのではないか?はちみつさんがこれに触れないのは不思議‥
2017/06/17(土) 12:24:13.05ID:qMkdrUOQ
あ、うんでもなんか、
http://stlalv.la.coocan.jp/HungarianNotation.html
↑のページ読んだだけでもうダメなんじゃないかって
文章もなんか危ないというか危ういし

とおもったらQZか
な〜んだ納得
2017/06/17(土) 13:21:59.00ID:ir1eTLN6
>>717
ハンガリアンは意見がわかれるからね‥
私はハンガリアンはやらないよ
2017/06/17(土) 14:21:54.44ID:a/4tSU3I
>>716
自分が見ないページだから意識の外だった。
そのページはわかりやすく説明できているとは思うけど、
基本的な書き方で今更調べることはあんまりないよ。
2017/06/17(土) 14:31:32.36ID:bupTq8cx
712です。
短いコードを打ちこんで動作を確認しました。
皆さん有り難うございました。

(ちょっと気になったのは
void operator [](std::initializer_list <int > list);
これがvsc2015では動作しなかったことぐらいです。
)
721653
垢版 |
2017/06/17(土) 16:42:18.70ID:YXyzn6OG
それ戻り値がvoidだからじゃ

vs2015で試したら添字演算子の結果を使わなければvoidのままでも動いたし
戻り値返すようにしたら普通の使い方もできたよ
2017/06/17(土) 18:56:32.74ID:a/4tSU3I
話がそれるけど operator[] に initializer_list を渡したいときってどんなとき?
次元が動的に決まるようなコンテナとか?
2017/06/18(日) 00:16:25.00ID:sDQUBcQX
xyの二つの値を渡したかったんだろ
言わせんな恥ずかしい
2017/06/18(日) 00:50:52.82ID:fX2BYeVR
void って C++ の予約語の中ではカッコイイ言葉ナンバーワンだよな!
2017/06/18(日) 09:48:40.36ID:BCfBDJC6
auto に席をゆずったらしい‥
2017/06/19(月) 13:14:46.01ID:dXkNDY8/
pascal とか fortran の方が良くね?
2017/06/19(月) 13:45:34.22ID:LlSBVcNV
後藤
2017/06/19(月) 14:29:30.47ID:MatPzd+v
>>726
良かろうが悪かろうがこのスレに来てるのはそれでも C/C++ を使うってやつらなんだからその問いかけは無意味
2017/06/19(月) 15:29:57.68ID:dXkNDY8/
予約語として他言語から呼べる万能感があるのに :-P
C89では削除されたのだっけ
2017/06/19(月) 19:14:53.97ID:zNrORK8z
>>727
setjmp/longjmp のインパクト!を考えると、いまいちだと思いますぅ
2017/06/20(火) 00:48:54.33ID:tAZ0INkH
longjmpは無理やり過ぎだよな
Cならではとも思うが
2017/06/20(火) 00:52:30.35ID:tAZ0INkH
リターンアドレスレジスタみたいなの持ってる石だと
ちょいとだけ複雑になるのかすぃら?
2017/06/20(火) 23:58:21.18ID:f6m5FZzF
>>172
>MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!
>研究会のメンバーでさえ、規格に詳しい人がいないのだから

規格も理解できない奴らが集まって書いた27年前の規格の解説本って
やばすぎだろ
2017/06/21(水) 00:16:32.09ID:vvvagSt1
5ヶ月以上前のレスに反応するって
やばすぎだろ
2017/06/21(水) 04:19:48.48ID:ZaPNA4YS
コンパイラやライブラリが腐っていることなんて
良くある事。利用者は配慮してくれないと (AA略)
2017/06/21(水) 11:49:15.08ID:x++JJuQ3
最終的にできたものが使用通りならそれでいい
規格準拠度なんてどうでもいいな
2017/06/21(水) 13:05:32.11ID:sg+bsLqU
/* 仕様通り動いたコード */
int Z = 0; // これを消すと動かなくなる
int Z2 = 0; // 2010.1.4. vcバグ回避の追加
char *s, *p;
if (s==p) return 2; //これ必要?
2017/06/23(金) 22:17:07.01ID:U/0DguFU
A a = {};
これってコピーコンストラクタ呼ばれる可能性ある?
2017/06/24(土) 00:27:16.63ID:PfOqrM0w
ない
2017/06/24(土) 00:27:41.83ID:5MVxspQe
>>738
ない
(もちろんaを構築するときに呼ばれるコンストラクタの話
Aのコンストラクタの中で起きることまでは知りようがない)
2017/06/24(土) 09:24:07.49ID:AroON3at
イコールあるけどコピーしないん?
もう文法わけわからん
2017/06/24(土) 13:28:24.19ID:7MOF4v/u
変数宣言のときの=はあくまで初期化であって、たまたま同じ記号を使ってるだけで代入とは違うと思ったほうがいい

同じと思うと他にもC++の参照とかで混乱する
743デフォルトの名無しさん
垢版 |
2017/06/24(土) 15:16:01.77ID:qquEaJ2M
>>741
コピーしようがしまいが結果は一緒でしょ?
単に最適化の結果で余計な処理が動かないだけと考えればいい
2017/06/24(土) 18:10:28.98ID:Ipep7Yd5
>>743
一緒じゃねーよヴァカ乙
リソースはメモリだけと思ってんの?どんだけお花畑なの?
mutex a = {};コピー無しの保証
745デフォルトの名無しさん
垢版 |
2017/06/26(月) 12:57:25.63ID:dr/i6/ki
>>744
コピー出来るクラスを例に持って来いよ
2017/06/28(水) 18:40:34.84ID:lG20CtJa
コピー出来ないクラスではコンパイル結果が異なるという>>744の指摘に対して
「コピー出来るクラスを例に持って来い」とはこれ如何に
747デフォルトの名無しさん
垢版 |
2017/06/28(水) 18:53:40.08ID:fwJBxSlX
>>746
その元コメントはコピーしようがしまいがと言ってるのにそもそもコピー出来ないクラス持ってきて罵倒とはこれ如何に
2017/06/28(水) 20:44:21.28ID:VFMMUwAr
>>743
一緒じゃない
一緒になるようにクラスを設計すれば一緒というだけ
2017/06/28(水) 20:47:16.20ID:VFMMUwAr
デフォルトコンストラクタでカレーライスを製造
コピーコンストラクタでラーメンを製造
代入でうどんを製造

同じか?
2017/06/28(水) 21:08:19.84ID:lG20CtJa
>>743が「コピーしようがしまいが」と言ったからこそ>>744がコピーされてはは困る例を出したのだが
悲しきかな>>747には理解ないのであった
2017/06/28(水) 21:16:03.41ID:VFMMUwAr
いや、ちょっとズレてると思うよ
2017/06/28(水) 22:13:17.29ID:xb2y2Mwj
横から何だけど
どうズレてるかの説明は無いの?
753デフォルトの名無しさん
垢版 |
2017/06/28(水) 22:25:47.08ID:xMEBWJOX
コピーしない保証がC++17でさらに追加されたがそこで最適化でコピーしようが直接構築しようがどちらでもよかったC++14までの規格は彼の頭の中ではヴァカでお花畑らしい
2017/06/28(水) 23:59:13.87ID:lG20CtJa
なるほど>>738を初期化でなくcopy/move elisionの話だと勘違いしたままだとこのようなとんちんかんなレスになるのだな
残念なのが>>739-742を読んでも勘違いに気付かないことだ
755デフォルトの名無しさん
垢版 |
2017/06/29(木) 00:23:16.57ID:0BA30UdR
>>754
とりあえずお前が一番元のレス読んでないと言うことは解ったよ。
読んでるというなら彼が何を疑問に思ってるか、そしてそれへの説明をしてみるといい
2017/06/29(木) 08:20:56.52ID:J9UCM8ul
>>752
恐らく>>751は「コピーしようがしまいが」について、コンパイル可否(>>750で書いたコピーされてはは困る例)ではなく
「デフォルトコンストラクターで構築したものとそれをコピーして構築したものを概念的に同一視することの是非」こそが論点と主張している
その片鱗が>>749
2017/06/30(金) 16:06:42.41ID:YTlik2k9
printf("おちんぽじゅぽじゅぽ")
2017/06/30(金) 23:27:57.21ID:SxEaPPM4
catch のところで例外を再スローすると
再スローされた例外の型は、catchの所に書いたスーパークラスの型に
差し代わってしまうの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況