C++相談室 part154

■ このスレッドは過去ログ倉庫に格納されています
2021/01/08(金) 17:54:00.55ID:0DW9z0rL
※前スレ
C++相談室 part153
https://mevius.5ch.net/test/read.cgi/tech/1602339500/

テンプレここまで
2021/02/07(日) 10:13:42.72ID:2AGAGJ05
マスクも手洗いもコロナを100%防げるわけじゃないから
マスク付ける必要も手を洗う必要もないね
2021/02/07(日) 10:20:21.65ID:HYoiJUgB
テストツールいらねえなんて言ってねえぜ
テストツール万能論はアホの考えだと言っている
2021/02/07(日) 10:21:25.49ID:HYoiJUgB
で、身に覚えのあるやつが返事してるから
ニヤニヤ笑ってるのさ
2021/02/07(日) 10:48:37.66ID:2AGAGJ05
「テストツール万能論」を主張したレスなんて一つも見えないんだけど
存在しないものを見てニヤニヤしてる変態こわい
2021/02/07(日) 10:56:59.83ID:HYoiJUgB
それを>>587がぬかすとは笑止な
2021/02/07(日) 11:11:45.24ID:0QEz1MW7
構い過ぎじゃね?
2021/02/07(日) 11:52:54.07ID:jX/y7Db/
>>591
まさかと思うけど>>587がマジで言ってるとか思ってないよね?w
2021/02/07(日) 12:03:05.54ID:2AGAGJ05
ああ・・・そういうことね・・・すまん触るべきじゃなかった
2021/02/07(日) 13:47:28.22ID:p49/UnNX
すまんで済んだらユニットテストは要らんわ!
2021/02/07(日) 14:09:34.56ID:qbLU6RFF
野菜食えで馬鹿みたいにブチギレるホリエと一緒やな
2021/02/07(日) 15:05:54.73ID:HYoiJUgB
>>593
奴は「必要ないね」とぬかしたんだ
別に武漢熱に話をすり替えようとすり替えまいとそこは関係ない
2021/02/07(日) 15:41:29.20ID:yi1XmM9H
>>597
文章を字面通りにしか解釈できない人?
2021/02/07(日) 16:31:48.90ID:jcLu/xd9
vectorを参照渡しするときの方法について教えてくください
class sansyo
{
private:
std::vector<short> _stdSansyo;
public:
void setSansyo(std::vector<short>& sansyo);
}
;void sansyo::setSansyo(std::vector<short>& sansyo)
{
_stdSansyo = sansyo;
_stdSansyo[5] = 500;
}
int main()
{
std::vector<short> moto;
sansyo cSansyo;
for (int i = 0; i < 10; i++) {
short tmp = i * 2;
moto.push_back(tmp);
}
cSansyo.setSansyo(moto);//ここで参照渡しのはず
for (int i = 0; i < 10; i++) {
std::cout << "値=" << moto[i] << "\n"; //値が変わっていない
}
}
こんなふうに、参照渡しにしてみたのですがどうも参照渡しになっていないでそのまま新しいvectorが作られちゃったぽいのですが
これだとメモリを倍使っちゃってるし、時間も掛かってますよね
どういうふうにしたら、喚ばれた側の関数で参照渡しに出来るのでしょう
2021/02/07(日) 16:37:08.22ID:sfdJNFTq
>>599
右辺値参照かstd::swap
2021/02/07(日) 17:13:26.18ID:8CWTHaUD
>>600
サンプル貼ってよ
2021/02/07(日) 17:21:04.63ID:jcLu/xd9
std::swapも右辺値参照も全然上手く行きそうになかっのたで

宣言をポインタにして
private:
std::vector<short> *_stdSansyo;

void sansyo::setSansyo(std::vector<short>& sansyo)
{
_stdSansyo = &sansyo;
sansyo[6] = 100;
_stdSansyo->data()[5] = 50;
}

関数をこんなふうに書き換えたら、ちゃんと参照だけで動いたのでもういいや

