0からの、超初心者C++相談室
1 :デフォルトの名無しさん :2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net 何にも知らない0からの出発、超初心者のためのC++相談室
668 :デフォルトの名無しさん :2023/11/26(日) 21:48:36.05 ID:Dy8SO9u0.net >>666 一応マイクロソフトのリファレンスは正式だと思うが まあマイクロソフト独自の規格ってなるのだろうけどな あんなもんは認めないというのなら仕方あるまい
669 :デフォルトの名無しさん :2023/11/26(日) 21:52:47.74 ID:DTfcWvWZ.net >>660 >仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど…… >原則としては C++ 用語ではないと考えて良いと思う。 >クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので >方向をアップ/ダウンで言うのもおかしな話だし。 upcastとdowncastって一般名詞なのではないかな?
670 :デフォルトの名無しさん :2023/11/26(日) 21:57:36.24 ID:mssmbX4x.net >>668 デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない
671 :デフォルトの名無しさん :2023/11/26(日) 22:15:54.01 ID:Dy8SO9u0.net >>670 デファクトスタンダード それだ 大正解
672 :はちみつ餃子 ◆8X2XSCHEME :2023/11/26(日) 23:34:44.38 ID:k38CbPq9.net 言語仕様の説明をするときには >>667 のようなバリエーションの内のどれのことを言っているかで 事情が変わってくるので結局は具体的な場合を示さなければならず、 「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。 (より詳細な場合分けをするので用語を使う機会がない。) 逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは 充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。 どうせ説明を付け足すなら用語の甲斐がないので 使う意味もそんなにないように思う。 念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので そうではない状況で文脈を共有できていて 「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。
673 :デフォルトの名無しさん :2023/11/27(月) 04:54:45.36 ID:tiJqQBXv.net オナニー解答
674 :デフォルトの名無しさん :2023/11/27(月) 08:10:08.19 ID:8c8BDf1i.net 相変わらずはちみちはめんどくせーな
675 :デフォルトの名無しさん :2023/11/27(月) 09:35:39.43 ID:7/k6/GSg.net >>648 違う言語で比較するときはそういう用語の使い方になるケースが多いと感じる 「學んでいない」のとはまた別の問題だと思う
676 :デフォルトの名無しさん :2023/11/27(月) 09:39:16.20 ID:7/k6/GSg.net >>653 あいつは學校行ってないかも知れないな なんでも試行錯誤で 挙句ChatGPTが完璧に教えてくれると勘違いしている 救えない
677 :デフォルトの名無しさん :2023/11/27(月) 09:41:27.50 ID:7/k6/GSg.net >>659 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
678 :デフォルトの名無しさん :2023/11/27(月) 09:52:51.04 ID:7/k6/GSg.net >>672-674 アスペ臭を感じる
679 :デフォルトの名無しさん :2023/11/27(月) 14:40:19.25 ID:UqO8a829.net アスペルガー症候群だって良いじゃないか? 何で差別的なことを書くのかね?
680 :デフォルトの名無しさん :2023/11/28(火) 00:01:54.69 ID:5UazaCro.net クラス内からのみ参照する定数配列のベストな書き方を模索しています。 まず 1、constメンバ変数にする方法。ヘッダに書くだけで手軽だが、オブジェクト生成のたびに領域が取られてしまい資源浪費。 2、staticメンバにする方法。 .h static const int TABLE[3]; .cpp const int TABLE[3]={1,2,3}; エラー。ほかに、{1,2,3}の場所をhに移動してみたりしたがすべてエラーになり断念。 3、cppにのみに書きhには書かない。 .cpp const int TABLE[3]={1,2,3}; エラーにならず良好。ただこれだとクラス無関係のC風の書き方なので、別の翻訳単位とよ間で名前の衝突が起きうる? 名前の衝突なく、メモリ占有はただ一個で、資源節約につながるならconstexprも活用したい。ベストな書き方はどうなりますか。 constexprは上のconstを置き換えて試しましたが2ではエラー解消せずでした。
681 :デフォルトの名無しさん :2023/11/28(火) 00:04:59.65 ID:5UazaCro.net 2のcppは const int クラス名::TABLE[3]={1,2,3}; も試したはずですがエラー解消しませんでした。
682 :デフォルトの名無しさん :2023/11/28(火) 00:37:23.98 ID:dISnZSIc.net 2で通るはずだけどなぁ・・・ヘッダインクルードしてないとか?はさすがに無いか あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)
683 :デフォルトの名無しさん :2023/11/28(火) 01:08:09.85 ID:dISnZSIc.net あ、ごめん2で通るはずってのはcpp側がクラス名::TABLEの場合
684 :デフォルトの名無しさん :2023/11/28(火) 06:02:30.27 ID:fb4KLmhh.net 2、staticメンバにする方法。 .h static const int TABLE[3]={1,2,3}; .cpp extern const int TABLE[3]; もれはやらんけど
685 :デフォルトの名無しさん :2023/11/28(火) 06:13:38.37 ID:fb4KLmhh.net あ、ごめん逆だった .cpp static const int TABLE[3]={1,2,3}; .h extern const int TABLE[3];
686 :デフォルトの名無しさん :2023/11/28(火) 10:21:56.36 ID:tbacT9e+.net >>681 これは通るだろ? コンパイラは何よ?
687 :はちみつ餃子 ◆8X2XSCHEME :2023/11/28(火) 10:25:57.66 ID:mRTkdYl9.net >>681 出来なかったというコードをそのまま提示して欲しい。 状況がよくわからないのに想像で対処法を考えてもしょうがない。 コードがちょっと長くなるなら codetter とか wandbox とか ideone とかを使って。
688 :デフォルトの名無しさん :2023/11/28(火) 10:27:57.27 ID:vcMwjchf.net クラス内の定数を外部に生出しとかしないから enunとかで宣言はするけど 何番目が欲しいとかはサービス関数作るしなぁ
689 :デフォルトの名無しさん :2023/11/28(火) 10:30:15.59 ID:vcMwjchf.net つか、static宣言の内部でしか使わないものを何でヘッダーファイルに書くの?
690 :デフォルトの名無しさん :2023/11/28(火) 10:32:49.40 ID:vcMwjchf.net ヘッダーファイルはクラスコードの名刺みたいなもんで 外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ
691 :デフォルトの名無しさん :2023/11/28(火) 10:35:09.02 ID:vcMwjchf.net マジックナンバー避ける為に#defineするとかも、cpp側の先頭に書くと、全ビルドしなくて済むしな
692 :デフォルトの名無しさん :2023/11/28(火) 11:07:40.67 ID:t7+ip2Xg.net >>689 staticには複数の意味がある >>680 の発想は h に static 描いてみたら「たまたま」エラーが消えたら ok みたいなやり方なんだろ
693 :デフォルトの名無しさん :2023/11/28(火) 11:35:51.07 ID:vcMwjchf.net >>692 staticより「内部でしか使わない」って話の方を拾ってね
694 :デフォルトの名無しさん :2023/11/28(火) 12:43:41.53 ID:dISnZSIc.net >>693 質問者は「クラス内からのみ参照する」って言ってただろ
695 :デフォルトの名無しさん :2023/11/28(火) 18:17:05.00 ID:vcMwjchf.net >>694 それならヘッダーファイルに書く必要無いやんけw
696 :デフォルトの名無しさん :2023/11/28(火) 18:50:50.78 ID:dISnZSIc.net そら綺麗に一つのcppに全部そのクラスの実装を切り分けてるならcpp内にstaticでいいだろうけどね
697 :デフォルトの名無しさん :2023/11/28(火) 20:09:09.84 ID:vcMwjchf.net そんな巨大なクラスは設計が間違ってないか?
698 :デフォルトの名無しさん :2023/11/28(火) 20:12:44.23 ID:bqHRuT95.net >>677 > 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される それなw 初心者ほどこの用語を使ってるように見える 初心者が集まるところでこれを流布してるやつがおるんやろな ポインタへのポインタっていうスケーラブルな定義が理解できてなくて アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな
699 :はちみつ餃子 ◆8X2XSCHEME :2023/11/28(火) 20:20:10.37 ID:mRTkdYl9.net >>697 この >>696 の言は逆のことを言ってると思う。 ひとつの翻訳単位にたくさんのクラス (の実装部分) を書くこともあるから ファイルスコープにしたらスコープの範囲が広すぎる (制限にならん) やんけと言ってるように読める。
700 :デフォルトの名無しさん :2023/11/28(火) 20:27:35.33 ID:dISnZSIc.net >>697 巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど) 例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ
701 :デフォルトの名無しさん :2023/11/28(火) 20:29:47.21 ID:dISnZSIc.net >>699 もちろんそれもある
702 :デフォルトの名無しさん :2023/11/28(火) 20:57:18.00 ID:dISnZSIc.net まぁどれを選ぶかは本人の都合だけど、クラス定義の中にprivateで書くのが自然っちゃ自然な希ガス
703 :デフォルトの名無しさん :2023/11/28(火) 21:00:29.03 ID:HOP5xTTo.net >例えばクラステンプレートになると、ソースに実装を書けないから C++の設計ミスだな 特にテンプレ
704 :デフォルトの名無しさん :2023/11/28(火) 21:55:43.79 ID:vcMwjchf.net テンプレートは単なる#defineだからなぁ あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ
705 :はちみつ餃子 :2023/11/28(火) 22:43:12.61 ID:mRTkdYl9.net 一応はモジュールの概念の導入でちょっと良くなっているはずだが皆でこぞって移行するってほどには全然なってないからそこまで魅力的とは思われてないんやろね。 従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。 コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。
706 :デフォルトの名無しさん :2023/11/28(火) 23:00:59.77 ID:5UazaCro.net どうも>>680 です。 2のクラス名あり版でビルド通りました。 -sample.h class sample_1 { int a; static const int TBL[3]; public: sample_1(); }; -sample.cpp #include "sample.h" #include <iostream> const int sample_1::TBL[3] = {1,2,3}; sample_1::sample_1() { a = 2; std::cout << TBL[a] << std::endl; } -main.cpp #include <iostream> #include "sample.h" int main() { sample_1 sa; return 0; }
707 :デフォルトの名無しさん :2023/11/28(火) 23:06:12.31 ID:5UazaCro.net sample.hにTBL宣言なしで、 sample.cpp #include "sample.h" #include <iostream> static const int TBL[3] = {1,2,3}; sample_1::sample_1() { a = 2; std::cout << TBL[a] << std::endl; } でもOKでした。こちらのstaticはC式の使い方ですね。 私はTBLが.hに現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。
708 :デフォルトの名無しさん :2023/11/28(火) 23:19:21.29 ID:dISnZSIc.net 解決おめ、自分の用途に合うと感じるならそれがベストと思うよ
709 :デフォルトの名無しさん :2023/11/29(水) 06:23:02.71 ID:n75oaT1g.net h に static 描くと単に相互干渉しないってだけで インスタンスは造られまくって無駄リソース出まくるんじゃね
710 :デフォルトの名無しさん :2023/11/29(水) 09:24:39.36 ID:5+1qDy8t.net 奴は人の書き込み見ちゃいないよw
711 :デフォルトの名無しさん :2023/11/30(木) 22:28:52.60 ID:p6G1t8dm.net sizeof(クラス名)を活用できる場面はありますか。 メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、 クラス一般について考えると思いつきません。 たとえば std::string name; がメンバ変数にあるともう、クラスのサイズは不定になりそうです。 あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。
712 :デフォルトの名無しさん :2023/11/30(木) 22:39:03.15 ID:jq+Wc58z.net >>711 >std::string name; >がメンバ変数にあるともう、クラスのサイズは不定になりそうです。 確認してみましょう!
713 :はちみつ餃子 ◆8X2XSCHEME :2023/11/30(木) 23:39:52.07 ID:3QI4e6Tt.net >>711 sizeof 演算子の適用結果は定数であることが保証される。 定数式として使うことができる。 std::string なども型の大きさが変動したりはしない。 C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。 (実際には処理系の拡張として VLA を使える場合もある。) メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。 それほど機会は多くないだろうけど。 本来 (?) の用途とは違うところで使われる場合もあって、 いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。
714 :デフォルトの名無しさん :2023/11/30(木) 23:55:15.59 ID:p6G1t8dm.net >>713 高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。
715 :デフォルトの名無しさん :2023/12/01(金) 10:06:48.86 ID:NZuUNSBe.net おまえら、stdとboostどう使い分けてる?
716 :デフォルトの名無しさん :2023/12/01(金) 13:58:15.55 ID:aU4DjGEJ.net >>714 stringも実際には確保したメモリのポインタと文字列サイズを持ってるだけ(だけではないけど簡単に言えば)なので Cの構造体と大して変わらんのよ
717 :デフォルトの名無しさん :2023/12/02(土) 07:29:47.55 ID:qIqFVuKn.net まず鍵を与え、文字列を暗号化等して暗号文文字列を返したい。 暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。 どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。 暗号化等には既製ライブラリ使います。
718 :はちみつ餃子 ◆8X2XSCHEME :2023/12/02(土) 09:03:43.92 ID:w8ZlbPjQ.net >>717 設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。 というよりも継承を使うほうが悪い。 「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。 プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?
719 :はちみつ餃子 ◆8X2XSCHEME :2023/12/02(土) 11:45:21.73 ID:w8ZlbPjQ.net 他の選択肢としてはストリームのアダプタにするとかいう方法も思いつく。 極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。 自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。
720 :デフォルトの名無しさん :2023/12/02(土) 12:16:48.61 ID:0tC7Yjqi.net sqliteとかの(暗号化もあるけど)暗号化しないバージョンのDBを使ってて 書き込むとき勝手に暗号化してくれると有難いな
721 :デフォルトの名無しさん :2023/12/02(土) 13:25:55.77 ID:JgaBxQHi.net ここはプログラム技術板だぞ 自分で作れ
722 :デフォルトの名無しさん :2023/12/03(日) 06:49:36.39 ID:xZHPSaOR.net このスレはC++の話ではない書き込みが多すぎる
723 :デフォルトの名無しさん :2023/12/03(日) 11:07:00.27 ID:QTewqrs7.net C++の守備範囲が広いんよ
724 :デフォルトの名無しさん :2023/12/03(日) 21:36:41.23 ID:kkqQUehZ.net >>718 ありがとう。 非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。 string 暗号化(鍵, 平文); だけあれば十分だと。
725 :デフォルトの名無しさん :2023/12/04(月) 21:09:04.65 ID:wzr7hFvb.net msys2で開発環境を作りたくて Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが std::ifstream ifs("hoge.txt"); のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。 fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。 どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?
726 :デフォルトの名無しさん :2023/12/04(月) 22:11:21.42 ID:+6ZMbPCa.net エラーメッセージは?
727 :はちみつ餃子 ◆8X2XSCHEME :2023/12/05(火) 00:16:37.88 ID:z5PiblaY.net msys2 環境は数種類のモードがあるはずだがどれで起動した?
728 :デフォルトの名無しさん :2023/12/05(火) 04:57:07.09 ID:DXGBHl1O.net 実行ファイルの場所がカレントになってないんだろ getcwd()してみ
729 :728 :2023/12/12(火) 14:02:16.36 ID:haJQSzRG.net エラーは何もなくて変数に何も格納されてない状態だったので原因よくわかりませんでしたが 今回は>>728 さんの言う通りになっていて解決できました まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します ありがとうございました!
730 :デフォルトの名無しさん :2023/12/12(火) 15:14:22.81 ID:bMo3JLCK.net GUIから起動するとカレントディレクトリがホームになるんだったっけ?
731 :デフォルトの名無しさん :2023/12/13(水) 15:23:50.85 ID:Xh1qTD5r.net OSの事情でカレントが簡単に移動してしまうのがめんどいな
732 :デフォルトの名無しさん :2023/12/13(水) 16:17:33.78 ID:b3+IUHNQ.net プログラムの実行に必要な設定ファイルやデータファイルはカレントディレクトリではなく実行ファイルのパスを基準に決めたほうがいいね
733 :はちみつ餃子 ◆8X2XSCHEME :2023/12/13(水) 17:12:54.61 ID:vPv7AHCs.net 設定ファイルの類いは AppData フォルダに置くのがこのましいということになってる。 アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。 逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。 Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。
734 :デフォルトの名無しさん :2023/12/13(水) 17:14:51.41 ID:Xh1qTD5r.net 起動時の引数や 自分のフルパスを取得するAPI経由で 実行ファイルのある場所を基点にどうこうすることが多いわ (Windows unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか 起動時のカレントのまま?
735 :デフォルトの名無しさん :2023/12/13(水) 17:20:10.83 ID:b3+IUHNQ.net >>733 それはインストーラー使うアプリでしょ? XCOPYインストールアプリの話だよ
736 :デフォルトの名無しさん :2023/12/13(水) 17:23:03.86 ID:HyXW4bJ5.net カレントじゃ無くて、アプリが実行されたディレクトリに一緒に置いとくもんだろ? ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?
737 :はちみつ餃子 :2023/12/13(水) 18:03:20.75 ID:vPv7AHCs.net >>736 基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。 scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。 Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。
738 :デフォルトの名無しさん :2023/12/13(水) 23:12:49.25 ID:zjCiNOvz.net グローバル位置に宣言したオブジェクトはmain前にコンストラクタが実行されますね。 仕様ではmain前に実行ということのほかに何か規定はありますか。 ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。
739 :はちみつ餃子 ◆8X2XSCHEME :2023/12/14(木) 00:23:02.09 ID:GWgG2Hfk.net >>738 ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。 ・ 定数初期化が終わってから動的初期化がされる ・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい) ・ 翻訳単位内の初期化順序は定義が現れた順序 ・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない 特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、 強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。
740 :デフォルトの名無しさん :2023/12/14(木) 01:04:36.74 ID:X6Ol8Z5z.net 普通は、WSL2 でLinux を使う MSYS2/MinGW の利点は、 hypervisor で、2つのOS を起動しないから軽い WSL2 では、Linux側から、Windows 側のアプリも起動できる。 ただし例えば、powershell ではなく、powershell.exe と拡張子も付ける 例えばpowershellで、Windows側のフォルダ内の一覧を表示して、Linuxのgrep で絞り込む /mnt/c/Users/ユーザー名/Documents$ powershell.exe ls | grep クイ 出力 d----- 2015/10/13 13:52 クイズ VSCode の拡張機能・Code Runner は、 右クリックメニューから、選択したコード、またはファイル全体を実行する この設定をチェックしておく Code-runner: File Directory As Cwd Whether to use the directory of the file to be executed as the working directory. そうすると実行時にcd で、そのファイルがある場所へ、カレントディレクトリを移動してから、 そのファイルをコンパイルして実行する 設定項目、executorMap には、多くの言語の実行コマンドが書いてある。 "code-runner.executorMap": { "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
741 :デフォルトの名無しさん :2023/12/31(日) 22:48:46.98 ID:tpduSr4A.net 相談室から誘導されたのでこちらで http://mevius.5ch.net/test/read.cgi/tech/1698705458/104 buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?
742 :デフォルトの名無しさん :2024/01/01(月) 01:29:30.25 ID:/rCM9JK/.net このスレッドはゼロからC++と言っているが、C言語を知っている前提になっているよなw
743 :デフォルトの名無しさん :2024/01/02(火) 11:00:49.80 ID:TDOOgc4U.net ワシも割と長く底辺コピペプログラマだけどなんでそんな詳しくなれるの?ってなる 有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか
744 :デフォルトの名無しさん :2024/01/02(火) 20:21:16.21 ID:G9bvfkvl.net >>743 頭の出来で決まっているからね 義務教育レベルで脱落した人間、日本語能力に問題がある人間は、プログラマーとしても問題がある。
745 :はちみつ餃子 :2024/01/02(火) 21:40:20.68 ID:RkRzwbey.net 知識は入れないと増えないというすごく当たり前の話。 長く放置してたら勝手に増えるなんてことはないよ。
746 :デフォルトの名無しさん :2024/01/03(水) 08:18:02.54 ID:3n4RUKo6.net ガキの頃からマイコンBASICマガジン見てたけど PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな
747 :デフォルトの名無しさん :2024/01/03(水) 08:26:31.48 ID:uKn1SmuA.net 糞コテが
748 :デフォルトの名無しさん :2024/01/03(水) 13:07:46.32 ID:3mJitcl/.net >>746 SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?
749 :デフォルトの名無しさん :2024/01/03(水) 13:17:11.92 ID:SgwYv7hO.net ポケコン触ってたころが一番楽しかったです 手の中に物理キーボードと実行環境があるんだもん 一生遊べるよ
750 :デフォルトの名無しさん :2024/01/03(水) 14:56:53.56 ID:giTORTIB.net >>741 memcpyでなくちゃんとplacement newでコピーorムーブコンストラクタ走らせればいんじゃね?
751 :デフォルトの名無しさん :2024/01/10(水) 03:00:04.91 ID:lNNg6PiH.net Class Hogeの中でたくさんのFugaを管理するために std::vector<std::unique_ptr<Fuga>>というメンバ変数を作りました 可変長引数テンプレートで複数のstd::unique_ptr<Fuga>を受け取るコンストラクタを書こうとしたのですが std::unique_ptrがコピー禁止のためうまくいきませんでした。 Hoge(Args&&... args) という形で右辺値参照を受け取ってうまいことムーブしてClass Hogeを初期化する方法ってありますか?
752 :はちみつ餃子 ◆8X2XSCHEME :2024/01/10(水) 04:36:30.64 ID:BOjhYgCx.net >>751 できると思うけど、何をやりたくて何が上手くいかなかったのかイマイチわからない。 出来なかったコードをみせて。
753 :デフォルトの名無しさん :2024/01/10(水) 11:27:22.10 ID:lNNg6PiH.net >>752 class Fuga { int placeholder; }; class Hoge { public: std::vector<std::unique_ptr<Fuga> > vec; template<class... Args> Hoge(Args... args) { vec = {args...}; } }; int main() { /*Fugaを何個か作成*/ auto p1 = std::make_unique<Fuga>(); auto p2 = std::make_unique<Fuga>(); auto p3 = std::make_unique<Fuga>(); /* 中略 色々処理 処理が終わったらHogeの中にFugaをまとめて放り込みたい*/ Hoge hoge(p1,p2,p3); } こういうものを書いたらunique_ptrがコピー禁止でエラーになったのでムーブにしたいけど書き方がわかりませんでした。
754 :はちみつ餃子 ◆8X2XSCHEME :2024/01/10(水) 12:45:18.04 ID:BOjhYgCx.net >>753 この場合は initializer_list が問題。 initializer_list を経由するとムーブ可能/コピー不可な型を扱えない。 initializer_list を経由しない形にすればよいので要素を emplace_back で 入れる形にするなどの対処法が考えられる。 #include <memory> #include <vector> class Fuga { int placeholder; }; class Hoge { public: std::vector<std::unique_ptr<Fuga> > vec; template <class... Args> Hoge(Args&&... args) { (..., vec.emplace_back(std::forward<Args>(args))); } }; int main() { /*Fugaを何個か作成*/ auto p1 = std::make_unique<Fuga>(); auto p2 = std::make_unique<Fuga>(); auto p3 = std::make_unique<Fuga>(); /* 中略 色々処理 */ // std::move で右辺値にキャスト Hoge hoge(std::move(p1), std::move(p2), std::move(p3)); }
755 :デフォルトの名無しさん :2024/01/12(金) 09:52:36.06 ID:Umd8uX9b.net c++で日本語の連想配列ってあります??
756 :デフォルトの名無しさん :2024/01/14(日) 15:30:33.22 ID:O4q5V5KL.net >>755 std::mapじゃだめなん?
757 :デフォルトの名無しさん :2024/01/16(火) 21:37:05.24 ID:eUaXJLuy.net >>754 無事に動作させることができました。ありがとうございます!
758 :デフォルトの名無しさん :2024/01/20(土) 18:17:15.80 ID:9qysS+ur.net 時間のかかる処理があり、それが現在のスレッドをブロックして欲しくないので その処理の部分に関してstd::async()の利用を検討していますが、 これって戻り値(future 型)でモニターしないといけない感じですか? 上記の処理はいつ終わるかは気にしないので別スレッドに投げっぱなし?で構わない のですが... pthread_detach()的な?
759 :はちみつ餃子 :2024/01/21(日) 12:43:25.73 ID:4rk7TZPC.net >>758 std::thread のメンバ関数に detach はあるけど、期待するのはこういうこと? ただ、メインスレッドが終了すれば他のスレッドが稼働中でもプロセス終了処理に入るし、 プロセス終了処理の中で標準ライブラリの後始末している最中に他のスレッドが 標準ライブラリを使うようなことがあると破綻するかもしれない。 強引に終わらせて良いなら std::quick_exit で即死させるという方法も取れるが、 基本的にはプログラムを終わらせるときには全てのスレッドを終了させて (終了を待って) おくのが 普通だと思う。
760 :デフォルトの名無しさん :2024/01/21(日) 21:48:26.38 ID:zlvjOB5M.net >>758 ですが、お返事ありがとうございます。 はい、とりあえず thread::detach() を使うようにしました。1つの疑問は、 https://ja.cppreference.com/w/cpp/thread/future/~future によると > ただし、その共有状態が std::async によって作成され、まだ準備完了になっておらず、これがその共有状態への最後の参照である場合は、ブロックする可能性があります。 ええ何それ、というのが発端でした(後出し失礼)。 確かに、メインスレッドの終了時のこともありますし、スレッドの後始末をちゃんと した方が本当はいいように思われます。処理が長時間たっても終了しない場合 タイムアウトさせたりとかも。 何かシステマティックな方法等あるでしょうか。参考になるものがあれば...
761 :はちみつ餃子 :2024/01/22(月) 12:54:36.50 ID:T1sqP3ZB.net >>760 メインスレッドの終了直前でまずは適当にフラグを立てた上で他のスレッドの終了まで待機する。 重い処理をしているスレッドの側で完了ではないにしても区切り良く終われるポイントでフラグを読んで フラグが立っていれば後始末ルートに入ってスレッドを終了させる。 その結果としてメインスレッドの待機状態が終わってプロセスの終了。 というのが普通の大まかな流れだと思う。 その上で待機時間があまり長すぎるようだと強引にでも終わらせるとかの処理を入れるかも。 std::async は既存の関数を非同期化するちょっとしたユーティリティという立場なんじゃないかな。 それで事足りるときは便利で簡単だけど、細かい制御を勝手にやってくれるわけでもないし、 やろうとするとちょっとイマイチって感じ。
762 :デフォルトの名無しさん :2024/01/28(日) 11:52:43.80 ID:W0uCnQb3.net 質問なのですがどんな環境(ロケール設定)のPCで動かしても 数値や時刻の入出力を修飾無し(12345 が 12,345 になったりしない)にする完璧な方法って次の3行で良い? setlocale(LC_ALL, ""); // printf()、scanf()に反映 _wsetlocale(LC_ALL, L""); // wprintf()、wscanf()に反映 (※ 環境依存。左記はWindowsの場合 std::locale::global(std::locale("", std::locale::all)); // cout、wcout、cin、wcin、ostringstream、wostringstream、...etc. C++の全部に反映 あとなんか実験する限り cout.imbue(std::locale("")); std::locale::global(std::locale("", std::locale::all)); とするとcoutが修飾有りとなり、cout.imbue()で与えた設定をstd::locale::global()が上書きしないように見えるのですがそういうもの?
763 :はちみつ餃子 :2024/01/28(日) 13:12:39.75 ID:hRRbWEE/.net >>762 言語仕様通りならそれらの関数を呼び出さないようにすれば環境に固有の表現の変換はしない。 std::setlocale の設定が C の標準関数の挙動に影響するのはその通り。 ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。 空の文字列を渡した場合には環境に固有の設定であり、通常はシステムの設定が反映される。 プログラムは起動したときに setlocale(LC_ALL, "C"); 相当の状態なので、普通は書く必要もない。 std::locale::global での設定は C++ の標準ライブラリの挙動に影響するだけでなく std::setlocale での設定にも反映されるので両方を呼び出す必要はない。 これもプログラム起動時のロケール設定は "C" 相当になっているのでそれで良ければ呼び出す必要もない。 ただし、 std::locale::global に与える設定が名前を持たない場合 (つまり std::locale("") のような場合) は std::setlocale 相当の変更もするかどうかは規定されない。 imbue はストリームにロケールを結びつけるのでグローバル設定とは独立して機能する。
764 :デフォルトの名無しさん :2024/01/28(日) 14:11:55.68 ID:eBJAlicu.net クラスオブジェクトの代入文に、=による単純コピーと、=演算子関数による独自コピーのどちらを使うか迷います。 たとえばメンバ変数が基本データ型の集まりなら単純コピーでいい。 今出くわしたのはメンバ変数がstd::array<int, 3>の場合で、まあたぶん単純コピーでよさそう?じゃあstd::vector<myclass>なら?などと疑問が深まります。 あとコピーコンストラクタによる初期化も合わせて考える必要がありそう。
765 :はちみつ餃子 :2024/01/28(日) 14:36:51.31 ID:hRRbWEE/.net >>764 単純コピーってのは何のこと? デフォルトで生成される代入演算子の意味で言ってるのかな?
766 :デフォルトの名無しさん :2024/01/28(日) 15:36:35.20 ID:W0uCnQb3.net >>763 レス㌧クス、 >ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。 なるほど "C" ですたか、これか↓ https://www.ibm.com/docs/ja/zos/2.2.0?topic=utility-locale-naming-conventions >普通は書く必要もない。 実はウィンドーズでUnicodeで出力する場合限定かもですだが、ロケール設定しないままだと 日本語OSでも漢字が表示されなかったり(L"Hello World! 漢字" → 表示: Hello World! ) 英語OSに持っていったら L"Hello World! 漢字" が丸ごと出なかったり……orz まあ漢字はこの際どうでも良いので、ロケール設定 "C" で行こうと思いまつ
767 :デフォルトの名無しさん :2024/01/28(日) 16:37:46.15 ID:eBJAlicu.net >>765 そうです。
301 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200
本文 スレッドタイトル 投稿者