0からの、超初心者C++相談室
1 :デフォルトの名無しさん :2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net 何にも知らない0からの出発、超初心者のためのC++相談室
509 :はちみつ餃子 ◆8X2XSCHEME :2023/07/17(月) 00:18:57.61 ID:YifLUjyU.net >>505 それって本当に意図通り? X のデストラクタが起動するのは X 型のオブジェクトが解体されるときであって 参照カウントがゼロになったときじゃないんだよ。
510 :504 :2023/07/17(月) 01:33:58.67 ID:9b8iHtwy.net >>509 …あー。それは意図通りではないですね。実際の解放はデストラクタで use_count()==1であることを確認する必要があるのかな。ありがとうございます。
511 :はちみつ餃子 ◆8X2XSCHEME :2023/07/18(火) 09:19:59.88 ID://OyAtPF.net パブリック継承した型では基底への型変換を禁じることができない。 つまり X<int> foo = new int(1); std::shared_ptr<int> bar = foo; みたいなことが出来てしまう。 間違った使い方を想定するとキリがないから なんでもかんでもガチガチに型を設計する必要はないんだけど、 この場合はどこかでミスりそうと思うので 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
512 :504 :2023/07/19(水) 03:16:45.39 ID:0uGQJSD8.net >>511 御忠告ありがとうございます。 高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。 > パブリック継承した型では基底への型変換を禁じることができない。 そんな問題があるとは。 派生クラスのキャスト演算子は引っかからず、基底クラスの コピーコンストラクタをいじらないと禁止出来ないっぽかった。 protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。 > 間違った使い方を想定するとキリがないから > なんでもかんでもガチガチに型を設計する必要はないんだけど、 > この場合はどこかでミスりそうと思うので > 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。 候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。 しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、 別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。 # shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照 なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、 他により良い方法を思いついたらそっちに乗り換えることにします。
513 :504 :2023/07/19(水) 18:45:15.41 ID:4lyHW67x.net そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、 public継承でほったらかします。
514 :デフォルトの名無しさん :2023/07/20(木) 15:28:07.42 ID:6BSTmMYa.net templateの世界へようこそ
515 :はちみつ餃子 ◆8X2XSCHEME :2023/07/21(金) 13:23:19.14 ID:NiBubQrd.net std::unique_ptr なら型引数でもデリータを与えることが出来て、 型引数が異なれば異なる型ということになる。 #include <memory> template<class T> struct custom_delete : public default_delete<T> {}; int main(void) { std::unique_ptr<int, custom_delete<int>> foo{new int(42)}; // ↓ 別の型なので移動できない。 エラーになる。 std::unique_ptr<int> bar = std::move(foo); } ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。 解体は動的な型に従うという保証をしているので。 #include <memory> struct foo {}; struct bar : public foo {}; int main(void) { // 解体のときに foo ではなく bar の // デストラクタが呼ばれることが保証される std::shared_ptr<foo> x{new bar}; } std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが 設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す というのが最も自然な形と言える。 std::shared_ptr を継承する形でカスタマイズしようとするのは してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
516 :504 :2023/07/21(金) 20:08:15.21 ID:jaEOXewl.net 一応発端の動かなかったコードを短くしたのでおいときます。 0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい 1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。 2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の デストラクタじゃないと処理できないけど、既製品だから外からいじられない。 3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば? というのが趣旨でした。 #include<vector> #include<memory> int main(){ std::vector<std::weak_ptr<int>> v; std::shared_ptr<int> x(new int(3), [&x, &v](int* i){ for(int j = 0; j < v.size(); j++){ std::shared_ptr<int> t = v[j].lock(); if(t && t == x){v.erase(v.begin() + j); break;} } delete i; }); v.push_back(x); }
517 :デフォルトの名無しさん :2023/07/25(火) 09:24:45.92 ID:k8WJtY+U.net >shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない これが無理っしょ
518 :デフォルトの名無しさん :2023/07/28(金) 10:56:39.59 ID:Zgvcm9f5.net なんで出来ると思ったの
519 :デフォルトの名無しさん :2023/07/29(土) 20:15:59.76 ID:ETnyq2kJ.net shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする
520 :デフォルトの名無しさん :2023/07/29(土) 20:25:36.66 ID:xEb8mTKO.net シャー専用ptr
521 :1 :2023/09/03(日) 20:55:45.58 ID:/ExZEMtW.net 「プログラム」作るのって、やってみたいけど、全然知らないから、教えて欲しい。 からのスレの目的で建てました。
522 :デフォルトの名無しさん :2023/09/03(日) 20:59:12.95 ID:W287fTtw.net まず、何が作りたいかイメージしてみましょう
523 :デフォルトの名無しさん :2023/09/04(月) 10:11:49.98 ID:/ASAZOX6.net >>521 がC++をやるのは早過ぎる 先にpythonでもやってみろ
524 :デフォルトの名無しさん :2023/10/02(月) 22:07:14.88 ID:l4Vvzubd.net 次のプログラムを実行するとコメントのように出力がされ、mainの最後で例外が発生してしまいます。 なぜ例外が発生するかわかる方教えてください。 mainを通してnewは2回実行され、deleteも2回実行されるので空ポインタをdeleteしていることもないと思うのです。 #include <iostream> using namespace std; class Csmp1 { private: int x; int* p; public: Csmp1(int n); ~Csmp1(); void disp() { cout << "x=" << x << endl;} }; Csmp1::Csmp1(int n) { x = n; p = new int; cout << "constructor " << x << endl; } Csmp1::~Csmp1() { delete p; cout << "destructor " << x << endl; } int main() { Csmp1 d3(300); // "constructor 300"と出力 d3.disp(); // "x=300"と出力 d3 = Csmp1(400); // "constructor 400"と出力し、その後"destructor 400"と出力 d3.disp(); // x=400と出力 return 0; } // デストラクタが呼ばれ、delete の部分で"Unknowin signal"例外発生
525 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:06.36 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
526 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:09.92 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
527 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:23.61 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
528 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:12:42.13 ID:/sjCb2h4.net >>524 d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
529 :蟻人間 ◆T6xkBnTXz7B0 :2023/10/02(月) 22:18:32.15 ID:/sjCb2h4.net 連投すみません。コピーコンストラクタと、代入もです。
530 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 00:13:21.44 ID:OUiDjLFt.net >>524 暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。 ポインタを代入した場合には代入元と代入先のポインタが指す先のオブジェクトは同一なので 一方のポインタを通じて delete したならもう一方のポインタからオブジェクトに触れようとしてはならない。 (もう存在しないので。) この場合は d3 = Csmp1(400); としたときに生成される一時オブジェクトはこの式が終わった時点で解体されるので d3 内にあるポインタはデストラクタで delete 済み、すなわち無効なポインタとなる。 d3 のデストラクタが起動したときはデータメンバ p が指している先は無効なので 無効なポインタをいじったことになって問題が生じる。 それと d3 のコンストラクトのときに new したオブジェクトはどこからも delete されてない。
531 :527 :2023/10/03(火) 00:55:04.57 ID:RKQFDOr6.net >>529-530 お二人さま ありがとうございます。 >d3 = Csmp1(400);としたときに生成される一時オブジェクトはこの式が終わった時点で解体される 右辺により生成されるオブジェクトが単にd3に格納されるのではないのですか。 それと入れ替わりに、d3コンストラクト時のオブジェクトのデストラクタが呼ばれると思ってました。 (どこからも参照されなくなるので) 自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。
532 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:13:14.63 ID:OUiDjLFt.net >>531 > 右辺により生成されるオブジェクトが単にd3に格納 JavaScript とか Python の動的型言語の経験があるのかな? それとも Java や C# の参照型のモデルで考えてる? C++ では左辺はメモリ上の特定の場所に対応づいていて、 別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは コピーするということ。 その上で不要になった一時オブジェクトは解体される。 一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで 解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
533 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:13:25.78 ID:OUiDjLFt.net >>531 > 右辺により生成されるオブジェクトが単にd3に格納 JavaScript とか Python の動的型言語の経験があるのかな? それとも Java や C# の参照型のモデルで考えてる? C++ では左辺はメモリ上の特定の場所に対応づいていて、 別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは コピーするということ。 その上で不要になった一時オブジェクトは解体される。 一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで 解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
534 :はちみつ餃子 ◆8X2XSCHEME :2023/10/03(火) 02:17:47.16 ID:OUiDjLFt.net サーバから書込みエラーが返ってきたのを専ブラの機能でリトライしたら多重投稿になってしまってるな。 なんか不安定な状況っぽい
535 :デフォルトの名無しさん :2023/10/05(木) 17:15:14.18 ID:WXXGTjkD.net みんなでリトライするからF5攻撃並みに自爆DOS攻撃
536 :デフォルトの名無しさん :2023/10/05(木) 18:29:28.73 ID:S7K0dlIY.net >>524 int *をunique_ptr <int>にすると コンパイルで弾かれるから 気づきやすいかもね newとdeleteは直で呼ばない方が良い
537 :デフォルトの名無しさん :2023/10/06(金) 10:09:01.67 ID:Zl0hPCVy.net newとdeleteを直で呼んでるかどうかと 今回の問題(コピーが発生してるかどうか)は 関係無いんじゃね?
538 :デフォルトの名無しさん :2023/10/06(金) 10:16:23.02 ID:QFTcWZUD.net いきなりC++から入るとは… 考え直した方がいい
539 :デフォルトの名無しさん :2023/10/06(金) 12:08:09.60 ID:xj8n2YWF.net >>537 「コピーが発生してるかどうか」とは関係ないのはその通り >>524 が恐ろしいのは コンパイル時点では気づかず実行して初めて明らかになるところ どうしたら実行前に避けるかの方策として unique_ptrの常用を提案しました
540 :デフォルトの名無しさん :2023/10/06(金) 13:16:53.99 ID:Zl0hPCVy.net >>524 に有効な解決策は コピーコンストラクタじゃなくて ムーブコンストラクタじゃないのかな
541 :はちみつ餃子 ◆8X2XSCHEME :2023/10/06(金) 16:48:00.89 ID:R7EjAYTn.net 両方やっとけばええじゃろ。
542 :デフォルトの名無しさん :2023/10/06(金) 21:05:50.93 ID:BgvqARb2.net vector dp(N+1,vector(i+1,vector<mint>(i,0))); これはdp[N+1][i+1][i]個のデータを確保していると思っておk?
543 :デフォルトの名無しさん :2023/10/06(金) 21:10:07.75 ID:G9Jlm58L.net OK牧場!
544 :デフォルトの名無しさん :2023/10/06(金) 21:44:11.09 ID:BgvqARb2.net TXH!
545 :527 :2023/10/16(月) 23:49:47.91 ID:6sfjI2pS.net >>532 を始めとして皆さんまたまたありがとうございます。 アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。 コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。
546 :デフォルトの名無しさん :2023/10/17(火) 23:09:31.94 ID:cH9YbrYr.net 既製品のクラスライブラリについて、クラス階層が深いところのクラスは、公開メンバの全体をひと目で見渡すことができません。 マニュアルや継承のツリーををたどって地道に調べるしかないのですか。
547 :はちみつ餃子 ◆8X2XSCHEME :2023/10/18(水) 09:51:20.64 ID:UZlHr99J.net >>546 ソースコードの構造を調べるのを補助するツールはあるが どういう意図でどういう使い方を想定してそう書かれているのかは プログラマが読み解かないとどうしようもない。
548 :デフォルトの名無しさん :2023/10/18(水) 17:06:40.02 ID:d+gN3jrr.net 既製品ならドキュメントあるだろ ドキュメントで謳ってないことはやるべきでない
549 :デフォルトの名無しさん :2023/10/18(水) 21:01:33.56 ID:XEk7oAP2.net visual studio community 2022で、 他のソリューションで作成されたmoduleをimportする方法がわかりません。 #includeみたいにパスを指定する方法とかがあるんでしょうか?
550 :デフォルトの名無しさん :2023/10/18(水) 21:18:35.91 ID:GW9b62tt.net あるよ
551 :デフォルトの名無しさん :2023/10/18(水) 22:46:30.83 ID:XEk7oAP2.net >>550 ぜひ教えてください!
552 :デフォルトの名無しさん :2023/10/19(木) 10:07:14.52 ID:W1XtHktx.net 外部モジュール取り込みは言語仕様じゃ無くてIDEの機能だから
553 :デフォルトの名無しさん :2023/10/20(金) 09:56:30.99 ID:/M3RKJCH.net IDEに頼ってるとアホになるよ
554 :デフォルトの名無しさん :2023/10/21(土) 16:32:35.29 ID:dhBJRkMq.net 0のうちにやめとけ 時間がもったいない
555 :デフォルトの名無しさん :2023/10/26(木) 23:16:10.15 ID:4gABazLN.net typedef uint8_t byte; : byte a = 3; uint8_t b = a; bの初期化は型不一致エラーにならないと思います。 コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。
556 :デフォルトの名無しさん :2023/10/26(木) 23:23:19.82 ID:oN20rU1J.net >>555 typedef は型の別名を作る機能であって新しい型を作らない。
557 :デフォルトの名無しさん :2023/11/05(日) 12:44:18.01 ID:iVzKXsmj.net Visual StudioでソリューションAでビルドしたブツ(.exe、.dll、lib)、シンボルファイル(.pdb)、必要なヘッダファイル(.h) をソリューションBで取り込むの場合、Aのビルド後イベントとBのビルド前イベントを駆使してフォルダのパスは "$(Solution)..\x\$(Platform)\$(Configuration)" みたいなマクロで解決、みたいなローテク頼みという印象、 Visual Studio 2019以降だと今は実はもっと簡単?
558 :デフォルトの名無しさん :2023/11/10(金) 23:40:20.59 ID:mtEH7OmF.net class MyClass { public: MyClass(); : }; int main() { MyClass* c = new MyClass(); ① MyClass d; MyClass* dp = &d; ② : } オブジェクトのポインタは①や②のように取得できると思います。 私からすると①はdeleteしなければならないのでできれば使いたくない。 ①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
559 :デフォルトの名無しさん :2023/11/10(金) 23:49:08.54 ID:VDRR6isO.net >>558 その「相互代入」って何ですか?
560 :はちみつ餃子 :2023/11/10(金) 23:56:43.46 ID:Irnop6+y.net >>558 自動変数の寿命はスコープ単位だから それより長い寿命のオブジェクトが必要なら new する。 寿命の種類のことを Storage duration といい、 new で生成したオブジェクトは Dynamic storage duration に該当する。 継承関係がどうこうというのは何が言いたいのかよくわからないが、 ポインタの性質はオブジェクトの寿命とは関係ない。
561 :デフォルトの名無しさん :2023/11/12(日) 00:13:49.90 ID:M40i1rJ9.net 相互代入は言葉がおかしいですね。 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。 オブジェクトのボインタを使う場面があまりないので用途を聞きました。 >>560 >自動変数の寿命はスコープ単位だから それより長い寿命のオブジェクトが必要なら new する。 自分の場合、関数内より長い寿命が必要となったらそれはもうグローバルにしてしまいます。設計方針がよくないですかね。
562 :はちみつ餃子 :2023/11/12(日) 02:00:51.06 ID:O0gb6uIB.net >>561 グローバル変数として書いたオブジェクトの寿命は static storage duration に該当する。 この static というやつは main が始まる前に構築されて main が終わった後に解体されるので 必要以上に長い寿命になってしまうことが多いし、 実行時の情報を元にして構築するオブジェクトを static にはしようがない。 dynamic (new でのオブジェクト生成) が必要になる場面はごく普通にある。 ごく普通にあるのに使わずに済ませてるならたぶん不自然な設計になってると思う。 グローバル変数は寿命も長すぎるがスコープも広すぎる。 人間は自分が思ってるより馬鹿だから最初にどういう想定をしてたのか忘れて要らんことをしてワヤにする。 触らせたくないものは隠しておくのはカプセル化の考え方の重要な部分。 本当に人間は忘れるし間違える。 部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。 まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。
563 :デフォルトの名無しさん :2023/11/12(日) 11:04:18.35 ID:l8rhUXJt.net >>558 >@の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。 そのためだけにあるという訳ではない >私からすると@はdeleteしなければならないのでできれば使いたくない。 生のポインタではなくスマートポインタ(unique_ptrやshared_ptr)を使えば deleteはスマートポインタがやってくれる 構築は uniqu_ptr <MyClass> = new MyClass(); や uniqu_ptr <MyClass> = make_unique <MyClass> (); のようにやる
564 :デフォルトの名無しさん :2023/11/12(日) 13:14:04.39 ID:xpiKETrj.net > 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。 > オブジェクトのボインタを使う場面があまりないので用途を聞きました。 アップキャストのことだろうかね。 必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか
565 :デフォルトの名無しさん :2023/11/13(月) 06:27:48.00 ID:qbVz2ceg.net >>558 は、最初から必要数が決まっているオブジェクトしか作ったことがないのかな。 リストやツリー構造を自作していれば、①が必要なケースは分かると思うけど。
566 :デフォルトの名無しさん :2023/11/13(月) 10:31:45.02 ID:IRswNIWu.net >>564 型チェックしなきゃ危険だけどな
567 :デフォルトの名無しさん :2023/11/13(月) 13:26:36.10 ID:qAieNn1D.net uniqu_ptr
568 :デフォルトの名無しさん :2023/11/13(月) 18:54:22.80 ID:CCXWxw1E.net >>567 おおスマン typoだね
569 :デフォルトの名無しさん :2023/11/13(月) 23:59:54.01 ID:RLYu3oMv.net >>562 ほか皆さんありがとう。 自分の関わってきた分野が小規模組み込みだからか、そもそもCでmallocの使用経験がないのです。 処理系がmallocをサポートしないMCUもありました(使いたいなら自分で作ってという思想、標準入出力も)。 なので>>565 さんの指摘は当たりです。 c++に挑戦している今の環境も小規模なので、newの利用はほどほどに検討してみます。
570 :デフォルトの名無しさん :2023/11/14(火) 00:03:40.68 ID:F1cdKor4.net >>564 だいたい参照で済んでしまいます
571 :デフォルトの名無しさん :2023/11/14(火) 12:46:18.30 ID:SRCspH78.net mallocもnewも使ったこと無いってやばいぞ
572 :はちみつ餃子 ◆8X2XSCHEME :2023/11/14(火) 15:58:08.40 ID:oTbgWDDI.net new 演算子はオーバーロードも出来て、型ごとにメモリの確保の仕方を変えるといったようなことも出来る。 メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?) 低レイヤでも便利な場面はたぶんある。 分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。 知っておくに越したことはないよ。
573 :デフォルトの名無しさん :2023/11/14(火) 21:59:36.46 ID:WxE96Zj2.net 空配列を用意してそれを順繰り使い回す チープなCPUでは必須の方法
574 :デフォルトの名無しさん :2023/11/14(火) 22:15:51.21 ID:VpxEmvp/.net RAM2KBでmallocが必要かどうか
575 :デフォルトの名無しさん :2023/11/15(水) 09:06:17.34 ID:vh+zgKB1.net よく A a = new A(); a->b(); delete a; みたいに生成してすぐ解放ってのがありますけど、 A a; a.b(); じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。
576 :デフォルトの名無しさん :2023/11/15(水) 09:39:21.05 ID:88mXe6hW.net 後者はスタックを消費するから A が巨大なオブジェクトだったら困るとかかな
577 :デフォルトの名無しさん :2023/11/15(水) 09:40:08.83 ID:7t1hSBTd.net >>575 A *a = new A(); よね、一応 bを呼び出したいだけなら特にメリットはないよ
578 :デフォルトの名無しさん :2023/11/15(水) 10:25:46.06 ID:2QF9cM/v.net スタック? そんな所にゃ領域取らないだろ
579 :デフォルトの名無しさん :2023/11/15(水) 16:06:06.00 ID:rnHf5KLb.net 何したらここの人らみたいにプログラム詳しくなれるの?PC98からやらなきゃダメ?
580 :はちみつ餃子 ◆8X2XSCHEME :2023/11/15(水) 16:35:01.46 ID:k729Xl/N.net >>575 > ありますけど、 ないよ……。 少なくともそう頻繁にはない。 あるとしたら >>576 が指摘するように A が特に巨大な場合というのはひとつの可能性。 ただ、巨大になるのがわかってるならリソースを分割して A の中で 上手いことやりくりする (A 自体の大きさは抑える) べきで、 クラスを使う側で配慮しなきゃならないのは普通は悪い設計だと思う。 第二の可能性として、 new 演算子をオーバーロードして そのオブジェクトがメモリの特定の場所に対応づけられる場合。 メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。 でもそれは低いレイヤだけの話で、 適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。
581 :デフォルトの名無しさん :2023/11/15(水) 18:55:56.04 ID:aqUxtLPE.net 超初心者スレで揚げ足とったり、マウントしたり
582 :デフォルトの名無しさん :2023/11/15(水) 19:46:52.63 ID:O3I3kWYX.net >>579 何か作ってるうちに嫌でも詳しくなるよ
583 :はちみつ餃子 ◆8X2XSCHEME :2023/11/15(水) 21:31:49.26 ID:k729Xl/N.net PC9801 時代を知ってる人は色々と詳しいと思うがその知識が役立っているというわけでもなくて、 PC9801 時代からの三十年くらいあれば詳しくなって当たり前ってだけだぞ。 たくさんの知識を身に付けるにはたくさん学ぶというシンプルな話。
584 :デフォルトの名無しさん :2023/11/16(木) 11:26:46.68 ID:QXdh7keC.net 当時は役に立ったけど今はオワコンの技術と 今でも役に立ってる技術と どっちが割合多い?
585 :デフォルトの名無しさん :2023/11/16(木) 11:55:31.84 ID:nxuWB9A/.net 「技術は陳腐化するが考え方は永遠である」
586 :はちみつ餃子 :2023/11/16(木) 14:01:30.65 ID:brAf4s3Y.net 新しい技術的流行が昔からあったやつの焼き直しってことは珍しいことじゃない。 「なんや、結局は××やないか」というときに××自体が廃れていてもう使わなくても 理解のためには役立っているのでオワコンとも役に立ってるとも言えたりする。
587 :デフォルトの名無しさん :2023/11/16(木) 15:18:16.01 ID:QXdh7keC.net ActiveXってCOMだよね COMってOLEだよね
588 :デフォルトの名無しさん :2023/11/20(月) 15:56:09.22 ID:QJSPRwrd.net こんにちは坂本と申します。 C++を0から勉強したく書き込み致しました。 私ごとですが先月定年退職し、やっと自由な時間がもてる様になりました。 在職中ずっとプログラミングの勉強をしたかったのですが子育てや職場がプラントの電気機械保全業務の3交代だった為に定年後を楽しみに我慢してまいりました。 プログラミングの知識は全くなく制御盤のPLCでニーモニック語でリストプログラミングをするぐらいしか経験はありません。 有料でもかまいませんので何回でも質問ができ、すぐに返答と解説をして頂けるサービスや学習機関がございましたら教えて頂きたく書き込ませてもらいました。 漠然とした質問で申し訳ありませんが今月よりプログラミングの勉強を独学で始めましたが質問できる知り合いもいなく困り果てております。 長文失礼致しました。
589 :デフォルトの名無しさん :2023/11/20(月) 19:07:01.26 ID:UNSN9Hhc.net >>587 DDEは?
590 :デフォルトの名無しさん :2023/11/21(火) 00:24:28.42 ID:cXhp/VaI.net C/C++ はポインターがあるから、ややこしい。 10年やっても無理 Ruby をやれ。 半年で、Ruby on Rails も出来る
591 :デフォルトの名無しさん :2023/11/21(火) 11:11:38.44 ID:HSO31doi.net 神社code
592 :デフォルトの名無しさん :2023/11/21(火) 14:22:46.70 ID:tYm3I+7J.net ポインターが分からない奴は プログラムを組む資格がない
593 :はちみつ餃子 :2023/11/21(火) 17:27:32.66 ID:4ADiN9xr.net ちゃんとした本があれば独学でそんなに困らないと思うけどな。 入門書の各章をじっくり読んで理解してから次の章に進むみたいな学習法をしているなら 詰まったときにどうしていいかわからなくなりがちなのでやめたほうがいいと思う。 色んな要素が相互に絡むので順番通りに学べるようなものじゃないから。 理解できなくてもたくさん詰め込んでいけばその内に繋がりがわかってくる。 「最初は」熟考しなくてもいい。 入ってない知識が関連するなら考えてもどうせわからん。
594 :デフォルトの名無しさん :2023/11/21(火) 17:38:45.53 ID:oh7zlSJI.net >>590 ポインタ使わないこともできるのに何言ってんだ そもそもポインタはノイマンアーキテクチャの基本なのでポインタがわからないというならコンピュータの利点を十分に利用できないということ
595 :デフォルトの名無しさん :2023/11/21(火) 18:05:44.93 ID:tYm3I+7J.net ポインター: 変数が入っているアドレスの数字 なんも難しいことはない
596 :デフォルトの名無しさん :2023/11/21(火) 18:24:30.60 ID:fyFN08Ef.net インデックスって言えば分かる? コンピュータにあるメモリー全体のインデックス番号
597 :デフォルトの名無しさん :2023/11/21(火) 18:35:32.85 ID:Ai4yJ31G.net 俺も最初全然わからなかったけどC言語ポインタ完全制覇のおかげで覚えた
598 :デフォルトの名無しさん :2023/11/21(火) 19:20:18.31 ID:JkIDzJ0A.net Java や C# にもポインタはあるしポインタを理解できなかったら他の言語も使えないよ ポインタ自体は難しくないんだけど C/C++ ではポインタ演算できちゃうのが鬼門なんだよね
599 :デフォルトの名無しさん :2023/11/21(火) 20:49:14.51 ID:TIZNoRj+.net N88-BASICにポインタあったっけ?
600 :デフォルトの名無しさん :2023/11/21(火) 20:53:06.63 ID:TIZNoRj+.net ポインタの文法なんて入門書には必ず説明があるので直ぐ分かるとして 俺が初期に読んだ数冊の入門書には それがプログラミングでどう役に立つのかが示されてなくて 悶々としながら読んでいたなぁ
601 :デフォルトの名無しさん :2023/11/21(火) 21:38:13.97 ID:fyFN08Ef.net ポインターなんて処理が糞遅いCPUをいかに速く動かすかって事以外に意味が無いからなぁ
602 :デフォルトの名無しさん :2023/11/21(火) 23:15:10.49 ID:mJ6deMbY.net std::string str = "abc"; ①str = str + "dd"; ②str = "dd" + str; これらの記述は有効のようです。 ①の右辺はstr.operator+("dd"); と解釈でき理解できます。 ②の右辺は "dd".operator+(str); と書きかえるとこれは無効に見えます。 std::stringのoperator+のプロトタイプを調べたところテンプレートが駆使されており私では読めませんでした。 ②が有効なのは、テンプレートの仕組み?でそう書けるようにつくられているからですか。
603 :はちみつ餃子 :2023/11/22(水) 06:21:16.63 ID:xG0rhWaa.net >>602 非メンバ関数として定義されている。 つまり str=std::operator+("dd", str); に相当することをやってる。 メンバ関数として定義すると不都合が起こるから std::complex とかも非破壊的な二項演算子は非メンバ関数として定義するのが通例だよ。
604 :デフォルトの名無しさん :2023/11/23(木) 18:16:14.60 ID:yQq1Seno.net >>603 本を見直したらfriendにするといい等ありました。 第1引数+第2引数、という記述があり、2個の引数を持つ+演算子関数が定義されている場合はそれが呼び出される決まりになっているのですね?
605 :デフォルトの名無しさん :2023/11/23(木) 18:17:35.84 ID:yQq1Seno.net stringから離れて一般的な質問です。↑
606 :はちみつ餃子 :2023/11/23(木) 20:11:53.97 ID:V52ACnUy.net >>604 そう。非メンバ関数として二つの演算子を受けとる operator+ があれば a+b みたいに書いたときに operator+(a,b) に読み替えられると考えてよい。 (全ての演算子を非メンバ関数として定義できるわけではない。) 余談だけど ADL という変な規則があるのは演算子が名前空間修飾できないことに対処する必要があるというのが理由のひとつで、自分が定義するクラスではこれが上手いこと作用するように設計すると便利なこともあるかもね。
607 :はちみつ餃子 :2023/11/23(木) 20:13:30.07 ID:V52ACnUy.net >>606 間違い。 「二つの演算子」じゃなくて「二つの引数」
608 :デフォルトの名無しさん :2023/11/23(木) 20:15:11.03 ID:0De2U7us.net 最小のサンプルコードを書いて自分で試すと分かるし身につくよ
609 :はちみつ餃子 :2023/11/23(木) 20:49:41.10 ID:V52ACnUy.net 書いてみるというのは賛成。 でもあくまでも学んでから確かめるために書くのであって動作から言語仕様を推測したりはしないように。 C++ には未定義とか処理系定義とかがいっぱいあるからテキトーに書いたプログラムの結果が保証された動作とは限らないから。
301 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200
本文 スレッドタイトル 投稿者