[過去ログ] C++相談室 part137 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
760: (ワッチョイ 2d8a-9DVt) 2018/09/26(水)15:33 ID:3yW6iUgn0(2/2) AAS
>>756
Tcl/Tk の立場は?
761
(1): (ワッチョイ 5dc3-teld) 2018/09/26(水)19:56 ID:oECBSnBC0(1/2) AAS
クラスは行数じゃなくて意味的にまとまってるかどうかだからな
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの
762
(1): (アウアウウー Sa25-xOzC) 2018/09/26(水)20:09 ID:LRnZd7JJa(1) AAS
>>761
数字が逆じゃないか?
763: (ワッチョイ cde3-tHrl) 2018/09/26(水)20:16 ID:ME0063O80(1) AAS
>>758
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ

>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
省1
764: (ワッチョイ 5dc3-teld) 2018/09/26(水)20:55 ID:oECBSnBC0(2/2) AAS
>>762
あってるよ
50行でも粗大ゴミは作れちゃうんだよ
765: (ワッチョイ bf9f-e6iu) 2018/09/27(木)00:26 ID:zZL/tnLy0(1/2) AAS
さすがに一万行でまとまってるクラスってのはないわ。。
766: (ワッチョイ 5780-q1nr) 2018/09/27(木)00:28 ID:pq96CSzd0(1/2) AAS
もしかして知恵遅れは
なんか書くために毎度毎度ofstreamを継承すんの

もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの

さすが
767: (ワッチョイ ff80-LozN) 2018/09/27(木)00:36 ID:3iNJ0doV0(1) AAS
例えば、基本クラスに出力クラスを作って、
派生クラスに、プリンター・PDF など、機能が異なるならオブジェクト指向だけど、

機能が同じなら、派生クラスではない。
単に、属性・メンバ変数が変わるだけ
768
(1): (ワッチョイ 5780-q1nr) 2018/09/27(木)00:50 ID:pq96CSzd0(2/2) AAS
void aho::write(ostream& aho) const {
aho << "aho" << endl;
aho << "baka" << endl;
aho << "manuke" << endl;
}

こんな感じで作っとけば
いろんなもんに書ける可能性がある
省2
769: (JP 0H2b-tojA) 2018/09/27(木)05:39 ID:DR3ASZ+QH(1) AAS
江添亮に匿名で質問ができて、高確率で答えが帰ってくる空間ってもうないのでしょうか
770: (ワッチョイ bf9f-e6iu) 2018/09/27(木)07:33 ID:zZL/tnLy0(2/2) AAS
本人のtwitterにでも投げれば?
高確率で「質問ではない」が帰ってくるが。
771: (ワッチョイ 9fbd-G9Ql) 2018/09/27(木)07:58 ID:GSDkLsyd0(1/2) AAS
>>750
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある

もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…
772: (ワッチョイ 9fb3-aemA) 2018/09/27(木)08:51 ID:Ct84HJ0d0(1) AAS
c++はコンパイラいるやろが
773: (ブーイモ MM5b-d72i) 2018/09/27(木)09:07 ID:eHS6051wM(1) AAS
そんな規約あったっけ?
Cling とか CINT はパチモノ?
774: (ワッチョイ 37d2-aemA) 2018/09/27(木)13:29 ID:lX4OM9LG0(1) AAS
>>768
そういうのは、templateのほうがいい。ostreamに依存せずにすむ。
775: (ワッチョイ 7748-aemA) 2018/09/27(木)16:27 ID:Zeo03I1R0(1) AAS
766からの流れでそうなっただけだろ
776
(1): (ワッチョイ 37e0-OlFv) 2018/09/27(木)16:47 ID:Oj9x/TA+0(1/2) AAS
俺には誰一人として標準のstreamクラスを継承する話はしてなかったように思えてならないんだが
(最初の>>758も書き出す処理を継承で共通部分と個別部分に分ける案を問うているだけ)
なんでそういう話になってるんだっけ
777
(1): (ワッチョイ 9f23-brPT) 2018/09/27(木)20:48 ID:vb6QqVUs0(1) AAS
>>776

>>758
>全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。

書き出す共通部をまとめたクラスというのは
ファイルで言えば ofstream みたいなものなのであろうと皆疑ってるんだろう。
「みたいなものではない」という、結論が違ってくるような違いも提示されないし。
778: (ワッチョイ 1704-ClIk) 2018/09/27(木)20:54 ID:/ZxE29S10(1/2) AAS
関数にすると不味いことある?
779: (ワッチョイ 37e0-OlFv) 2018/09/27(木)21:00 ID:Oj9x/TA+0(2/2) AAS
>>777
そうなのか……ありがとう
俺はostreamを引数に取る関数オブジェクトを多態やprotectedを使って実装するみたいなイメージで読んでた
780
(1): (ワッチョイ 1704-ClIk) 2018/09/27(木)21:09 ID:/ZxE29S10(2/2) AAS
最初にクラスを設計し始めるのは筋が悪いと思ってる。そんな3流プログラマ。
781: (ワッチョイ 9fbd-G9Ql) 2018/09/27(木)23:22 ID:GSDkLsyd0(2/2) AAS
訂正;
△:シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
○:シェルスクリプトがあるだけではシェルスクリプトの解釈実行を開始することはできない