けど右辺値参照とstd::swapの例も出してくれたらこれから色々いたスカリマス
2021/02/07(日) 17:24:59.07ID:8CWTHaUD
>>600
ほれほれ
貼れんのか
2021/02/07(日) 17:28:56.01ID:yi1XmM9H
>>599
参照渡し自体はできてるはず。
ただ参照渡ししたvectorをクラスのメンバに代入して、代入されたクラスメンバの方を更新しているからvectorを渡した元の方にはまったく影響が無いというだけ。
2021/02/07(日) 17:29:10.92ID:jX/y7Db/
>>598
もうそう言うことにしないと自我が保てないんだろw
2021/02/07(日) 17:59:39.88ID:p49/UnNX
sansyo::_stdSanshoをどうしても参照にしたいならこうするしか、
class sansho {
private:
std::vector<short> _stdSansyo;
public:
sansho(std::vector<short>& src) : _stdSansyo(src) { }
void setSansyo(std::vector<short>& sansyo);
};
void sansyo::setSansyo(std::vector<short>& sansyo) {
_stdSansyo[5] = 500;
}
int main() {
std::vector<short> moto;
sansyo cSansyo(moto); //ここで参照渡し
for (int i = 0; i < 10; i++) {
short tmp = i * 2;
moto.push_back(tmp);
}
cSansyo.setSansyo(moto); // moto[5]に500が入りまくり
for (int i = 0; i < 10; i++) {
std::cout << "値=" << moto[i] << "\n"; //値が変わった!(予定
}
};
2021/02/07(日) 18:00:52.99ID:HYoiJUgB
>>598
だったら何だとぬかす気だ?
> 存在しないものを見てニヤニヤしてる変態こわい
> 文章を字面通りにしか解釈できない人?

要するに話になんない奴ってことだろ
言ったことにも裏の意味にもコメントされたくない
じゃあ相手しねえでやるから黙ってろゴミ
2021/02/07(日) 18:02:35.24ID:p49/UnNX
訂正orz
誤: private: std::vector<short> _stdSansyo;
正: private: std::vector<short>& _stdSansyo;

もしcSansyo.setSansyo(moto)の呼び出し時に参照を渡したいんじゃああ!
という向きにはsansyo::_stdSansyoはstd::vector<short>* _stdSanshoにして
ポインタを持つようにすべき
2021/02/07(日) 18:10:05.07ID:p49/UnNX
ちゅかもっと大きな一般原則としてつぎのどっちかにすべき
(1) std::vector<short>の実体の所有権をmain()(で定義いているmoto)に固定してcSanshoクラスにmotoのアドレスを記憶させない
(2) std::vector<short>の実体の所有権をcSanshoクラスのインスタンス(_stdSansyo;)に固定してmain()でmotoを定義するのをやめる
※ 個人の感想です

つまり出題が悪い。出し直し
2021/02/07(日) 18:10:05.98ID:hHDgzHUe
>>602
元の考え方を変えずに動作させるにはその方法は十分に妥当だと思うよ。

ただ、もっと複雑なプログラムになったときにうっかりデータよりポインタのほうが
長生きすることになっても発見しづらいデザインになっている。

可能なら全体のデザインを見直すべきという話で、
いっそ所有権を渡してしまったほうが間違いにくいかもねという意味で右辺値参照や swap の話題が出ているので、
>>599 をベースにして右辺値参照や swap を使う例に書き換えるのは難しい。
別物になってしまう。
2021/02/07(日) 18:11:12.01ID:yi1XmM9H
>>607
自分以外の複数の人を同一人物だと思っちゃう人?
2021/02/07(日) 18:14:03.86ID:p49/UnNX
>>611
ネットの総意とか言い出しちゃう人?
2021/02/07(日) 18:16:20.19ID:p49/UnNX
検証不能な事物を錦の御旗にするような人間が
ソフトウェアのテスト推しなのは
大いなる矛盾である氏ね
2021/02/07(日) 18:18:25.00ID:HYoiJUgB
>>611
あの流れで
> 文章を字面通りにしか解釈できない人?
なんてぬかすやつは複数ID自演厨と見なされて当然だ
疑われたくなければ口の利き方に気をつけな

疑いは晴れてない
この後の発言にも気をつけるんだな
615デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:24:44.17ID:4v/nAOdw
>>566
なにこれ
616デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:29:05.24ID:U/6f7Qk0
参照をフィールドに保持するのは、一部のパーサーくらいでは?

しかも、状態を関数に切り分けないとデバッグが辛いので、仕方なくそうするだけで、バッド何とかの類だし。
617デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:31:34.10ID:U/6f7Qk0
むかし5chで誰かが、プログラムを書くときは必ずテストしてるはずなんだって言ってましたが。
それを単体テストとして書いておけばずっと使えて便利だよと。

