C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
C++相談室 part146
レス数が1000を超えています。これ以上書き込みはできません。
2019/11/07(木) 11:35:36.76ID:4wggfTwe
912デフォルトの名無しさん
2019/12/15(日) 11:31:53.05ID:LATD77rz そうなのかな?
913デフォルトの名無しさん
2019/12/15(日) 11:37:55.15ID:PfQY9kAx まずイテレータで何を抽象化したいかを明確にしなよ
ノードを意識させたいのか?
ノードを意識させたいのか?
914デフォルトの名無しさん
2019/12/15(日) 11:38:38.78ID:LATD77rz STL風ツリーって検索しても絶対出てこないし、CIAが絡んでるような気がしてきた。
915デフォルトの名無しさん
2019/12/15(日) 11:39:36.48ID:LATD77rz そこがわかんないんだよねえ。
禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
916デフォルトの名無しさん
2019/12/15(日) 11:45:00.74ID:mSzJWPy5 ツリー構造
範囲が広すぎて
汎用化すると使い勝手が悪くなるからしない
ってだけかと
範囲が広すぎて
汎用化すると使い勝手が悪くなるからしない
ってだけかと
917デフォルトの名無しさん
2019/12/15(日) 11:56:45.76ID:Q+saMC6e recursive_directory_iteratorとかね
918デフォルトの名無しさん
2019/12/15(日) 12:06:14.82ID:mSzJWPy5 なんでdirectory?
treeでいいじゃん
treeでいいじゃん
919デフォルトの名無しさん
2019/12/15(日) 12:22:05.91ID:Q+saMC6e いや立体がどうたら言ってるから
じゃあrecursive_directory_iteratorを使うユーザーのコードは
いちいち多重ループだの再帰だのといった処理になるのかって
思ってさ
じゃあrecursive_directory_iteratorを使うユーザーのコードは
いちいち多重ループだの再帰だのといった処理になるのかって
思ってさ
920デフォルトの名無しさん
2019/12/15(日) 12:24:23.41ID:LATD77rz ツリーは、あるノードの親が知りたいときもあるはず。
921デフォルトの名無しさん
2019/12/15(日) 13:07:24.45ID:TeOOTcIs ごちゃごちゃ考える前にイテレータの本分を決めなよ
begin()からend()まで++で走らせた時にどうなってほしいの?
話はそれからだ
begin()からend()まで++で走らせた時にどうなってほしいの?
話はそれからだ
922デフォルトの名無しさん
2019/12/15(日) 13:09:44.18ID:MBW+LfoG 一般にtreeの探索順序はアルゴリズムと深く結びついてるし、
そこ凝りだすと沼だぞ。
そこ凝りだすと沼だぞ。
923デフォルトの名無しさん
2019/12/15(日) 13:09:51.26ID:5G1zfwod 関数ポインタをシリアライズしてファイルとして保存し、
ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
924デフォルトの名無しさん
2019/12/15(日) 13:13:54.57ID:nhcuVJi8 関数だろうが変数だろうがポインタはただの整数値でしょ
925デフォルトの名無しさん
2019/12/15(日) 13:18:39.25ID:p2D9PeH2 >>923 環境や「利用」の仕方を具体的に限定すればやりようはあるかもね。
926デフォルトの名無しさん
2019/12/15(日) 13:20:48.30ID:hicN34V0 次に(別のプロセスで)ファイルを読み込んだときに、
元の関数を同じ番地で参照できると限らんしな。
関数ポインタの配列のインデクスなら大丈夫だろうだけど。
元の関数を同じ番地で参照できると限らんしな。
関数ポインタの配列のインデクスなら大丈夫だろうだけど。
927デフォルトの名無しさん
2019/12/15(日) 13:23:00.95ID:LATD77rz https://ja.cppreference.com/w/cpp/iterator/reverse_iterator/operator%3D
これconstexprになってるけど、どういうときに定数になるんだろ?
end()の時かな?
これconstexprになってるけど、どういうときに定数になるんだろ?
end()の時かな?
928デフォルトの名無しさん
2019/12/15(日) 13:39:23.84ID:2FA7t6Jx C++20以降のvector/stringとか
使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
929デフォルトの名無しさん
2019/12/15(日) 13:47:38.10ID:LATD77rz どうもありがとう。
930デフォルトの名無しさん
2019/12/15(日) 13:52:49.06ID:ph9lwYgM constexpr関数の中で使うため。
931デフォルトの名無しさん
2019/12/15(日) 14:30:37.97ID:o9m7qUoD デストラクタがデフォルトでvirtualじゃないのは設計不良ではあるまいか
932デフォルトの名無しさん
2019/12/15(日) 14:34:47.01ID:EeC59mXx あえてベースの方のメソッドを呼びたいなんてことあるのかね?
933デフォルトの名無しさん
2019/12/15(日) 14:38:17.75ID:p2D9PeH2934デフォルトの名無しさん
2019/12/15(日) 15:15:03.49ID:K1ul1r/C >>931
C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
935デフォルトの名無しさん
2019/12/15(日) 15:29:48.68ID:7Mmj/dyw virtualでなかったら継承禁止にしても良かったんじゃないかとは思う
936デフォルトの名無しさん
2019/12/15(日) 16:19:56.16ID:AolOnHel そうするとメタプログラミングに色々と支障が出たはずだし
STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
937デフォルトの名無しさん
2019/12/15(日) 16:52:10.11ID:TkLVy9px デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは
どうなんだろうか
baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは
どうなんだろうか
938デフォルトの名無しさん
2019/12/15(日) 17:01:04.52ID:ph9lwYgM unique_ptr使えばvirtualにする必要無いのでは?
939デフォルトの名無しさん
2019/12/15(日) 17:16:05.58ID:p2D9PeH2 >>938 んなこたーない。
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
940デフォルトの名無しさん
2019/12/15(日) 18:59:53.87ID:tmrMX5L5941デフォルトの名無しさん
2019/12/15(日) 19:10:50.35ID:AolOnHel セオリーとして覚えてる人多いけど、何故なのかまで考えてない人が多い例の一つだね
要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
942デフォルトの名無しさん
2019/12/15(日) 19:29:34.24ID:tmrMX5L5 永遠の初心者です、お願いします
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?
---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
https://ideone.com/YPlfsC
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?
---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
https://ideone.com/YPlfsC
944デフォルトの名無しさん
2019/12/15(日) 20:01:24.23ID:01f7hQnX >>943
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
945デフォルトの名無しさん
2019/12/15(日) 20:05:17.27ID:5sPbacoo エラストテネス
6n+1, 6n+5だけ保持とかってみんな考えるよね
ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュが効くよう分割処理するのが非常に効果的
スレッド分割の為にいずれにしろ分割処理は作る事になる
6n+1, 6n+5だけ保持とかってみんな考えるよね
ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュが効くよう分割処理するのが非常に効果的
スレッド分割の為にいずれにしろ分割処理は作る事になる
946デフォルトの名無しさん
2019/12/15(日) 20:07:01.24ID:5sPbacoo エラトステネス
947デフォルトの名無しさん
2019/12/15(日) 20:14:20.76ID:mkXjftMX 高分子エラストマー
948はちみつ餃子 ◆8X2XSCHEME
2019/12/15(日) 20:20:59.00ID:jthcUe0A >>943
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
949デフォルトの名無しさん
2019/12/15(日) 20:54:13.00ID:TKBas8kS >>939
親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.
~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.
~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
950デフォルトの名無しさん
2019/12/15(日) 21:07:41.82ID:2FA7t6Jx951デフォルトの名無しさん
2019/12/15(日) 21:19:04.13ID:TKBas8kS >>950
まだ仕組みのとこまでですが理解できました。ありがとうございます。
まだ仕組みのとこまでですが理解できました。ありがとうございます。
952デフォルトの名無しさん
2019/12/15(日) 21:24:07.01ID:tmrMX5L5 質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、
Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい?
1. C++だとsizeof(Foo::Bar)と書いたらおk
2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない
(1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く
(2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ
(Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く
Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい?
1. C++だとsizeof(Foo::Bar)と書いたらおk
2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない
(1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く
(2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ
(Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く
953デフォルトの名無しさん
2019/12/15(日) 21:39:08.56ID:tmrMX5L5 ふとオモタがインスタンスの必要性は無くせるかもしれん
Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても
sizeof(((Foo*)0)->y)
と書けばC言語で逝けるかもしれん…
スゲー気持ち悪いコードだが、、、、
Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても
sizeof(((Foo*)0)->y)
と書けばC言語で逝けるかもしれん…
スゲー気持ち悪いコードだが、、、、
954デフォルトの名無しさん
2019/12/15(日) 21:46:34.52ID:PfQY9kAx >>951
あくまでコンパイル時の型で決まるだけだから要注意
例えば
class A;
class B : public A;
A* p = new B();
std::shared_ptr<A> a(p);
これだとBのデストラクタは呼ばれない
あくまでコンパイル時の型で決まるだけだから要注意
例えば
class A;
class B : public A;
A* p = new B();
std::shared_ptr<A> a(p);
これだとBのデストラクタは呼ばれない
955デフォルトの名無しさん
2019/12/15(日) 21:48:17.68ID:5sPbacoo なんでそんな中途半端な機能を
わざわざコストをかけて入れたんだろう
わざわざコストをかけて入れたんだろう
956デフォルトの名無しさん
2019/12/15(日) 21:49:32.31ID:5sPbacoo やむを得ず
なんだろうけど
なんだろうけど
957デフォルトの名無しさん
2019/12/15(日) 21:51:55.29ID:PfQY9kAx958デフォルトの名無しさん
2019/12/15(日) 22:05:12.60ID:TeOOTcIs type erasureと相性悪いんだっけ
959はちみつ餃子 ◆8X2XSCHEME
2019/12/15(日) 22:15:04.90ID:jthcUe0A >>943
思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。
#include <vector>
#include <iostream>
int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0;
}
思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。
#include <vector>
#include <iostream>
int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0;
}
>>944,945,948,959
コメントありがとうございます!
>>944,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています
>>948
>初期化リストの中にそんなごちゃごちゃしたこと書きたい?
クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました
一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、
複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても
https://ideone.com/y3ROXS
コメントありがとうございます!
>>944,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています
>>948
>初期化リストの中にそんなごちゃごちゃしたこと書きたい?
クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました
一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、
複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても
https://ideone.com/y3ROXS
961デフォルトの名無しさん
2019/12/16(月) 20:14:24.13ID:89loOkbp まあこういう自己満は通過儀礼だよな
962デフォルトの名無しさん
2019/12/16(月) 21:46:21.90ID:kSgVv2yp lambdaの即時評価はjsだと多用されているイメージ
ブロックスコープないからね
ブロックスコープないからね
963はちみつ餃子 ◆8X2XSCHEME
2019/12/17(火) 00:52:53.01ID:0JRJucIS964デフォルトの名無しさん
2019/12/17(火) 03:23:09.50ID:JQ5aWxOy プライベートメンバの単体テストってみんなどうしてるのかな。
965デフォルトの名無しさん
2019/12/17(火) 03:30:02.23ID:nsTCJN+n #define private public
966デフォルトの名無しさん
2019/12/17(火) 03:58:13.47ID:KUtZUPl9 #if 0
friend test;
#endif
friend test;
#endif
967デフォルトの名無しさん
2019/12/17(火) 07:08:07.08ID:KzMqUd+t #ifndef NDEBUG
friend struct test;
#endif
friend struct test;
#endif
968デフォルトの名無しさん
2019/12/17(火) 07:46:15.26ID:wpWnXFFo 闇言語
969デフォルトの名無しさん
2019/12/17(火) 11:20:07.09ID:dc1/89bE namespace Method{ namespace Detail {
template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{};
} }
// 文字列で呼び出すための関数を登録するためのマクロ
#define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \
namespace Method { namespace Detail { \
template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \
using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \
MethodRegister() { \
MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \
} \
~MethodRegister() { \
MethodContainer::GetInstance().Unregister( #FUNC ); \
} \
}; \
static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \
} }
void HOGE(){
std::cout << "Hello World!" << std::endl;
}
void HOGE( std::string text ){
std::cout << text << std::endl;
}
METHOD_REGISTER_METHOD( HOGE, void );
METHOD_REGISTER_METHOD( HOGE, void, std::string );
こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、
関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等
多数の問題が出て詰まってしまいました。
こういった問題を対処するにはどうすればよいのでしょうか?
template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{};
} }
// 文字列で呼び出すための関数を登録するためのマクロ
#define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \
namespace Method { namespace Detail { \
template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \
using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \
MethodRegister() { \
MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \
} \
~MethodRegister() { \
MethodContainer::GetInstance().Unregister( #FUNC ); \
} \
}; \
static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \
} }
void HOGE(){
std::cout << "Hello World!" << std::endl;
}
void HOGE( std::string text ){
std::cout << text << std::endl;
}
METHOD_REGISTER_METHOD( HOGE, void );
METHOD_REGISTER_METHOD( HOGE, void, std::string );
こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、
関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等
多数の問題が出て詰まってしまいました。
こういった問題を対処するにはどうすればよいのでしょうか?
970デフォルトの名無しさん
2019/12/17(火) 11:28:10.65ID:rApV4krM BOOST
971デフォルトの名無しさん
2019/12/17(火) 12:23:52.67ID:lfJGbKnI972デフォルトの名無しさん
2019/12/17(火) 18:42:08.59ID:iYSb7MEE このへんがいいんでないの。
https://srz-zumix.blogspot.com/2015/06/c-private.html
https://srz-zumix.blogspot.com/2015/06/c-private.html
974デフォルトの名無しさん
2019/12/17(火) 21:19:56.70ID:r3fDxRx7 プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。
まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。
まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。
975デフォルトの名無しさん
2019/12/17(火) 21:45:39.29ID:HvtzVY9o templateでアクセスすると合法的にプライベートメンバにアクセスできる
976デフォルトの名無しさん
2019/12/17(火) 21:49:21.80ID:iYSb7MEE そんな糞な方法でテストなんかしたくねー。
977デフォルトの名無しさん
2019/12/18(水) 01:14:03.75ID:zSYbFuJ0 テストなんかお綺麗にする必要が無い
978デフォルトの名無しさん
2019/12/18(水) 06:18:11.97ID:BbfJ/y// テストのテストが必要になるような意味のわからないテストコードはアウト
テストコードは実行せずに人が読んで理解できなければいけない
テストコードは実行せずに人が読んで理解できなければいけない
979デフォルトの名無しさん
2019/12/18(水) 07:25:56.60ID:ksLRDXXy >>978
どんな感じか見せていただけないでしょうか。
どんな感じか見せていただけないでしょうか。
980デフォルトの名無しさん
2019/12/18(水) 07:42:51.80ID:PEFQbiIG981デフォルトの名無しさん
2019/12/18(水) 07:48:17.80ID:uFDqtnkl >>979
例えばテストコードの中にループや条件分岐があるようなものはアウト
例えばテストコードの中にループや条件分岐があるようなものはアウト
982デフォルトの名無しさん
2019/12/18(水) 11:33:15.65ID:ksLRDXXy ループは許してもらえませんか?
データの並びとか検査したいんで。
条件分岐はたぶんないと思います。
データの並びとか検査したいんで。
条件分岐はたぶんないと思います。
983デフォルトの名無しさん
2019/12/18(水) 12:41:59.93ID:pXzQg2xI 原理主義にすぐ染まるやつw
ご苦労様
ご苦労様
984デフォルトの名無しさん
2019/12/18(水) 13:15:29.66ID:iEIErwam テスト用にいろんな複雑なテストも入れてるけど
まずいのか?
まずいのか?
985デフォルトの名無しさん
2019/12/18(水) 13:22:47.07ID:AjekT9H/ Debugビルドしたら遅すぎて検証できなくて詰んだ
986デフォルトの名無しさん
2019/12/18(水) 13:34:17.71ID:YQOjezK4 典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、
テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな
原則的には、期待する出力は全てハードコードするのが正しい
難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ
テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな
原則的には、期待する出力は全てハードコードするのが正しい
難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ
987デフォルトの名無しさん
2019/12/18(水) 13:39:53.25ID:iEIErwam メカが絡むリアルタイム処理でそんな事出来るかよ
988デフォルトの名無しさん
2019/12/18(水) 15:13:38.33ID:uFDqtnkl >>982
Parameterized Testsがあれば十分じゃね?
Parameterized Testsがあれば十分じゃね?
989デフォルトの名無しさん
2019/12/18(水) 15:16:04.78ID:uFDqtnkl990デフォルトの名無しさん
2019/12/18(水) 15:38:06.38ID:AmwvkO78 次スレは
991デフォルトの名無しさん
2019/12/18(水) 16:59:26.54ID:ksLRDXXy よ。
992デフォルトの名無しさん
2019/12/18(水) 17:57:22.30ID:uFDqtnkl993デフォルトの名無しさん
2019/12/18(水) 20:28:47.90ID:CdPazUY7994デフォルトの名無しさん
2019/12/18(水) 21:11:16.67ID:LM1drZI+ クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい?
995蟻人間 ◆T6xkBnTXz7B0
2019/12/18(水) 21:14:21.02ID:Zo1XP656 >>995
strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.
strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.
996デフォルトの名無しさん
2019/12/18(水) 21:14:35.04ID:uFDqtnkl C言語でしっかり文字列処理出来るようになったほうがいい? → いい
C++でC言語の文字列処理する? → しない
C++でC言語の文字列処理する? → しない
997デフォルトの名無しさん
2019/12/18(水) 21:16:04.08ID:aoz4SWmd >>987
逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。
逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。
998デフォルトの名無しさん
2019/12/18(水) 23:15:57.41ID:cF9WM4jz999デフォルトの名無しさん
2019/12/19(木) 00:00:58.14ID:zX6m0cqE 単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝
Google TestとかTest::MoreとかJUnit使ったらワカル
Google TestとかTest::MoreとかJUnit使ったらワカル
1000蟻人間 ◆T6xkBnTXz7B0
2019/12/19(木) 00:08:57.93ID:r6T/W91o あれっ?
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 41日 12時間 33分 22秒
新しいスレッドを立ててください。
life time: 41日 12時間 33分 22秒
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 高市内閣「支持」64%「不支持」19% NHK世論調査 ★2 [少考さん★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 高市首相「多様なコメの増産を進める」 方針転換への懸念払拭狙いか ★2 [どどん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 初めて顔パックしたけど凄いなこれ
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 巨大地震 [957955821]
- 胃腸弱い奴は社会的弱者←ガチ
- 【🏡】岩手ビックウェーブ🏄うおおおおおおおおおおお🌊
- 千晴の住所教えてよ!
