0からの、超初心者C++相談室
1 :デフォルトの名無しさん :2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net 何にも知らない0からの出発、超初心者のためのC++相談室
627 :デフォルトの名無しさん :2023/11/25(土) 17:03:42.33 ID:vlVh3gWj.net ちなみに「入門書を何冊か買って読みながら進めるといいよ」みたいな書き方だったらこんなに絡んだりしてないからね?
628 :はちみつ餃子 :2023/11/25(土) 17:04:18.21 ID:BXmPXb0v.net >>626 いや、そりゃそうでしょ。 最初から言語仕様を読めとか言わないよ。 入門書だって仕様書に基づいて書いてるし、基づいてない入門書だったらクソってだけ。
629 :611 :2023/11/25(土) 17:06:46.45 ID:5Y+f+Y1g.net >>620 これをやってきたのがはちみつ餃子なんだよ 俺ははちみつ餃子の書き込みにいつも感心してるよ
630 :デフォルトの名無しさん :2023/11/25(土) 17:09:19.28 ID:rcrc48ZO.net >言ってることが変わってきた うん、まぁ、はちみつはそういうとこあるから・・・w ただまぁ、言語仕様に詳しい人の存在は(はちみつに限らず)非常に有難いんだが、 実際にソフト書く上で気にしなきゃいけないのは言語仕様だけじゃない 特定のソフトの個別の問題を解決するためのアルゴリズムについて、資料があるのか?と。(すでに出来上がってて公開されてるアルゴリズムが存在する問題などほとんど無い) 一番大事なのは論理的思考力であって、なんでもはなから資料をアテにしてたら逆にそれが身につかないよ
631 :デフォルトの名無しさん :2023/11/25(土) 17:12:35.76 ID:vlVh3gWj.net >>628 だとしたら、言語仕様を推測するな、未定義動作や処理系がどーのこーのとずいぶんと遠回しな言い方をしたねえ 入門書を読みといいよの一言で済むのに >>629 それは別の話。餃子がエキスパートであることは否定してない 初心者の前に高いハードルを立ててC++を聖域みたいにするのはやめて欲しいのだ
632 :デフォルトの名無しさん :2023/11/25(土) 17:13:52.19 ID:rcrc48ZO.net どうも仕様オタク(言い方は悪いが、アマチュアという意味も込めて)な人達は、自分の知ってる世界が全てだと思い込んでるようで前々から問題だと思ってた 世の中、マイナーなAPIとかになると嘘を書いてることもあるし何も資料が無いことすらある もちろん実際の動作から「今わかること以上」をわかった気になる(仕様を知った気になる)のは問題だが、 逆に言えば「仕様がこうだから間違ってないんだ」などと動作を確かめもせずに決めつけるのも問題だ そういうのは結局本人の心的態度の問題に過ぎない
633 :はちみつ餃子 :2023/11/25(土) 17:15:51.23 ID:BXmPXb0v.net アルゴリズムは考えればわかることもあるかもしれんが、言語仕様は考えたってわからんし。 (想像はつくことも多いけど。)
634 :デフォルトの名無しさん :2023/11/25(土) 17:17:15.50 ID:mGx3DnG8.net > 書いてみるというのは賛成。 初心者はこれでもいい > でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。 中級者以上になって言語仕様等に踏み込んだ学習をしようとするなら書いたもので仕様を測るのではなく「学んで」知るべし と言う意味だと俺は>>609 を解釈してた
635 :はちみつ餃子 :2023/11/25(土) 17:21:04.72 ID:BXmPXb0v.net >>631 複雑難解な C++ を試させるのがハードルの低い方法だと主張したいわけ? きちんと整備された学習ルートがあるという話なのにそれでハードルを上げてるとか言われるのは心外だわ。
636 :デフォルトの名無しさん :2023/11/25(土) 17:24:19.67 ID:vlVh3gWj.net 「きちんと整備された学習ルートがあるという話なのに」 お前そんな話してたか?
637 :デフォルトの名無しさん :2023/11/25(土) 17:24:48.18 ID:mGx3DnG8.net あれよな ・初心者スレだからアドバイスはすべて「初心者向けの内容」 ・初心者スレだけどアドバイスは「初心者向けの内容」と「その先を見据えた内容」 はちみつ大先生は後者だけど、ツッコミを入れたほうは前者で読み取っているから噛み合わないってだけよな、たぶん
638 :はちみつ餃子 :2023/11/25(土) 17:26:03.64 ID:BXmPXb0v.net >>636 まずは資料を読め (資料があるから) という主張を最初からしてるつもりだが。
639 :デフォルトの名無しさん :2023/11/25(土) 17:34:11.58 ID:xBFezCRv.net 「C++言語リファレンスを頭に叩き込め!!話はそれからだ」 でいいんじゃね?と俺は思っている で、理解できない部分は入門書やサンプルコードを読んで理解する まずは書いて試せという人もいるが俺はこの意見には賛同できない プログラミング言語というのは日本語や英語などの自然言語と違って 少しでも間違えたら動かないし、C++の場合なら最悪システムが破壊される 理解できなくても動けばいいなどという考えの奴がいるからバグが量産されるのだ ミスが許されないのはたとえば医者だな 医者は医者になる前に知識を詰め込むのが普通だ 知識もないのに外科手術をしたらどうなるか? 切りながら覚えろというのか? プログラミングは手術と同様、まずは知識、次に技術が必要となる、と俺は思っている 【完】
640 :はちみつ餃子 :2023/11/25(土) 17:40:31.27 ID:BXmPXb0v.net >>637 初心者教育は二種類に大別されると思っていて、たとえば公立学校の授業でするような 興味がない層も含めて最低限の知識は与える教育と 学ぶ意欲があって専門知識と言えるようなものを身に付けようとする者に対する教育。 前者は「興味をひく」というところから考えないといけない。 理屈よりも楽しいと思えるようなやり方が必要になることもあるだろう。 後者は理屈を避けては通れない。 理屈の身に付け方には色んな方法論があるかもしれないけど まずは書いてあるものを読め (先人がそれを良いやり方だと思ってまとめてくれたんだから! 手を動かす必要があると思うところでは演習問題があったりもする) という風に考えてる。 今は初心者であるかどうかは重要ではなく ここで相談するような層は後者のルートのつもりでいると私は思って書いてる。
641 :デフォルトの名無しさん :2023/11/25(土) 17:45:56.52 ID:Xpg7OWMd.net >>639 >理解できなくても動けばいいなどという考えの奴 誰の話?
642 :デフォルトの名無しさん :2023/11/25(土) 18:21:13.32 ID:xBFezCRv.net >>641 わからないか…かわいそうに… 教えてあげなぁぁい
643 :デフォルトの名無しさん :2023/11/25(土) 18:24:14.13 ID:0MoP1N3f.net おちんちん舐めてごらん
644 :デフォルトの名無しさん :2023/11/26(日) 10:58:08.83 ID:d/KzVdDP.net >>625 最近ChatGPTに全部聴いて済ます変なのが住み着いて迷惑だな
645 :デフォルトの名無しさん :2023/11/26(日) 11:15:51.84 ID:d/KzVdDP.net >>639 >医者は医者になる前に知識を詰め込むのが普通だ >知識もないのに外科手術をしたらどうなるか? >切りながら覚えろというのか? 言いたいことは判るが「最初の医者」はどうしてたんだろうな 君の言ってるやり方は「従順な職人」を育てるやり方としては正しいが クリエイターを育てることは出来ない
646 :デフォルトの名無しさん :2023/11/26(日) 12:24:07.96 ID:t0WQFMSf.net >>639 からの>>642 だからな 一見それっぽいこと言ってるようで全く中身の無い事を言うアホが長いこと住み着いてる(C++系だけなのか他もなのか) 突っ込まれると頭悪い煽り方しかしてこないからすぐわかる、玄人ぶりたいだけのアホだから相手しない方がいい
647 :デフォルトの名無しさん :2023/11/26(日) 12:37:18.37 ID:DTfcWvWZ.net 医者の下りはおかしい 医師は残念ながら完全な医学的知識を身に着けて 外科手術に臨む訳じゃないぞ 語弊を恐れなければ「切りながら覚える」側面もある
648 :はちみつ餃子 :2023/11/26(日) 12:54:38.94 ID:k38CbPq9.net ちゃんとした資料で学んでないと用語が無茶苦茶だから 何を言ってるんだかわからないということが起こる。 言語仕様の理解が結果的に正しくてもそうでなくても。 「伝わればいいだろ!」みたいに言う人が結構いるんだけど伝わらないから困るんだ。 メンバ関数をメソッドと言ったりするのは誤解の余地はそんなにないと思ってたら 非メンバ関数もメソッドと言っている例を観測したことがあるし、 子クラスって派生クラスの意味で言ってるんだよな? と思ってよく確認したら入れ子になったクラス (nested class) だったりするし、 クラス変数は静的データメンバの意味だろう (Ruby とかにはそういう用語があるし) と思ったら 静的でないデータメンバのことを言ってたというオチもある。 結果的に正しく使ってる場面ですら本当にその意味で言ってるのか疑わしくなる。 経験や感覚で書けるようになったとしても まともな資料を読んでないというのはそういった形でコミュニティ内で有害なわけで たまには思い違いがあるのはしょうがないが 学んでないし学ぶ気もないのを良しとは言えないよ。
649 :デフォルトの名無しさん :2023/11/26(日) 13:47:17.98 ID:t0WQFMSf.net >>648 いい加減にしろよ お前何でそんな上からなの?
650 :はちみつ餃子 :2023/11/26(日) 14:18:15.64 ID:k38CbPq9.net >>649 伝えようとしない態度を批判してるところに対して伝わらないことを書くのやめろよ。 何が言いたいんだ?
651 :デフォルトの名無しさん :2023/11/26(日) 14:34:29.20 ID:mssmbX4x.net 自己正当化しか考えてない人格破綻者に道理を教えてやる気は無い、自分で考えろ ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。 荒らす気は無いのでこれで終わりにする
652 :はちみつ餃子 :2023/11/26(日) 14:42:52.42 ID:k38CbPq9.net 完璧に把握しろなんて一度でも俺が書いた箇所があるなら指摘してくれよ。 書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?
653 :はちみつ餃子 :2023/11/26(日) 14:55:17.55 ID:k38CbPq9.net 資料(この場合は入門書)を読んでから手を動かして学ぶというごく普通の手順を主張してるつもりだが、むしろそうじゃない方法でどうするのがよいと考えてるんだ? 学校だって座学でやったことを演習で実践してるだろう。
654 :デフォルトの名無しさん :2023/11/26(日) 15:50:55.41 ID:DTfcWvWZ.net 気にするなってほぼ嫉妬なんだから
655 :デフォルトの名無しさん :2023/11/26(日) 16:03:14.03 ID:t0WQFMSf.net >ほぼ嫉妬 俺に言ってんの? いずれにせよ荒らそうとしてる自覚はあるか?
656 :デフォルトの名無しさん :2023/11/26(日) 16:08:02.37 ID:Dy8SO9u0.net >>655 どう考えてもお前が荒らしじゃん 人のことをアホ呼ばわりしてるし
657 :デフォルトの名無しさん :2023/11/26(日) 16:22:42.40 ID:t0WQFMSf.net >>639 =645=659 バレバレだからwww
658 :デフォルトの名無しさん :2023/11/26(日) 18:08:35.12 ID:fCQnoW9K.net >>652 言語仕様・未定義動作・処理系とか言ってたから完璧に把握しろに近いニュアンスだと感じた メソッドではなくメンバ関数、用語を正しくつかわないと伝わらないとか言ってることがどんどん変わってる
659 :デフォルトの名無しさん :2023/11/26(日) 18:08:55.12 ID:4RSi5A29.net お取り込み中すみませんが質問です ダウンキャストという用語が是か非かです ボクは不適切な用語だと思っていて 理由は 1) 言語の仕様に出てきていない 2) アップかダウンかについてももちろん仕様に無い 3) アップキャスト相当の操作は通常行わない です 少なくともC++界隈でちゃんとした定義なんて出てこないですよね?
660 :はちみつ餃子 :2023/11/26(日) 20:14:28.93 ID:k38CbPq9.net >>659 仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど…… 原則としては C++ 用語ではないと考えて良いと思う。 クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので 方向をアップ/ダウンで言うのもおかしな話だし。 derived-to-base convertion というような用語は仕様書の文面にもあるので アップキャストに相当するのはこの用語のはずだけど base-to-derived convertion という用語は出てこないので ダウンキャストに相当する直接の用語はなさそう。 冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。 ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。 to が脱落したらだいぶん雰囲気が変わってしまうでないの。 これは真似しないほうがいいかもね。 ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので なんだかんだで一語で表せるってのは便利なんだと思う。 私は使わないようにしているけど。
661 :はちみつ餃子 :2023/11/26(日) 20:20:37.65 ID:k38CbPq9.net すまぬ。 綴りが間違えてた。 concertion じゃなくて conversion だった。
662 :デフォルトの名無しさん :2023/11/26(日) 20:28:40.49 ID:4RSi5A29.net レスサンクス お手数おかけして痛み入ります > 3) アップキャスト相当の操作は通常行わない B *b = (B *)d; // もしもこれが必要な世界だったら 使い分ける?ための用語が欲しくなるのはまだわかるけど D *d = (D *)b; // こっち方向にしかキャストしないんだから 区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない …とはいえボクがいくらこう考えても みんながそうじゃないから蔓延ってるわけで > 私は使わないようにしているけど。 その一言で何か救われた気分になりました
663 :デフォルトの名無しさん :2023/11/26(日) 20:32:07.21 ID:4RSi5A29.net 一応補足 > B *b = (B *)d; // もしもこれが必要な世界だったら B *b = d; // こう書くだけじゃ許されなくて
664 :デフォルトの名無しさん :2023/11/26(日) 20:37:16.38 ID:Dy8SO9u0.net ダウンキャストって言葉は普通に使われてると思うが… 日本語版のウィキペディアなら C++ - Wikipedia https://ja.wikipedia.org/wiki/C%2B%2B に「dynamic_castは基底オブジェクトから派生オブジェクトへの変換(ダウンキャスト)を実行時に安全に行うための演算子である」とある 英語版ウィキペディアなら Downcasting - Wikipedia https://en.wikipedia.org/wiki/Downcasting マイクロソフトのリファレンスなら dynamic_cast 演算子 | Microsoft Learn https://learn.microsoft.com/ja-jp/cpp/cpp/dynamic-cast-operator にアップキャストとダウンキャストのことが書かれてる
665 :デフォルトの名無しさん :2023/11/26(日) 20:47:28.85 ID:4RSi5A29.net rustに至っては嘆かわしいことに https://doc.rust-lang.org/std/any/trait.Any.html > pub fn downcast<T>(self) -> Result<Box<T, A>, Box<dyn Any, A>> where T: Any, 上記トレイトのメソッド名に採用されている あー虚しい あーヤダヤダ
666 :デフォルトの名無しさん :2023/11/26(日) 20:59:53.00 ID:mssmbX4x.net >>664 使われてるけど規格に定義があるような正式な用語ではないってことだろ
667 :はちみつ餃子 :2023/11/26(日) 21:20:56.75 ID:k38CbPq9.net >>662 むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。 ポインタを経由せずに値を直接キャストすることもありうるし 参照の場合かもしれない。 class foo {}; struct bar : public foo {}; int main() { auto a = bar(); // bar から foo へのアップキャストってどれのこと? auto b = static_cast<foo>(a); auto c = static_cast<foo *>(&a); auto &d = static_cast<foo &>(a); }
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 環境は数種類のモードがあるはずだがどれで起動した?
302 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200
本文 スレッドタイトル 投稿者