シェルスクリプトはもちろんシェルスクリプトから呼ばれるシステムコールその他の
一切合財をシェルスクリプト上だけでシミュレートする能力がある(と思う)が
全ての始まりを起こすのにC/C++で書かれたOSを要する

>>780
省1
782: (ワッチョイ 9f1b-0IEC) 2018/09/27(木)23:59 ID:RQl7S0Gm0(1) AAS
来たよ、暇なので
783
(2): (ワッチョイ 77e3-c2ki) 2018/09/28(金)09:32 ID:hWUH9Sli0(1/11) AAS
最新のC++コンパイラが使えないので質問。
右辺値参照が仮引数になっている以下のような関数があった場合、

aaa(左辺値の変数);

とすると、ちゃんと、aaa() は呼び出される?
それともエラーになる?

void aaa(T&& a)
{
省2
784
(2): (アウアウカー Saab-NM1n) 2018/09/28(金)09:39 ID:UtPWkOJga(1) AAS
>>1のオンラインコンパイラを使おう
785
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)09:40 ID:7KXXqv1B0(1/7) AAS
>>783
呼び出される。
lvalue は rvalue にもなる。
786: (ワッチョイ 77e3-c2ki) 2018/09/28(金)09:48 ID:hWUH9Sli0(2/11) AAS
>>784
どこにあるの?
787
(1): (ワッチョイ 77e3-c2ki) 2018/09/28(金)09:53 ID:hWUH9Sli0(3/11) AAS
では、aaa()に次のようなoverloadがある場合は、「2」の方が呼び出されて、
#if の部分を 0 にすると、「1」が呼び出される?
だとすると、昔のC++では無かったような overloadの仕様かも?

T b;
aaa(b); // bは左辺値のつもり

void aaa(T&& a)
{
省8
788: (ワッチョイ 9f23-brPT) 2018/09/28(金)10:13 ID:WRA8TBfa0(1) AAS
>>787
>>784
789
(4): (ワッチョイ 7748-aemA) 2018/09/28(金)10:23 ID:RVKB6eOl0(1/2) AAS
>>783
呼び出されない
右辺値参照は左辺値を受け取らない(原則)

ただしTがテンプレート仮引数の場合と、auto&&の場合は、
右辺値参照で左辺値を受け取れる(特例)

型を推定させた場合に限り、右辺値参照は、
左辺値参照への左辺値参照に変形できる
790
(1): (ワッチョイ 77e3-c2ki) 2018/09/28(金)10:32 ID:hWUH9Sli0(4/11) AAS
[Compile and Execute C++11 Online (GNU GCC v7.1.1)]
外部リンク[php]:www.tutorialspoint.com
で下の方のコードを試したら、

$g++ -std=c++11 -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:18:10: error: cannot bind rvalue reference of type ‘TPerson&&’ to lvalue of type ‘TPerson’
   aaa(b); // bは左辺値のつもり
省5
791: (ワッチョイ 77e3-c2ki) 2018/09/28(金)10:33 ID:hWUH9Sli0(5/11) AAS
>>790
[続き]

#include <stdio.h>

struct TPerson {
 int m_age;
};

void aaa(TPerson && a)
省11
792
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)10:35 ID:7KXXqv1B0(2/7) AAS
あれ? ごめん。
確かめたら呼び出されなかった。

勘違いしてたかも
793
(3): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)10:39 ID:7KXXqv1B0(3/7) AAS
あ、逆の場合と混同してた。
const T& に rvalue がマッチするんだった。

このあたりのルール、なんか一貫性がない感じがする。
794: (ワッチョイ 77e3-c2ki) 2018/09/28(金)10:40 ID:hWUH9Sli0(6/11) AAS
>>792
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。

外部リンク:stackoverflow.com
外部リンク[html]:www.open-std.org

The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:
省10
795: (ワッチョイ 77e3-c2ki) 2018/09/28(金)10:44 ID:hWUH9Sli0(7/11) AAS
>>789
なるほど、std::move() は、あなたの言ってくれた、template の場合に当たるから
こその動作だったんだ・・・。
796
(1): (ワッチョイ 77e3-c2ki) 2018/09/28(金)10:49 ID:hWUH9Sli0(8/11) AAS
>>793
template の場合と、auto の場合は、まさに、一貫性が無いということらしい。

