1 名前:デフォルトの名無しさん [2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net] 何にも知らない0からの出発、超初心者のためのC++相談室
282 名前:デフォルトの名無しさん mailto:age [2021/06/02(水) 14:44:42.56 ID:QfG+Xq1u.net] >>280 すいません詳しくありがとうございます 補数って概念全く理解してなかったので、それが原因だと分かりました。 コンピュータは足し算しかできないのですね… そこら辺知識固めてからもう一度読み直してみようと思います。
283 名前:蟻人間 mailto:sage [2021/06/02(水) 16:48:03.08 ID:1WJ2HfQ7.net] 10進4桁の場合、9999に1を足すと10000、オーバーフローしてゼロになる。よって、このオーバーフローするシステムの場合、9999はマイナスイチを表していると考えることができる。 同様に9998は-2であり、9997は-3である。
284 名前:蟻人間 mailto:sage [2021/06/02(水) 16:54:31.73 ID:1WJ2HfQ7.net] 符号付き8ビットの場合、2進数11111111、つまり16進でFFがマイナスイチを表す。同様に11111110(FE)はマイナス2であり、11111101(FD)がマイナス3である。 規則性が分かると思うけど、ビットを反転して、符号なし整数と見なしてイチを足すとマイナス符号の追加と同じ効果がある。証明略。
285 名前:はちみつ餃子 mailto:sage [2021/06/02(水) 17:04:16.45 ID:Bcy6nIKX.net] 一応補足しておくけど負の数の表現が二の補数であることは C/C++ の言語仕様としては保証してないし、 (C++20 からは二の補数であることが保証されるようになった) 1バイトが8ビットであることも保証してない。 signed char に型変換したときに上位ビットを切り捨てることも保証されない。 (変換後の型が unsigned のときには実質的に保証される。) 言語仕様として保証しないからといって間違っているというわけではなくて、 一般的なコンピュータのアーキテクチャではおおよそそうなってるのが普通というのも事実。 C++ の言語仕様の一部は機械の都合 (どのような機械語を生成するのが効率的か) でいくつかの選択肢 をとれるように言語仕様の側では意図的に決めてない部分がある。 「C++ の説明」として見たら >>276 で引用されている説明はちょっと微妙かもしれん。 あまり踏み込んで説明するのがめんどいから「普通は」という言葉でごまかしているんだと思う。
286 名前:デフォルトの名無しさん [2021/06/02(水) 23:13:21.37 ID:ZuDsQZsq.net] float/doubleは
287 名前:デフォルトの名無しさん mailto:sage [2021/06/03(木) 02:59:14.77 ID:Ers5yK+g.net] char は環境依存なので使わないようにする。 unsigned・signed のどちらなのか、分からないため unsigned char は、0〜256 signed char は、-128〜127 0〜127、7ビットの範囲では、この2つは共通している signed charは、先頭ビットが1なら、負数となる。 2の補数を調べて 1111_1111・0xFF なら、256か、-1
288 名前:286 mailto:sage [2021/06/03(木) 03:03:09.44 ID:Ers5yK+g.net] >>287 修正 256 ではなく、255 です unsigned char は、0〜255 1111_1111・0xFF なら、255か、-1 だから、環境依存のchar 型を使っていると、 エラーに、-1を使っていたが、他の環境では255と表示されたりする
289 名前:デフォルトの名無しさん [2021/06/03(木) 10:13:20.76 ID:oKNqyVQK.net] むしろ int を期待してる引数に char 渡す時が危険
290 名前:はちみつ餃子 mailto:sage [2021/06/03(木) 13:38:18.86 ID:ivgy5ZU8.net] char 同士なら符号の有無が違ってもビットパターンは維持された ままで型を読み替えることが期待できる (言語仕様として保証しているわけではない) けど、大きな型に変換するときは符号拡張が起こることがあるからだね。
291 名前:デフォルトの名無しさん mailto:sage [2021/06/05(土) 22:29:47.19 ID:UR0LV/yo.net] ハーバートシルト『STL標準講座』翔泳社, 1999, p.156-157 のサンプルプログラムで、そのままだとコンパイルが通らないものがあるのですが、 適当にconstをつけていたらコンパイルできるようになりました しかし、理由がわかりません どなたかご教示いただけませんか? https://ideone.com/LGnjXo
292 名前:デフォルトの名無しさん mailto:sage [2021/06/06(日) 01:24:02.19 ID:Lz5dZs8J.net] operator <<のとこでoがconst参照だから、そのoからはconstなメンバ関数しか呼べない。のでそれで合ってる 元のソースが間違ってるか何かだと思う、この仕様は最初からのはずなので
293 名前: mailto:sage [2021/06/06(日) 01:44:38.27 ID:xlnMgrm3.net] >>291 set<>::iterator は const をつけていなくても set<>::const_iterator と同じくイテレータ≒ポインタに const 属性がつきます。 だから set<>::iterator p; …@、と宣言した場合の p には「終生」 const 属性がつきまとうことになります。 例えば@の p にポインタ演算子 * を適用して出来た表現「*p」が参照に読み替えることがあれば、その参照は const 参照でなければなりません。 もともと const 属性はポインタにつけて、const 属性のついたポインタに -> 演算子を使って出来たメンバ変数の値を変更しないようにコンパイル時に厳密にチェックする縛りです c++ における参照は「機械的にポインタを使った書き方に書き直すこと」が可能(…A※)ですから、const なイテレータ(≒ポインタ)から生成した参照は const な参照にならざるを得ないのです ※Aは私の持論で、今回のお題でも参照をポインタに全部書き換えてやろうと試行錯誤していましたが、さすがに iostream や set で先に参照として宣言されているものを後からポインタにするのは不可能でした 頑張ってみたけれども、かえって意味不明な https://ideone.com/Yc0YvT ぐらいにしかならなかった、持論は修正しなくてはいけないなあ… set は重複要素を許さない二分木構造です。二分木構造 set に要素を挿入するときに、要素の大小関係にしたがって二分木の形をくみ上げていきます。 だからすでに二分木に組み込まれてしまった要素が、後からほいほいと要素の内容を変えられてしまっては二分木構造に矛盾をきたし、役に立たなくなってしまう… だから set にすでに組み込まれている要素をイテレータで走査するときは、そのイテレータ≒ポインタは、メンバの書き換えが不可能なイテレータとするしかないか、と私は考えます 提示していただいたソースを、上に述べた原則にしたがって、この原則に関係ない余分な部分を削り落として書く(あと、ちょっと簡略化もしています)と次のような感じでしょうか。 https://ideone.com/Zr1qIH friend 略 operator<<(略 C const &obj) { ... } にならなくてはならないのは set<C>::iterator は set<C>::const_iterator と同じだからです friend bool operator<(C const &a, C const &b) は set への要素の挿入のときに使う比較関数ですが、比較作業以外に要素のメンバを変えるとか余計なことをさせないために、最初から const 参照で宣言するべきでしょうし、そうなっているみたいですね しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。 ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう 上記のお題をこの方針で書くとこうなります。 https://ideone.com/G42gUs いろいろ書きすぎたかもしれませんが、上に示した三つのソースコードを研究してみてください
294 名前: mailto:sage [2021/06/06(日) 01:58:54.60 ID:xlnMgrm3.net] >>291 >>293 https://mevius.5ch.net/test/read.cgi/tech/1594615908/593 593 名前:◆QZaw55cn4c [] 投稿日:2021/03/14(日) 20:13:24.03 ID:uaeFGveg [3/6] >>590 >C++は未だ*や&、&&、で頭の中がグルグル回ってしまう これらの「記号」は習得に順序があります。 まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。 次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう 参照 で返す、という場面でも、@参照返しが出来る場合と、A参照返しはできずせいぜい RVO に期待するしかない場合、の@A二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、@Aは結構重要だと思います && は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
295 名前: mailto:sage [2021/06/06(日) 02:07:24.75 ID:xlnMgrm3.net] >>292 operator<<() のストリームじゃないほうの引数は、const 参照ではなくてもいいと思います 今回のは const 参照が要求されたのは、 set のイテレータだから https://ideone.com/j6CV0s
296 名前: mailto:sage [2021/06/06(日) 02:32:48.87 ID:xlnMgrm3.net] >>293 ソースを貼り付けた一行目がミスっていましたね、修正します。 >しかし、この const 属性はプログラミング 3 年生くらいまでは、かなり分かりにくい縛りであることは、私の経験からもとても理解できます。 >ポインタや参照をしっかり理解しないことには、わざわざ自分を縛る const のありがたみもよく理解できないだろうと、私も同情するのです。 >そういうときは、const_iterator p から作った表現 *p が展開された先の実際の表現を、「*p のコピー・オブジェクトのコピー」にするのがいいでしょう >上記のお題をこの方針で書くとこうなります。 https://ideone.com/Ivx0JY
297 名前:デフォルトの名無しさん mailto:sage [2021/06/06(日) 02:41:34.70 ID:Lz5dZs8J.net] ああ、operator <<のconstも最初付いてなかったのか それならsetの仕様変更のせいだね というか昔のままの非constの方が良かったんだけどなぁ 比較演算子自分で書いてるような構造体だと順序変わらない場合もあるんだし・・正直押し付けがましい
298 名前: mailto:sage [2021/06/06(日) 03:22:16.34 ID:xlnMgrm3.net] >>297 自分で一から書く分には const に一貫性を持たせて、結果、const が有用に働くように書いていけるかもしれない、とか思うのですが、 他の人の分を取り込むときは、最悪 const_cast を >>291 の言うように「適当にconst_cast をつけていたらコンパイルできるようになりました」とか私も言っているわけでして、私は >>291 を笑うことができません……
299 名前:デフォルトの名無しさん mailto:sage [2021/06/06(日) 08:29:50.46 ID:KyPgEn9X.net] 一から書いている私ですが、 全てのフォルダ・ファイル・プログラムに一貫して *と何か名前を付けてプログラミングをしています。
300 名前:デフォルトの名無しさん mailto:sage [2021/06/06(日) 08:34:21.45 ID:8VTCuGWY.net] QZ・・・・ C++をちゃんと理解できてないのに無理すんなw
301 名前: mailto:sage [2021/06/06(日) 09:27:07.17 ID:xlnMgrm3.net] >>300 >C++をちゃんと理解できてないのに無理すんなw うん。すっごく認めます! でもちゃんと理解できていないからこそ、アウトプットもきちんと書くようにして定着させたい、というのもあるんですよ 「教えることは教わること」 >>291 に対する回答としての >>293 , >>295 に間違いはないですよね?
302 名前:デフォルトの名無しさん mailto:sage [2021/06/06(日) 09:44:11.48 ID:WkbXnMOk.net] 意味分からん理屈だな ずっと前からC++分からないって言ってるよね? もしかして理解できる頭を持ってないのかな?
303 名前: mailto:sage [2021/06/06(日) 13:37:50.42 ID:xlnMgrm3.net] >>302 自己申告なんて当てにしてはいけないのでは?
304 名前:デフォルトの名無しさん mailto:sage [2021/06/06(日) 15:27:30.95 ID:fMmzH2Jl.net] 文面から必死な感じがヒシヒシと伝わってくるのに 皮肉も理解できないとはさすが厚顔無恥の代表格 誰も認めてくれないから自画自賛するしかないんですね
305 名前: mailto:sage [2021/06/06(日) 16:22:05.09 ID:xlnMgrm3.net] >>304 え?必死?思いがけない反応ですね まあ >>291 の方が提示したソースはハーバードシルトにしては冗長だと思って無駄丁寧っぽく説明したほうがいいかと >>293 をワサワサ書きましたが、それが必死だとは… よく分かっている方 >>292 に対しては簡潔に私の意見 >>295 を送ってもう十分、仕様変更があったという情報 >>297 をいただいて感謝、というところでしょうか
306 名前:290 mailto:sage [2021/06/06(日) 22:29:30.82 ID:DvMt5hdj.net] >>292 >>293 どうもありがとうございます constメンバ関数の理解が不十分だったようです constメンバ関数はメンバ変数を変更しないという理解だけで、 constオブジェクトはconstメンバ関数しか呼べないことへの 理解が足りなかっため私自身混乱していました ご説明いただいた内容を足掛かりに理解を深めたいと思います
307 名前:1 mailto:sage [2021/06/07(月) 07:01:58.64 ID:pWKPTo4/.net] まぁ、いいじゃねぇか、プログラミングなんて何にも知らないってのスレだし。
308 名前:デフォルトの名無しさん mailto:sage [2021/06/07(月) 07:48:28.30 ID:c29T7zKX.net] const char* const str[] は文字列アドレスを格納するポインタの配列って意味であってますか? const char* strは文字列を格納するポインタ? char str[] は文字配列? 一気に出てきてよくわからなくなって来たので間違えてたら教えて欲しいです。
309 名前:デフォルトの名無しさん mailto:sage [2021/06/07(月) 08:39:52.02 ID:xFpLHEPr.net] >>308 だいたいあってる
310 名前:デフォルトの名無しさん mailto:sage [2021/06/07(月) 11:12:06.49 ID:BLDePS2Q.net] ちゃんとメモリ確保してから使えよ
311 名前:デフォルトの名無しさん mailto:sage [2021/06/07(月) 22:09:28.76 ID:JY7FyEcf.net] >>309 ありがとうございます。
312 名前:デフォルトの名無しさん mailto:sage [2021/06/08(火) 23:28:22.97 ID:kZSYpF+Y.net] https://ideone.com/2fyV5M 103 と115で確保された動的配列のアドレスは別物なんでしょうか? コピーコンストラクタの動きがよくわからないです
313 名前:デフォルトの名無しさん mailto:sage [2021/06/09(水) 02:24:41.44 ID:ZtayyY2i.net] 103のarrayはコピーされたものだから別物だよ てか初っ端から手直しが必要なソースを貼るのはやめろ
314 名前:デフォルトの名無しさん mailto:sage [2021/06/09(水) 02:39:16.49 ID:Ih94CWHU.net] スレの主旨的に初心者が初歩的な質問をするのは別に構わんとは思うんだが、 入門書にでも書いてあるようなことはよく読んで勉強したほうがいいと思うぞ。 素人が1レスで答えるよりはちゃんと体系だった解説のほうがわかりやすいよ、常識的に考えて。
315 名前:デフォルトの名無しさん mailto:age [2021/06/09(水) 04:24:03.76 ID:BGdtXEJj.net] >>313 すいません、ヘッダーとかcpp分けてるのどうアップロードすればいいのか分からなかったです 後65行目にcopy(other.m_array, other.m_array + m_size, m_array);とあるのですが何をしてるのか分かりません 本には”第1引数以上第2引数未満のアドレスにあるデータを第3引数の指すアドレス以降にコピーする関数で…とあるのですが 具体的に何をしてる関数なのでしょうか?第2引数の足し算も何なのかよく分かりません。
316 名前:デフォルトの名無しさん mailto:sage [2021/06/09(水) 04:43:32.09 ID:ZtayyY2i.net] https://ideone.com/EScxwq こうしたらそのままコンパイル通るやろ 自分のヘッダincludeしてるとこにヘッダの内容貼り付けるだけ https://cpprefjp.github.io/reference/algorithm/copy.html memcpyと似たようなもん(コピーの仕方は違うけど other.m_arrayの指すアドレスから+m_size分のアドレスまで(未満)をm_arrayの指すアドレスから同じく+m_size未満までコピーしとるだけ これで分からんならポインタの理解が出来てない 上記のとこだとイテレータとか出てるけどこの場合ポインタなので全部ポインタに読み替えていい
317 名前:デフォルトの名無しさん mailto:sage [2021/06/09(水) 04:53:28.23 ID:ZtayyY2i.net] ちょっと誤解招きそうなので補足 m_sizeは個数なのでアドレス値ではないがintのm_size個分アドレスが加算される このへんは>>314 の言う通り入門書嫁
318 名前:デフォルトの名無しさん [2021/06/09(水) 14:16:25.82 ID:3Qpbsqp/.net] cpp で socket を読み書きする stream 系の class ってありますか? boost にはあったと思いますが 標準のはあるんですか?無いですか?
319 名前:はちみつ餃子 mailto:sage [2021/06/09(水) 16:06:33.34 ID:Ih94CWHU.net] >>318 標準には無い。 が、ソケットに stream のインターフェイスをかぶせることはそれほど難しくはない。
320 名前:デフォルトの名無しさん mailto:age [2021/06/09(水) 22:30:15.61 ID:BwbEIJxn.net] >>316 1引数から2引数で足したアドレスまでを第三引数にコピーしてるのですね やっと分かりました。ありがとうございます。 頭硬い人はロベール向いてないのかな…
321 名前:デフォルトの名無しさん mailto:sage [2021/06/09(水) 23:57:13.88 ID:ZtayyY2i.net] それは良かった まぁ最初は理解に時間かかるもんだ
322 名前:デフォルトの名無しさん [2021/06/10(木) 10:45:51.80 ID:ZbfFyHii.net] >>319 thx cpp の std にある関数で glibc の様な getpass ってありますか? 標準のは無いですか?
323 名前:はちみつ餃子 mailto:sage [2021/06/10(木) 14:24:18.43 ID:MOYAWABe.net] >>322 無いよ。
324 名前:デフォルトの名無しさん [2021/06/11(金) 14:28:13.59 ID:tB3/M6ll.net] FILE *fp = fopen() で取得した fp を使って stringstream としてアクセスすることは出来ますか?
325 名前:はちみつ餃子 mailto:sage [2021/06/11(金) 17:27:01.32 ID:DsaVPusD.net] >>324 直接的に一発で FILE* に stream をかぶせる手軽な方法はないと思うけど、 std::basic_streambuf を継承して setbuf, overflow, sync などをオーバーライドしたクラスを作ればストリームバッファになる。 (普通は std::basic_filebuf も内部的にはそう実装されているはず。) それをストリームに結び付ければストリームに出来ることは何でもできるよ。 仕様を調べるのがすごくしんどいだろうけど、 実装は (細かいエラーチェックとかを抜きにすれば) 百行も要らないくらいの簡単なものでいけるんじゃないかな。
326 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 00:59:39.17 ID:QFUk0bjY.net] >>324 fstreamを使えば? #include <fstream> #include <sstream> … std::ifstream fs("hoge.txt"); std::stringstream ss; ss << fs.rdbuf(); fs.close(); それともfstream使えない特殊な環境?
327 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 16:36:23.72 ID:uJQ6HHCX.net] FILE *fp = fopen(...); std::ifstream fs(fp); 出来たらいいな
328 名前:デフォルトの名無しさん mailto:sage [2021/06/17(木) 21:31:03.90 ID:OB6uOiq6.net] 関数へ渡す引数の型を限定したいときどう書くのが一般的ですか? 具体的に言うと符号なしのintだけ受けつけたいんですけど
329 名前:はちみつ餃子 mailto:sage [2021/06/17(木) 23:54:09.39 ID:Gi/wqrqm.net] >>328 暗黙の型変換を許さないということかな? それならテンプレートにした上で型に制約を付ければいい。 ここでは C++11 でも通るように書いてみたけど C++20 以降なら コンセプトが使えるのでもう少し簡単に書ける。 #include <type_traits> template<class T> typename std::enable_if<std::is_same<T, unsigned int>::value>::type foo(T) { } int main(void) { int a = 1; unsigned int b = 2; foo(a); // これはエラーになる foo(b); // これは通る }
330 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 08:42:03.67 ID:kejK9s3z.net] なんで戻り値voidに限定してんだよボケ餃子
331 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 11:49:14.92 ID:AVf6Ht59.net] 確かにそれで可能だけど、回答が超初心者スレのレベルを逸脱していると思うのですが
332 名前:はちみつ餃子 mailto:sage [2021/06/18(金) 18:30:00.74 ID:JA4mPV9U.net] >>330 単なるサンプルだからだよ。 >>331 超初心者が相談するという主旨のスレではあるけど、 超初心者には理解できないという結果になることもあるだろうし、 可能であれば相談した結果として初心者から脱したらそれに越したことは無いでしょ。 これで相談がクローズってわけでもないから もっと深く知りたいってのならわからないところを続けて質問してもらってもいいわけで。 もっと簡単な方法があるならそれを提示するんだけども、なくなくなくない?
333 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 19:23:19.39 ID:kejK9s3z.net] >>332 アホか 普通のenable_ifの使い方と全く違うお前だけのオナニーコード押し付けて何がサンプルだ 何不必要な制限勝手につけてドヤってんだボケ
334 名前:はちみつ餃子 mailto:sage [2021/06/18(金) 19:32:07.35 ID:JA4mPV9U.net] >>333 返却値 (または enabler) で制限するのは普通だろ。 むしろ他にどう使えるんだ?
335 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 19:35:45.29 ID:kejK9s3z.net] >>334 マジで言ってんのか? #include <type_traits> template <class T, typename std::enable_if<std::is_same<T, unsigned int>::value>::type* = nullptr> void foo(T) { } int main() { // foo((int)1); foo((unsigned int)1); } enablerってこれのことか知らんが、お前のコードだと戻り値voidにしか出来んだろってこと
336 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 19:42:19.79 ID:kejK9s3z.net] >>328 ちなコンセプト版(C++20対応コンパイラが必要) #include <type_traits> template <class T> concept UnsignedInt = std::is_same_v<T, unsigned int>; template <UnsignedInt T> void foo(T value) { } int main() { // foo((int)1); foo((unsigned int)1); } (インデントは全角なので注意) まぁどっちも難しいと思うけど無理に理解せず流した方がいいと思う(それか制限あきらめるか
337 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 19:43:08.40 ID:AVf6Ht59.net] >>332 いや、お前の言いたいことは分かるよ ただテンプレートメタプロコードを超初心者にいきなり例示して、「わからないところを続けて質問」して回答を繰り返して、結果的に理解に至るのは何ヵ月後になるんですかと テンプレートに関する高度な質問が飛び交う中、ここは超初心者スレとして機能するんですかと この場合>>328 が求めているのはドリルじゃなくて穴だと思うよ俺は どういう背景があってunsigned int以外を受け付けたくないか、を聞くべきなのでは?
338 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 19:57:29.32 ID:kejK9s3z.net] 確かにそうだね というか自分もテンプレート以外思いつかんかった・・ >>334 なんか変な癖あるから標準的な使い方がすっぽ抜けてたのかね ボロカス言って悪かった
339 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 20:01:53.90 ID:zIhiG+wy.net] あんまり詳しくない俺にはこういうのしか思いつかん。 __my_func() は直接呼ばないお約束にしておいて、static_assert で。 template のところは、書き換えは雰囲気でできると思うけど・・・ #include <type_traits> #include <iostream> unsigned int __my_func(unsigned int a) { return a * 2; } template <class T> unsigned int my_func (T a) { static_assert(std::is_same<T, unsigned int>::value == true, "is not uint."); return __my_func(a); } int main() { int a = 2; unsigned int b = 2; //std::cout << my_func(1) << std::endl; // assert //std::cout << my_func(a) << std::endl; // assert std::cout << my_func(1U) << std::endl; std::cout << my_func(b) << std::endl; }
340 名前:はちみつ餃子 mailto:sage [2021/06/18(金) 20:30:53.23 ID:JA4mPV9U.net] >>335 > お前のコードだと戻り値voidにしか出来んだろ なんか変なこといってると思ったらそこがすれ違いか。 std::enable_if のテンプレート引数の二個目を省略しなければ何にでも出来るよ。 (std::enable_if の type は void に固定されているわけではない。) クラスやコンストラクタは返却値がないから enabler を使うんであって、 普通の関数のときは返却値のほうで制御するのが普通だと思うぞ。
341 名前:はちみつ餃子 mailto:sage [2021/06/18(金) 20:33:26.89 ID:JA4mPV9U.net] >>337 まあそうなったら他に誘導してもいいし、資料を提示するだけで十分だと思った。 ただ背景をもうちょっと引き出すべきというのも確かに必要なことではあったな。
342 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 20:39:10.69 ID:kejK9s3z.net] そうなんか、そういえばいつも自作alias使ってたから気付かんかったわ >普通の関数のときは返却値のほうで制御するのが普通 別に戻り値でも引数でもいいが、クッソ読みづらいと思うけどな あとそれならこういうスレで第2引数省略すんなよ、初心者惑わしたいのか?
343 名前:1 mailto:sage [2021/06/19(土) 15:34:05.42 ID:kvHrZ2tI.net] ここは中級者が、お互いを煽り合うスレでは無い、ということを理解して欲しい。
344 名前:デフォルトの名無しさん [2021/06/19(土) 16:53:11.57 ID:zDrgWeBe.net] 引数同じで戻り値だけ違う関数を造って使い訳たい
345 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 17:01:53.54 ID:xVp2TfT/.net] >>343 俺ははちみつが書くより先に同じこと(enable_if)思ってたけど、このスレには不適切だと思って書くのやめてたんだけどな あんな不適切で不親切な回答(テンプレートとSFINAEとか、はちみつも使いこなせてないようなものを使う上に戻り値の変更方法も、自身が言ってるコンセプト版も書かない)に怒っちゃいかんのか
346 名前:はちみつ餃子 mailto:sage [2021/06/19(土) 17:30:35.18 ID:/f53/cxR.net] >>345 そこらへんが少しばかり詳細なら初心者に理解できる内容になるという主張? 少々の書き方の工夫で初心者がわかるように解説できるわけないだろ。 関連知識も含めればちょっとした本一冊分くらいにはなる内容なんだから。 「まずはテンプレートの知識が必要ですね」ということが初心者に対する解で、 そこに至る前にごちゃごちゃしたことを詰め込むのは不親切だと思うわ。
347 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 17:34:51.32 ID:xVp2TfT/.net] >>344 戻り値だけ違う同名関数は作れないのでテンプレートにするか、引数で戻り値を指定するしかないとおも template <typename T> T hoge(); template <> int hoge<int>() {} template <> float hoge<float>() {} hoge<int>(); hoge<float>(); もしくは int hoge(int) {} float hoge(float) {} ?hoge(int()); hoge(float());
348 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 18:00:39.76 ID:kvHrZ2tI.net] 1 + 1 = 1
349 名前:デフォルトの名無しさん mailto:sag [2021/08/24(火) 01:28:35.73 ID:WM1jAzNs.net] https://pastebin.pl/view/e395f5ca operator関数の動きがよくわからないんですが tmp.x = x + p.x; これの p.xと xとtempはどのオブジェクトのことを指してるんでしょうか?
350 名前:はちみつ餃子 mailto:sage [2021/08/24(火) 01:50:15.06 ID:MkJE9y3A.net] >>349 operator+ は演算子 + の実体として機能する。 故に p1+p2 は p1.operator+(p2) と書いた場合と完全に同じ。 tmp はもちろんこの関数内で宣言した tmp 変数だし、 p は渡された引数 (この場合は p2) のコピーなので p.x には 6 が入ってるね。
351 名前:デフォルトの名無しさん mailto:sag [2021/08/24(火) 02:43:37.56 ID:WM1jAzNs.net] >>350 ありがとうございます。引数がどれに対応してるかわかりました。 p1.operator+(p2) これは何でしょう?
352 名前:デフォルトの名無しさん [2021/08/24(火) 03:37:20.26 ID:gGQMgsWd.net] 掛け算の*と、 色々を示す*が 同じ*なんで困っていますが、どうしたらいいんでしょうか?
353 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 03:55:09.38 ID:jikR3Y9f.net] 色々ってワイルドカードのこと? C++においては*は乗算かポインタ関係だけだよ >>351 p1のメンバ関数として普通にoperator +を呼んでるだけ
354 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 04:29:07.93 ID:gGQMgsWd.net] ありがとうございます。 c++ のワイルドカード記号ってなんでしょうか?
355 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 04:33:24.90 ID:jikR3Y9f.net] 言語そのものには無いよー エディタやIDEで検索するのには使えることもあるが
356 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 04:45:36.01 ID:gGQMgsWd.net] 教えてもらって、勉強になりました。 ありがとうございました。
357 名前:デフォルトの名無しさん mailto:sag [2021/08/24(火) 07:22:03.54 ID:WM1jAzNs.net] https://pastebin.pl/view/31e451ad クラスの型変換と型変換用のコンストラクタの意味が全く分からないのですが これをすると何が得なのでしょうか?10行目は普通のコンストラクタに見えますがなぜ変換用? 入門書に載ってるコードなのですがエラーで動作もせず何がなんだか分かりません…
358 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 15:23:13.01 ID:jcrsR8Np.net] 2つ目のprivateはpublicの間違いじゃね? あと変換は、単に引数一つだけを受け取るコンストラクタは 自動的に?暗黙のキャストにも使われる、というだけ(それを禁止する方法もあるが
359 名前:デフォルトの名無しさん mailto:sag [2021/08/25(水) 07:15:15.42 ID:dwOa++JV.net] >>358 おかげさまで動きました。ありがとうございます。 でもいまいち型変換の意味が分からないのですが operator 型名()return 変数を定義するとどの変数にも代入出来るようになるってことですか?
360 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 15:58:08.24 ID:3/bOIe3o.net] C++ キャスト でぐぐるといいよ (キャストはCにもあるけど)
361 名前:はちみつ餃子 mailto:sage [2021/08/25(水) 22:29:05.16 ID:/Q8zinJC.net] >>359 型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし て書いてもかまわないんだが、変換関数 (conversion function) または変換 コンストラクタ (converting constructor) が定義されていると暗黙の型変換 が適用される文脈では勝手に適用して変換してくれるので便利。 例えば以下のように foo 型のオブジェクトを受けとる文脈で bar 型のオブジェ クトを渡しても通るのは変換が適用されるから。 struct foo {}; struct bar { operator foo() { return foo(); } }; void func(foo) {} int main(void) { foo x = bar(); func(bar()); }
362 名前:デフォルトの名無しさん mailto:sag [2021/08/26(木) 01:12:00.54 ID:BlNdGFU0.net] >>361 ようやくイメージできてきました。ありがとうございます!
363 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 06:25:31.31 ID:C2TXXzWD.net] >>361 そんな難しくせずに、 { change A to B } でいいんじゃないの?
364 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:12:40.22 ID:QSgOZ0Rh.net] なんのこっちゃ
365 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 08:15:52.67 ID:ue9a70Za.net] コマンドライン引数の意味が全く分からないのですが Visualstudioを使っているからでしょうか? それとも、コマンドプロンプトの使い方を理解できないでしょうか? https://programming.pc-note.net/c/commandline.html ここも参照にしたのですが何が得で何ができてるのかよく分かりません。 コマンドラインってVSでデバッグ無しで実行をした時に出る黒い画面ではないですよね? 質問ばかりですいませんが本当に何も分からないのでお願いします。
366 名前:デフォルトの名無しさん [2021/08/27(金) 11:14:47.31 ID:xylLBHc1.net] >>365 メモ帳でファイルをドラッグアンドドロップで開く例が紹介されているが これはWindowsのShellであるExplorerがexefileに対して登録されているドラッグアンドドロップハンドラーを処理してドロップしたファイルのフルパスを文字列として起動するプロセス環境のコマンドラインパラメータとして渡している 黒い画面(コマンドプロンプト)にもExplorerとは違うがプロセスの起動とパラメータを渡す機能が実装されている 起動するexefileに続けてスペースを開けたあと記入した文字列がそのままパラメータとして渡される ファイル名以外にも自由に渡せるためプログラムの動作を指定したり変更する目的で使用される あなたが作成するプログラムでシェルから渡されたコマンドラインパラメータを確認する方法はそのページにもある通りだ コマンドラインパラメータを活用してバラ色の人生を満喫してくれ
367 名前:デフォルトの名無しさん [2021/08/27(金) 14:23:11.73 ID:8dQk5Ix1.net] getopt
368 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 23:33:15.78 ID:cMIVTei2.net] 例えば、デスクトップにショートカットを作る。 コマンドプロンプトを起動して、Ruby スクリプト・a.rb を実行する リンク先 C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb" 注意。書き込めないので、間に@を入れました 作業フォルダ C:\Users\Owner\Desktop a.rb 内には、puts ARGV (ARGV は配列で、そこにコマンドライン引数が渡ってくる) と書いておいて、ショートカットに、フォルダx・ファイルb.txt をdrag&drop すると、 コマンドプロンプトが起動して、以下のように表示される C:\Users\Owner\Desktop\x C:\Users\Owner\Desktop\b.txt
369 名前:デフォルトの名無しさん mailto:sagi [2021/10/06(水) 22:36:41.57 ID:OG+j1FAK.net] const char* const str[]={"aaa","bbb","ccc"} constの効果を教えてほしいです 後ろのstrの前のconstは付けると const str[0]="dddd"って出来なくなるのは分かったのですが 先頭のconstが分かりません
370 名前:デフォルトの名無しさん mailto:sage [2021/10/06(水) 22:51:34.11 ID:ItOX1MR6.net] str[0][0]='d';
371 名前:デフォルトの名無しさん mailto:sagi [2021/10/06(水) 22:53:20.88 ID:OG+j1FAK.net] >>370 なるほど。 ありがとうございます。
372 名前:デフォルトの名無しさん mailto:sagi [2021/10/09(土) 07:12:25.69 ID:JFpyaThm.net] ロベールC++入門の代入演算子についてなのですが コピーコンストラクタのときは動的配列をdelete[]しなかったのに なぜ代入演算子を使うときだけdelete[]するのか分からないので教えて下さい 本にはm_arrayには前に確保したメモリが存在するためdelete[]しないとメモリリーク と書いてあるのですがコピーコンストラクタも同じじゃないの?と混乱してます 100行目です https://ideone.com/xL8UOn
373 名前:デフォルトの名無しさん mailto:sage [2021/10/09(土) 10:44:46.48 ID:tDH5FAwQ.net] newしたメモリが不要になったらdeleteする これだけ コピーコンストラクタでのdelete、 いつnewしたデータに対して?
374 名前:デフォルトの名無しさん mailto:sage [2021/10/09(土) 17:51:02.84 ID:QAOoCtV/.net] >>373 すいません、わからないです。 コピーコンストラクタはnewでアドレスを確保しないものなのですか?
375 名前:はちみつ餃子 mailto:sage [2021/10/09(土) 18:03:01.95 ID:Z56nk6n1.net] >>374 ロベールの C++ 入門を読んだことがないからどういう構成になっとるか知らんけど、 それがわからんのならたぶんそれ以前の章を理解でてきないと思う。
376 名前:デフォルトの名無しさん mailto:sage [2021/10/09(土) 18:04:17.21 ID:jELfb/xT.net] >>372 代入演算子は既にあるオブジェクトを別のオブジェクトで上書きする操作 コピーコンストラクタは別のオブジェクトから新しいオブジェクトを作って初期化する操作 代入演算子でdelete[]しているのは既にあるオブジェクト(*this)のメンバとして確保済みのメモリ領域 コピーコンストラクタの実行時には「既にあるオブジェクト」にあたるものは無いので、deleteするものも無い
377 名前:デフォルトの名無しさん mailto:sage [2021/10/09(土) 20:35:07.35 ID:QAOoCtV/.net] >>376 初期化と代入の知識が曖昧でした 分かった気がします。ありがとうございます。
378 名前:デフォルトの名無しさん [2021/10/10(日) 20:55:50.73 ID:6QW0WSDe.net] AtCoderの初心者向けのC++の説明のページを読んでいます。 vector<int> a(10); aの第i番目の要素にアクセスする場合、a[i]よりもa.at(i)と書くほうが良いと書いてあります。 これは現在のC++で推奨されている書き方でしょうか?それとも単に初心者はそう書いたほうがいいというだけのことでしょうか?
379 名前:ハノン mailto:sage [2021/10/10(日) 21:05:41.56 ID:KKHdhYPj.net] >>378 >a[i]よりもa.at(i)と書くほうが良い そう主張されている理由はどのように書かれていますか?私はどちらでも大差ないと思っていますが‥‥
380 名前:デフォルトの名無しさん mailto:sage [2021/10/10(日) 21:07:18.12 ID:6QW0WSDe.net] >>379 vector<int> a(10); b = a.at(10); などと書いた場合にコンパイルエラーになりますが、エラーメッセージがatを使うと表示されるというのが理由です。
381 名前:デフォルトの名無しさん mailto:sage [2021/10/10(日) 21:08:35.36 ID:6QW0WSDe.net] 初心者でないプログラマーでatを使って書いている人は少数派ではないのですか?
382 名前:デフォルトの名無しさん mailto:sage [2021/10/10(日) 21:31:47.25 ID:zWyM5YPA.net] 範囲外にアクセスする可能性があるならat、ちゃんと事前にチェックするなら[]でいいんじゃない?