C++相談室 part142
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part137 (正しくはpart138) http://mevius.5ch.net/test/read.cgi/tech/1535353320/ C++相談室 part139 https://mevius.5ch.net/test/read.cgi/tech/1538755188/ C++相談室 part140 https://mevius.5ch.net/test/read.cgi/tech/1547326582/ C++相談室 part141 https://mevius.5ch.net/test/read.cgi/tech/1550772463/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.103【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1530384293/ ■長いソースを貼るときはここへ。■ http://codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語) ----- テンプレ ここまで ----- - VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>470 クラス内で定義したクラスです class ClassA { public: ... private: class ClassC; ClassC * C; } class ClassA::ClassC { ... } の場合class ClassA::ClassC からClassA::を取るとコンパイルが通りません 「プログラミング言語C++」だと、入れ子クラス(nested class)とか メンバクラス(member class)とか呼んでるみたい。 内部クラス(inner class)もよく聞くけど調べたらJava用語っぽいな Inner Class、Java用語なのか。そう呼んじゃってたわ >>473-474 nested class は仕様にあるので、 これが公式な用語と思って良いみたいだね。 以前、「完全さを求めるあまり今存在する良い物を犠牲にしてはならない」という趣旨のことわざをBBCハードトークで仄聞したのだが、原典はなんだろうか? >>480 ググってヒットしたもののうち、これについてめぐらせています(ことわざとは関係ありません…) http://www.kt.rim.or.jp/ ~hisashim/gabriel/WIB.ja.html この人(原著者)、最後まで間違ったままでいるような気がしてなりませんが、実際のところどうでしょうか ストリームの遅さは凄い凄すぎる。 ほとんどの場合、遅くても問題ないということはわかる。 でもあそこ迄遅くする必要があったのだろうか。 3.5 ストリーム ttps://sicp.iijlab.net/fulltext/x350.html これだろう 理想的にはこうなるべきだが、技術的には未だに追いついてないだけであり、将来的には解決される なのでC++では他のどの言語も真似してない<<や>>がある 逆に言うとストリーム・プログラミングが主流になったらC++が主流の座に返り咲く 今やどの言語もprintfのような書式付き文字列を指定する方式に回帰した(jsすら!)。 少なくとも書式付き出力に限れば、ストリームはプログラミング言語の中ではもう淘汰されてしまったんだと思うよ。 早いとこ、string::format()とかbasic_ostream::format()とか作ってほしいわ 多言語対応するためにはC#みたいに %1, %2みたいに引数を番号で指定できる書式じゃないとダメでしょ。 ストリームの精神はrangeに受け継がれて生き残るよ だから書式はそろそろ負けを認めよう <<には<<なりの良さがあると思うので、ストリームというより、stringがoperator <<をサポートすれば良いと思う。 文字列操作するためのインターフェイスとしては最悪だよ。 考えた奴は自分では絶対使わないで人に使わせるだけのタイプだろうな。 そもそもだけど、なんで文字って表示されるのに << とか %s とかこういうのが必要なの? どの言語でもprint(a);だけで表示させればよくない?aが文字列でも整数でも小数でもさ。 引数で判断してくれよ。 >>493 え、そう? 文字列を連結する時に、+=と+を使い分けるより<<だけですむ方が楽だし、連結する順番も自明だし結構良くない? std::string str; str << "hoge" << 123 << ".txt"; みたいな。 >>492 それは私も考えていました、cerr に都度吐いているメッセージを、もう一度プログラムの最後にまとめて吐きなおす、とかをやってみたいんです… >>495 そのやり方は引数の順序を変えられないから語順が違う言語間での翻訳で困る コンストラクタの引数に出力先stringインスタンスを渡すostream派生クラスを作ればいいじゃない。 string str; hogestream sstr(str); sstr << "hoge" << 128; stream の機能はいらんからとにかく文字列に差し込むだけ出来ればいいってのなら 単に operator<< を定義すれば出来るけど……。 https://wandbox.org/permlink/dIkEh0LDZEixGoiF >>499 ,500,501 ostream派生クラスじゃなくて独自のクラスのほうが軽量でいい。 stringインスタンスへのポインタのほかに、数値書き込み時の進数設定(oct,dec,hexを覚えておく)などをメンバ変数に持てばOK。 basic_ostream使えよっていつも思う なんで決め打ちするのかわからない b配列全てをa配列のケツにコピーするとき std::vector<char> a; char b[]={0,1,1,3,4}; a.insert(a.begin(),&b[0],&b[sizeof b]); これでいいの? &b[sizeof b] これが死ぬほど気持ち悪いんだけど そんな気色悪い書き方しなくてもこれでいいよ a.insert(a.end(), std::begin(b), std::end(b)); >>508-509 std::copy に back_inserter を渡す方が効率的という豆知識。 >>511 insertのが速いんでね? resizeしてmemcpyになるはず アルゴリズムよりvector::insertのほうが実装による最適化の余地は大きそうだな ポインタがイテレータとして渡された時点で相手が連続バッファだってわかるからね &b[sizeof b]でもstd::end(b)でもやってることは変わらないんだけどな 見映えは重要だな sizeof bじゃcharでしか使えないんで、そういう意味でもイケてないかも >>515 見栄えというか、名前が付いているってのはそれだけで単純にわかりやすいな。 (名前が妥当であれば。) 嫌儲で、東京五輪チケットのソースコードが出てるけど C++使ってるお前らなら、こんなソースコードじゃないよね? https://gogotsu.com/wp-content/uploads/2019/05/01-9.jpg >>518 サーバーサイドあまりやってないけどこんな泥臭い書き方するのか こんなもんだろ SIerが間違ってコンシューマ系のWeb制作を請けてしまうとこんな感じになる てかこんなもの韓国に出すのね 安くなさそう ってもしや北の方? parseInt(Num).lengthって動かなそう ほんまやw桁でも返ってくるのかと思ったがundefinedじゃんかw 型に無駄にこだわった結末がstreamと知っとくのは重要。 あの間違いを覚えとけ。 ゲームのシーンを管理するクラスとシーンクラスがあり、管理するクラスはシーンクラスを保持しています シーンクラスから管理クラスのシーンチェンジを行う関数を呼び出したいのですがどうやったらいいでしょうか シーンクラスが管理クラスのインスタンスを持ちたくありません >>518 webにあげるなら難読化まではしないにしても最低限圧縮するよね >>526 シーンクラスに管理クラスへの参照(ポインタ)を持たせればいいんじゃないのか >a.insert(a.begin(),&b[0],&b[sizeof b]); > これ、添字オーバーしてるけどメモリエラーとかにならないの? >>530 イテレータ範囲のendは配列の場合最後の要素の次のアドレス それは普通の実装ではアクセスされることはない 規格的にも最後の次の要素へのポインタだけは未定義じゃない &p[N]はp + Nと同じって規格にあったっけ? 確かに&b[sizeof b]はデリファレンスしてるわ これはあかんそう >>533 a[i]は a+i ではなく *{a+i} 経験上出来るプログラマーは言語オタクが多いイメージ?(ただし浅い) &*pはデリファレンスなしで単にpと評価するってどっかで特別に決められてなかったっけ? >>530 int a[5]; int *p = &a[5]; というコードが有効、つまり 「配列の最終要素の次の要素」(現実には存在しないデータ)のアドレスを取れる、 という仕様から、この場合は許される、というのが >>531 の指摘か。 一般的に >>538 が成り立つなら便利だけど、調べ切れなかった。 流れの元になった >>508 を見返したら、 a.insert(a.begin(),&b[0],&b[sizeof b]); これだと b[] の内容はベクタ a の先頭に挿入されちゃうね。 >>530 >>a.insert(a.begin(),&b[0],&b[sizeof b]); >> > >これ、添字オーバーしてるけどメモリエラーとかにならないの? 508だけど、これは a.insert(a.begin(),&b[0],&b[sizeof b]); こっちの間違いです。ごめんなさい。 a.insert(a.end(),&b[0],&b[sizeof b]); &b[sizeof b]); この部分は b+sizeof(b) これなら問題ない感じ? どちらでも動くけど、たまたまいてる可能性捨てきれないから不安なんだよね。 実際のソースはsizeof(b)がbに格納されているデータのサイズを示していて、 char b[256]; int s = read( fd, b, sizeof b); a.insert(a.end(),&b[0],&b[s]); みたいな感じで書いてます。 んで、b最大数来た場合にちゃんと動くか気になったというわけっす。 int s = read( fd, b, (sizeof b)-1); 無難にこれの方がいいですかね? >>539 >int *p = &a[5]; これは多分だめで、ポインタ値としての存在なら許される int *p = a+5; ややこしいからoperator <<を定義しようw VC++だと std::vector<T> a; &a[a.size()]はoperator[]のassertionに引っかかるね std::transformって並列処理されてますか? c++17のparallel版使えば並列実行されるかもしれない visual studioでC++17にしたけどいまいち並列版の使い方が分からなかった 普通にfor回すのと、OpenMP使ってfor並列化するのと、transform(非並列)使うの比較したら OpenMP>普通にfor≧transform だった struct AとAを継承したstruct Bがあって Aの内容をBの共通部分にコピーする方法ってないですか? A a; B b = a; みたいにしたいんですけど親を派生先にキャストはできないので困ってます struct B : public A { B* operator=(const A& a){ this->hoge = a.hoge;} }; これ初期時にも使えるんかな コピーコンストラクタが実装できたとしてメンバ変数は1個ずつコピーするしかないですかね スライシングをさせるとか? 安全に?スライシング起こす方法ってあったっけな? なんか危ういからやろうともしなかったが >>549 初期化時は普通にコンストラクタ初期化リストで A(a) って書けるでしょ。残りのメンバをどうするのか知らんけど。 代入なら static_cast<A&>(b) = a か b.A::operator=(a) で済みそう。 普通にコンストラクタかオペレーター作ればいいんじゃね B::B(const &A) B::operator =(const &A) A::operator B() 雑なキャストでよければdynamic_cast<A>でおk ↑dynamic_cast<B>の間違い B b = dynamic_cast<B>(a); >>551 sturctでまとめればデフォルトコピーコンストラクタが使えるけどね。 あとはintとかPODオブジェクトだけだったらmemcpyしちゃうとかも、俺はたまにやるなw 549です 解決しましたありがとうございます 以下のように書いたら思っていたことが出来ました (派生先のコンストラクタで親のデフォルトコピーコンストラクタ呼べるの知りませんでした) 代入は現状使う予定がないので大丈夫です B::B(const &A a) : A(a) {} 引数付きコンストラクタって、=default使えるの? 厳密にはC++の質問になるのかよく分からないんですが…… C++プライマーで勉強しててconstexprの部分にさしかかったんですけどコンパイル時評価、コンパイル時に評価される……みたいなことが書いてあるんですがこれの意味がいまいちよくわかりません 実行時評価という言葉も見られるんですがそれぞれの違いとそもそも評価ってどういう処理のことなんでしょうか それとそもそもconstexprの使いみちが分かりません よろしくおねがいします。 >>563 評価=機械語による演算。 コンパイル時評価とは、コンパイラ(PCなど)が演算してその結果を成果物に出力すること。 実行時評価とは実行機(スマホなど)でプログラム実行時に演算して利用すること。 constexprってのは#defineの置き換えのために生まれたんだよ C++11以前はenum使ってたんだけどなんかかっこわるいから専用のキーワードが出来たってことさ 1+2を計算するアプリ作るとするじゃん? constexpr int a = 1 + 2;って書くじゃん? でもこれaが3なの分かりきってるじゃん? アプリをインストールした世界中のスマホでいちいち1+2=3って計算するの資源の無駄じゃん? だからそういうコードを書いてコンパイルするとコンパイラが最初から「a=3」って埋め込んで世界資源の浪費を防ぐんだよ これがコンパイル時評価 実行時評価は普通の電卓アプリがやってること ユーザーが計算したいのは1+2か5×5かlog123456789かは使われてみるまでわからないので、おとなしくスマホのCPUと電池を使って計算する これが実行時評価 const int n = 5; const int m = n * 100; 要するにこうするとmを計算してくれる 別にビルド構成に組み込めば済む話じゃね?くだらないな。 そんなことしなくてもソースコード中に普通のコードと一緒に書けるから constexprはtemplateと組み合わせたときに真価を発揮する。 templateを実体化するときに、型や非型引数に加えて、変数や関数なども活用して複雑な条件をつけ、 実体化するコードをカスタマイズできるようになるからね。 constexpre定数って配列の要素数に出来るということ以外に本質的な意味ってあるの? そのへんがよくわからない ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる