C++相談室 part142

■ このスレッドは過去ログ倉庫に格納されています
2019/04/01(月) 22:17:05.84ID:wmfpIKt/
次スレを立てる時は本文の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
2019/05/16(木) 02:06:57.91ID:mZDDPYlt
struct B : public A
{
B* operator=(const A& a){ this->hoge = a.hoge;}
};
これ初期時にも使えるんかな
2019/05/16(木) 02:25:05.62ID:1v50lv4I
コピーコンストラクタが実装できたとしてメンバ変数は1個ずつコピーするしかないですかね
2019/05/16(木) 02:28:08.55ID:mZDDPYlt
スライシングをさせるとか?
安全に?スライシング起こす方法ってあったっけな?
なんか危ういからやろうともしなかったが
2019/05/16(木) 06:25:17.13ID:/dAesd8e
cloneメソッド用意するとか
2019/05/16(木) 06:31:42.80ID:ebJ8HHSX
>>549
初期化時は普通にコンストラクタ初期化リストで A(a) って書けるでしょ。残りのメンバをどうするのか知らんけど。
代入なら static_cast<A&>(b) = a か b.A::operator=(a) で済みそう。
2019/05/16(木) 06:33:37.60ID:C3C4SHXA
普通にコンストラクタかオペレーター作ればいいんじゃね
B::B(const &A)
B::operator =(const &A)
A::operator B()
雑なキャストでよければdynamic_cast<A>でおk
2019/05/16(木) 06:38:27.18ID:C3C4SHXA
↑dynamic_cast<B>の間違い
B b = dynamic_cast<B>(a);
2019/05/16(木) 11:40:14.21ID:74mGoL8y
>>551
sturctでまとめればデフォルトコピーコンストラクタが使えるけどね。
あとはintとかPODオブジェクトだけだったらmemcpyしちゃうとかも、俺はたまにやるなw
2019/05/16(木) 17:20:00.24ID:PgzYowjZ
549です
解決しましたありがとうございます

以下のように書いたら思っていたことが出来ました
(派生先のコンストラクタで親のデフォルトコピーコンストラクタ呼べるの知りませんでした)
代入は現状使う予定がないので大丈夫です
B::B(const &A a) : A(a) {}
2019/05/16(木) 18:17:29.46ID:mr2QiBZl
その内容だったら=defaultでいいよ
2019/05/16(木) 21:32:58.41ID:/aEDSlbd
引数付きコンストラクタって、=default使えるの?
2019/05/16(木) 22:09:55.18ID:jJO9F8Je
使えないよね
うかうかっと読み過ごしてたわw
562デフォルトの名無しさん
垢版 |
2019/05/18(土) 13:00:29.63ID:M54jyEoh
大本営がおるで!!!
2019/05/19(日) 21:52:57.08ID:sHpfouee
厳密にはC++の質問になるのかよく分からないんですが……
C++プライマーで勉強しててconstexprの部分にさしかかったんですけどコンパイル時評価、コンパイル時に評価される……みたいなことが書いてあるんですがこれの意味がいまいちよくわかりません
実行時評価という言葉も見られるんですがそれぞれの違いとそもそも評価ってどういう処理のことなんでしょうか
それとそもそもconstexprの使いみちが分かりません

よろしくおねがいします。
564デフォルトの名無しさん
垢版 |
2019/05/19(日) 22:10:21.84ID:H7yZimvS
>>563
評価=機械語による演算。
コンパイル時評価とは、コンパイラ(PCなど)が演算してその結果を成果物に出力すること。
実行時評価とは実行機(スマホなど)でプログラム実行時に演算して利用すること。
565デフォルトの名無しさん
垢版 |
2019/05/19(日) 22:21:54.17ID:Jw8g2++w
constexprってのは#defineの置き換えのために生まれたんだよ
C++11以前はenum使ってたんだけどなんかかっこわるいから専用のキーワードが出来たってことさ
2019/05/19(日) 22:26:05.40ID:yh9Mbv1R
1+2を計算するアプリ作るとするじゃん?
constexpr int a = 1 + 2;って書くじゃん?
でもこれaが3なの分かりきってるじゃん?
アプリをインストールした世界中のスマホでいちいち1+2=3って計算するの資源の無駄じゃん?
だからそういうコードを書いてコンパイルするとコンパイラが最初から「a=3」って埋め込んで世界資源の浪費を防ぐんだよ
これがコンパイル時評価

実行時評価は普通の電卓アプリがやってること
ユーザーが計算したいのは1+2か5×5かlog123456789かは使われてみるまでわからないので、おとなしくスマホのCPUと電池を使って計算する
これが実行時評価
2019/05/19(日) 22:27:31.23ID:c0f8nIXT
const int n = 5;
const int m = n * 100;

要するにこうするとmを計算してくれる
2019/05/19(日) 22:31:08.95ID:tquD1oX1
別にビルド構成に組み込めば済む話じゃね?くだらないな。
2019/05/19(日) 22:51:01.09ID:HuWon3wi
そんなことしなくてもソースコード中に普通のコードと一緒に書けるから
2019/05/19(日) 23:25:27.63ID:L0Ufwo4O
constexprはtemplateと組み合わせたときに真価を発揮する。
templateを実体化するときに、型や非型引数に加えて、変数や関数なども活用して複雑な条件をつけ、
実体化するコードをカスタマイズできるようになるからね。
2019/05/19(日) 23:34:14.21ID:+2TJ1Pbf
それなんかわかりやすい具体例コード出来ます?
2019/05/19(日) 23:36:46.24ID:oSFlthhy
constexpre定数って配列の要素数に出来るということ以外に本質的な意味ってあるの?
そのへんがよくわからない
2019/05/19(日) 23:37:52.41ID:yh9Mbv1R
「constexpr 中3女子」でぐぐると変態コードがたくさん出てくるよ
2019/05/19(日) 23:38:23.88ID:oSFlthhy
配列の要素数と非型テンプレートパラメータね
2019/05/19(日) 23:38:52.26ID:L0Ufwo4O
分かりやすいかどうかは知らないが、以前ここ?で誰かが紹介していたnameofライブラリとか?
https://qiita.com/ta_dragon/items/1828ceb16bc8733526e1
c++17で導入されたstring_viewを使った文字列操作で、enum定義を文字列化してしまうってやつ。
2019/05/19(日) 23:41:56.16ID:yh9Mbv1R
constexpr int f();

constexpr int a = f(); //OK
const int b = f(); //NG

違いってこれだけでしょ
2019/05/19(日) 23:42:38.19ID:yh9Mbv1R
あれ?違うわ
無視して
2019/05/19(日) 23:56:10.59ID:vshkspmO
変態じみたものとしてはコンパイル時cコンパイルがあるな。
http://kw-udon.hatenablog.com/entry/2016/12/03/201722
2019/05/20(月) 00:13:59.34ID:osDMULGu
constexpr以前でも定数伝搬とか意識して書いてたところはあったはず、でもそれが本当に定数になっているのかはアセンブリ見ないと分からない
constexpr導入によってconstexpr変数の初期化は確実にコンパイル時に実行される、できなければエラー
同様の理由でconstexpr関数(コンパイル時にも実行可能な関数)が導入される
2019/05/20(月) 00:26:47.75ID:TOLwHecl
アセンブリ見なくても生成コード見ればよくね
2019/05/20(月) 00:36:37.94ID:osDMULGu
コンパイラのAST見るって事?
より困難では
2019/05/20(月) 03:36:27.47ID:68OGLTNB
単なる#define定数の代わりとしても名前空間が使える分価値はあるし
例えばconstexprでCRCを計算すれば文字列switchが可能になるとか難しいけど便利ではある
2019/05/20(月) 08:10:49.52ID:lEqHTAQ5
それ普通にヘッダーファイル生成コードでも書いた方がいいだろ。。
そっちのが明らかに可読性、デバッグのしやすさ上だし。
こんなもんありがたがってるのはどうせmakeもまともに書けない連中だろう。
2019/05/20(月) 11:52:26.23ID:mpvIl0KS
そうやって何十万ものヘッダファイルを生み出した例を知ってる。
2019/05/20(月) 12:32:04.02ID:Eu4SldXI
>>583
c++の規格内で完結するのと、make等の外部ツールを使うのとでは移植性が全然違うよ。
2019/05/20(月) 12:47:56.71ID:DC309puZ
同じ記述でソースコード内に式が書け関数が使えるメリットは可読性に大きく影響するだろうに
2019/05/20(月) 16:29:52.79ID:MZiC0WHg
外部ツール使えばいいはさすがに草
588デフォルトの名無しさん
垢版 |
2019/05/20(月) 18:36:37.69ID:a9u60dH4
configure なんて外部ツールを使ったソースファイルやヘッダーファイルを生成しまくりですが、新しい車輪の再発明ですか?
2019/05/20(月) 19:28:03.54ID:MZiC0WHg
configureできる純粋なWindowsはよ
2019/05/20(月) 19:31:01.36ID:m/UtbRiI
configureは古い。GitHubやるならCMake一択。
591デフォルトの名無しさん
垢版 |
2019/05/20(月) 19:35:30.06ID:ZjVO7Mes
CMake使ってるけど、いろいろ使いにくい。
2019/05/20(月) 19:47:55.36ID:MZiC0WHg
configureより100億倍マシだとは思うけど
それはそうとしてwindowsでpkgconfig使わせて
2019/05/20(月) 20:04:37.87ID:IyGiubcZ
CMakeって使いづらいよね
ターゲットの属性指定するのに
属性が先にくるんだもの
594デフォルトの名無しさん
垢版 |
2019/05/20(月) 21:22:56.75ID:VWEIYE4F
Visual Studio(C#)のプログラミングに関する質問です。

インクルードする2ファイルが、双方のクラスを互いに必要とするケースにおいて、
コンパイルが通らなくて困っています。(当たり前なのですが…)

【Aファイル】
クラスAの定義{
クラスBの使用(インスタンス作成、メソッド利用)
}

【Bファイル】
クラスBの定義{
クラスAの使用(インスタンス作成、メソッド利用)
}

【全体インクルードファイル】
#include Aファイル
#include Bファイル

【コンパイル結果】
Bクラスが存在しません(Aファイルにて)

【質問】
お互いにクラス定義を必要とする場合、
★具体的に★どのような実装をすれば良いのでしょうか?
2019/05/20(月) 21:26:14.46ID:lEqHTAQ5
本当に複雑な計算が必要な定数なんてそんな多くないだろうに。。
やっぱバカしかいねーのな。。
2019/05/20(月) 21:28:50.53ID:TjPZT1E7
具体的には実装回答しないけど前方宣言
2019/05/20(月) 21:29:24.12ID:68OGLTNB
>>594
C#?
598デフォルトの名無しさん
垢版 |
2019/05/20(月) 22:43:14.24ID:VWEIYE4F
>>596
前方宣言ありがとうございます。猛烈に調べてみます。
599デフォルトの名無しさん
垢版 |
2019/05/20(月) 23:58:43.37ID:ZjVO7Mes
indexという構造体を作ってstd::vectorにぶち込んだらgcc8でエラーになるのだが。
ダメなん?
600デフォルトの名無しさん
垢版 |
2019/05/21(火) 00:00:39.50ID:nvUZjTIz
ideoneでやってみると通るんだけどな。
そのままコピペしてもgcc8だと通らない。
なんやねんこれ。
2019/05/21(火) 00:42:44.99ID:R14wVX0G
ソースなりエラーメッセージなり出せや
2019/05/21(火) 00:53:39.04ID:qC5qbLDj
どうせそのクソ構造体コピーもムーブも出来ないんだろ
定義貼ってみ
2019/05/21(火) 01:07:06.57ID:XM845/F7
wandboxの8系統でもダメなん?
2019/05/21(火) 09:38:36.10ID:0u73mqpq
deleteした後のポインタに0やnullを入れることを「仕様」にしないのは何か理由があるんですかね?
2019/05/21(火) 09:42:27.71ID:BlBHQ5S4
たとえばポインタのコンテナを扱ってる場合、
deleteしたポインタをコンテナから消そうと思ったら
その仕様だと逆に不便じゃね
2019/05/21(火) 09:45:22.82ID:2HB0EGuO
>>604
・ポインタが右辺値だったら意味ないから
・今どきもうユーザーコード内に new, delete は出てこないから
607デフォルトの名無しさん
垢版 |
2019/05/21(火) 10:02:39.86ID:/yR1kHAO
>>604,606
そんな貴方にスマポ。具体的には unique_ptr, shared_ptr。
2019/05/21(火) 10:26:36.33ID:wU6Ws5fl
>・今どきもうユーザーコード内に new, delete は出てこないから
こういう決めつけはどうかと思うんだよなぁ
とか言ったらまた荒れるんだろうな・・

というか理由は単にゼロオーバーヘッドだろ
2019/05/21(火) 10:58:39.79ID:9RXBRo+g
>>592
configureのが楽
2019/05/21(火) 11:47:39.94ID:2HB0EGuO
>>608
出てこないのが理想なんだから>>604のような機能は逆行
ってことだろ
2019/05/21(火) 12:08:41.91ID:om3WDsPR
ポインタを一時変数に代入していた時点で意味無くなるし
void*とかで持っていたらどうするつもりなんだか
2019/05/21(火) 17:11:33.15ID:OTKORriw
スマポでdeleteは排除できてもnewはいるだろ
2019/05/21(火) 18:14:30.34ID:m8UBXeEG
make_sharedに渡すのってT()がいいのかnew T()がいいのか分からない
2019/05/21(火) 18:21:48.26ID:JOJ6V6qz
どっちも普通は渡さないだろ?
615デフォルトの名無しさん
垢版 |
2019/05/21(火) 19:18:35.44ID:/yR1kHAO
マ的にはナマポは生ポインタです?
616デフォルトの名無しさん
垢版 |
2019/05/21(火) 22:20:27.03ID:p9O37jGc
ヌルーポ
617デフォルトの名無しさん
垢版 |
2019/05/22(水) 00:47:45.78ID:a4QDMpfS
>>602
それが、indexという名前がダメらしくて、アンダースコア一本付け足すだけで通るんだよ。
2019/05/22(水) 00:51:52.15ID:wNVmTKK9
その環境の標準ヘッダを書き換えたバカがいるとかじゃね
2019/05/22(水) 06:17:49.28ID:t1pLQv56
>>617
>>601
2019/05/22(水) 11:05:25.06ID:bpe9UG2z
>>613
コンストラクタのパラメータ渡すもんやろ
2019/05/22(水) 17:38:02.73ID:754wR9Ar
WindowsのSleep関数みたいな変態マクロが実装されてるとか
2019/05/22(水) 19:05:38.03ID:HXP4tOE0
さっさと元ソースとgcc -Eとgcc -dM -Eの結果貼るか死ぬかどっちか選べ
2019/05/22(水) 19:07:58.37ID:0oi9wkAH
C++ってゲーム業界以外で使われてるの?
2019/05/22(水) 19:10:27.02ID:wNVmTKK9
使われているだろ
少なくともGoogle、アップル、MSでは主要言語のひとつだよ
2019/05/22(水) 19:22:56.56ID:E7rKivNV
メーカーの募集ページでも見れば?
2019/05/22(水) 19:31:09.11ID:HXP4tOE0
今をときめく人工知能のライブラリのほとんどはPythonの皮+C++のコアっていう構成だぞ
2019/05/22(水) 20:00:24.67ID:KVrYPX3F
>>623
テレビ、宇宙、鉄道路線の最短経路
2019/05/22(水) 20:09:03.46ID:tAHmoj8N
あれだけPython重点だったChainerもmasterにC++の自動微分マージしたしな
2019/05/22(水) 21:03:12.50ID:a23nlY2Z
>それが、indexという名前がダメらしくて、アンダースコア一本付け足すだけで通るんだよ。
心当たりがありすぎるw
これは外には出せんなw
2019/05/22(水) 21:12:32.67ID:omtGQ9bF
>>627
漠然としすぎでよくわからんのだがw
おれの周りだと、重い演算部分だけc/c++でライブラリ化するのはあるけど、
アプリを作るのはないな
c++使える人少ないし
2019/05/22(水) 21:31:18.91ID:G1WjNUUx
>>623
仮想通貨
632デフォルトの名無しさん
垢版 |
2019/05/22(水) 22:42:45.38ID:u7nmxvF3
金毘羅とコンパイラ、どのくらい互換性あるの?
2019/05/23(木) 00:25:21.49ID:uUKvPk1Q
魂斗羅くらいじゃない?
2019/05/23(木) 03:17:45.28ID:tfvbct5D
コンプラの前では何れも塵芥の様なものよ
2019/05/23(木) 10:36:11.44ID:NhdF0b/F
>>497
printfも語順変えられへんで…
2019/05/23(木) 11:31:22.42ID:6zCIietC
>>635
printfはフォーマット文字列を言語ごとに切り替えればいいけど、streamはハードコーディングになってしまう
2019/05/23(木) 11:47:25.42ID:HpI/x5tV
具体的にどんな場面で困るのか例を挙げてもらうと助かる
2019/05/23(木) 12:02:43.15ID:asp3Rd8H
多言語対応とか?
2019/05/23(木) 12:58:07.89ID:NhdF0b/F
>>636
語順変えられへんわ、引数がハードコーディングだわで
printfも変わらんやろっての
2019/05/23(木) 12:59:15.62ID:NhdF0b/F
>>638
streamでも文字列をリソース使えばいいだけやで
641デフォルトの名無しさん
垢版 |
2019/05/23(木) 13:22:43.81ID:ovhRah7H
「Aさんが所有するBをCしますか?」という文章を多言語対応すると、ABCの並びを各言語に応じて変える必要があるでしょ。
書式指定で引数並びを変えることができないprintf()やiostreamでは対応不能。JavaやC#のような対応が正解。
2019/05/23(木) 14:02:03.14ID:PBFS7PSY
>>640
streamだと文字列リソースが細切れになってもとの文字列が何だったかよく分からず翻訳者にそのまま渡せないって問題はあるかも。

いずれにしても、c++の文字列formattingは更新が必要
2019/05/23(木) 14:25:55.23ID:Y2p7ALG3
string_view、constexpr、templateを使えば、C#風のフォーマットも実現できそうな気はする。
2019/05/23(木) 15:31:58.20ID:59bc+gd2
とうとうstreamへの何癖もここまで頭おかしくなったか
645デフォルトの名無しさん
垢版 |
2019/05/23(木) 16:05:52.24ID:ovhRah7H
Do you C B that A owns?
2019/05/23(木) 18:20:07.46ID:NhdF0b/F
>>643
それはコンパイル時に決定してしまうからだめだな。
ロケール設定に合わせて動的に変えられる仕組みではない
2019/05/23(木) 18:37:21.77ID:NhdF0b/F
型指定文字間違えたら簡単に飛ぶscanf系
飛ばないけど書式文字列と書きたい値の型合わせが必要なprintf

まー、ostreamは数値の精度指定とか面倒っちゃー面倒だが
目くじら立てて本質的に駄目って話と違うからなぁ。
2019/05/23(木) 18:39:20.26ID:9reHFHA1
結局、eof までデータを読んで vector に格納する、の正しいやり方が分からない。
リードエラーまで気にするのはやり過ぎだとしても、空行がある場合などにも正しく動くものを作るにはどうするべき?
下のコードでダメな場合ある?
駄目じゃないとしたらもっと洗練されたやり方ある?

vector<double> invec(string filename){
 vector<double> A;
 ifstream fin(filename);
 double temp;
 while(not fin.eof()){
  fin >> temp;
  A.push_back(temp);
 }
 return A;
}
2019/05/23(木) 18:45:48.03ID:GRcYBCGD
そのコードじゃむしろどのパターンでもダメじゃね
最後がダブって格納される
while(fin>>temp) {
A.push_back(temp);
}
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況