その書き込みを見て世界中の人がテストフレームワークを書き始めたんですよ。
2021/02/07(日) 19:06:50.71ID:n+epGkV9
>>616
想像力が足りなすぎ
>>617
想像力が豊かすぎ
619デフォルトの名無しさん
垢版 |
2021/02/07(日) 20:53:42.20ID:U/6f7Qk0
バッドエンディングですね。
2021/02/07(日) 21:03:56.50ID:ZOvCZ0cx
グローバル変数使うなとは言わないけどコメントもないのはキツい
grep掛けて検索しても訳分からん
ポインタで飛び火してるときなんてもう…
2021/02/07(日) 22:09:55.11ID:IiZq+u+t
演算子オーバーロードの厄介さはキーワード検索で拾いにくいこと。
反復子もそうだが。ま、言い出したらきりないが。
2021/02/07(日) 22:57:26.65ID:HI2f2oIL
>>561を書いたのは私なんだけどなぁ...
面倒くさそうな人がいるし、一般論だけ言って立ち去ろって思っただけ
2021/02/07(日) 23:02:22.83ID:HI2f2oIL
ちなみに、>>561以降は何も述べてない。
私は一般論を語っただけだから、他の人が私と似た考えでツッコミを入れただけに過ぎない。

殺虫剤のパラドックス?それがどうした?
私はテストコードを書いて不具合を激的に抑えているが?

殺虫剤のパラドックスを説明したところで、不具合を限りなくゼロに近づける試みが無駄であることの証明にはならない。
2021/02/07(日) 23:09:32.25ID:sfdJNFTq
>>622-623
自我の芽生え、おめでとう!
では、かえるの歌を歌います。

【...JASRAC権利関係の為、自主検閲...】

♪パパーン
(全員でクラッカーを鳴らす)
625デフォルトの名無しさん
垢版 |
2021/02/07(日) 23:20:12.91ID:IiZq+u+t
殺虫剤のパラドックスなんてものは存在しない。
ただの退行テスト不足だ。
2021/02/08(月) 06:24:22.18ID:PnrMZIJR
殺虫剤のパラドックスって言いたかっただけやろw
そもそもテストで発覚したバグを修正したら同じテストで摘出できないのは当たり前
摘出できたら単なる修正漏れだしw
JSTQBの関係者か信奉者が言い出したんだろうけどあまり意味のない用語だと思う
2021/02/08(月) 06:42:41.05ID:HwnOmmQF
蒸し返さなくていいから……
628デフォルトの名無しさん
垢版 |
2021/02/08(月) 07:03:25.17ID:nKLqWVxG
虫返さないですと!?
2021/02/08(月) 11:05:43.31ID:NGjwD54G
>>610
そもそも>>600は的外れだと思うんだが
メンバの方を参照かポインタで持つ、で終わりだろ
3行目以降完全に蛇足
2021/02/08(月) 11:20:50.36ID:VJ9lplXi
>>627,628
そういうのは無視しろ
2021/02/08(月) 12:00:56.57ID:zDqHH6LK
スルーの法則
2021/02/08(月) 12:43:41.70ID:DuebuhTc
>>602
>>599
誰か
永続的に使用するなら shared_ptrで受け取れ。今のままだとsetSansyoを呼び出す側が所有権手放していいのかわからなくて困るだろ。
て指摘した?
今や生ポインタなんて性能優先のときに内部的に使用するもんで、インターフェイスで使用するもんじゃない。

あと、参照も関数内だけで使用する引数に使うもんで、永続的に所有する引数に使うもんじゃない。
633デフォルトの名無しさん
垢版 |
2021/02/08(月) 14:04:18.90ID:VJ9lplXi
コンストラクタでなら参照型のメンバ変数に保存できる。ほとんどの人はやらないけど。
2021/02/08(月) 18:54:29.18ID:DuebuhTc
>>633
できるのと実際に実装するのは別の話だわな。
所有権の無いオブジェクトの参照を保存するなんて狂気の沙汰だ。
635デフォルトの名無しさん
垢版 |
2021/02/08(月) 19:12:34.60ID:nKLqWVxG
アイキャンユーキャン。
2021/02/08(月) 20:51:28.21ID:U8Md53kE
>>633
クラス間に親子関係のようなものがあって、子の生存期間が常に親の生存期間内にあるような場合は、親への参照をメンバ変数とすることは普通にあると思うけど。例えば>>484とか
2021/02/08(月) 21:15:43.14ID:NGjwD54G
shared_ptr(またはスマポ)至上主義の変なやつ以前から居るんだよな
相手にするな
2021/02/08(月) 21:37:27.20ID:UsSsiWeS
ナマポ使ったほうが良い場面なんて皆無でしょう
2021/02/08(月) 21:48:31.75ID:2GJiXyxS
出たwナマポ完全否定奴w
640デフォルトの名無しさん
垢版 |
2021/02/08(月) 21:58:57.06ID:VJ9lplXi
参照型のメンバ変数は参照オブジェクトの生存期間を保証できないからweak_ptrで保存しておいて使う時だけshared_ptrを取得するのがC++的な解決なんじゃないの。
2021/02/08(月) 22:08:09.48ID:FKp3giDs
スマポにしたら所有権の問題を考えなくてよい
というわけではないからスマポ使えというのは妥当ではない
逆に所有権に矛盾が無ければインスタンスは生成元が与えた参照を持って良い

