0からの、超初心者C++相談室at TECH
0からの、超初心者C++相談室 - 暇つぶし2ch979:
25/04/19 17:31:17.09 FLUMnkWw.net
プリプロセッサというか、Cへのトランスレータだったみたいよ

980:はちみつ餃子 ◆8X2XSCHEME
25/04/19 18:46:21.80 cJmAkIgz.net
>>979
いや、 C++ の前身である C with Classes の最初の処理系は Cpre と名付けられていて、明らかにプリプロセッサを指向してる。
このことじゃない?

981:
25/04/19 19:59:57.03 nvjdNFmD.net
>>980
かもしれません
30年以上前のうろ覚えなので

982:はちみつ餃子
25/04/19 20:26:59.32 cJmAkIgz.net
C++ と呼ぶようになってからの処理系 CFront もそれはそれで思想としては C コンパイラをジェネレータとして使う (移植性が高いから) というものであって言語としての解釈は CFront がやるし C は中間表現にすぎないからトランスレータと呼ぶのが適切かどうかは微妙なところ。
Clang のことを LLVM-IR へのトランスレータとは普通は言わないみたいな感じ。
いや、変換してるからトランスレータには違いないんだろうけどさ。

983:デフォルトの名無しさん
25/04/19 20:34:02.90 Rs10e6Jw.net
つまりNim最強ですねわかります

984:デフォルトの名無しさん
25/04/28 09:51:37.89 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:デフォルトの名無しさん
25/04/28 10:00:18.82 +jC2JIL+.net
匿名クラスってCで言う構造体やん

986:デフォルトの名無しさん
25/04/28 10:12:11.66 RRBAM2hD.net
>>984
newの後にクラス定義は書けない
匿名インラインでなんちゃらしたい場合はラムダを使う

987:はちみつ餃子
25/04/28 12:35:00.60 clGXfLYj.net
>>984
簡潔な回答としては「できない」ということになる。
関数ひとつで終わるような簡単なコールバックならラムダ式で渡せるように設計する。
もう少し複雑なものになると……式の中に定義を書けるのは見通しが悪いし、出来てしまう Java のほうが良くなさそう。
別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。

質問の本筋ではないが気になる点として、
new で生成したものはどこかで delete しなきゃならないからそのコードだけから判断できる範囲ではなんだか筋が悪そうに見える。
つまりそもそも new する意味がないんじゃない? と思う。

988:デフォルトの名無しさん
25/04/28 13:12:28.38 PR6E6U1X.net
>>986 >>987 なるほど、ありがとうございます 

>>987
>別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。
はい、それで行ってみようかとおもいます

>new で生成したものはどこかで delete しなきゃならないから
はい、そういうわけでshared_ptrで... そのためにも型の名前はあった方がいいですね

諸般の事情でJavaとC++のコードを間接的に共有しようとしていまして、
ならばコードのスタイルもできるだけ似せようかなと、思ったのでした

989:デフォルトの名無しさん
25/05/02 09:24:43.58 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:はちみつ餃子
25/05/02 09:54:10.74 LUc36ySD.net
>>989
どこでどのように型が合わないのか説明して。

991:はちみつ餃子
25/05/02 11:40:02.44 n0wyIh3y.net
>>989
for 文の括弧の中はセミコロンで区切られた三つの節を持つ形式である必要があるが、二つの節しかないのが根本的な間違い。

そんでそれを脇に置くとして、ループカウンタ i が unsigned であるときに --i >= 0 という式で判定しようとするのが間違い。
0 以下になることはありえないのだから判定の意味がない。 (無限ループを意図したのでない限りは。)

整数を別の整数型に型変換したときに型変換後の型で表現可能な範囲の値であるならば同じ数値のままであることは保証されて何も問題はない。
逆に言えば扱う値の範囲次第では違う数値に変わったり未定義になったりすることがある。
hoge.count() が返す型が size_t なら最後まで size_t で扱うのが基本的には好ましい。
値が取りうる範囲を把握しているなら問題を起こさない範囲で適切に型変換するのはプログラマの裁量による。
状況によって判断するしかない。

992:デフォルトの名無しさん
25/05/02 12:05:12.81 b7t9YOim.net
我慢できなくなって説明しちゃうはちみつさん

993:デフォルトの名無しさん
25/05/02 19:42:35.68 rPO248eK.net
for(long long i = (long long)hoge.count(); --i >= 0; ){...}

994:デフォルトの名無しさん
25/05/04 09:19:50.28 RkNPiBO2.net
Rust使えばもっと楽になるかと思いきや
面倒が増えただけだったでござる

995:デフォルトの名無しさん
25/05/04 10:01:55.29 CPTw2I9A.net
>size_t を返す hoge.count() みたいなのがあって
>for(int i = hoge.count(); --i >= 0){...}

Rustなら単に (0..hoge.count()).rev()

996:はちみつ餃子
25/05/04 11:51:46.75 w7r9Yiaa.net
全体としては Rust のほうがだいぶん楽だと思うけどなぁ。
好みや慣れの要素があるから単純には比較できないのだけれど。

997:デフォルトの名無しさん
25/05/04 11:59:34.01 RkNPiBO2.net
はちみつさんもRust使ってるんだね

998:デフォルトの名無しさん
25/05/04 11:59:44.18 RkNPiBO2.net
かわいい

999:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 2364日 21時間 4分 32秒


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch