1 名前:デフォルトの名無しさん [2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net] 何にも知らない0からの出発、超初心者のためのC++相談室
983 名前:デフォルトの名無しさん [2025/04/19(土) 20:34:02.90 ID:Rs10e6Jw.net] つまりNim最強ですねわかります
984 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 09:51:37.89 ID:PR6E6U1X.net] C++で匿名クラスを使ってみたいのですが、試したところ class { public: void print() { std::cout << "Hello!\n"; } } obj; obj.print() は動きました。それならば auto objp = new class { public: void print() { std::cout << "Hello!\n"; } } (); objp->print(); あたりが動くのかな、と思いましたがコンパイルでエラーになってしまいます anon_class_test.cpp:4:19: error: declaration of anonymous class must be a definition 4 | auto objp = new class { | ^ anon_class_test.cpp:7:7: error: expected a type 7 | } (); | ^ 正しい書き方があれば教えていただけないでしょうか? ちなみに、Java (Android)でのコールバックの登録であるような、インラインで無名の クラスのオブジェクトを定義・生成して渡すような書き方がC++でもできるのかな、 という疑問があり、それの第一歩的な感じなのですが
985 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 10:00:18.82 ID:+jC2JIL+.net] 匿名クラスってCで言う構造体やん
986 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 10:12:11.66 ID:RRBAM2hD.net] >>984 newの後にクラス定義は書けない 匿名インラインでなんちゃらしたい場合はラムダを使う
987 名前:はちみつ餃子 mailto:sage [2025/04/28(月) 12:35:00.60 ID:clGXfLYj.net] >>984 簡潔な回答としては「できない」ということになる。 関数ひとつで終わるような簡単なコールバックならラムダ式で渡せるように設計する。 もう少し複雑なものになると……式の中に定義を書けるのは見通しが悪いし、出来てしまう Java のほうが良くなさそう。 別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。 質問の本筋ではないが気になる点として、 new で生成したものはどこかで delete しなきゃならないからそのコードだけから判断できる範囲ではなんだか筋が悪そうに見える。 つまりそもそも new する意味がないんじゃない? と思う。
988 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 13:12:28.38 ID:PR6E6U1X.net] >>986 >>987 なるほど、ありがとうございます >>987 >別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。 はい、それで行ってみようかとおもいます >new で生成したものはどこかで delete しなきゃならないから はい、そういうわけでshared_ptrで... そのためにも型の名前はあった方がいいですね 諸般の事情でJavaとC++のコードを間接的に共有しようとしていまして、 ならばコードのスタイルもできるだけ似せようかなと、思ったのでした
989 名前:デフォルトの名無しさん mailto:sage [2025/05/02(金) 09:24:43.58 ID:k5bGwZZ0.net] size_t を返す hoge.count() みたいなのがあって for(int i = hoge.count(); --i >= 0){...} と描くと 型が違うって怒られるのですが for(int i = (int)hoge.count(); --i >= 0){...} for(unsigned long i = (unsigned long)hoge.count(); --i >= 0){...} for(size_t i = hoge.count(); --i >= 0){...} どれが正解?
990 名前:はちみつ餃子 mailto:sage [2025/05/02(金) 09:54:10.74 ID:LUc36ySD.net] >>989 どこでどのように型が合わないのか説明して。
991 名前:はちみつ餃子 mailto:sage [2025/05/02(金) 11:40:02.44 ID:n0wyIh3y.net] >>989 for 文の括弧の中はセミコロンで区切られた三つの節を持つ形式である必要があるが、二つの節しかないのが根本的な間違い。 そんでそれを脇に置くとして、ループカウンタ i が unsigned であるときに --i >= 0 という式で判定しようとするのが間違い。 0 以下になることはありえないのだから判定の意味がない。 (無限ループを意図したのでない限りは。) 整数を別の整数型に型変換したときに型変換後の型で表現可能な範囲の値であるならば同じ数値のままであることは保証されて何も問題はない。 逆に言えば扱う値の範囲次第では違う数値に変わったり未定義になったりすることがある。 hoge.count() が返す型が size_t なら最後まで size_t で扱うのが基本的には好ましい。 値が取りうる範囲を把握しているなら問題を起こさない範囲で適切に型変換するのはプログラマの裁量による。 状況によって判断するしかない。
992 名前:デフォルトの名無しさん mailto:sage [2025/05/02(金) 12:05:12.81 ID:b7t9YOim.net] 我慢できなくなって説明しちゃうはちみつさん
993 名前:デフォルトの名無しさん mailto:sage [2025/05/02(金) 19:42:35.68 ID:rPO248eK.net] for(long long i = (long long)hoge.count(); --i >= 0; ){...}
994 名前:デフォルトの名無しさん mailto:sage [2025/05/04(日) 09:19:50.28 ID:RkNPiBO2.net] Rust使えばもっと楽になるかと思いきや 面倒が増えただけだったでござる
995 名前:デフォルトの名無しさん mailto:sage [2025/05/04(日) 10:01:55.29 ID:CPTw2I9A.net] >size_t を返す hoge.count() みたいなのがあって >for(int i = hoge.count(); --i >= 0){...} Rustなら単に (0..hoge.count()).rev()
996 名前:はちみつ餃子 mailto:sage [2025/05/04(日) 11:51:46.75 ID:w7r9Yiaa.net] 全体としては Rust のほうがだいぶん楽だと思うけどなぁ。 好みや慣れの要素があるから単純には比較できないのだけれど。
997 名前:デフォルトの名無しさん mailto:sage [2025/05/04(日) 11:59:34.01 ID:RkNPiBO2.net] はちみつさんもRust使ってるんだね
998 名前:デフォルトの名無しさん [2025/05/04(日) 11:59:44.18 ID:RkNPiBO2.net] かわいい
999 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 2364日 21時間 4分 32秒