こういう一貫性の無さのことを「直交性が低い」と言って、言語が分かりにくい
指標になるらしい。
797
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)11:07 ID:7KXXqv1B0(4/7) AAS
>>796
一貫性は無いけど、仮引数の rvalue reference に lvalue がマッチ「してほしくない」というのはわかるので、
まあしょうがない。
798
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)11:11 ID:7KXXqv1B0(5/7) AAS
>>789
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
799
(1): (ワッチョイ 7748-aemA) 2018/09/28(金)11:58 ID:RVKB6eOl0(2/2) AAS
>>798
それ以外の何だと思うの?
800: (ワッチョイ 77e3-c2ki) 2018/09/28(金)12:26 ID:hWUH9Sli0(9/11) AAS
>>797
あまのじゃく?
801: はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)12:29 ID:7KXXqv1B0(6/7) AAS
>>799
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
802
(2): (ラクッペ MM0b-2bq/) 2018/09/28(金)14:07 ID:7VsD45M6M(1/2) AAS
江添とお前らどっちがC++に詳しい
803: (ワッチョイ 77e3-c2ki) 2018/09/28(金)14:45 ID:hWUH9Sli0(10/11) AAS
>>802
その人もここに来るかも知れないから。
804
(1): (ササクッテロル Sp4b-cB/m) 2018/09/28(金)14:53 ID:5bmo24w9p(1) AAS
江添で言えばまさにわかりやすくその辺の事情解説してくれてるだろ
今の話で江添より詳しいとかありえねー
805
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/28(金)17:00 ID:7KXXqv1B0(7/7) AAS
>>802
江添氏は C++ を使うプログラマというよりは、
C++ の規格の専門家として C++ の知識を持ってるんだから、
かなり詳しいよ。
806: (ワッチョイ 77e3-c2ki) 2018/09/28(金)17:18 ID:hWUH9Sli0(11/11) AAS
>>805
いずれにせよ、気持ちはうれしかったよ。
807: (ラクッペ MM0b-2bq/) 2018/09/28(金)17:49 ID:7VsD45M6M(2/2) AAS
>>804
そのへんの事情って?
>>805
それは本人も自負してるようだけど
808: (ワッチョイ 17b3-cB/m) 2018/09/28(金)18:34 ID:2UofBC6a0(1) AAS
>>789 >>793あたりの仕様の事情な
809
(1): (ワッチョイ 9fbd-G9Ql) 2018/09/28(金)21:21 ID:tCflGkAm0(1/5) AAS
もし非テンプレート関数かつ非インライン関数なvoid bar(Foo&& a)に左辺値xを渡してビルドが通る言語規格だとしたら、
 tmp = xのコピー
 barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK

一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
省4
810: (ワッチョイ 9fbd-G9Ql) 2018/09/28(金)21:24 ID:tCflGkAm0(2/5) AAS
訂正;
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる

コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分
811
(1): (ワッチョイ 9fbd-G9Ql) 2018/09/28(金)21:34 ID:tCflGkAm0(3/5) AAS
>>793
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
省4
812: (ワッチョイ 9fbd-G9Ql) 2018/09/28(金)21:36 ID:tCflGkAm0(4/5) AAS
(30分前にこのスレを読んで初めて右辺値とか右辺値参照といったブツを知った初心者なので語ってみた
813
(1): (ブーイモ MM7b-/SOc) 2018/09/28(金)22:13 ID:pgnHcfqPM(1/2) AAS
>>811
y = x
の後もxへのアクセスはrへのアクセスで良くないの?
814
(1): (スップ Sd3f-brPT) 2018/09/28(金)22:40 ID:5I7m9/jNd(1) AAS
どんな文が現れようとずっとrでいいんじゃね?
815
(1): (ワッチョイ 9fbd-G9Ql) 2018/09/28(金)22:45 ID:tCflGkAm0(5/5) AAS
>>813 >>814
ホンマや!(;゚Д゚)天才か!
816: (ブーイモ MM7b-/SOc) 2018/09/28(金)22:50 ID:pgnHcfqPM(2/2) AAS
>>815
ウッサイ、チネ
817: (ワッチョイ ff5b-/SOc) 2018/09/28(金)23:48 ID:AAs3crMS0(1) AAS
>>809
再帰だろうがアドレスとろうがオンラインだろうが例外は適用されるだろ。
やっぱ30分で理解するのは無理じゃね?
818
(2): (オッペケ Sr4b-N9wp) 2018/09/28(金)23:50 ID:HzE5xAmYr(1) AAS
auto a = funcA(funcB(funcC(input)));
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?

つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?
819
(3): (ワッチョイ ff5b-/HDE) 2018/09/29(土)00:09 ID:UwfF5QN40(1/2) AAS
>>818
いんや。
オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし、戻り値最適化で一切何も起こらない可能性すらある。

て、はちみつが言ってた。
820
(1): (オッペケ Sr4b-N9wp) 2018/09/29(土)00:13 ID:X+ykKtqpr(1/2) AAS
>>819
へぇ

> 一切何も起こらない
というのは、一切余計なオーバーヘッドがない、ということですか?
821
(1): (アウアウウー Sadb-ZVm4) 2018/09/29(土)00:22 ID:4+9Po3M4a(1) AAS
単純なコピーよりは早くなる可能性があるってだけでは?
822
(1): (ワッチョイ ff5b-/HDE) 2018/09/29(土)00:30 ID:UwfF5QN40(2/2) AAS
ちょっと誇張しすぎた。
正しくは「コピーもムーブも起らない可能性すらある」

コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ
823
(1): (オッペケ Sr4b-N9wp) 2018/09/29(土)00:36 ID:X+ykKtqpr(2/2) AAS
へぇ〜〜〜
ありがとうございます

まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが
824: はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/29(土)02:25 ID:4F2hgYyq0(1/2) AAS
>>818-823
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。
825
(1): (ワッチョイ 17b3-cB/m) 2018/09/29(土)14:26 ID:7XGFV27+0(1/4) AAS
>>819
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ
826: (ブーイモ MM7b-/SOc) 2018/09/29(土)14:32 ID:OnnXxjQtM(1) AAS
>>825
ええ…
コピーより重いムーブコンストラクタの存在を前提に話す必要ある?
827: (ワッチョイ 17b3-cB/m) 2018/09/29(土)14:44 ID:7XGFV27+0(2/4) AAS
むしろムーブで軽くなるのは大抵の場合ムーブによってヒープの確保、解放を
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが

基本をすっ飛ばすからはちみつその他誤解するやつが出てくる
828
(1): (ワッチョイ 5780-q1nr) 2018/09/29(土)14:49 ID:IuTgmxg/0(1/3) AAS
この機能が必要になった背景・経緯

ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。

つまりこんなあぶなっかしい
unique_ptr、shared_ptr、weak_ptrとか使ってるヤツラも
省2
829: (ワッチョイ 5780-q1nr) 2018/09/29(土)14:56 ID:IuTgmxg/0(2/3) AAS
しかしアホのあたらしもの好きは半端ない
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い
830: (ワッチョイ 17b3-cB/m) 2018/09/29(土)14:58 ID:7XGFV27+0(3/4) AAS
いや、autoはともかくshared, unique, weakは危なっかしくないと思うが・・
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき
831: (ワッチョイ 5780-q1nr) 2018/09/29(土)14:59 ID:IuTgmxg/0(3/3) AAS
で、こんなしょうもないことより
ホントに理解しないといけない部分がすっぽりと抜けてる
832
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/09/29(土)16:42 ID:4F2hgYyq0(2/2) AAS
C++ の (というかプログラミング言語の) ほとんどの機能は抽象化の道具。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。

>>828
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
省2
833: (ワッチョイ 17b3-kFNE) 2018/09/29(土)17:03 ID:7XGFV27+0(4/4) AAS
スマポは言語の機能じゃねーよボケ
834: (ワッチョイ 9fbd-G9Ql) 2018/09/29(土)18:38 ID:GD2dD6IB0(1/2) AAS
>>832
>問題は道具で解決すべき。
ネ申は確かLL言語を創造された
835: (ワッチョイ d7b3-ZVm4) 2018/09/29(土)18:45 ID:Dc4laUcM0(1) AAS
ムーブはゼロの発見に次ぐ、人類史上における大発見と言われてるけどな。
ノーベル賞候補の一つにもなってるし。
836: (ワッチョイ 9fbd-G9Ql) 2018/09/29(土)18:51 ID:GD2dD6IB0(2/2) AAS
std::auto_ptr<T>はもともとオブジェクトをムーブしたくて生まれたわけでは無いと思う…
確実な解放の実現が先
ムーブする仕様はあと

あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある
837
(1): (ブーイモ MM7b-uZyL) 2018/09/29(土)18:56 ID:oWn9MzvpM(1/2) AAS
move元のオブジェクトに対するアクセスがコンパイルエラーになるんならわかるけど、そうじゃないんなら
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?
838: (ラクッペ MM0b-2bq/) 2018/09/29(土)19:32 ID:YVfD+mv1M(1) AAS
お前ら江添に負けて恥ずかしくないの?
839: (オイコラミネオ MM4f-IJfJ) 2018/09/29(土)20:26 ID:1/46iTAZM(1) AAS
全然?
840
(1): (スプッッ Sd3f-brPT) 2018/09/29(土)21:00 ID:vc6gAAuZd(1) AAS
>>837
それ何が嬉しいんだ?
vector とかどうすんだよ
1-
あと 162 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.023s