ていうかスコープを抜けたら自動的に解放される系のクラスを書いたら
エラー処理上エラー通知先としての生成元オブジェクトの参照保持はほとんど不可避
2021/02/08(月) 22:11:14.29ID:NgGwlfwa
コピー禁止のshared_ptr欲しい
2021/02/08(月) 22:25:23.27ID:bp+4mh0R
すべてスマポで書くスタイルも悪くないと思うけど、メイヤーズ神もツリー構造で子が親のポインタを持つときはナマポで十分と書いている
2021/02/08(月) 22:27:43.60ID:34Jom8HU
木のノードは子へのポインタじゃなくて子のノードIDを持て😡
2021/02/08(月) 22:48:15.38ID:NgGwlfwa
自分よりポインタの方が寿命が長いことが保証されているなら確かに生ポで問題ないが
それが成り立つ状況ってなかなかないよな。
646デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:02:19.81ID:VJ9lplXi
参照先の実体がまだ生存しているかどうか知るにはweak_ptr::expired()を使うしかないのが現状でしょ。
647デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:07:56.19ID:nKLqWVxG
Chromiumはstd::unique_ptrを全面的に使ってるけど、ポインタを使う設計そのものが古いような気がする。
2021/02/08(月) 23:13:28.50ID:BwguerZK
まあcコードを全く使わないってのならいいんでないの。
ただc++のポータビリティーは君が思ってるより低いけどね。
2021/02/08(月) 23:23:15.47ID:cR8ppl+C
露骨すぎるマウント取りたがりダッセーwww
650デフォルトの名無しさん
垢版 |
2021/02/09(火) 01:58:29.04ID:qUmf+U4D
マウントじゃなくてポインタでは?
651デフォルトの名無しさん
垢版 |
2021/02/09(火) 02:46:23.52ID:jPnyP+Vp
C++に特化したAPIなんてどこのOSでも提供されないから、結局、Cの配列と互換性のあるstd::vectorやstd::arrayを使わざるを得なくなる。
652デフォルトの名無しさん
垢版 |
2021/02/09(火) 04:01:45.22ID:qUmf+U4D
>>644
木もコンテナで良いですよね。
所有権がハッキリしてて。
2021/02/09(火) 07:34:27.86ID:nSJhwzEU
>>651
data()を必ず使う手合いか?
2021/02/09(火) 07:39:10.06ID:s3p3GZ7R
木は木全体を収める領域ごと一気に解放する場合もあるから別に
655デフォルトの名無しさん
垢版 |
2021/02/09(火) 17:49:12.66ID:KrtnTLUi
>Cの配列と互換性のある

doubt
656デフォルトの名無しさん
垢版 |
2021/02/09(火) 17:53:30.91ID:LEWRJrN2
ダウトとデビューって似てるよね
657デフォルトの名無しさん
垢版 |
2021/02/09(火) 18:35:55.16ID:qUmf+U4D
親が子のポインタを所有する木は、親を消すとネストして子孫のデストラクタを呼ぶので、スタックが枯渇します。

したがって、子から順番に消さなくてはなりません。
658デフォルトの名無しさん
垢版 |
2021/02/09(火) 18:56:53.48ID:qUmf+U4D
その様はまるで摩天楼がドミノ倒しのように連鎖倒壊するようでもあり、DOMINOというピザにもなっています・
2021/02/09(火) 19:07:16.84ID:IPYpL0sA
なんと後味の悪い話
2021/02/09(火) 20:39:36.84ID:zHOwdh/n
意味が分からない
2021/02/09(火) 21:07:48.14ID:Rh87rJZX
>>657
それで枯渇するようじゃ木の探索すらできない。
2021/02/09(火) 21:13:02.23ID:5Ac7csWH
探索はループでもできるんで、たとえば数万個の要素を持つツリーを子から消せというのは真理なのかも
2021/02/09(火) 21:27:40.55ID:AojZLEiV
消すのは独立して実行できるので別スレッドに送れば実質コスト0
2021/02/09(火) 21:38:09.75ID:s3p3GZ7R
>>662
DFAとPDAではやれることの範囲の違いがちげう

