- 1 名前:デフォルトの名無しさん [2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net]
- 何にも知らない0からの出発、超初心者のためのC++相談室
- 855 名前:デフォルトの名無しさん [2024/06/15(土) 17:34:41.45 ID:kg6WNOQa.net]
- >>844
C++は、日本語対応していないよ、注意してね。 だから、"あいうえお"なんかのコードは実行されない。 俺はこれを理解するのに10年以上かかった。
- 856 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/06/15(土) 19:41:12.56 ID:g9ixUcaw.net]
- >>855
No. 現在は Unicode についての規定はあるし、 Unicode のコードポイントに対応つくことが保証された文字列リテラルはある。
- 857 名前:858 mailto:sage [2024/06/15(土) 21:31:29.30 ID:kg6WNOQa.net]
- 俺のエディタは、EmEditor Professional (64-bit)だ。
だ。だからC++は、C++17だ。 わからなかった。ごめんな。
- 858 名前:デフォルトの名無しさん [2024/06/16(日) 00:50:11.77 ID:v0fD0nKy.net]
- C++と文字コードに関してはこの記事が面白かった
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b 俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった
- 859 名前:デフォルトの名無しさん mailto:sage [2024/06/16(日) 23:06:40.05 ID:+HL215mo.net]
- >>854
どうやってチューリングテストするんじゃ……
- 860 名前:デフォルトの名無しさん mailto:sage [2024/06/16(日) 23:21:48.48 ID:+HL215mo.net]
- coutやcinとかなiostream系の入出力手段のうちのワイド文字でないやつは
エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから Shift JISの入出力が問題を引き起こすことは無いという認識でおk?
- 861 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/06/16(日) 23:45:30.66 ID:Crm/SwBu.net]
- >>860
言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い) 実際に Windows では文字コードや改行コードの変換をする。 改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない? 変換するということは変換元が想定通りじゃないときには破綻する可能性がある。 Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。 バイナリモードではバイト列そのまま。 Linux だとテキストモードとバイナリモードは区別がない。
- 862 名前:デフォルトの名無しさん mailto:sage [2024/06/17(月) 00:54:42.78 ID:pXzMaPAe.net]
- >>861
だいたいわかりた、 >実際に Windows では文字コードや改行コードの変換をする。 テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、 cout << "アイウエオカキクケコ\nさしすせそ" << endl; と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、 上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを 「実行時に」解釈する必要がある つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、 Shift JISというものを知っている必要があり、これが >Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。 につながるんだと思う。
- 863 名前:デフォルトの名無しさん mailto:sage [2024/06/17(月) 00:57:00.44 ID:pXzMaPAe.net]
- しかし
>実行環境の都合で各種の変換を入れても良い。 とC++の仕様には書いてあると言っても実際には透過的でない文字コード変換とか有り得ないんでないので? 例えば ofstream ofs("foo.txt"); ofs << "アイウエオカキクケコ\nさしすせそ" << endl; // (1) std::string s1, s2; ifstream ifs("foo.txt"); ifs >> s1 >> s2; // (2) とやったらs1、s2とも中身は(1)の記述をコンパイル時に解釈した通りになる、 という期待動作しかありえないのでは…… 具体的には s1の中身は SI アイウエオカキクケコ SO の12バイト(末尾NUL除く)になって、 s2の中身は さしすせそ という10バイト(末尾NUL除く)になる、
- 864 名前:デフォルトの名無しさん mailto:sage [2024/06/17(月) 01:13:07.47 ID:pXzMaPAe.net]
- いやトチ狂ったスマンヌ、
Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから >>862 の理解はやや的を外していた……orz テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。 しかし、であればやっぱ>>860に戻って、実は実害無いのでは…… Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし…… 透過的でない文字コード変換(>>863)が無い限り、cout して cin して結果が変になるケースが思いつかなsげ…… (正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く
- 865 名前:デフォルトの名無しさん [2024/06/17(月) 16:31:20.06 ID:prlYSpwu.net]
- wstringがutf-32だったら良いのに
- 866 名前:デフォルトの名無しさん mailto:sage [2024/06/18(火) 11:56:24.49 ID:mldi07Wv.net]
- >>858
その人ブチギレてるフリしてるだけの厨二病だから・・・
- 867 名前:デフォルトの名無しさん mailto:sage [2024/07/17(水) 14:22:34.59 ID:UFGYctg0.net]
- std::functionって関数の「比較」はできないんでしたっけ?
例えばあるクラスが std::function<..> m_callback みたいなインスタンス変数を持ってて そこにコールバックを登録できるメソッドがあるとします registerCallback(std::function<..>& callback) { m_callback = callback; } みたいな で、registerCallback(func)が呼ばれた後、正しいコールバックが保持されていることをテスト したいのですが、例えばregisterCallback()の引数に渡したstd::function<..>のオブジェクトと m_callbackはどうしたら比較できるでしょうか。単純に == ではエラーになる模様です
- 868 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/07/17(水) 16:12:07.26 ID:rcKIBlXh.net]
- >>867
メンバ関数テンプレート target を使えば元の関数を取り出せる。 https://wandbox.org/permlink/3sCREueD2sVYMW9t ただし、取り出すときに元の型を指定する必要がある。 ただの関数ならば簡単なのだけれど、 ラムダ式から直接に入れた場合には適切な型を指定できない。 ラムダ式が生成する値はそれぞれに固有の型を持つので。 一旦 std::function に入れたらあまり取り出さない (取り出す必要がない) 設計が望ましいと思う。 テストのためだけなら大丈夫だと思うけど。
- 869 名前:デフォルトの名無しさん mailto:sage [2024/07/19(金) 12:25:52.15 ID:HkXmecYp.net]
- functionではなくオーバーロードで生の関数や関数オブジェクト(ラムダ含む)を受け取って、functionと共にアドレス値を保存すればいいのでは
関数オブジェクトの場合はoperator ()のアドレス
- 870 名前:デフォルトの名無しさん [2024/07/21(日) 02:13:54.03 ID:5YGWxq2c.net]
- 独習でc++を勉強していて時々プロセッサとかライブラリ関数これなんだろ?になるのですがそういうの調べる辞典的なものってあるのでしょうか?
あるのでしたらおすすめのもの教えてもらえませんか
- 871 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 02:27:27.18 ID:neWsPxIF.net]
- C++標準に関しては
https://cpprefjp.github.io/ https://ja.cppreference.com/w/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 プラットフォーム固有のものに関してもそれぞれあるけど 関数名でググったら大抵上の方に出てくるとおも
- 872 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/07/21(日) 08:39:43.55 ID:uupG6eva.net]
- ググって出てくるようなのは誤った記述も多い。
あまり信用しすぎずになるべく複数の情報源を持つのが好ましいと思う。 言語仕様は改訂もあるから資料の日付を見てどの版に対応するのかも意識する必要がある。 >>871 が示すような有志がまとめているサイトはちょっとした企業よりも高いモチベーションがあるのか質は高い。 本当にありがたいサイトなので役に立ったと思ったらちょっとくらいは寄付してあげてね。
- 873 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 12:22:32.16 ID:qC5USrOr.net]
- Unix環境ならmanは割と手軽で良い
- 874 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 15:22:13.51 ID:neWsPxIF.net]
- いや、プラットフォーム固有って言ったのは
Microsoft Learn(旧MSDN)とかApple Developerとかのことやぞ
- 875 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 16:05:28.79 ID:neWsPxIF.net]
- 安価忘れてた、>>872ね
複数の情報源持つべきとかは同意するけど プラットフォーム固有のは公式が一番信用できるに決まってる(ただMicrosoftのは機械翻訳になってから日本語版がアレだけど・・・)
- 876 名前:デフォルトの名無しさん [2024/07/21(日) 19:10:23.03 ID:5YGWxq2c.net]
- >>871
>>872 ありがとうございます。 やっぱ、ググって調べるのが一番なんですね。 ただ、C++と言いつつほぼCの内容で紹介してて本でやってる課題とこの関数の使い方知りたいでなんか食い違いあったんですがここわかりやすそうなので助かります。
- 877 名前:デフォルトの名無しさん [2024/07/21(日) 21:04:50.60 ID:D0FAs2Ah.net]
- cpprefjpはなんかTシャツ作るらしいから記念に買うわ
https://github.com/cpprefjp/site/issues/1296
- 878 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 21:06:26.85 ID:neWsPxIF.net]
- 手元に置いておく辞典系の本があっても良いと思うけどちょっとお勧めできるものを知らない・・(C++11より前のものしか買ったことない)
秋葉原とかの技術系の書店で手に取って読んでみるのがベストなんだけどねぇ
- 879 名前:デフォルトの名無しさん [2024/07/23(火) 01:20:07.66 ID:Rfg4Mjqa.net]
- >>877
誰得
- 880 名前:デフォルトの名無しさん mailto:sage [2024/07/25(木) 15:13:06.50 ID:kulC2cnH.net]
- >>879
1万円くらいで転売しようと考えています
- 881 名前:デフォルトの名無しさん mailto:sage [2024/07/29(月) 05:00:32.70 ID:ycfafYuZ.net]
- >>871の
https://cpprefjp.github.io/ 、単発寄付が、簡単にできたらなーと、惜しくなった。
- 882 名前:デフォルトの名無しさん mailto:sage [2024/08/01(木) 04:44:09.33 ID:ZgmEa4OS.net]
- unordered_map の extract というのはC++17以降でしか使えないのですか
- 883 名前:デフォルトの名無しさん mailto:sage [2024/08/01(木) 09:34:34.68 ID:jWmufzw0.net]
- >>882
https://cpprefjp.github.io/reference/unordered_map/unordered_map.html 対応バージョンがC++17ってなってるね
- 884 名前:デフォルトの名無しさん mailto:sage [2024/08/02(金) 22:37:31.58 ID:8YStqjv0.net]
- ここでGoogleTestの質問をしてもよろしいでしょうか?
- 885 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 12:54:37.69 ID:jHE0rxct.net]
- 質問なのですが派生とshared_ptr<T>を組み合わせたときに、
class Base { int m_x; protected: // Baseクラスのコンストラクタはprotected Base(int x) : m_x(x) { } virtual ~Base() { } // 仮想関数にしてもしなくても同じ下記現象 }; class Derived { public: // 派生クラスのコンストラクタはpublic Derived() : Base(10) { } }; std::shared_ptr<Base> pBase(new Derived()); とやったら error C2248: 'Base::~Base': protected メンバー (クラス 'Base' で宣言されている) にアクセスできません。 と言われるんだけどなんで?その判定要る??
- 886 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 12:56:00.59 ID:jHE0rxct.net]
- 自己解決しますた
文句が言われているのはBaseのコンストラクタでは無くてデストラクタか……orz
- 887 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 14:08:27.06 ID:dHG4OJIq.net]
- 本当に解決したの?
それDerivedがBaseを継承していないよ?
- 888 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 15:33:06.74 ID:jHE0rxct.net]
- あっはい
class Base { int m_x; protected: // Baseクラスのコンストラクタはprotected Base(int x) : m_x(x) { } pulic: // Baseのデストラクタをpublicに修正 // (1) virtual ~Base() { } }; class Derived : public Base { // 誤記訂正 // (2) public: // 派生クラスのコンストラクタはpublic Derived() : Base(10) { } }; std::shared_ptr<Base> pBase(new Derived()); // (3) (1)で解決、(2)は誤記訂正 文句言われたのがBaseのコンストラクタだとすると(3)においてDerivedのインスタンスがshared_ptr<Base>に渡される時点で呼び出し済なので
- 889 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 15:35:40.71 ID:jHE0rxct.net]
- (3)でコンパイルエラーになるのは辻褄があわなくね?!と思った次第
文句言われたのがBaseのデストラクタだったからだいたい理解すた (std::shared_ptr<Base>はあくまでBaseしか知らないから、Base::~Base()がpublicでなかったら 呼べないという解釈でエラーにするのは当然な可能性
- 890 名前:デフォルトの名無しさん mailto:sage [2024/08/05(月) 09:26:19.70 ID:SHyTm/CM.net]
- std::unordered_map<std::string, std::unique_ptr<int>> map があった時のmapの管理について
教えてください この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は foo = std::move(map["hoge"]); としないといけない? で、moveしたあとは hogeに対する値は無効になっちゃってますよね。ということは 自分で消さないといけない? map.erase("hoo")とかで
- 891 名前:デフォルトの名無しさん mailto:sage [2024/08/05(月) 12:50:07.44 ID:Gb5pye15.net]
- >>890
>この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は >foo = std::move(map["hoge"]); としないといけない? 「値を取り出す」をどういう意味で使っているかによる 単に中身を読むだけならmoveしなくても良い
- 892 名前:はちみつ餃子 mailto:sage [2024/08/05(月) 12:51:26.12 ID:cmuXon6W.net]
- >>890
その考え方で正しい。 std::unique_ptr をムーブすると抜け殻のほうのオブジェクトは nullptr を指すようになることは保証されるが、 そのスマートポインタ自体が std::unordered_map から勝手に消えたりはしない。 消えて欲しいならそのための操作は必要。
- 893 名前:はちみつ餃子 mailto:sage [2024/08/05(月) 12:53:54.43 ID:cmuXon6W.net]
- std::unique_ptr 自体はコピーできないがそれが指しているオブジェクトを読むだけなら出来るしコピーすることも出来る (コピーコンストラクタを削除していないなら) 。
- 894 名前:デフォルトの名無しさん mailto:sage [2024/08/06(火) 11:13:46.48 ID:SBxTyrdX.net]
- Rust使おうず
- 895 名前:デフォルトの名無しさん [2024/08/06(火) 12:55:07.35 ID:7fXoqzm8.net]
- いらね
- 896 名前:デフォルトの名無しさん [2024/08/12(月) 00:31:08.71 ID:YAf3BhD8.net]
- 標準講座C++―基礎からSTLを利用したプログラミングまで 新装版 ハーバート シルト著が気になったのですがこれで勉強したことある方いますか?
- 897 名前:はちみつ餃子 mailto:sage [2024/08/12(月) 01:07:19.65 ID:CLy07uUA.net]
- >>896
読んだことは無いけど 2009 年発売ってのは微妙な部分かもと思う。 2011 年の言語仕様改定がインパクトの強い変更を含んでいて基本的な書き方の習慣に大きな変化があった。 そこらへんの事情が含まれない本だと現状にそぐわない。
- 898 名前:デフォルトの名無しさん mailto:sage [2024/08/12(月) 03:05:00.33 ID:LOlm/bL8.net]
- weak_ptrが処理の途中で解放されてしまうのを防ぐために lock()を呼んでshared_ptrを
取得してから処理、というのがありますが、 lock()を呼んだ時点で既に解放されていることもあるわけですよね? 確かにlock()の戻り値をチェックして不正な呼び出し等を防げるのはありがたいのですが、 そもそもオブジェクトが既に解放されているのは残念といいますか。 lock()を呼んでからする処理の場所に来るまでに解放されないようにしたい、と思った場合、 どうしたらよいのでしょうか? もしかしてそもそもweak_ptrを使うな、ということになります?
- 899 名前:デフォルトの名無しさん mailto:sage [2024/08/12(月) 03:59:48.65 ID:ArETDaeV.net]
- あいまいな言葉よりコード見せてみ
- 900 名前:デフォルトの名無しさん [2024/08/12(月) 08:49:28.44 ID:+jMHtzbv.net]
- 既に寿命が切れてる場合はlock() が無効な shared_ptr を返すのでそれで判定する
lock() を呼んだ後は戻り値の shared_ptr が寿命を伸ばすので問題ない shared_ptrは「有効なshared_ptrが1つ以上ある間はオブジェクトの寿命が消えない」ものなので、lock() が返すshared_ptrを保持してる間は消えないよ lockを「weak_ptrからshared_ptrへの昇格を試みる」ものと考えても良い lockしたい箇所の時点で必ずオブジェクトが生きていて欲しいなら、それはweak_ptrでなくshared_ptrを使うべき
- 901 名前:デフォルトの名無しさん mailto:sage [2024/08/12(月) 10:20:21.64 ID:Lq53CINI.net]
- >>896
2000年くらいにSTLはこれで勉強したよ 基本的なことは網羅されているが C++の新しい仕様には対応してないので 別途学習すべし いまもっと良い本があるかは分からない C++の仕様は建て増しなので この本に書かれていることは無意味ではない
- 902 名前:デフォルトの名無しさん [2024/08/12(月) 13:09:35.61 ID:XQ/hRBSk.net]
- キメラ
- 903 名前:デフォルトの名無しさん [2024/08/12(月) 16:00:24.68 ID:K9Aw1MHl.net]
- 超初心者とは何なのか・・・
- 904 名前:デフォルトの名無しさん [2024/08/13(火) 01:12:06.02 ID:sOEG0OlC.net]
- >>897>>901
返答ありがとうございます。 今同著者の別の本で勉強中ですが基本的なところでこれも買っとこうかな?って質問しました。 基本参考書として買ってみます。 基礎的なところ終わったら自分が作りたいプログラムに必要な現状の本でも買ってみます。
- 905 名前:デフォルトの名無しさん [2024/08/13(火) 01:32:59.16 ID:sOEG0OlC.net]
- すいません。誰か下のコンパイルオプションわかる方いますか?
解いてた問題の解答にも文字化けするって書いてあったので文字化け対策のオプションなんかないかな?って思って調べたらこのオプションで解決できるって出てたので使ってた人の入力例そのままオプション挿入してみてちゃんと解決できたから気になって調べたんですがググっても出てこなくて入力例が次の行のやつです。 g++ test.cpp -finput-charset=CP932 -fexec-charset=CP932 -finput-charset -fexec-charset
- 906 名前:デフォルトの名無しさん mailto:sage [2024/08/13(火) 02:09:15.07 ID:sAvdrrrS.net]
- >>905
https://www.google.com/search?q=%22-finput-charset%22
- 907 名前:デフォルトの名無しさん [2024/08/13(火) 07:27:51.38 ID:8FMmWnXe.net]
- ああなるほど、意図せずマイナス検索状態になってたから一件もヒットしなかったってことか
あるある
- 908 名前:デフォルトの名無しさん mailto:sage [2024/08/13(火) 08:43:34.22 ID:6ajF2Nvb.net]
- >>896
シルトは有名 ロベールも有名だったけど、 C++11 に対応していないので古い STL標準講座、1999年 ハーバート・シルト 著 επιστημη(エピステーメー) 監修 この本も古い。 確か、エピステーメーはC++ の標準化委員だっけ? C++テンプレートテクニック―簡潔で再利用しやすいコードのためのC++活用術 επιστημη/高橋 晶【著】、2009 独習C++ 新版、2019/11 高橋 航平 (著), επιστημη(エピステーメー) (監修)
- 909 名前:デフォルトの名無しさん [2024/08/13(火) 12:38:43.84 ID:sOEG0OlC.net]
- >>906>>907
ありがとうございます てか、検索でそういうことあるんですね
- 910 名前:デフォルトの名無しさん mailto:sage [2024/08/13(火) 12:57:30.56 ID:lcpgo4xV.net]
- >>900
了解です、どうもありがとうございます >>899 一般的なことを知りたかっただけなので
- 911 名前:デフォルトの名無しさん [2024/08/14(水) 09:51:50.71 ID:UePmitOB.net]
- 変数名の付け方について教えてくだち
Objectの個数、とかは nobjs とか objcnt (類例: argc)とかは本に載っていてそれぞれ nobjs --- number of objects の短縮表記 objcnt --- object count の短縮表記(名詞obuectが形容詞的活用 となって対応する同じ語順の英語表現がある気がするのですが <limit.h> の INT_MAX、INT_MIN はmaxやminがなぜ後置? 何の短縮形? minやmaxの後置と前置の使い分けとは一体……
- 912 名前:はちみつ餃子 mailto:sage [2024/08/14(水) 10:32:46.90 ID:z6gmNdON.net]
- >>911
C は一貫した名付規約 (naming convention) を定めていないし、主要な処理系が持っていたものを追認する形で仕様に入ることもよくあるので起源ごとに名前の方式は異なる。 慣例はおおよそ踏襲されるのでもし新しい整数型が追加されたらそれの最大・最小値は同じような名前で表されると思うけれど全体を通したルールはない。
- 913 名前:デフォルトの名無しさん [2024/08/14(水) 11:43:42.69 ID:gAudIBvM.net]
- MIN_LONG, MIN_SHORT, MIN_USHORT だとmin まで同じで探しにくい
INT_MAXだとINT_ まで打てばコード補完できるけど、逆の語順だとMAX_ まで打った際に各型の候補がズラーっと並ぶことになる 当時は高級なエディタは無いし、多分そんな意図で命名してないと思うけど 、便利と言えば便利 意味を考えるならそれは max of int でなく、intという空間におけるmaxという値 (言語によってはint.max と書くような値) と考えると良いと思う
- 914 名前:デフォルトの名無しさん mailto:sage [2024/08/14(水) 13:14:34.06 ID:+mepCwPn.net]
- C++ならstd::numeric_limits使おうよ
- 915 名前:デフォルトの名無しさん [2024/08/14(水) 13:42:54.01 ID:UePmitOB.net]
- >>912
>全体を通したルールはない。 えええええええ…… 迷える子羊は一体どうしたら……orz >>914 それはそうかもしれんが std::numeric_limits<double>::min()ではなくてstd::numeric_limits<double>::lowest()なのがイマイチなカンジ あと while ((*p <= CHAR_MAX && isspace(*p)) { p++; } とかのときは<limits.h>のがお似合いに思える……
- 916 名前:デフォルトの名無しさん mailto:sage [2024/08/14(水) 13:49:52.66 ID:NvgdlQi4.net]
- 些細なことにこだわんな
複数人で開発してる以上そういう揺れはどうしても起こり得る 受け入れて先行け
- 917 名前:デフォルトの名無しさん mailto:sage [2024/08/14(水) 14:35:57.51 ID:uvjb8yy0.net]
- object count, count number of object
integer maximum, maximum of integer …同じじゃね?
- 918 名前:はちみつ餃子 mailto:sage [2024/08/14(水) 15:32:03.62 ID:z6gmNdON.net]
- 全体を通した名前の指針としてはマクロは大文字でそれ以外は小文字 (スネークケース) ってくらいかなぁ。
関数形式のマクロは小文字なのもあったりと例外はいくらかあるけども。
- 919 名前:デフォルトの名無しさん mailto:sage [2024/08/14(水) 21:18:49.93 ID:uPunKI9P.net]
- 今ってクラス名とか割とキャメルケースじゃないですか? DocumentWindowみたいな
一方でC++自体は小文字とアンダースコアで でも意外とちぐはぐな感じはない。むしろ予約語、システム的なものは小文字で ユーザー定義のものと分離されていていい感じ?
- 920 名前:はちみつ餃子 mailto:sage [2024/08/14(水) 22:08:58.60 ID:z6gmNdON.net]
- >>919
C++ の大元の設計者である Stroustrup は言語の技術的な詳細 (文法上の役割?) を名前に埋め込むことを嫌がってる。 https://www.stroustrup.com/bs_faq2.html#Hungarian クラスだから、ユーザ定義だからという区別を名前に入れるべきじゃないという考え方を取ってるわけ。 その一方で言語としての縛りは入れないという方針も著書に書いてある。 思うところはありつつも個々の場面は言語ユーザの判断にゆだねるってことだね。 C++ は C++ だけで完結するわけじゃなくて色んなシステムと接続することもあるからその都合に合わさないといけないこともあるだろうし。 たとえば Windows だと多くの API がキャメルケースなわけで。 私自身にはクラス名をキャメルケースにするのはちぐはぐに見えている。 でも出自が違うライブラリを組み合わせるならそういうこともしょうがないとも思ってる。
- 921 名前:デフォルトの名無しさん [2024/08/14(水) 22:31:40.03 ID:gAudIBvM.net]
- クラスや変数名に異なる命名を敵用するといった考え方が出てきたのがおそらC++登場の後だから仕方ないという感じ
C++は他の言語ほどには統一されたルールはない 自分は個人的に以下のルールを採用してる おそらくPythonやRustあたりのルールに近い ・型の名前 (クラス、構造体、enum) は PascalCase ・変数と関数名は lower_snake_case ・定数とマクロは UPPER_SNAKE_CASE ・クラスのメンバー変数は value_ のように末尾にアンダースコアを付ける ・構造体のメンバーはアンダースコアなし (変数と同じ) 上記もあくまで個人的な意見に過ぎないので、プロジェクトの方針があるならそれに合わせるのが良いと思う あと基本的な命名ルールも言語によって変わるので、その言語内に慣習やルールがあるならそれも見ておくと良いと思う 例えばC#はメソッドを PascalCase にするなど、上記とは異なる慣習がある
- 922 名前:デフォルトの名無しさん [2024/08/14(水) 22:37:11.57 ID:gAudIBvM.net]
- 標準ライブラリは型が lower_snake なんだけどね
(std::string とか std::vectorとか) 自作型をこれに合わせるかは好みの域を出ない気がする 自分は型と関数で区別付けたいから PascalCaseにしてます (例. class MyData; enum MyEnum)
- 923 名前:デフォルトの名無しさん [2024/08/14(水) 22:37:12.21 ID:gAudIBvM.net]
- 標準ライブラリは型が lower_snake なんだけどね
(std::string とか std::vectorとか) 自作型をこれに合わせるかは好みの域を出ない気がする 自分は型と関数で区別付けたいから PascalCaseにしてます (例. class MyData; enum MyEnum)
- 924 名前:デフォルトの名無しさん [2024/08/18(日) 12:06:41.90 ID:BK0va+Po.net]
- iostreamとか糞やん
- 925 名前:デフォルトの名無しさん mailto:sage [2024/08/23(金) 00:25:52.73 ID:Vi8prHau.net]
- はちみつ先生の中の人ってエピステーメー氏じゃないですか。
- 926 名前:デフォルトの名無しさん mailto:sage [2024/08/23(金) 12:18:20.78 ID:x07V73qD.net]
- そなの? 何で?
- 927 名前:デフォルトの名無しさん mailto:sage [2024/08/23(金) 23:55:05.93 ID:Vi8prHau.net]
- エピ氏はかつて標準化委員だったそうです。はちみつ先生は、規格書が完全に頭に入ってる感じですから委員経験者と見ても違和感ない。
スレ民に委員がいるという話もあります。 あと前に「~じゃろ」ってレスを一度だけ見たのですが、それがエピ氏風に思えました。
- 928 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 00:19:56.05 ID:czb9YTjo.net]
- なるほどー
証拠としては足りないと思うけども矛盾はしない はちみつ氏と対立する立場で議論したことがあるけども エピ氏だとしたら感慨深い STL標準講座で勉強した世代だし
- 929 名前:デフォルトの名無しさん mailto:sage [2024/08/25(日) 00:23:17.55 ID:zZ+WMAII.net]
- >>925
私は個人的なことは書かないようにしているし書いている場合でも嘘を混ぜているのだけれどプロのプログラマではないのは本当だと断言する。 肯定も否定もしたくないんだけど変に誰かと混同されるとその人に迷惑がかかるかもしれないからはっきりさせておく。 私はプログラムなりプログラミングの解説なりで金を貰ったことは全くない素人で、名の知られた人物ではない。 アマチュアなりになんらかの分野で有名だったりもしない。 >>927 規格が頭に入ってるわけないでしょ。 毎回調べてる。 プログラムの設計の妥当性などについては議論を戦わせればよいと思うけど今ある規格がどうなってるかは規格を調べるしかない。 それなのに空想で議論するような馬鹿馬鹿しいことがちょくちょく起こってるから話を先に進めたくて規格を持ち出してるだけ。
- 930 名前:はちみつ餃子 mailto:sage [2024/08/25(日) 00:54:19.91 ID:zZ+WMAII.net]
- 名前が抜けてた。 >>929 は私ね。
JaneXeno で書き込めなくてウェブブラウザから書き込んだらミスった。
- 931 名前:デフォルトの名無しさん [2024/08/25(日) 18:28:51.25 ID:uK1NQ0Uz.net]
- 質問です。参考書に乗ってた例試してたんですが下のコードがどういう動作してるのかよくわかりません。実行したらif(argc !=2)のところのコメント表示しかされませんでした。
#include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { if(argc !=2) { cout <<"使い方: WRITE <ファイル名>\n"; return 1; } ofstream out(argv[1]); if(!out) { cout <<"出力ファイルが開けません\n"; return 1; } char str[80]; cout << "文字列をディスクに書き込み、$で停止します\n"; do { cout << ": "; cin >> str; out << str << endl; }while(*str !='$'); out.close(); return 0; }
- 932 名前:デフォルトの名無しさん mailto:sage [2024/08/25(日) 18:44:55.52 ID:tzsbYjlF.net]
- >>931
https://www.google.com/search?q=main+argc
- 933 名前:デフォルトの名無しさん [2024/08/25(日) 23:27:35.25 ID:uK1NQ0Uz.net]
- >>932
返信ありがとうございます。 mainのところがコマンドライン実行用のものだとわかったのですがif(argc !=2)だけが実行されて char str[80]の一行下のコメントまで行かないで実行終わってるのでそこがどうなってるのかよくわかってません。
- 934 名前:934 [2024/08/26(月) 00:51:12.62 ID:Lf2Vflpz.net]
- 参考書に載ってるからまさかと思ったんですが>>931のコードってif文のreturnで強制終了させられてるってことですよね?
ちょっと気になってif文のところコメントアウトして動かしてみたらdo while文のところまで動いてたからif(argc !=2)の説明文表示しておいてがreturn 1で返してmainのところが終了させてるのかというのであってますか? しかも出力ファイル検出用のif文のところも絶対に入る形になっちゃってるみたいなので説明文はdo while文の入力で出力ファイル指定してね。みたいな文章ついているんですが例として出てるのに欠陥あるコードという認識でよろしいのでしょうか?
- 935 名前:934 [2024/08/26(月) 01:02:13.28 ID:Lf2Vflpz.net]
- 自己解決しました。
今回の例って実行時に一緒に書き込みファイル名入力するだけだったのを気付いてなかっただけでした。
- 936 名前:デフォルトの名無しさん mailto:sage [2024/08/26(月) 09:03:23.80 ID:Nzy9klFi.net]
- せっかく>>932がキーワードで検索してるのに「自己解決」かよ
- 937 名前:デフォルトの名無しさん mailto:sage [2024/08/26(月) 09:15:40.09 ID:y+gYSKWx.net]
- 超初心者スレでそんな回りくどい指摘で理解しろというほうが厳しいのでは
- 938 名前:デフォルトの名無しさん mailto:sage [2024/08/26(月) 09:42:05.98 ID:B88aYAlq.net]
- >>931
「よくわかりません」というのは質問になっていません。 何がわからないのかが伝わるようにまとめてください。 結果からすると argc や argv がコマンドラインから渡されるものだということがわかっていなかったようですが、質問一般のやり方としては「こうなると理解している」「でも実際にはこうなった」という形にすると伝わりやすいと思います。 質問を整理する過程で答えが分かってしまうのもよくあることです。 (ラバーダック・デバッグ) それと参考書を元にしている場合は参考書のタイトルを書くのが望ましいです。 もしその本を持っている人がいたら前後の文脈からより適切な回答をできますし、同じ疑問をもった人がウェブ検索でここにたどり着くことが出来るかもしれないからです。 と、超初心者スレらしく質問の仕方の基本を書いておきます。
- 939 名前:デフォルトの名無しさん mailto:sage [2024/08/26(月) 10:49:37.17 ID:3+7ACU+U.net]
- !=2 よりも < 2 派は少数派?
- 940 名前:デフォルトの名無しさん [2024/08/26(月) 15:31:48.06 ID:cZUTj8Xv.net]
- !=2のほうが安全よね
引数が2つ以上渡された場合、ユーザーが引数の意味を勘違いしている可能性があるので第1引数をファイル名として扱うのは危険かもしれない
- 941 名前:デフォルトの名無しさん mailto:sage [2024/08/26(月) 18:34:12.28 ID:vEMD05Dv.net]
- まんこまんこー まんこまんこー まんこまんこー 君にまんこまんこー
- 942 名前:デフォルトの名無しさん [2024/08/26(月) 18:43:51.64 ID:FhzwHLyM.net]
- 萬恋次郎
よろずれんじろう
- 943 名前:デフォルトの名無しさん mailto:sage [2024/08/28(水) 10:09:54.84 ID:W2AehnGr.net]
- 一つや無しでも許容するかしないかの違い
- 944 名前:1 mailto:sage [2024/10/08(火) 08:50:18.94 ID:EX5jdZbuX]
- 5ちゃんねるの方は削除されてるから、ここだけ生き延びてる。
ここ有効活用しようぜ。
- 945 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 09:32:10.21 ID:Pp2f7Vup.net]
- すみません、std::atomic<bool> m_added = false; というインスタンス変数がある
クラスで bool isAdded() { return m_added; } というメンバ関数を作ると error: use of deleted function 'std::atomic<bool>::atomic(const std::atomic<bool>&)' というエラーになってしまいます。なぜこんなことに? ググると return m_added.load(); とすればよさげで、実際エラーにはならなくなりますが これで合っていますでしょうか?
- 946 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 10:21:38.62 ID:G3xxa4mJ.net]
- >>945
それは std::atomic<bool> という型であって、bool型ではないから。 load()でboolに変換されているということだね。
- 947 名前:はちみつ餃子 mailto:sage [2024/10/29(火) 11:42:59.70 ID:IsdOq2r9.net]
- >>945
インスタンス変数って何? 文脈から推測するとデータメンバのことかな? だとするとこんな感じのことだと思って説明するよ。 class foo { std::atomic<bool> m_added = false; public: bool isAdded() { return m_added; } }; こういう書き方だと std::atomic<bool> m_added = false; はコピー初期化という扱いになる。 なのでコピーコンストラクタが必要だが std::atomic にはコピーコンストラクタが無いのでコピーコンストラクタがないという旨がエラーメッセージとして表示される。 解決方法としてはメンバ初期化子リストで初期化すればいい。 これなら直接初期化の扱いになる。 class foo { std::atomic<bool> m_added; public: foo(void) : m_added(false) {} bool isAdded() { return m_added.load(); } }; C++17 以降だとコピー省略が保証される (かつコピーコンストラクタの存在を要求しない) 場面なので C++17 以降を使うのなら修正は必要ない。 std::atomic<T> には operator T() があるので std::atomic<bool> から bool へは変換できて、そのときの効果は std::atomic<bool>::load を呼び出すのと同じ。 暗黙に変換するのでこの部分は本来なら問題ないはず。 ここを修正してエラーが出なくなったというのは何か誤解してると思う。
- 948 名前:949 mailto:sage [2024/10/29(火) 21:08:49.76 ID:DeRlzLOn.net]
- すみません、色々勘違いやら説明不足やらあるようです。あと用語もいろいろと。
まず std::atomic<bool> m_added = false; という初期化ですが、 自分の環境はC++17(のはず)なので、これは大丈夫だったようです
- 949 名前:949 mailto:sage [2024/10/29(火) 21:14:42.30 ID:DeRlzLOn.net]
- で、本当の問題は、condition_variable::wait_for()の述語バージョンのコードでして
諸般の事情でネットから拾ってきたコードを一部変更して書きますと(たぶんインデントが 壊れますが、ご了承ください) #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono> #include <atomic> std::mutex mtx; std::condition_variable cv; std::atomic<bool> ready = false; void wait_for_event() { std::unique_lock<std::mutex> lock(mtx); cv.wait_for(lock, std::chrono::seconds(3), []{ return ready; }); std::cout << "Event occurred or timeout reached" << std::endl; } int main(void) { std::thread worker(wait_for_event); worker.join(); return 0; }
- 950 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 21:15:37.83 ID:oxmgzCly.net]
- volatileが廃止されてatomicになったんだっけ?
- 951 名前:949 mailto:sage [2024/10/29(火) 21:19:59.00 ID:DeRlzLOn.net]
- この、述語部分のラムダ式で return ready; とするとコピーが発生するのでatomic的に
まずい(それをコピーコンストラクタをdeleteすることで実現している)、という理解です で、ではどうしたらいいかという話に
- 952 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 21:25:03.73 ID:DeRlzLOn.net]
- うわ、名前の>>947は間違いです、>>945でした、ごめんなさい
- 953 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 21:37:22.02 ID:vJbaxs/e.net]
- 述語の戻り値型にboolを明示的に指定すればおk
- 954 名前:はちみつ餃子 mailto:sage [2024/10/30(水) 07:03:45.19 ID:o3z0lAnP.net]
- >>949
ラムダ式の返却値の型は省略すると return に与えた式から推論され、推論結果は参照にはならない。 つまり []{ return ready; } は []->std::atomic<bool>{ return ready; } と書いたのと同じということ。 これだと値を返すときにコピーが発生するのでコピーコンストラクタが必要 (だけど実際には無い) ということになってしまう。 解決方法としては load を呼ぶというのは妥当な方法のひとつだけど、 返却値として bool を明示する、つまり []->bool { return ready; } とするのでもよいし、 キャストを書いて [] { return static_cast<bool>(ready); } というようにするのでも良い。 見栄えからすると [] { return bool(ready); } のほうが綺麗かな?
- 955 名前:はちみつ餃子 mailto:sage [2024/10/30(水) 15:17:53.47 ID:o3z0lAnP.net]
- 色々と書いたけど、この場合について言えば変換に頼るよりは load を呼んだほうが意図が読み取りやすくて良いと思う。
|

|