つかこの場合は安易にスマポとかコンテナを使うから破棄ごときにトラバースの手間がかかるんである
2021/02/09(火) 21:44:42.72ID:5Ac7csWH
それもそうであるな
2021/02/09(火) 21:50:17.60ID:s3p3GZ7R
ちゅか垂直探索なら木をメモリに持っておく必要が無い
水平探索ならメモリ上に世代1、世代2、....と木を育てていく(らしい)が
兄弟ノードを全部見終えたのでいざ従妹ノードに移ろうとするときに
親ノードへの参照は欲しい木がするがするとshared_ptrなら即循環参照になり、
子の情報で親(子孫がいっぱいぶら下がっている)を生成できるわけもないから、
ウィークポインタの出番でもない
667デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:37:49.58ID:XIZePh+h
子から消さなかったばかりに。
2000人を乗せた航空機が洋上で消えた。
ってなるかも?
2021/02/10(水) 01:48:13.89ID:ZYaksnCf
A380でさえ853席だが2000人なんてどうやって載せるんだろう
2021/02/10(水) 01:51:41.17ID:2ozOIzIF
く、空中で衝突するとか…
670デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:53:08.99ID:XIZePh+h
インドでは屋根の上にも乗ります。
671デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:55:11.55ID:XIZePh+h
https://trafficnews.jp/post/80031

証拠写真みつけてきた。
2021/02/10(水) 01:55:17.84ID:uF0JvJPV
GTA5のMOD作成者みたいな会話だな
2021/02/10(水) 02:01:19.54ID:uF0JvJPV
>>653
昔はdata()がなかった。(遠い目)
2021/02/10(水) 06:40:17.61ID:ZYaksnCf
アントノフの貨物室にすし詰めでどんくらい乗れるかな
675デフォルトの名無しさん
垢版 |
2021/02/10(水) 06:40:27.16ID:XIZePh+h
東京: TK
京都: KT
大阪: OSK
淡路: AWG
2021/02/10(水) 07:59:22.76ID:FGGGEnfF
航空機や原発みたいなクリティカルなシステムでは
全部固定長の配列で書いてあるんじゃないの
2021/02/10(水) 08:06:21.27ID:uF0JvJPV
釣れますか。
ヒープのほうが少し安全です。
2021/02/10(水) 10:25:11.13ID:4XPmMtZj
>>671
どこが証拠やねん!
せいぜり100人やないかヽ(`Д´)ノ
2021/02/10(水) 14:32:04.65ID:TFzLuCg0
すみません、std::for_each を使っていて continue したくなりましたが、サポートしてないです
よね? これって:
1. for_each は continue する必要がないような処理に限ってに使うべき。
2. ループの中で大きい if ブロックを作って空の処理にすればよい。
3. その他
2021/02/10(水) 15:13:45.18ID:ZYaksnCf
returnすれば?
for_each(begin(foo), end(foo), []{ if(bar) return; });
681デフォルトの名無しさん
垢版 |
2021/02/10(水) 16:06:00.49ID:HSfvjOUE
return は continue ではなく break じゃないの?
質問者の2.大きなif分で実質何もしないでいいと思う
2021/02/10(水) 16:20:11.24ID:ZYaksnCf
for_eachをbreakするにはthrowかlongjmpがいるぞ
2021/02/10(水) 16:35:39.62ID:S47HOUGT
きったねぇジャンプだ
684デフォルトの名無しさん
垢版 |
2021/02/10(水) 16:51:31.94ID:HSfvjOUE
あ、ラムダ式になってたのか
2021/02/10(水) 17:51:08.81ID:tNqysU9n
>>679
for 文で書いた方が短く書けそうだけど、
あえて for_each を使いたい理由が何かあったりするの?
2021/02/10(水) 18:41:41.17ID:FGGGEnfF
Perlなら問題無くできる(continue→next、だが
C++規格委員会がfor_eachのcontinueを許可しないのは最後の一線なのかもしれん…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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