X



C++相談室 part154
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2021/01/08(金) 17:56:28.28ID:GG1sOSQC
おつかれー
0003デフォルトの名無しさん
垢版 |
2021/01/08(金) 19:34:40.54ID:hBRzO/B9
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0004デフォルトの名無しさん
垢版 |
2021/01/08(金) 19:38:13.11ID:8XBZO/70
operator->*を好き勝手にオーバーロードするのは
C++厨二病なら誰しもが通る道だと思ってる
0007デフォルトの名無しさん
垢版 |
2021/01/08(金) 20:55:30.03ID:lmjqKHzd
だって演算子オーバーロード楽しいし!
それSpirit作者のジョエルさんにも言えるの?
0008デフォルトの名無しさん
垢版 |
2021/01/08(金) 21:03:27.15ID:NkKDsd1u
% を三次元ベクトルのクロス積にするのはかつて自分も思いついたけど、勧められないって立場の人も居て
演算子オーバーロードが自然かそうでないかってのは人に拠るなと思った
自分の価値観で言えばiostreamの >> とかってあんまり自然じゃないが
他に何がいいかって言われてもないので仕方ない
0010デフォルトの名無しさん
垢版 |
2021/01/08(金) 21:17:01.55ID:U7HVBqAl
絵文字プログラミングが来る
なので独自オペレータは出来た方がいい
0011デフォルトの名無しさん
垢版 |
2021/01/08(金) 21:44:49.24ID:gxkYqo9D
>>4
わしは20年ぐらい前にその道を通った
だから若者がその道を通ることについては何もいわない
ほっといて気がつかないならダメ人材だし
使える人材は自分で気がつく
0012デフォルトの名無しさん
垢版 |
2021/01/09(土) 00:35:22.39ID:8yDnsj0x
キーワードも再定義可能にしてホスイ
0014デフォルトの名無しさん
垢版 |
2021/01/09(土) 01:39:13.52ID:InkVVK6p
#define private public
ってテクニックのことか。
0018デフォルトの名無しさん
垢版 |
2021/01/09(土) 10:07:37.60ID:c2CH7ey/
この辺かなC++20ドラフトより
16.5.1.2 Headers [headers]
8 Identifiers that are keywords or operators in C++ shall not be defined as macros in C++ standard library headers.
(標準ライブラリはキーワードをマクロにすんな)
16.5.4.3.2 Macro names [macro.names]
2 A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 4, or to the attribute-tokens described in 9.12, except that the names likely and unlikely may be defined as function-like macros (15.6).
(キーワード・文脈依存キーワード・予約済み属性トークン(ただしlikelyとunlikelyを除く)をdefineやundefすんな)
0020デフォルトの名無しさん
垢版 |
2021/01/09(土) 20:30:21.03ID:w9vYk25X
>>13
何言ってんだおめー;;;
0021デフォルトの名無しさん
垢版 |
2021/01/09(土) 21:18:55.59ID:jpx8Mcv4
C++はプリプロセッサが発展する方向にいかなくて本当に良かった
プリプロセッサを吸収して凄いことになってる気はするが
0023デフォルトの名無しさん
垢版 |
2021/01/09(土) 21:37:52.40ID:Te5slSqE
(でも楽しいよね
(コンパイル直前のコードが数個のプリミティブにまで還元されちまう楽しい言語もあるしな))
0024デフォルトの名無しさん
垢版 |
2021/01/09(土) 22:11:02.76ID:w9vYk25X
プリプロセッサはC言語の目的(OSを様々なプラットフォームに移植可能な共通ソースコードとして書く)ための
必要欠く書くべからざるしくみとして導入され、できた時点で仕様としてはほぼ過不足なかった
という印象

そういう目的のブツなので、キーワードの再定義には全く不向き
0026デフォルトの名無しさん
垢版 |
2021/01/10(日) 07:04:45.26ID:pzwk9NYM
最近は#includeと#defineしか使ってない。
0027デフォルトの名無しさん
垢版 |
2021/01/10(日) 08:03:37.57ID:pzwk9NYM
#defineじゃなくて#pragma onceだった。
0032デフォルトの名無しさん
垢版 |
2021/01/10(日) 11:49:17.12ID:WbJbdET/
#pragma便利よね ライブラリのリンク指定とかも
0033はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/10(日) 11:50:54.98ID:smlN1G6e
>>8
そう、 iostream は「仕方ない」と思うんだよな。

C++11 で variadic template が導入されるまでは
可変長引数を安全な型システムの中で扱えなかった。
仕方がないから演算子でなんとかそれっぽくしただけ。
演算子の中で比較的それっぽいのが << や >> だっただけ。

>>9
そういう観点から見ると、パスや日付の区切りに / を使うのは
演算子にしなければならない仕方なさは感じられない。
演算子にするなら / は比較的自然な選択ではあると思うけど。
0035デフォルトの名無しさん
垢版 |
2021/01/10(日) 11:57:06.83ID:uVXyGOJo
ファイルパスってチェーンしたいものの筆頭格だから演算子にするのは妥当だと思うけど
0036デフォルトの名無しさん
垢版 |
2021/01/10(日) 12:20:31.40ID:pzwk9NYM
>>28
使ってるわい。
0037デフォルトの名無しさん
垢版 |
2021/01/10(日) 12:20:58.71ID:pzwk9NYM
とはいえレスくれてありがとうw
0038デフォルトの名無しさん
垢版 |
2021/01/10(日) 12:38:01.52ID:stlWAB5c
>>35
std::path だと operator/= だな。
優先順位とか戻り値の型とか理由はあるんだろうが、やはり無理してる感は拭えない。
0039デフォルトの名無しさん
垢版 |
2021/01/10(日) 23:28:34.84ID:9cXVj8qL
mutexって同時だとどうなるの?
0040デフォルトの名無しさん
垢版 |
2021/01/10(日) 23:32:27.11ID:9cXVj8qL
信用して使うしかないけど…本当に同時で来たら…どうなるのかなぁ…と思って…。
0041デフォルトの名無しさん
垢版 |
2021/01/10(日) 23:43:03.84ID:1knBg1rC
同時に入ろうとしたら同時に入るのではない別の世界線に分岐するから
結局同時にならない
0043デフォルトの名無しさん
垢版 |
2021/01/11(月) 00:44:15.09ID:AtO8PUuj
それだと…CPUの負荷や調子によって…同時になるって…事だよ…。
0044デフォルトの名無しさん
垢版 |
2021/01/11(月) 00:45:46.62ID:AtO8PUuj
mutex…危ういな…どうしよう…。運に任せて…諦めるか…。
0045デフォルトの名無しさん
垢版 |
2021/01/11(月) 00:54:29.81ID:AtO8PUuj
運任せは辛い…。
0048デフォルトの名無しさん
垢版 |
2021/01/11(月) 01:59:20.31ID:3nmpeNiQ
>>46
信用できないならソースやアセンブリ読めよ。ここで名無しに答えてもらっても、信用できないんだろ?
0049デフォルトの名無しさん
垢版 |
2021/01/11(月) 03:08:34.69ID:KSKcxhht
MutexはOSに依存するので絶対に大丈夫ということはないですが、数々のトラブルを引き起こし最も懸念されたLinuxが安定してきてるので、現在では実用上問題がないレベルにあると思います。
0050デフォルトの名無しさん
垢版 |
2021/01/11(月) 03:36:14.65ID:dLrb5ZQk
マルチCPUでバスリクエストが同時に出た場合の制御なんて明確に定義されてんだろうが
OS依存だハード依存だと逃げているから見えない不安に怯えることになるんだよ
0051デフォルトの名無しさん
垢版 |
2021/01/11(月) 06:01:13.69ID:vFi9Z+AQ
LinuxのMutexって使いにくいよね
俺はWindowsから入ったからMutexって名前付きが当たり前だと思ってたんだけどLinuxのMutexには名前がない
どうやって複数のプロセス間で同じMutexを使うんだよ・・・って悩んだ
共有メモリなんかでMutexのアドレスを受け渡しするらしいんだけどさ
面倒くさくなってLinux版の同期制御はファイルロックにしちゃった。。
0052デフォルトの名無しさん
垢版 |
2021/01/11(月) 06:47:08.93ID:KSKcxhht
LinuxのファイルロックはNFSで(※私たちにはバグのように見える)仕様通りの動作をするので気を付けたほうが良いですよ。

ユーザーが指定したファイルやディレクトリを不用意に使用すると再現性の無いバグに悩まされます。
0053デフォルトの名無しさん
垢版 |
2021/01/11(月) 06:56:23.61ID:vFi9Z+AQ
>>52
アドバイスありがとう
Linuxで共有メモリの使い方もよく分からなくて
共有メモリも書いてる途中で読み取りされたら困るから
「書いたよー」「読み終わったよー」ってプロセス間同期したいんだけどMutex受け渡しの前に同期処理って・・・
それで共有メモリの読み書きをファイルロックで同期してMutexを渡すかなーって考えてるうちに
もうファイルロックだけでいいんじゃないかってなってしまった

一般的にはどうやってやるのがよかったんだろ?
0054デフォルトの名無しさん
垢版 |
2021/01/11(月) 07:35:12.79ID:KSKcxhht
>>53
結局、「NFSではバグります」と注意したうえでファイルロックを使うことが一般的に行われてるみたいですよ。

逆に言うと、NFSだけ気を付ければ、問題が起きないみたいです。
0056デフォルトの名無しさん
垢版 |
2021/01/11(月) 08:06:43.86ID:vFi9Z+AQ
>>54
ありがとう ちょと安心した
0057デフォルトの名無しさん
垢版 |
2021/01/11(月) 08:16:58.50ID:vFi9Z+AQ
>>55
コード見てみましたけどMutexの作成と共有メモリの書き込みが終わってからforkしてますね
forkした親と子ならそれでもいいんでしょうけど
実際は親子ではないプロセス間でMutex使いたくなったりするじゃないですか
Mutexが作成される前や共有メモリへの書き込み完了前にスレーブがMutexを要求しに来ると困ります
0058デフォルトの名無しさん
垢版 |
2021/01/11(月) 08:38:54.12ID:WYfXTDe9
>>51
名前付きも普通にある
sem_open
名前はセマフォだが当然mutexとして使える

目的がメッセージのやり取りならmkfifoも使える
0059デフォルトの名無しさん
垢版 |
2021/01/11(月) 08:48:31.88ID:3OtB0f6U
mutexじゃなくて名前付きセマフォなら普通にプロセス間で使えなかったっけ?
0061デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:22:15.64ID:KSKcxhht
>>60
Linuxではファイルロックで良いよ。
0062デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:28:25.14ID:vFi9Z+AQ
セマフォのほうには名前付きあったんですね見落としてました
ありがとう!
0063デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:39:24.93ID:vFi9Z+AQ
あと別のところでソケットを排他リソースで使うというアイデアを教えてもらったことあります
同じポート番号をバインドできるのは1つだけだからこれを排他に使うという案
0064デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:52:46.06ID:KSKcxhht
3年ぶりの建設的なスレだな。
0066デフォルトの名無しさん
垢版 |
2021/01/11(月) 10:39:47.37ID:sBoV/AFh
>>51
pthread周りはなんであんな仕様なのか謎
CPUのアーキテクチャーを深く知れば合理性を得心できるのかどうか、
0067デフォルトの名無しさん
垢版 |
2021/01/11(月) 11:25:14.07ID:vFi9Z+AQ
>>65
それはファイルロック(flock関数)ではなく、単純にファイルの存在チェックをしているだけじゃないですか?
flockを使ったファイルロックならプロセス異常終了時にOSによってロックが解放されます
0068デフォルトの名無しさん
垢版 |
2021/01/11(月) 12:46:20.78ID:vpEQZDgx
ミックスジュースよりセックスジュースが好きですね
0069デフォルトの名無しさん
垢版 |
2021/01/11(月) 14:25:33.73ID:EL34sMb+
唐突に何いいだすねん君は!
(‘д‘⊂彡☆))Д´)パーン <ミックスジュースよりセックスジュースが好きですね
0071デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:14:45.22ID:AtO8PUuj
39です…。
mutexの信頼性をずーと疑ってたら…POSIXスレッド…pthread_mutex_lockに行き着きました…
ブロックもするそうです…ソース見てたら…カーネルの様です…pthread_mutex_lock_fullであれば…atomic_compare_and_exchange_val_acq…などもあります…テストアンドセットです…
アトミック操作です…しかし…普通にmutexを実装してpthread_mutex_lock_fullが呼ばれるかは…
分かりません…どんなmutexライブラリも最終的に…このカーネルを呼んでるだけだと思います…
呼ばれてるのは…fullではなく…弱い方のpthread_mutex_lockだと仮定しても…カーネルを疑うなんて…
本当に…ナンセンスな話なので…一応…信用して使うことにします…。
0072デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:55:02.21ID:AtO8PUuj
39です…。
結局…fullでなくても…atomic_exchange_acqが呼ばれているようです…アトミック操作です…。
なので…みなさん…安心して使いましょう…。
0073デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:56:14.48ID:KSKcxhht
>>72
そこでやめずに、atomic_exchange_acqの中まで追いかけてみませんか?
0075デフォルトの名無しさん
垢版 |
2021/01/11(月) 21:32:01.48ID:KM6/Ii6v
Debian woody の頃まで posix thread は使い物にならなかったが Debian etch からようやく使い物になった印象だな
当時から利用している身にしては
0076デフォルトの名無しさん
垢版 |
2021/01/12(火) 05:50:41.37ID:pJAexhLb
わりと最近ですね。
0077デフォルトの名無しさん
垢版 |
2021/01/12(火) 07:34:00.56ID:V95G+u6D
woodyって20年くらい前だっけ
最初はJavaVMもグリーンスレッドというVM内の仮想スレッド実装だったんだよね
あれもOSネイティブのスレッドが信用されてなかったからなのかな
もちろん、現在のJavaVMはOSのネイティブスレッド使う実装になってるけどね
0078デフォルトの名無しさん
垢版 |
2021/01/12(火) 07:44:47.10ID:pJAexhLb
Javaといえばブラック何とかプロジェクトがSUNに文句言ってなかったっけ?
0079デフォルトの名無しさん
垢版 |
2021/01/12(火) 07:45:53.88ID:pJAexhLb
Etchが2007年と書いてあるな。
0080デフォルトの名無しさん
垢版 |
2021/01/12(火) 09:08:57.41ID:e5lAHXYT
設計思想的なことについて質問があります。
クラスの使い方がよく分かりません。

僕が今何かを作ろうと思ったら、関数の集まりが引数や返り値のやり取りを通じて協調するような設計をしてしまいます。
この引数や返り値が多く複雑になったりしてきたらクラスを用いた設計を考える、という理解は正しいでしょうか?
0081デフォルトの名無しさん
垢版 |
2021/01/12(火) 09:22:47.73ID:XkW3hQXX
>>80
正しいかどうかは知らないし気にしないでいいと思うけど、
そういう場合はただのデータの集まりとして構造体(これもクラスの一種だけど)を使うだけでも簡単になるだろうね。
0082デフォルトの名無しさん
垢版 |
2021/01/12(火) 13:35:30.39ID:lxco4c0J
個人的には、一度無理にでも概念(ウインドウとか表示とか作ってるソフトの主要な概念)をクラス名にして作ってみるといいとおも
やってるうちに慣れてくる
0083デフォルトの名無しさん
垢版 |
2021/01/12(火) 14:01:10.35ID:V95G+u6D
そうだね
なにかを題材にしてオブジェクト指向やってみるのがいいと思う
でもウインドウはどうかなー そもそもUIツールキットをある程度知らないといけないし
GUIってオブジェクト指向らしからぬ部分も多いので

もっとビジネスロジック中心の題材がいいと思うよ たとえば掲示板システムとか
板には複数のスレがあって、各スレの中には複数のレスが並んでて、スレの書き込むメソッドでレスが1つ増えてーみたいな
0084デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:56:33.61ID:LUlB/OIG
>>4 >>11
. を再定義したいと思った
0085デフォルトの名無しさん
垢版 |
2021/01/12(火) 17:32:55.18ID:+0XoTmdG
>>82
初歩的な質問なのですが、クラスってモノじゃなくて概念でも良いのでしょうか
つまり、歩く人のプログラムを作るとき、人というクラスが歩くというメソッドを持っていても良いし、歩くというクラスが一歩進むというメソッドを持っていても良いのでしょうか
言語の仕様上はもちろんどちらでも良いと思いますが、どちらの設計の方が筋が良いということはないと思って良いですか?
0086デフォルトの名無しさん
垢版 |
2021/01/12(火) 17:34:51.31ID:fQCYjk84
ナントカ系の関数群みたいに相互に関連し合っているものを
暗黙じゃなく明確化するのがクラスだよ
0087デフォルトの名無しさん
垢版 |
2021/01/12(火) 17:38:10.34ID:V95G+u6D
>>85
「歩く」をクラスにするよりは「歩ける」をインターフェースにしたらどうかな
人間クラスに「歩ける」インターフェースを実装することで「歩く」メソッドがあることを保証できる

対象ドメインをどのようにモデル化するかは状況や要件次第
0089デフォルトの名無しさん
垢版 |
2021/01/12(火) 19:50:41.34ID:YNFRivpW
>>87
「歩け」インターフェースを定義したらインスタンスが歩ける想定であることは自明なのでは…

ちなメソッドは一般にオブジェクトの状態変化を引き起こすブツなので
命令型プログラミングの範疇であり命令形で命名すうるが正しい

※ 個人の感想です
0090デフォルトの名無しさん
垢版 |
2021/01/12(火) 19:52:42.41ID:YNFRivpW
しかしインスタンスの生成というプロセスは関数型プログラミングから拝借しており、
命令型と関数型のいいとこ取りしようとして失敗した
classベースのオブジェクト志向は
0091デフォルトの名無しさん
垢版 |
2021/01/12(火) 19:58:16.79ID:GTfU1r+6
何ベースのが成功なの?
0092デフォルトの名無しさん
垢版 |
2021/01/13(水) 09:25:15.89ID:X1FbeZvQ
場合によっては歩くクラスもありだと思うよ。
ゲームで次の行動を一つずつ記憶させたい場合とか。
commandパターン、mementoパターンでググって
0093デフォルトの名無しさん
垢版 |
2021/01/13(水) 09:45:27.73ID:D0cZCa+j
歩くということは、位置が変化する。
現在位置は人オブジェクトのプロパティなのか?
それでええのか?
0094デフォルトの名無しさん
垢版 |
2021/01/13(水) 11:14:57.57ID:XODVGtfI
>>93
良くね?


>>87
インターフェースって継承される前提のものなんですよね?
どのクラスが「歩ける」を継承するんですか?
0095デフォルトの名無しさん
垢版 |
2021/01/13(水) 12:34:30.18ID:QVnLWQ3q
>>85
数値化できるものなら何でもオーケーだ
歩行を数値化するにはN個の関節を持つM本の脚をパラメータとし時間経過ごとの接地点と関節の位置をジェネレータみたいに連続的に返すような設計が考えられる
0096デフォルトの名無しさん
垢版 |
2021/01/13(水) 13:12:01.01ID:D0cZCa+j
>>94
じゃあ将棋の駒オブジェクトはプロパティとして位置を持っているのか?
0097デフォルトの名無しさん
垢版 |
2021/01/13(水) 14:09:32.74ID:D0cZCa+j
俺の考えるOOシステムでは、駒オブジェクトは盤面オブジェクトやルールブックオブジェクトへの参照を持っいる。

駒オブジェクトへ前へ3移動とメッセージを送ると、駒オブジェクトはルールブックオブジェクトと盤面オブジェクトを用いて、移動可能であれば盤面オブジェクトへ自身を移動するようメッセージングする。
0099デフォルトの名無しさん
垢版 |
2021/01/13(水) 15:38:23.35ID:CyYDkVRJ
システム次第でしょ。
もしも将棋の駒が自律歩行多脚戦車だったら、GPSシステムがすべての位置情報を管理してるなんておかしいし。
0100デフォルトの名無しさん
垢版 |
2021/01/13(水) 15:38:43.61ID:D0cZCa+j
enum class なら可能。
0101デフォルトの名無しさん
垢版 |
2021/01/13(水) 20:01:32.91ID:D0cZCa+j
C++はテンプレートがあるので設計の詳細を先送りできる。
その特徴を生かせるように、プッシュ型を流行らせませんか?
プッシュ型は、前提が少ないので、利用者が自由に組み合わせることが出来ます。

これは、インターフェースによって事前に詳細を設計してしまう方式と真逆かもしれないが、組み合わせによって機能を作ることが出来まっする。
0103デフォルトの名無しさん
垢版 |
2021/01/14(木) 06:54:42.42ID:mrWYZ3Pm
Caper や Bison でプッシュ型を調べてみるとわかると思います。
0104デフォルトの名無しさん
垢版 |
2021/01/14(木) 06:59:25.06ID:mrWYZ3Pm
あらゆるソフトウェアで使いまわされるライブラリにおいて、詳細が既に決まっているのは不自由なことです。
0106デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:23:48.43ID:mrWYZ3Pm
>>105
プッシュ型はパーサーでよく使われます。
ユーザーが柔軟性を求めるからです。

Caperはプッシュ型、Bisonはパーサー側が文字を読む方式ですが、オプションとしてプッシュ型を選べます。
パーサにおいてプッシュ型とは、(パーサではなく)パーサを呼び出す側が文字を送り込みます。

それによって何が起きるでしょうか?
従来のパーサーは状態と共に行番号を保存します。
プッシュ型の場合、行番号を保存するのは呼び出し側です。

パーサーが読む文字とは何でしょうか?
プッシュ型において、Cではint、C++ではユニコード。コードポイントです。
文字デコードを行うのは、呼び出し側です。

では従来のパーサでは?
行番号を管理するためには、文字デコードもパーサーの仕事です。
つまりパーサーは大きな塊でアリ、組み合わせる部品ではありません。
0107デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:27:04.63ID:mrWYZ3Pm
プッシュ型はUNIXに通じるものがありますが、UNIXでは実現されませんでした。
0108デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:47:44.25ID:mrWYZ3Pm
パーサーは本来、構文解析が仕事です。
しかし、現状多くのパーサーは、構文解析以外の機能を密に結合している。

本来の仕事以外は分離して、小さな部品にすることで再利用性が高まる。
という感じですかね。

これはテンプレートと同じでもろ刃の剣でもあるんですよ。
詳細を設計しないんですから。

しかし、STLの寿命の長さを見て分かる通り、詳細が設計されていないという事は利用者が自由に設計できるという事で、使い出があるんです。
0109デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:48:23.53ID:mrWYZ3Pm
もちろん、パーサーに限った話ではないですよ。
例です。
0110デフォルトの名無しさん
垢版 |
2021/01/14(木) 09:22:59.17ID:EIDQMz1r
みんながみんなパーサーを開発する側じゃないからなー
もっと身近な例はないですか?
このようなデザインパターンがプッシュ型だとこうなる、みたいな
0111デフォルトの名無しさん
垢版 |
2021/01/14(木) 09:29:21.76ID:mrWYZ3Pm
>>110
使う側にとって良いことなんですよ。

それと、プッシュ型は万能ではないんですよ。
一部のコンポーネントの部品化に対して利益があるのです。
0113デフォルトの名無しさん
垢版 |
2021/01/14(木) 10:15:16.01ID:mrWYZ3Pm
まあそうですね。
すいませんでした。
0114デフォルトの名無しさん
垢版 |
2021/01/14(木) 10:22:13.84ID:FFXK54Rt
身近な例で利点があるなら広めるのに協力するのもいいが今の時点で利点が分からん。
0115デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:40:36.18ID:qrpkNJTC
別にC++だけの問題じゃないんだけど…質問…例えば…エクスプローラのようにファイル一覧出すじゃん…
画像や動画は…サムネイルを出すじゃん…このサムネイルは非同期で更新になるじゃん…
一度開いたら…キャッシュから読み込みたいじゃん…このキャッシュの保存ってさぁ…一意にするのに…
ファイルパス・更新日時・サイズである程度一意になるけど…完璧な一意ではないじゃん…
同じ名前・同じ更新日時・同じサイズで上書きされたら、前の画像がサムネイルに出るじゃん…
どうすんの?
0116デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:42:53.95ID:qrpkNJTC
キャッシュなんてそんなものだから…それでいいのかなぁ…
0118デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:55:13.17ID:EIDQMz1r
ファイルパスと更新日時で一意になると考えていいでしょ
コンテンツが変更されれば更新日時が進むという前提で
それさえも許せないクリティカルなシステムならファイルの全バイト列から衝突率の低いハッシュ作るとかファイル読むのと変わらんことになる
クリティカルなシステムではキャッシュ使わんな
0119デフォルトの名無しさん
垢版 |
2021/01/14(木) 16:05:02.51ID:qrpkNJTC
なるほど…。
0121はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/14(木) 16:16:29.09ID:9qLPLWCT
ファイルシステムによるけど iノード番号だったり
それに近い管理機構で一意に特定できる場合もあるんじゃないの。
サムネイルくらいなら雑でいいやという割り切りもあると思うけど、
ある程度は不整合がないようにする努力もしてると思う。
0123デフォルトの名無しさん
垢版 |
2021/01/14(木) 23:49:25.09ID:9gUF6PTW
スヌープとLRUでおk
この2つでダメだという香具師は、
スヌーピングのロジック設計をサボっているか、
メモリをケチって必要量に未達なだけ
0124デフォルトの名無しさん
垢版 |
2021/01/16(土) 08:13:56.08ID:dLwYQ6PK
おはようございますみなさま、質問させてください

ユーザー定義クラスを作成し、循環参照を防止するためweak_ptrをメンバに持たせています。
そして任意の処理でshared_ptrをweak_ptrに代入し使用したいと思っておりました。
しかし、メンバ関数内部でweak_ptrを使用すると、式にはポインタ型が必要です、旨のエラーが出てしまいます。
調べてみたところ、lock()でshared_ptrに再度権利委譲するとshared_ptr側から動くのですが、私が初心者な事もあり何か釈然としません(我が儘でしょうか……)
一度weak_ptrに落とし込んだものを再度shared_ptrに戻す部分が引っかかっているのだと思います(気にしすぎですかね)

そこでお聞きしたいのですが、クラス内部で動的に定めたいと思っているweak_ptrを使う際に、これ以外の方法はありますでしょうか?
それとも上記の通りlock()で一時的なshared_ptrに束縛した方がいいのでしょうか?

朝から長文失礼しました
0125デフォルトの名無しさん
垢版 |
2021/01/16(土) 08:49:06.94ID:ld2GCDwz
ロックしないと知らない間に参照先のshared_ptrで持ってるオブジェクトが破壊されてても文句言えないけどそれでもいいの?
weak_ptrってそういうものだぞ
0127デフォルトの名無しさん
垢版 |
2021/01/19(火) 02:35:16.36ID:y82ZfCrD
移譲って要は継承せずにオブジェクトとして使うってことですよね?
なぜ「移譲」なんてわけわからない名前がついてるんですか?
0130デフォルトの名無しさん
垢版 |
2021/01/19(火) 09:18:39.64ID:xem4SJ/U
日本語の問題だけど移譲は同じレベルに権限等を移すこと、委譲は下のレベルに移すことらしい
委譲は継承より権限の制限があるという含みがあるんだと思う
あくまで人間の組織での比喩なんだろうけど
0131デフォルトの名無しさん
垢版 |
2021/01/19(火) 09:54:48.36ID:QmODXpTw
名前付けるほどのことか?と問われればたしかにそう思う
クラス内で他のクラスオブジェクトを使ってるだけw
0135デフォルトの名無しさん
垢版 |
2021/01/19(火) 20:00:27.80ID:rn87bDt4
「オブジェクト指向?じゃあ継承しなきゃ!共通実装はみんな継承でポリモにしろ!」みたいなノリのクソ設計が溢れかえった時期があって
カウンターとして無理に継承せんでもオブジェクト持って使えばええんやでっていう事に名前付けたのが委譲とかコンポジションとか
しょうもないんだけど継承教に対抗するには名前が必要だったんよ
0136はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/19(火) 21:06:03.25ID:Zp03eKCw
>>134
そのとおりだよ!
前スレで C++11 (以降) に否定的な意見も出てるが、
使える状況であえて C++03 (以前) を選択したがる感覚はわかんね。
0138デフォルトの名無しさん
垢版 |
2021/01/19(火) 23:09:23.44ID:7+t4BBWY
なんか、ここはどこ私はだあれなやついるなw
なんでテンプレートが出てくるのか
0141デフォルトの名無しさん
垢版 |
2021/01/20(水) 19:27:35.22ID:kPiTytYK
C++スゲー=俺スゲーしたいだけの学生が増えたんだろ

>>134, >>136
エアプ乙
便利にはなったが、メタプログラミングやってても委譲コンストラクタ無くてもそんなに困らんかったぞ
メンバの初期化には関数の戻り値だって使えただろ、どこで困るんだ?
0142デフォルトの名無しさん
垢版 |
2021/01/20(水) 19:33:42.85ID:kPiTytYK
あ、委譲コンストラクタが無くても、の話であって03と11がどうこうじゃないよ
0143デフォルトの名無しさん
垢版 |
2021/01/20(水) 21:35:54.62ID:UBOdXm83
constメンバの初期化をしたいとき
初期化リストで初期化すれば良いっていやー良いが
コンストラクタ毎に初期化リストを書かねばならない
メドイ…
0145デフォルトの名無しさん
垢版 |
2021/01/20(水) 21:47:26.52ID:MvJ8v0/f
>>141
C++03で何が困るって、<system_error>や<filesystem>や<execution>みたいのがなかったことだよ
新機能を乱発してプログラマを喜ばせるのを慎むというハゲの主張はわかるが
あまりにも保守的すぎて現実から乖離し始めていた
0147デフォルトの名無しさん
垢版 |
2021/01/20(水) 21:57:51.96ID:kPiTytYK
>>143-144
え、そんな場面滅多に無いと思うが・・・
委譲するときは他のコンストラクタしか初期化子使えないはず・・

と思ったが非constなものは全部コンストラクタ本体で初期化、ならいけるか
0148デフォルトの名無しさん
垢版 |
2021/01/20(水) 23:00:47.64ID:UBOdXm83
>>146
同じことをするのに複数のやり方があったらプログラミング言語界のPerlになってしまう
お禿様の気持ちはワカル
0152デフォルトの名無しさん
垢版 |
2021/01/21(木) 07:40:13.27ID:Z8coO7Zb
perlは遊び道具としては面白いのかもしれないけど本番で使うにはちょっと…
0153デフォルトの名無しさん
垢版 |
2021/01/21(木) 08:36:52.78ID:RnFvGHUF
Git for windowsと一緒にインストールされる遊び道具、という世界観ですね。大切にしなさい。
0154デフォルトの名無しさん
垢版 |
2021/01/21(木) 08:52:53.32ID:2LdLfW0X
へー、findやopensslは便利に使ってたけどperlまで入ってたのか。
まぁ、もう使うことはないだろうけど。
0155デフォルトの名無しさん
垢版 |
2021/01/21(木) 09:35:52.84ID:RnFvGHUF
Perlを厄介と考えるPGのほうがPerlよりも先に厄介払いされる。若いくせに向学心がないことが垣間見える。
0157デフォルトの名無しさん
垢版 |
2021/01/21(木) 10:25:31.85ID:RnFvGHUF
Perlを難しいと思うようだとあまり伸びしろがないね。職業変えたほうがいいかもね。正直でごめんね。
0159デフォルトの名無しさん
垢版 |
2021/01/21(木) 11:09:21.23ID:rjSQv0Wq
最近のモダン(この言い方自体が既に古いがw)な言語使ったことないんじゃね?
あとそれなりの規模の開発したことないんだろうね
perlは書捨てのツール作ったりするには便利だったけど今更新規で使うことはないわ
0160デフォルトの名無しさん
垢版 |
2021/01/21(木) 15:15:36.61ID:upjC6TmF
Perlの開発者ってタッチタイピングできなかったのかな?
なんであんなに1文字の特殊変数だらけの言語作っちゃったの?キーボード入力が楽になるとか思っちゃったのかな?
結果は可読性の低いクソースコードが量産されただけだったよね
0161デフォルトの名無しさん
垢版 |
2021/01/21(木) 16:04:26.02ID:eIfq2EBT
>>160
gnu-makeやshell scriptも同じ。
emacsも、キーバインドを丸覚え出来る人しか使えない。
作者が記憶力が桁違いにいい人だったりしてな。
0162デフォルトの名無しさん
垢版 |
2021/01/21(木) 16:22:10.60ID:jCImDRpq
>16 :デフォルトの名無しさん:2006/03/10(金) 22:15:19
>>>10
>> こんな変数名があちこちに散らばっているのがPerl
>
>大学の研究室のボスは、特殊変数の表をふ〜んと2分ほど眺めて完全に暗記した。
>
>そういうレベルの人たちのための言語なんだなと思って、トイレで血の涙を流した。
0163デフォルトの名無しさん
垢版 |
2021/01/21(木) 16:57:53.30ID:eIfq2EBT
表を見た直後なら、俺も暗記してるぞ。
しばらくたったら忘れる。
短期記憶と長期記憶の違いだ。
0164デフォルトの名無しさん
垢版 |
2021/01/21(木) 18:03:23.48ID:ukSw99eK
Perlはglobが使えるようになったらuse strictの下でも参照渡しとかできてC++的に組めるようになるからおk
しかしglobを使うことと理解することは別宇宙の話なのであった
0166デフォルトの名無しさん
垢版 |
2021/01/21(木) 18:24:32.27ID:RnFvGHUF
このスレ、初心者多すぎ。丸暗記なんて誰もしないぞ。何のためにオンラインヘルプあると思ってんだろう。
辞書持ち込み禁止に慣れた学生の気分なのかな。
0167デフォルトの名無しさん
垢版 |
2021/01/21(木) 18:26:55.41ID:RnFvGHUF
自身の理解力のなさを胡麻化すために大げさな言い回ししているように見える。マジでPGむいてないから転職したほうがいいよ。
0168デフォルトの名無しさん
垢版 |
2021/01/21(木) 18:30:55.76ID:RnFvGHUF
>>160 みたいな己の能力のなさを棚に上げておおげさな物言いをする人には調査の仕事を振ることすらできないんだが。
0170デフォルトの名無しさん
垢版 |
2021/01/21(木) 19:17:51.03ID:RnFvGHUF
ちょっとしたことをやるのに適しているのがスクリプト言語なのに、そのスクリプト言語の初歩にさえつまづいてしまう人はPGに向いてないんだよ。
正直でごめんね。Perlだけの話してるわけじゃないんだわ。
0171デフォルトの名無しさん
垢版 |
2021/01/21(木) 21:03:47.74ID:ukSw99eK
>>169
Perl 6が出るまで無限に待たされそうな気がするから
バージョン5系の消滅は無限の未来なんじゃないかな…
0172デフォルトの名無しさん
垢版 |
2021/01/21(木) 21:28:48.83ID:cjnTDlz3
人って第一印象が重要でしょ。
言語もそうだと思うの。
Perlだけの話をするけど、Perlは第一印象で損してる感じ。
PG経験あれば直感的に避けようとする人も少なくないのでは?
0173はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/21(木) 21:30:02.98ID:ooF1treM
>>171
Perl 6 は 2015 年に安定板がリリースされたぞ。
ただし、旧来の Perl と互換性は全然ないので後に Raku と改称された。
要するに別言語になってしもうた。
0174デフォルトの名無しさん
垢版 |
2021/01/21(木) 21:40:40.11ID:RnFvGHUF
>>172
ドルマークを多用するPerlはシェルスクリプトに慣れた人にはむしろ入りやすいはずだけどね。
0175デフォルトの名無しさん
垢版 |
2021/01/21(木) 21:46:06.32ID:6tk1Snw3
あわしろ氏はJavaはオワコンこれからはPerlと言ってるけどな。
0177デフォルトの名無しさん
垢版 |
2021/01/21(木) 22:23:21.95ID:RnFvGHUF
知っている人も多いと思うけど、bash/zsh向けに便利な入力補完ツール fzf が存在する。
そのGitHubにはfzfにPerlを併用するサンプルコードが散見される。
https://github.com/junegunn/fzf/wiki/Examples

今やPerlは、sedやawkより多機能なちょっとしたテキスト改変ツールとして、Perl本来の役割に回帰している。
PerlをCGIを書くための言語と思っている人にはPerlがオワコンに見えるかもしれないが、現実は違う。
0178デフォルトの名無しさん
垢版 |
2021/01/21(木) 22:35:21.87ID:RnFvGHUF
python3が入っていない環境はわりとあるけどperlが入っていない環境はまずない。
0179デフォルトの名無しさん
垢版 |
2021/01/21(木) 22:35:36.69ID:Z9MWAls1
なんでC++スレでPerl, Perlと連呼するんだろう
おおかた、その心理を察することができるので草生えるwww
0180デフォルトの名無しさん
垢版 |
2021/01/21(木) 22:41:15.38ID:RnFvGHUF
本スレテーマであるC++やJavaなどのコンパイル言語のコーディングの生産性を高めるにはスクリプト言語の有効活用が欠かせない。
makeやantではかゆい所に手が届かないもどかしさは今も昔も同じなんだよ。
0184デフォルトの名無しさん
垢版 |
2021/01/22(金) 00:49:01.09ID:di1fs6eX
たしかルビーの素となった言語がペールでは?
0185デフォルトの名無しさん
垢版 |
2021/01/22(金) 01:19:07.37ID:55qwSi9o
macOSのソフトウェア更新ツールHomebrewはRuby製。マカーがいる限りRubyは不滅。
0186デフォルトの名無しさん
垢版 |
2021/01/22(金) 13:19:25.84ID:pJ+Dy7HC
>>157
PerlもPHPも難しいとは思わないけど
だからこそ排除すべき
0187デフォルトの名無しさん
垢版 |
2021/01/22(金) 13:20:41.30ID:pJ+Dy7HC
>>160
>1文字の特殊変数だらけの言語

Rubyのことですね判ります
0189デフォルトの名無しさん
垢版 |
2021/01/22(金) 14:18:28.68ID:WLGQ46hZ
C++のところで延々と続けるのもなんだけど、TECOってのは相当複雑怪奇だったみたいね
0190デフォルトの名無しさん
垢版 |
2021/01/22(金) 22:15:36.76ID:HHqIRAh/
C++が今後関数型プログラミングを言語としてサポートしていくことはありますか?
0193デフォルトの名無しさん
垢版 |
2021/01/22(金) 23:49:36.96ID:LcAiXyQN
>>192
C++の「マルチパラダイム」の中に関数型が今後入ることはあるか (あるいはもう入ってるか) という質問なんですが、変なことを聞いていますか?
0197デフォルトの名無しさん
垢版 |
2021/01/23(土) 07:19:17.61ID:E7+6hgZm
std::functionとラムダ式で関数はほぼ第一級オブジェクトとして扱えるからC++はとっくに関数型言語ですよ
モナドだってやろうと思えば作れるよ
0198デフォルトの名無しさん
垢版 |
2021/01/23(土) 13:50:31.25ID:1/fAmr9E
じゃーHaskellにできることはC++でもできるし、同じように書けるって言うのかい
0203デフォルトの名無しさん
垢版 |
2021/01/23(土) 18:58:05.34ID:C4WlxIYr
>>198
そんなクソみたいなこと言うんだったら、まず「関数型言語」の定義から言えよ。
Lispが関数型言語じゃないとか言い始めそうだな。
0204デフォルトの名無しさん
垢版 |
2021/01/24(日) 11:36:54.35ID:wSlEv8S7
Rubyは関数型ωωω
0207デフォルトの名無しさん
垢版 |
2021/01/24(日) 21:13:47.08ID:hPeuQsPP
肛門を保護するために出る粘液はイイ匂いがするので、化学的に類似品が合成され、香水の原料になっています。
ウンコは臭いですが、ウンコの周りには良いものがあるかもしれない。
0209デフォルトの名無しさん
垢版 |
2021/01/25(月) 00:51:35.02ID:h/LmkNzq
>>207
腸液は質感、匂いともに精液に酷似してるっていうのはよく言われてるけど、それのことじゃないよね?
良い匂いの分泌液なんて聞いたことがない
0211デフォルトの名無しさん
垢版 |
2021/01/25(月) 10:13:42.80ID:uSgkqdKl
と言いつつ嬉しそうな吉宗であった。
0212デフォルトの名無しさん
垢版 |
2021/01/25(月) 13:06:55.63ID:sPc2eBUP
PerlとC++は、見づらいソースコードに慣れる能力を鍛えてくれる。
Perlをオワコン扱いする人は情弱である。
0214デフォルトの名無しさん
垢版 |
2021/01/25(月) 13:34:11.10ID:lM5Uli0g
糞コードに触れるとアンチパターンがわかるというのは確かにあるが、それを人に勧めるのは気がひける。
0215デフォルトの名無しさん
垢版 |
2021/01/25(月) 13:48:32.46ID:sPc2eBUP
まずい酒の味を知らない者には、うまい酒の味を見分けることはできない。
0218デフォルトの名無しさん
垢版 |
2021/01/25(月) 22:56:10.85ID:sPc2eBUP
まずい酒を飲めなくなることは、プログラミングに置きかえればクソコードのメンテナンスができなくなることを意味しており、スキル低下でしかない。
0220デフォルトの名無しさん
垢版 |
2021/01/25(月) 23:57:21.75ID:sPc2eBUP
うまい酒については「水のように飲みやすい」というほめ表現もあるが、なら水飲んどけよという話でもある。
0223デフォルトの名無しさん
垢版 |
2021/01/26(火) 02:05:34.14ID:wg8lZWjJ
>>220
ほんまこれ
前にカエルの肉を食ったやつが「ほんと鶏肉とおんなじようなもんだから!食べてみて!」
ってしつこいんだが、だったら鶏肉でいいだろなんでわざわざゲテモノ食わにゃならんのか??となる
0224デフォルトの名無しさん
垢版 |
2021/01/26(火) 03:51:19.13ID:uiGtA95I
寄生虫が良い風味出すから。
0225デフォルトの名無しさん
垢版 |
2021/01/26(火) 06:09:38.08ID:ZRZozNwf
macOSのHomebrewいいね。Perlが最新の5.32.1に即対応。人柱上等なところに惚れる。
0226デフォルトの名無しさん
垢版 |
2021/01/26(火) 07:49:52.25ID:ZI8ZD6Xl
安めの食材や有り合わせでうまいもん作れる腕があっても
腐ったものはどうにもできない

例えるなら、これだろ
0228デフォルトの名無しさん
垢版 |
2021/01/26(火) 11:52:17.15ID:XuLptVzr
>>223
今ジビエなどとおしゃれに言ってるがゲテモノ食いが今の事態を招いてる

中途半端な科学信仰が何もかも迷信にしてしまって自然を正しく畏れなくなった
0229デフォルトの名無しさん
垢版 |
2021/01/26(火) 13:45:24.16ID:uiGtA95I
ちょっと腐ったほうが柔らかくなってアミノ酸も多いよ。
熟成させたと言えばグルメも安心だし。
0230デフォルトの名無しさん
垢版 |
2021/01/26(火) 13:48:13.24ID:uiGtA95I
野菜は立てておくと腐らないんだけど、その代わり成長するからね。
光合成できるかも?と思ってなけなしの養分使って葉を伸ばすんだろうけど、光合成は出来ません。
0231デフォルトの名無しさん
垢版 |
2021/01/26(火) 13:54:11.58ID:uiGtA95I
野菜の活〆を発明したら儲かるだろな。
放射線以外で。
0233デフォルトの名無しさん
垢版 |
2021/01/26(火) 21:46:24.92ID:ZRZozNwf
プリプロセッサマクロだらけの“汚い”コードを否定したらC/C++の強みを失うことになる。
JavaやC#はプリプロセッサマクロが貧弱なのが玉にキズだ。
0234デフォルトの名無しさん
垢版 |
2021/01/26(火) 21:51:10.66ID:ZRZozNwf
pybind11スレがないこんな世の中じゃ〜Python〜
まぁマクロの塊のような代物だが。
0235デフォルトの名無しさん
垢版 |
2021/01/27(水) 06:03:44.65ID:yQalyIAE
C++はコミュニティで発言力のある人が大抵率直にものを言い過ぎる、悪く言えば口が悪いので忌み嫌われてるとこある
0236デフォルトの名無しさん
垢版 |
2021/01/27(水) 07:30:48.85ID:eLUquqZ0
>>229
カダベリンやムスカリンが発生してたり
セレウス菌が大量にいるのは
そういう問題じゃねえぜ
0237デフォルトの名無しさん
垢版 |
2021/01/27(水) 07:48:28.28ID:4l9V085Z
でも、Linux板なんか失敗したボランティアの住所載せて、放火しろとは言ってませんよ??言ってませんよ??・・・などの書き込みあるからな。
それに比べれはだいぶ良識的では?
0238デフォルトの名無しさん
垢版 |
2021/01/27(水) 11:26:52.94ID:cJSBZXf9
C/C++のプリプロセッサも貧弱すぎ
0239デフォルトの名無しさん
垢版 |
2021/01/27(水) 17:43:27.13ID:nPuTGnvU
C++例外のスタック情報がとれないのはC++の欠点。
例外でスタック情報を使えるJava/C#/Python/Perlはエライ。
0243はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/28(木) 10:23:46.51ID:vBYpvnJx
>>239
gdb にアタッチしたことないんか?

C++23 には stacktrace が入るから
デバッガを使いこなせなくても少し楽にトレースできるかもな。
0244デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:52:39.05ID:dNWrUHbO
>>223
フグは豚肉に触感似てるけどフグの方が美味い
0245デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:54:00.53ID:dNWrUHbO
>>228
日本で感染爆発が起きてないのは以前からジビエが流行してたからか
0246デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:55:14.42ID:dNWrUHbO
>>230-231
白菜は外の皮じゃなくて中の芯から先に食べろと言われている
0247デフォルトの名無しさん
垢版 |
2021/01/28(木) 11:40:01.79ID:eLxqvNeX
>>200
ユニコ時代だからAPLよりずっと先行ってるぞ
組み込み演算子で∩∉とか集合論の記号採用してたりアトミックな演算子は⚛++とか洒落効いてたりする
一方で古代perlのプレフィックスは緩和されてる
0248デフォルトの名無しさん
垢版 |
2021/01/28(木) 11:51:37.25ID:eLxqvNeX
∅∘∩ ⊍∪ ⊖ ⊎ ∖≅ ∈ ∉ ∋ ∌ ≡
≢ ⊂ ⊄ ⊃ ⊅ ⊆ ⊈ ⊇ ⊉ ≼ ≽.«»≠␤
他組み込みではこんな感じか
>= やらよりmずっと可読性高いと思う、エディタもvimとか高機能なのなら問題なかろう
␤文字を表示してくれるのは特に便利
0252デフォルトの名無しさん
垢版 |
2021/01/28(木) 17:41:41.73ID:GsoT0xyU
クラスAのオブジェクトをクラスBのメンバにするときってどうやってAのコンストラクタ呼ぶの?

class B{
 A a;

public:
 B(){
  // この辺でAのコンストラクタを呼びたい
 }
};
0253デフォルトの名無しさん
垢版 |
2021/01/28(木) 17:48:00.82ID:WrE+/6so
>>252
メンバのコンストラクタの方が先に呼ばれる。だからそこでは既にAは構築済み。
どうしてもBのコンストラクタ内でAのコンストラクタ呼びたいなら、メンバ変数はポインタで持つ
0254デフォルトの名無しさん
垢版 |
2021/01/28(木) 18:07:20.07ID:IHrlZHr2
>>243
gdbはおいとくとして、Visual StudioってC++例外のスロー位置を追跡できたっけ?
0256デフォルトの名無しさん
垢版 |
2021/01/28(木) 18:54:30.61ID:IHrlZHr2
あとで再初期化したくなること多いから、結局コンストラクタの実装を別の関数に分離すること多いよね。
コンストラクタの種類が増えたら使いまわしたくなるし。
0258デフォルトの名無しさん
垢版 |
2021/01/28(木) 19:28:49.13ID:IHrlZHr2
デバッガやシンボルがない環境でもスタックトレースできたほうが良いと思うけどね。
後発言語の生産性の高さはこの辺の充実ぶりにあるでしょ。
0259デフォルトの名無しさん
垢版 |
2021/01/28(木) 19:42:24.27ID:IHrlZHr2
他プロセスと連携するシステムにはデバッガを当てにくい事が多い。
タイミング依存の不具合を追跡する場合、デバッガがまったく役に立たない。
0261デフォルトの名無しさん
垢版 |
2021/01/28(木) 20:36:13.14ID:IHrlZHr2
デバッガ使いこなすとか言って悦に入ってる人と会話が噛み合わないんだが。
0262デフォルトの名無しさん
垢版 |
2021/01/28(木) 20:36:14.66ID:yp+dwtvR
>>258
だよね
むしろデバッガをアタッチできる環境ならスタックトレースはなくてもなんとかなる
ユーザー環境でスタックトレースがテキストファイルに落ちるようになってるとトラブルシューティングがしやすい
0264デフォルトの名無しさん
垢版 |
2021/01/28(木) 21:48:11.74ID:q3mIN91/
>>261, >>263
悪いがプロだよ
IDEの機能を使いこなせてない初心者が、先に学ぶべきことから逃げて言語だけでどうにかさせようとするような
(いつものことだが)はちみつのミスリードに釘を刺しただけだ
0265デフォルトの名無しさん
垢版 |
2021/01/28(木) 21:51:13.66ID:q3mIN91/
>>261
あと、流れを読む限り俺の発言が気に入らなくてファビョってるのは君の方だよね、俺1行しか書いてなかったし(しかも大した内容じゃない)w
何が気に障ったんだ?
0266デフォルトの名無しさん
垢版 |
2021/01/28(木) 21:51:23.69ID:oPlwADge
いやごめん、俺は流れは一切追ってなくて他意はないよ
茶化したかっただけ
気にしないで
0268デフォルトの名無しさん
垢版 |
2021/01/28(木) 23:53:15.94ID:RfcrpqT0
>>253,255
じゃあ、Bを構築してしばらく経ってからわかる情報を使ってAを構築したいとき、Aのインスタンスをメンバとして持つのは不可能ということですか?
ポインタで持つ以外の方法はない (想定されてない?) のでしょうか

constなメンバ変数を初期化するときも近いことを思います
0269デフォルトの名無しさん
垢版 |
2021/01/29(金) 00:10:27.15ID:ZIYbfTXe
>>268
そういうコンストラクタ制約を持つクラスはけっこう多い。
WindowsのC++向けGDI+ライブラリのクラス群はまさにこれが当てはまる。
広範に存在している以上は受け入れるしかない。
今時は標準でshared_ptrなどの共有ポインタクラスを使えるので、さほど問題にならないでしょ。
0270デフォルトの名無しさん
垢版 |
2021/01/29(金) 00:19:48.35ID:SRnp44iw
>>268
Aに引数なしのコンストラクタ、コピーorムーブ代入演算子があるなら、後で作って代入でもいいけど
まぁ特に理由なければ(スマート)ポインタで持った方が無難だし楽

constはどうしようもない
0271デフォルトの名無しさん
垢版 |
2021/01/29(金) 00:22:16.89ID:MWSZTtHp
>>268
「Bを構築してしばらく経ってからわかる情報」を返すヘルパー関数を作って初期化リストの中で呼べばいいじゃない
0272デフォルトの名無しさん
垢版 |
2021/01/29(金) 07:49:13.10ID:/axUqcOX
データメンバをconstってあんまりやらないな
publicに晒すとかじゃなきゃメンバ関数を
constにするだけで足りるから

あ、staticメンバのconstはよくやるけどね
0273デフォルトの名無しさん
垢版 |
2021/01/29(金) 08:02:53.38ID:1V7SRlCX
>>251
ある
実装は同じunsigned longでも意味が違うから別クラスとして扱いたいときとか
private継承できたらナア……
現状(C++03)はプリミティブ型と同じ演算子(のうちの当座のアプリケーションで使うやつ)をいちいち実装したクラスを作って
NDEBUGマクロで実装を切り替えるみたいな涙ぐましい努力が要る
0274デフォルトの名無しさん
垢版 |
2021/01/29(金) 08:05:13.74ID:1V7SRlCX
訂正orz
誤: private継承
正: public継承かつoperator unsigned long()はprivateかつunsigned longからの構築はexplicit
0275デフォルトの名無しさん
垢版 |
2021/01/29(金) 08:08:37.91ID:1V7SRlCX
メンバをconstにして代入演算子を定義せずにいるとデフォルトの代入演算子をが定義できないとコンパイラに文句を言われる俺環、
0276デフォルトの名無しさん
垢版 |
2021/01/29(金) 09:20:50.39ID:koPyq8om
>>273
それ、継承できたとして式の中で混在しても区別されないんじゃね?
テンプレートの型引数で区別するような使い方くらいしか思いつかないが。
0277デフォルトの名無しさん
垢版 |
2021/01/29(金) 12:20:22.74ID:c2S2Mocm
メンバ変数のconstはポインタ型ならすることあるけど、値で持つメンバ変数はあんまり意味なくない?
constなくても勝手に外部から書き換えられないように、ちゃんと隠蔽しとけばいいだけでしょ
0278デフォルトの名無しさん
垢版 |
2021/01/29(金) 12:35:16.78ID:2DekME/2
>>277
class内の処理においても変更しないつもりだ、変更されることはない、と明示することで意識しておかなければならないことを少し軽減できるのだから、無駄ではないと思う。
手間をかけずにconstにできるならしておけばいいし、逆に無理して複雑なことをしてまでconstにする必要はないという程度のことかと思う。
0279デフォルトの名無しさん
垢版 |
2021/01/29(金) 12:55:03.34ID:c2S2Mocm
>>278
たしかにconst付いてればコンストラクタで設定した値がずっと変わらないことが
明示的になるから無意味ではないか
0280はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/29(金) 14:10:30.45ID:heeNhc25
>>273
そういう用途なら opaque alias という提案だけは出てるけど
どう見てもグダグダなんで、場当たり的な方法のほうがマシだと思うよ。
0281デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:04:20.47ID:5pIDnM+S
>>251
3値のboolean作るときってboolean継承すべき?
0282デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:07:44.73ID:5pIDnM+S
>>256
言いたいことは判るが
コピーコンストラクタやムーブコンストラクタが勝手に使われるから
デフォルトに任せてると何が起こるかは判ってた方が良い
0283デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:10:21.66ID:5pIDnM+S
>>259
COMサーバーというかDX用にフィルタ書いてると訳判らなくなった
0284デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:56:37.48ID:RxAp4EkX
>>281
3値のbooleanを作って何するの?
boolへのポインタにしてtrue / false / nullptr の3値でなんとかならんか?
0286はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/29(金) 17:23:22.91ID:t7wU8l8M
>>281
仮に真偽値型を継承可能であったとして、三値型が真偽値型を継承するのはおかしいだろう。
場合によって柔軟な判断が必要な場合はあるものの、
継承は is-a 関係を表したいときに限ったほうがよろしいというのが一般的な設計原則だと思うが。
0288デフォルトの名無しさん
垢版 |
2021/01/29(金) 18:57:54.24ID:ZIYbfTXe
はちみつ餃子「スタックトレースできないならデバッガ当てればいいじゃない」
0290デフォルトの名無しさん
垢版 |
2021/01/29(金) 19:56:26.71ID:ZIYbfTXe
テンプレートを使えば、クラス継承に依存しない記述が可能。
iostreamが黒歴史扱いである現実を踏まえての話。
0293デフォルトの名無しさん
垢版 |
2021/01/29(金) 21:39:11.47ID:ZIYbfTXe
iostreamは使いもしないメンバ変数を継承することを強要される悪い手本でしょ。
0295デフォルトの名無しさん
垢版 |
2021/01/30(土) 01:56:51.26ID:SJAC6oP5
iostreamはクソなのは正解だが別に批判するようなことでもない
なぜなら使わなければいいだけの話だからだ
0296デフォルトの名無しさん
垢版 |
2021/01/30(土) 02:06:50.03ID:OHt9F1SU
無理にクラス継承を使わずオーバーライド関数とそれを使うテンプレート関数を充実させたほうが幸せになれる。
0297デフォルトの名無しさん
垢版 |
2021/01/30(土) 02:41:04.49ID:PJvUkb6d
別に無理して継承を使っているわけではない
どっかの馬の骨が気に入らんからといって
あれを使うなこれを使うなと言われるほうが無理そのものだ
0298デフォルトの名無しさん
垢版 |
2021/01/30(土) 02:53:37.72ID:OHt9F1SU
例えば、ファイルに書き込む処理があったとする。
ファイルハンドルとして有名な型としては、int型、FILE*型、iostream型、Win32APIのHANDLE型などがあげられる。
これらを派生クラスに閉じ込めて抽象化するよりも、関数名が同じになるオーバーライド関数を作ってテンプレート関数から呼んだ方がはるかに楽。

int WriteBuffer(int fp, const char* buffer);
int WriteBuffer(FILE* fp, const char* buffer);
int WriteBuffer(ostream& fp, const char* buffer);
int WriteBuffer(HANDLE fp, const char* buffer);

template<typename FILE_OBJECT>
void WriteContent(FILE_OBJECT o)
{
WriteBuffer(o, "write test1");
WriteBuffer(o, "write test2");
}
0301デフォルトの名無しさん
垢版 |
2021/01/30(土) 05:45:11.84ID:SLqQC90z
フリー関数とクラスメンバでは、インテリセンスが効くか効かないかの違いもある。
0303デフォルトの名無しさん
垢版 |
2021/01/30(土) 06:06:53.60ID:SLqQC90z
クラスの場合、名前空間を書かなくても、インテリセンスが効く。
0304デフォルトの名無しさん
垢版 |
2021/01/30(土) 06:47:43.00ID:budoESfZ
コンストラクタの初期化リストで
class A{
 int x;

public:
 A(int x) : x(x) {}
};
みたいにしたとき、ちゃんとメンバのxがコンストラクタの引数のxで初期化されますよね?
メンバの x と同名の引数の x が同一のスコープに同居しているようで紛らわしいかなと思ったのですが、こういう書き方を避ける慣習はありますか
0305デフォルトの名無しさん
垢版 |
2021/01/30(土) 07:04:07.72ID:ULcRPxme
自分は普通にその書き方してる
避ける人も居るっぽいけど好きなようにすればいい
0306デフォルトの名無しさん
垢版 |
2021/01/30(土) 09:09:49.20ID:PHKUCpSE
iostreamマンセーバカってのは型安全ならどんな仕様でも良いと思ってるカスが多いからな。
型安全は評価する一項目に過ぎないってのに。
0307デフォルトの名無しさん
垢版 |
2021/01/30(土) 09:29:38.23ID:vDjChjwr
iostreamは整形のための情報をわざわざ状態として持たされるのがクソ
当時は状態が邪悪だっていう考え方が一般的じゃなかったからしょうがないけど
0308デフォルトの名無しさん
垢版 |
2021/01/30(土) 09:38:20.91ID:2pTx0la6
でも状態もってなかったら記述が煩雑になりすぎない?
HTMLのマークアップとまでは言わんまでも
0309デフォルトの名無しさん
垢版 |
2021/01/30(土) 09:59:20.80ID:OHt9F1SU
整形設定を記憶する変数インスタンスをiostreamインスタンスと分離すべきって話でしょ。
必要に応じて差し替えできるように参照渡しするか、逆にiostreamを参照渡しするとか色々やれたはず。
0310デフォルトの名無しさん
垢版 |
2021/01/30(土) 10:06:40.70ID:OHt9F1SU
というか他のオブジェクト指向言語だと整形情報がFormatterクラスとかに分離されているのが普通だし。
0312デフォルトの名無しさん
垢版 |
2021/01/30(土) 10:40:52.47ID:hVJYorL3
初歩的な質問なのですが、stringクラスの内部バッファはデストラクタで破棄されるため自分では一切管理しなくていいという認識で良いのでしょうか?
0313デフォルトの名無しさん
垢版 |
2021/01/30(土) 11:17:24.76ID:SLqQC90z
アロケータによるけど、普通は管理しなくて良いのでは?
0314デフォルトの名無しさん
垢版 |
2021/01/30(土) 12:47:13.80ID:EWZvTk3z
>>308
状態持ってても無駄に煩雑(複雑ではない)
0315デフォルトの名無しさん
垢版 |
2021/01/30(土) 12:57:10.51ID:8FYOnD7D
iostream 型安全なのはいいけど、char/signed char/unsigned char ぜんぶ文字扱いするのはやめて欲しかった。
0316デフォルトの名無しさん
垢版 |
2021/01/30(土) 13:18:35.30ID:SLqQC90z
単項プラスで。
0317はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/30(土) 13:18:38.04ID:4OMKN/Z4
>>309
入出力を直接的に司るバッファクラス (basic_streambuf) と
書式制御を司るストリームクラスを分離したデザインになっているし、
必要に応じて差し替えることも出来るよ。

iostream においてそれがわかりやすいか、良いデザインであるかは別として、
ちゃんと分離したデザインになってる。
0318◆QZaw55cn4c
垢版 |
2021/01/30(土) 14:53:52.50ID:L1O2TNoD
>>304
私は馬鹿なのでメンバ変数とコンストラクタ引数を x, _x というふうに書き分けています、馬鹿が感染るかもしれないのでお勧めはしません
0321デフォルトの名無しさん
垢版 |
2021/01/30(土) 16:41:05.48ID:SLqQC90z
MicrosoftとAdobeがその書き方多いですね。
0322デフォルトの名無しさん
垢版 |
2021/01/30(土) 17:13:12.28ID:S5wIZr5N
なお、_x は、命名規約上、禁止。先頭が _ の名前はコンパイラなどの
システム予約なため。
0324はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/30(土) 17:19:55.79ID:4OMKN/Z4
>>304
>>318-319
命名規約の方法論は色々なのでプレフィクスを付けるルールが定めてある場合もあるし、
むしろ一致させていくようにしているものもある。
私自身は、少なくともメンバに値を設定するだけの単純なコンストラクタである場合には
名前を一致させていくスタイルで書く。

C++ を使う上でのガイドラインとしてよく参照されているのはグーグルのスタイルガイドで、
データメンバの名前は最後にアンダースコアを付けるようにルールを定めている。
https://google.github.io/styleguide/cppguide.html#Variable_Names

その一方では C++ の設計者である Stroustrup は型やスコープを変数名に含めるのは好ましくない
(しかし部分的に便利な場合もあることは認めている) と書いている。
https://stroustrup.com/bs_faq2.html#Hungarian

どちらの習慣が圧倒的優勢ということはないと思う。

>>322
グローバル変数としてはアンダースコアで始まる名前は予約されているけど、
そうでない場合には問題ない。

ただし、

・ アンダースコアで始まって大文字が続く名前
・ アンダースコアが連続 (名前の先頭部分以外でも) する名前

は名前の種類やスコープにかかわらずどこでも予約されている。
0325デフォルトの名無しさん
垢版 |
2021/01/30(土) 17:30:01.20ID:2r/QlSUC
互いの信仰を侵害してはならないがチーム内では統一されている必要がある
規約の背景は明確である必要がある
0326デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:08:50.99ID:OHt9F1SU
>>317
まず、FILE*とostreamが一対一対応していないのがダメ。
せっかくC言語でファイル、パイプ、標準IOがFILE*型としてで統合化・抽象化されていたのに、
C++でostreamとfstreamで分離される劣化が起きた。
0327デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:30:25.89ID:PJvUkb6d
ios_baseで統一する形に変わっただけ
それをFILE*がどうたらと駄々こねるのは
頭が堅すぎる実年齢に無関係の老害だ
0328デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:36:35.02ID:OHt9F1SU
パイプ処理をostream系で書く奇特な人ってどのくらいいるの?
0329デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:41:09.24ID:OHt9F1SU
pythonは定数がないから全部大文字の変数は定数のようにみなしましょう的な談合がある。
0331◆QZaw55cn4c
垢版 |
2021/01/30(土) 19:09:23.04ID:L1O2TNoD
>>322
束縛領域が狭いローカル変数とかには、_x を使ってもいいのではないか?と考えていますが‥‥
0333デフォルトの名無しさん
垢版 |
2021/01/31(日) 03:18:57.87ID:6QCY/vGM
>>331
実は#defineマクロの中で使われるケースがあってね。
_xが、アプリの中で使われてない事を前提にしないとマクロが作れない
場合とか。
0334デフォルトの名無しさん
垢版 |
2021/01/31(日) 06:52:18.40ID:gXTMTlGe
HTTPサーバーのサンプルで、関数型言語がCを凌駕して、C実装の作者が??になってるやり取りをどこかで見たのですが、わかる方いらっしゃいませんか?

おそらくC++は簡単に勝てるはずなんですが。
0339デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:23:16.43ID:BqL9JwJS
>>331
_で始めると激しくコンパイラ依存になる
0340デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:50:22.50ID:BqL9JwJS
>>334
Erlang?
0341はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/31(日) 10:57:57.30ID:+XHxoAeu
>>339
繰り返すが言語仕様上はグローバル変数ではない名前の頭がアンダースコアで始まるだけなら問題ない。

現実に出来が悪いコンパイラがたくさんあるのであれば仕方がないが、
少なくとも俺はそんなのに遭遇したことはない。
0342デフォルトの名無しさん
垢版 |
2021/01/31(日) 11:04:21.78ID:fCVb5Gn/
>>338
DLLのビルドに使ったコンパイラと
そのDLLを使うアプリをビルドするコンパイラが違っても動くんだぞ
ABIの指定は仕方ねえだろ
0344デフォルトの名無しさん
垢版 |
2021/01/31(日) 12:10:02.04ID:gXTMTlGe
>>343
それです。
ありがとうございます。
0345デフォルトの名無しさん
垢版 |
2021/01/31(日) 13:12:26.22ID:ZnRwde8F
>>341
英語サイトでも、説明の仕方が誤解を招くようなものがありまして、もしかしたらそれは誤解かも知れません。
https://stackoverflow.com/questions/25090635/use-and-in-c-programs
「Here's what the C standard says (section 7.1.3):
 1. All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
 2. All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.」
訳:
1. アンダースコアで始まって直後に英大文字が続くか、または、アンダースコアが連続して
 続く識別子は、いかなる使用も予約されている。

2. アンダースコアで始まる全ての識別子は、通常または、タグ名前空間における
 ファイルスコープの識別子として常に予約されている。

1. の方は、_XXX か、__xxx は予約されていると言うことですが、
2. の方は、_xxx の形式は、例え xxx の部分の先頭が小文字であっても、ファイルスコープにおける
識別子として予約されており、ローカル変数名としては使うべきではないということだと思われます。

また、C++の方では、
https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
*Reserved in any scope, including for use as implementation macros:
10. identifiers beginning with an underscore followed immediately by an uppercase letter
11. identifiers containing adjacent underscores (or "double underscore")
*Reserved in the global namespace:
12. identifiers beginning with an underscore

この12.の書き方が(あなたに)誤解を招いた気がします。
また、11.によれば、xxx__yyy のように _ が連続するものは、識別子の中間であっても予約されている
とのことです。
0346デフォルトの名無しさん
垢版 |
2021/01/31(日) 13:18:09.37ID:ZnRwde8F
>>337
それは問題ではないんだけど、
#define a(x) { int _x = 1; _x = x * 2; printf("%d",_x);}
のようなマクロが有ったとすれば、
int y = 5;
a(y); // 10 と表示される。

int _x = 5;
a(_x); // 2 と表示される。
0347デフォルトの名無しさん
垢版 |
2021/01/31(日) 13:42:32.29ID:Rr91L/mp
int と自作クラス A の pair を priority_queue に入れようと思ったら pair<int, A> に対する less の定義(?)が要るって言われました
int だけに基づいてソートしてくれたら結構なんですが、最も簡単な書き方はどんなですか

また、自作クラス A は array を継承しているのですが、less の定義も引き継ぐ方法はないのでしょうか
0348デフォルトの名無しさん
垢版 |
2021/01/31(日) 14:05:10.94ID:WjHCKOmN
いろんな見解があってややこしいから、安全側に倒して「_で始まる名前は一切使うな」でいいと思ってる
コンパイラ実装するような奴以外はそれで困らんやろ
0349デフォルトの名無しさん
垢版 |
2021/01/31(日) 14:10:22.05ID:gXTMTlGe
【HOW】予約済みの席に座る方法【TO】
0350デフォルトの名無しさん
垢版 |
2021/01/31(日) 14:15:41.43ID:WjHCKOmN
>>347
using Aitem = std::pair<int, A>;
using Aqueue = std::priority_queue<Aitem>, std::vector<Aitem>, [](const Aitem& lhs, const Aitem& rhs){ return lhs.first < rhs.first; }>
Aqueue your_queue;
0351デフォルトの名無しさん
垢版 |
2021/01/31(日) 14:54:17.91ID:bSEeGU13
>>345
ファイルスコープとローカルスコープは違うよ。
あと、今議論中なのはアンダースコアひとつで始まるメンバ変数についてなんで、アンダースコアの連続がアウトなのは誰でも知ってるし、餃子も324で書いてる
0352デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:06:11.72ID:gXTMTlGe
盛 り 上 が っ て ま い り ま し た ↑
0353デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:07:16.87ID:gXTMTlGe
SRELLって知ってますか?
0354デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:15:54.45ID:ZnRwde8F
>>351
undersocre で始まる識別子は、Cの仕様ではこうなっています:
「All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.」

「undersocre で始まる識別子はfile scopeでは使用してはいけない」
とは言っておらず。
「undersocre で始まる識別子はfile scopeの識別子として使用される
ことが予約されている」
と言っています。

with file scope

の前置詞がなぜ in ではなく with になっているかは私には分かりかねますが、
その直後にも in が使われているので in が二重に使われるのを避けたのかも
知れません。
0355デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:18:08.68ID:gXTMTlGe
inを踏むとか言ってみたくなるじゃないか。
責任とれ。
0356デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:18:17.21ID:ZnRwde8F
どうやら、
「identifiers with file scope」は、「ファイルスコープを持つ識別子」
であり、with は、「持つ」の意味で使われているようです、。
0357デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:41:47.21ID:bSEeGU13
>>354
予約されてるとはつまり使うなってことだけど、いずれにせよファイルスコープの話であって、ローカル変数の話じゃないよ。
0358デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:03:58.33ID:fCVb5Gn/
>>346
#define a(x) { int z = 1; z = x * 2; printf("%d",z);}
int y = 5; a(y);
int z = 5; a(z);
これと何が違うの?
下線で始まることとは無関係だろ
0359デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:08:45.08ID:q0ry4PhJ
STLコンテナの継承ってしない方が良いんですかね?

たとえばarrayに機能を追加 ([i][j] で i 行 j 列の要素を取得する等) して行列クラスを作りたいとき、
・arrayを継承する
・行列クラス内で要素を格納するメンバを array として持つ
の2パターンが考えられますが、皆さん的にはどっちが好ましいですか?

行列 is an array なので今こそ継承の使いどころだと思ったのですがいかがでしょうか
0360デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:16:47.40ID:WjHCKOmN
arrayは仮想デストラクタ持ってないからポリモは出来ない
データ構造使うだけなら必要ない
やめとけ
0361デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:20:57.91ID:NgKJGEE4
かか関数型マクロなら不用意に定義されていても
 int y = (a)(x)
という書き方おすれば問題無くマクロじゃない関数a()の方が呼ばれるので問題無い!
事前に
 typedef double a;
とかされていた場合は知らんが、
0362デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:21:36.60ID:2wqasnUt
好きにしたら?
C++なんて自己流全開で俺スゲーしてなんぼ、他人の顔色伺ってたらダメ
行列なんてプロダクションではどうせ出来合いのライブラリ使うんだし
0363デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:22:25.80ID:q0ry4PhJ
>>360
じゃあメンバとして要素(array)を持てば良いってことですよね?
[]の定義の仕方はわかるのですが、[][]ってどうやって定義するんでしたっけ?
0364はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/31(日) 16:27:00.30ID:+XHxoAeu
>>363
直接には出来ない。 (二引数を受け取れるようにしようという提案はある。)
operator[] を持つ別のクラス (のオブジェクト) を返すという形で実装する。
0365デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:27:38.50ID:X7lGC0go
case by case だろうけど
Array と Matrix に関してなら
直観的に考えると後者かな
継承する意味が無い
0366デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:30:29.11ID:X7lGC0go
[][][]だと3引数になるの?
[][][][]だと4引数になるの?
って疑問が出るので
operator[] を持つ自分自身のクラス (のオブジェクト)が正解だと思う
0369デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:32:06.68ID:fCVb5Gn/
継承といえば
type_infoは仮想デストラクタ持ってるけど
派生クラス作ったやついる? 実験でなく
0370デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:34:24.04ID:ZnRwde8F
>>358
命名規約に従って変数名をつけていれば、>>346のマクロはバグらない。
一方、>>358のマクロは、命名規約に従って合法的に定義されたローカル
変数zに対して使ってもバグる。
その違い。
0371はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/31(日) 16:34:43.94ID:+XHxoAeu
>>366
operator{] にこだわらずに要素にアクセスするメンバ関数を用意するのでもそんなに困らない。
見栄えだけの問題。

まあ見栄えも大事なんだけど。
0372デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:36:28.41ID:ZnRwde8F
>>357
そうではなく、_xxx は、グローバル変数で使うことが予約されているので、
ローカル変数では使ってはならない、と読み取れるように思う。
0373デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:38:11.57ID:q0ry4PhJ
>>366
すみません。どう書いたら良いのか分かりません
[]は
int& operator [] (int i) {return elem[i];}
みたいな感じですよね?
0374デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:43:15.04ID:fCVb5Gn/
>>370
そのためにinlineとconstexprが用意されてるわけだが
なぜマクロで作らなければならないんだ?

どこぞのOS屋がmaxなんてクソマクロ作ってたせいで
みんな迷惑してたよな
0375はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/31(日) 16:45:04.61ID:+XHxoAeu
>>372
ファイルスコープで予約されている名前とローカル変数で名前がかぶっても
単にシャドウされるだけなので衝突しない。

ローカル変数名として使うべきでないという理由にならない。
0376デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:51:19.01ID:ZnRwde8F
>>370
[補足]
マクロ引数が二重に評価されてしまうのを防ぐため、マクロ作者が
気を利かせたつもりで次のようなマクロを書いたとする:
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); }
作者の意図としては、
char *ptr1, *ptr2;
b(*ptr1++, *ptr2++);
のような場合にも正しく動作するようにしたいということで、
この場合は、*ptr1++, *ptr2++ は、それぞれ1回ずつ評価されるので、
ptr1, ptr2 は、それぞれ 1ずつ前に進むので、アプリ作者の意図を
組むことが出来る。

一方、使う側が命名規約に従わず、アプリのローカル変数で_x,_yを定義し、
int _x=1;
int _y=2;
b(_y,_x);
とすると、このマクロは誤動作し、
int x=1;
int y=2;
b(y,x);
と書いたときと結果が変わってくる。
0378デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:57:55.61ID:ZnRwde8F
>>375
まあ、そうなんだけども、多分、英語の意味をそのまま素直に汲み取れば、
単純に>>372の意味のはず。
またそれは>>376のような状況を防ぐことが出来る。

>>374
まあ実際それはそういうこともあることは有るが、マクロでしか書けないような
例もあるわけで、>>376のようなマクロ作者のせっかくの配慮が、命名規約
を破って書かれたアプリでは逆効果になってしまうことがある。
0379デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:00:34.53ID:ZnRwde8F
[補足]
なお、Cの伝統だと、
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); }
ではなく、
#define b(x,y) do {int _x=x; int _y=y; f(_x,_y); g(_x,_y); } while(0)
と書く。
こうしておくと、このマクロを{}ブロックを伴わないif文に書いたときに異常動作
をしない。
0380はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/01/31(日) 17:08:36.84ID:+XHxoAeu
>>378
素直に読めばグローバルスコープで予約されているものは
グローバルスコープで予約されているという意外の意味を読み取ることは出来ない。

そこからローカル変数も制約されるという主張が出てくる理由が不在なんで、
何を言うてんのやろ……? ってなるわけ。
0382デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:14:33.59ID:fCVb5Gn/
>>376
だから二重評価が問題になるようなことをマクロでやるなって
その例だってinlineで書けるだろ

邪道なやり方を保護するために
本筋が迷惑を被るのは本末転倒だ
0383デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:15:05.39ID:ZnRwde8F
>>380
「All identifiers that begin with an underscore are always reserved
 for use as identifiers with file scope in both the ordinary and
 tag name spaces.」
「file scopeを持つ識別子として使用されるために予約されている」
だべ?
block scopeを持つ識別子として使用されたら、話がおかしいと思うが。

「この自動車は、仕事で使うために予約されています」
の場合、その自動車を私用で使えば、規則違反だよね。
0384デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:15:45.54ID:fCVb5Gn/
int _x; //こんなのがあっても
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); } //ブロックスコープで保護されるだろうが
0385デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:19:07.49ID:ZnRwde8F
>>382
でも、_ が最初に来る名前をアプリが使っちゃいけない、というのは伝統的にそういう
ことが一番の目的だと思うぞ。
もう一つは、コンパイラの内部でこっそり使う場合があって、それと知らないうちに
衝突する可能性が僅かにあるため。
なぜこっそり使うかと言うと、絶対に衝突しないようにコンパイラ側を
書こうとするとコンパイラ作りに手間がかかるから。
もし、アプリ側が命名規約を守ってくれていれば、コンパイラ作りが楽になる
ことがある。
0387デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:25:17.52ID:fCVb5Gn/
>>385
おまえさんはコンパイラ屋か?
そうだとして同業者は__builtin_va_argのように注意深くやってるぞ
自分らのエゴのために客に制限をかけるようなことを
でかい声で叫びまくるのはやめてくれ
0388デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:30:48.87ID:ZnRwde8F
>>387
まあ、本当はコンパイラ内部でこっそり使う場合、絶対に衝突しないような
もっと変な名前を使っているから大丈夫なんだ。
起動時の TickCounter の値を変数名の一部に入れたりとかね。
0389デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:37:15.73ID:2WBeknRq
>>383
ローカルスコープで同じ名前の別変数を定義するのは「その自動車を私用で使う」ことには当たらないって言ってるの
0390デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:42:24.07ID:/1NNOLNs
ヘッダーファイルに書くか、ソースファイルに書くかの違いも大きい。
ヘッダーファイルに書くときは名前衝突に対する細心の注意が必要。
0392デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:51:16.48ID:/1NNOLNs
C/C++の場合、スコープだけ意識するのは不十分で、ヘッダーかソースかで厳格さを変える柔軟性が必要。
ヘッダーに書くと影響範囲が大きいから。
0393デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:57:13.23ID:fCVb5Gn/
テンプレートなんか普通にヘッダに内容全部を書くが
マクロでバカやるやつがいなければ平和だよ
0394デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:58:49.95ID:A8yllSCF
ローカルスコープでも _x が禁止だというなら >>346 のマクロ a 定義内で _x を使っていい理屈もわからんよな。
0395デフォルトの名無しさん
垢版 |
2021/01/31(日) 18:55:26.91ID:gXTMTlGe
std::pair<>を継承してquadを作る場合どうなりますか?
0396デフォルトの名無しさん
垢版 |
2021/01/31(日) 18:58:05.19ID:gXTMTlGe
std::regexが意外と使える子に成長してますが、標準化委員会では捨て去る提案まで出てるそうで。
0397デフォルトの名無しさん
垢版 |
2021/01/31(日) 19:37:14.68ID:/1NNOLNs
std::regexはプロパティが貧弱なので結局、従来の正規表現ライブラリ使う羽目になる。
std::regexと互換性のあるインターフェースを持つ正規表現クラスを提供するよう呼びかけるのが現実的。
0398デフォルトの名無しさん
垢版 |
2021/01/31(日) 19:51:04.44ID:vFnk+kXo
順序付き pair って自分で順番に格納するのと2要素のsetにするのどっちが良いですか
0399デフォルトの名無しさん
垢版 |
2021/01/31(日) 20:39:53.24ID:/1NNOLNs
pairはSTLのアルゴリズムの恩恵を得るための物。
自宅の郵便受けを豪華にしたところで、郵便事業には何の関係もない。ただの趣味の世界。
0401デフォルトの名無しさん
垢版 |
2021/01/31(日) 21:47:36.00ID:jyYnHelr
set<int, vector<pair<int,int>*>>
元の集合に1億個程度のペアが入ってるとすると、住所録めいたものをあらかじめ生成しておく

配列でやっても速そう
list[m].empty()
こういうリストで空っぽかどうかわかればいいわけだ
vector<vector<pair<int,int>*>>>;

それならドでかい二次元配列に入れた方がラクかもしれない

連想配列でも出来る
map<int ,vector<pair<int,int>*>>>

静的な話だったが動的つまり追加と検索が交互に起こるとおそらく話は違ってくる

全部試して早かったモンが高速である、程度の他愛ない結論に落ち着く
0405デフォルトの名無しさん
垢版 |
2021/02/01(月) 01:17:42.16ID:FSry25xS
>>391
int _x=_y;
int _y=_x;
ここの二行目の右辺の_xは、b(_y,_x)の第二引数の_xではなく、一行目
で宣言した_xになっているので、b(_y,_x)の第一引数の_yになる。つまり、
int _x=引数の_y;
int _y=引数の_y;
となるので、{}の中の_x, _yは、どちらも引数の_yの値に等しくなってしまう。
これではマクロ作者が意図したことではなくなってしまう。
0406デフォルトの名無しさん
垢版 |
2021/02/01(月) 01:19:32.38ID:FSry25xS
>>394
まあ、それはもっともな指摘なのだが、アプリ本体では使用禁止で、
マクロでは使用可能と勝手に解釈してしまうのが一つの流儀。
0407デフォルトの名無しさん
垢版 |
2021/02/01(月) 01:22:56.68ID:FSry25xS
>>389
そうではなくて、ローカルスコープで使うことそのものが、file scope
で使ってないことに当たるので、規約違反と言うことになると解釈できる
気がするんだ。

なぜそんなルールにしたのかは分からんがな。
0408デフォルトの名無しさん
垢版 |
2021/02/01(月) 03:22:30.15ID:fw9rYrIy
>>405
残念だったね。インライン関数使おうね。

>>406
あなたの流儀を規格の定めであるかのように話すのは迷惑なのでやめてくださいね。

>>407
file scope で予約されてる名前を file scope で使ってないなら問題ないね。
規約違反などという解釈にはならない。気のせい。そんなルールになってない。ってことで終われよ。
0410デフォルトの名無しさん
垢版 |
2021/02/01(月) 07:30:17.18ID:LhepLs74
>>406
マクロ定義内の仮引数名は当のマクロ定義外の何者とも関係しないのでは…
いわゆる束縛変数
0411デフォルトの名無しさん
垢版 |
2021/02/01(月) 07:38:30.21ID:LhepLs74
として安全に取り扱われる

一方>>346の_xはa(x)が展開された結果が他のプリプロセッサ定義で再置換され得るなら危険
これが起きるかはプリプロセッサの仕様(規格)を見たら白黒付くが
個人的には君子なので危うきには近づかないことに死体、
0412デフォルトの名無しさん
垢版 |
2021/02/01(月) 08:09:47.67ID:v6ebtUL1
うちの若いのがあんなアホマクロ書いてたら張っ倒す
まあ、やらかしそうなのはいないけど
0413デフォルトの名無しさん
垢版 |
2021/02/01(月) 09:26:53.82ID:5yr9aQzL
>>346
そもそもそのマクロで生成される変数はファイルスコープでないから、そもそも問題外では?

仮にファイルスコープな変数を宣言するようなマクロでも、ユーザが意図せず
0416デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:06:54.06ID:ZelzH3+k
>>414
コロナの影響だろな。
福島大爆発の影響も計り知れない。
「原爆ぶらぶら病」で検索してください。
0417デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:30:15.68ID:jyRtFT93
>>408
>file scope で予約されてる名前を file scope で使ってないなら問題ないね。
そうじゃない。
英語原文を読めば、file scopeで予約されているのではなく、file scopeで
使用するために予約されているのだ。
だから、file scope以外で使用することが禁止されている。
0420デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:55:04.41ID:ioMwojjO
>>417
その一文ばっかりやたらこだわるけど
これが属しているセクションの名前って「17.4.3.1.2 Global names」なんだわ
グローバル名前空間の名前以外については言及してないの
ドラフトならインターネットで無料で見られるんだからこの辺の全容見てきな?
0421デフォルトの名無しさん
垢版 |
2021/02/01(月) 13:14:13.18ID:Z79JHlVc
>>417
あらゆる場所で使ってはいけないのなら、7.1.3でわざわざ1つ目と対比させるように使用用途を限定して記載した理由を説明してよ。
普通はコンパイラ実装者のために予約されている、だけで十分でしょ
0422デフォルトの名無しさん
垢版 |
2021/02/01(月) 13:45:48.95ID:fos4FOVO
仕事に情熱が持てなくなった
0424デフォルトの名無しさん
垢版 |
2021/02/01(月) 14:08:01.06ID:fos4FOVO
>>373
obj& operator [] (int i) {return elem[i];}
もちろんelem[]の定義はobj elem[];
obj.shape() も実装すると便利
0425デフォルトの名無しさん
垢版 |
2021/02/01(月) 14:13:00.08ID:fos4FOVO
>>416
「コロナでゴロゴロ病」
0428デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:22:14.79ID:ZelzH3+k
C++ is the only real language for expert developers.
0429デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:55:19.50ID:fos4FOVO
C/C++は好きだし比較的最強の部類だと思うけど
夢未過ぎは判断を誤るから色んな言語を適材適所に使えるようになるのが理想
0431デフォルトの名無しさん
垢版 |
2021/02/01(月) 17:46:42.82ID:ZelzH3+k
中国人のありがたいお言葉ですぞ。
0432デフォルトの名無しさん
垢版 |
2021/02/01(月) 18:02:36.06ID:jyRtFT93
大体、この板には中国人や韓国人はほとんど来ず、来ているのはアメリカ人
やヨーロッパやアフリカが多いらしい。
0435デフォルトの名無しさん
垢版 |
2021/02/01(月) 18:57:50.94ID:0s4gr52A
自作の構造体をsetに入れたいときって operator < さえ定義しとけば良いの?
eraseとかは全部のメンバが同じものを見つけて消してくれると思って良い?
0436デフォルトの名無しさん
垢版 |
2021/02/01(月) 21:08:59.66ID:ZelzH3+k
検索するとひろみをお勧めしてくる時点で無理だった。
0437デフォルトの名無しさん
垢版 |
2021/02/01(月) 21:34:17.50ID:ZelzH3+k
しかもチップも取るんかーい!
0438デフォルトの名無しさん
垢版 |
2021/02/01(月) 22:43:42.23ID:CtNYZU7D
>>435
erase含め、同値性は!(a<b)&&!(b<a)で判定される
全メンバ一致で同値とみなしたいなら辞書順比較する比較関数を定義すればよし
0440デフォルトの名無しさん
垢版 |
2021/02/01(月) 22:53:14.56ID:CtNYZU7D
まあ、setに入れるためだけなら演算子オーバーロードするより関数オブジェクト使う方がいいかね
0441デフォルトの名無しさん
垢版 |
2021/02/01(月) 23:03:45.93ID:f9q1oLiO
C++の質問じゃないとは思うんですが、上位数ビットを0で埋めたいといった場合は
「0埋めしたいビットを0、他を1にしたもので&演算する」
であってますか?
0442デフォルトの名無しさん
垢版 |
2021/02/01(月) 23:11:37.27ID:ZelzH3+k
合ってます。
0443デフォルトの名無しさん
垢版 |
2021/02/01(月) 23:17:45.03ID:f9q1oLiO
>>442
ありがとうございます
今までは例えばQWORDの上位3バイトを0埋めしたいってとき(value << 3*8) >> 3*8って言う2命令使う馬鹿な方法でやっていました・・・
0444デフォルトの名無しさん
垢版 |
2021/02/02(火) 02:08:00.00ID:DmcXRB7X
へ椅子ブックが少し綺麗になってます。
0445デフォルトの名無しさん
垢版 |
2021/02/02(火) 02:10:27.05ID:DmcXRB7X
RedditのC++コミュは17万人、オンラインが500人以上。
凄いね。
0446デフォルトの名無しさん
垢版 |
2021/02/02(火) 10:17:10.33ID:uFATDe77
ビット演算の中で最速なのってシフトじゃなかったっけ?
だから下手したら>>443の方がフェムト秒レベルでは微妙に早いんじゃない?
0448デフォルトの名無しさん
垢版 |
2021/02/02(火) 12:37:23.36ID:vWAdhQ36
>>446
CPUの世代やアーキテクチャによって違うが、
Latencyが、Shiftの方がandより少し遅いことがある。
0449はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/02(火) 12:49:48.88ID:+MtixY9O
>>434
Go は GC が前提にあるから少し制約が強いけども、
OS のカーネルを書くのでもない限り思ったより足かせにならないという評価はあるみたいだね。
0454デフォルトの名無しさん
垢版 |
2021/02/02(火) 22:23:15.74ID:likaPPB8
operator ==も定義しておくとなお良い
==のために<が2回呼ばれるのもアホらしいと感じるはず…
結局std::rel_opsを使って全部定義するという結論に落ち着く
0455デフォルトの名無しさん
垢版 |
2021/02/02(火) 22:25:04.30ID:likaPPB8
インテルのやつはバレルシフタじゃない気配がする…
シフト結果をテーブル化した方が速かったことg
0456デフォルトの名無しさん
垢版 |
2021/02/02(火) 22:28:35.48ID:likaPPB8
あるいは最大限バレルシフタにしようとしているがパイプライン1段に収まっていないだけかもしれん…
0457はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/03(水) 00:25:34.21ID:p0NvFN6a
>>443
gcc, clang, msvc で最適化最大で試してみたら and をとるように最適化されたぞ。
主要コンパイラがそのように最適化するということは (前後の状況によるかもしれないけど)
たぶん and のほうが効率的ってことなんだろう。
0458デフォルトの名無しさん
垢版 |
2021/02/03(水) 00:38:50.10ID:53EFMpkm
ビットシフトは64bit整数でのコンパイラ解釈が信用できないからAND演算子使うのが確実だと思うけどどうかな。
0459デフォルトの名無しさん
垢版 |
2021/02/03(水) 00:51:08.70ID:5b6XJ+8s
>>458
落ち着いてよく考えてみよう
お前がC++で作った成果物のうち、お前自身が書いたコードの割合なんてごくごく僅かに過ぎない
仮にそんなレベルで互換性が当てにならないような環境があったとして、お前が直接書いていない他の99%のコードがまともに動くと本気で思うか?
0460はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/03(水) 00:54:51.58ID:p0NvFN6a
0xffffffffff とか書いてたら桁数を正しく書けてるか不安になる……

今の C++ だと桁区切りも入れられるけど、
どう入れたら意図がわかりやすいかようわからんし、
シフトで表現するのもありな選択だと思う。
0462デフォルトの名無しさん
垢版 |
2021/02/03(水) 01:20:23.24ID:53EFMpkm
コンパイラがちゃんと32bit整数への丸め警告を出してくれるならいいが、しれっとコンパイルされたらお手上げ。
0465デフォルトの名無しさん
垢版 |
2021/02/03(水) 06:29:42.77ID:y3dS6mbz
unsigned long long x = (0x1ULL << 32) - 1ULL;
ならちゃんと動く(と思う)が
unsigned long long x = (0x1 << 32) - 1;
とかだとイマイチ不安が…
0466デフォルトの名無しさん
垢版 |
2021/02/03(水) 06:38:54.06ID:Nl+WsQpo
>>465
下の方はイコールの右辺にintしか出てこないのだから、intが32bitの環境なら32bitでしか計算されないだろう
0467デフォルトの名無しさん
垢版 |
2021/02/03(水) 10:23:38.02ID:q8Ed7guF
丸めと暗黙の型変換は違うものでは?
0469デフォルトの名無しさん
垢版 |
2021/02/03(水) 13:02:19.58ID:53EFMpkm
ビットシフト記述は自然すぎてソースコードに埋もれてしまう。
64ビットマスクのAND記述は見た目がどぎついので、かえって人間の注意を引くことができる。
0471デフォルトの名無しさん
垢版 |
2021/02/03(水) 15:50:32.48ID:pE1foWCw
>>465
やっぱり、32BITの時が一番プログラミングし易かったな。
64BITになると、64BITと32BITを区別して書く必要が出てきて、
書くのが面倒になった。
0473デフォルトの名無しさん
垢版 |
2021/02/03(水) 21:29:02.90ID:53EFMpkm
まじめにC/C++標準型size_tを使っている人には32bitと64bitの処理切り分けが地味に辛い。
0475デフォルトの名無しさん
垢版 |
2021/02/03(水) 22:40:25.83ID:Ea4RwHR/
>>424
> obj& operator [] (int i) {return elem[i];}
> もちろんelem[]の定義はobj elem[];

objは行列クラスで、elemはobjのメンバで行列要素を格納する一次元配列、で合ってますよね?
class obj{
 array<int, ?> elem;
public:
 obj& operator [] (int i) {return elem[i];}
};
ということですか?
0476デフォルトの名無しさん
垢版 |
2021/02/04(木) 03:22:45.38ID:R0EDVzG0
>>473
size_t は、型名が長いし _ も含んでいるし、打つのが辛い。
それにコードに締める長さも長くなるので画面が狭くなるし。
0477デフォルトの名無しさん
垢版 |
2021/02/04(木) 04:17:06.60ID:SkZt7jTc
>>473
まじめに、て別にsize_t使ってたら偉いわけじゃない
サイズを表したいけどいちいち考えたくない場合の選択肢だぞ
0479デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:40:48.70ID:ZzRKCYY/
>>471
それ本来そこにあった問題に気付いていないだけだったと思うぞ
0480デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:44:02.03ID:ZzRKCYY/
>>475
class obj{
 array<obj, ?> elem;
public:
 obj& operator [] (int i) {return elem[i];}
};
0481デフォルトの名無しさん
垢版 |
2021/02/04(木) 12:06:17.02ID:DWE1XJjK
>>480
それってarrayのarrayとかvectorのvectorとか配列の配列として行列を作るのと同じですよね?
一次元配列に要素を格納しておいて[][]でアクセスするのは不可能なんでしょうか
row majorやcolumn majorを自由にできる、等の理由でそちらの方が好ましいのですが
0482デフォルトの名無しさん
垢版 |
2021/02/04(木) 12:29:12.61ID:waKgX41w
一次元配列を内包しているクラスのoperator[](int y)が、下記のようなクラスを返すようにすればできる。

class Row {
vector<int>& 一次元配列への参照
int 列数
int y
int& operator[](int x){ return 一次元配列への参照[列数*y+x]; }
};


でも自分ならoperator[]は使わずもとのクラスにindex(x, y)みたいな関数を用意して対処すると思う。
0483デフォルトの名無しさん
垢版 |
2021/02/04(木) 13:10:42.29ID:g2cSm/y9
malloc とか new で確保したメモリ領域を使うように
vector ( または array ) をインスタンス化するにはどうすればよいですか?
0484はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/04(木) 13:13:43.37ID:ttCVH4wp
>>481
こういう雰囲気で他のクラスをひとつ間に入れることでなんとかなる。

https://wandbox.org/permlink/ZXI1nkkCLRJQPtAJ

だけど俺も >>482 の言う通り operator[] にこだわらずに適当なメンバ関数でやる方法を推すわ。
実態として二引数なのだし、記法のためだけに余計な定義をするの馬鹿らしいと思う。

提案としては hoge[i, j] みたいな感じで二引数のインデックスを受け取れるようにする案は出てるんだが、
現状ではこのときのカンマは普通にカンマ演算子として解釈される。
前準備として、 C++20 からはブラケット内でのカンマは非推奨にするという変更が入っている。
https://timsong-cpp.github.io/cppwp/n4861/depr.comma.subscript
0485はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/04(木) 13:20:29.03ID:ttCVH4wp
>>483
ある時点で確保済みのメモリの上にオブジェクトを構築するには
std::uninitialized_default_construct を使う。

でも std::vector 自体を適当なメモリの上に構築できても
std::vector 内で使うメモリは std::allocator で確保しようとするから、
必要ならアロケータを定義する必要がある。
0486デフォルトの名無しさん
垢版 |
2021/02/04(木) 15:40:11.75ID:R0EDVzG0
>>479
いや、全て32BITは、それに全て統一することで速度とメモリ効率と実用性の
バランスが取れていた。
ところが64BITだと実用上、表せる値の範囲はオーバースペックで
変数のメモリに占めるバイト数が8バイトと余りにも効率が悪い。
なので、多くの数値は32BITとし、必要な部分だけ64BITにするという
面倒な選択を強いられる様になった。
アドレスが64BITなので、それを整数型に入れるためには32BITの整数では
不足するので引きつられて整数も64BITを必要としがちになり、大混乱
が生じている。
(また、メモリーもアドレスを32BITより多くを必要とするアプリは非常に稀。)
0487デフォルトの名無しさん
垢版 |
2021/02/04(木) 16:48:02.49ID:DWE1XJjK
>>482
ありがとうございます
ストラウストラップの「プログラミング言語C++」に「行列クラスの設計」なるセクションがあったのを覚えてるので、そちらではどうしていたかも見てみます
0488デフォルトの名無しさん
垢版 |
2021/02/04(木) 17:07:22.68ID:dB2jWvbu
unique_ptr<Hoge[]> p(new Hoge[4]{a, b, c, d});
みたいな定義と同時に代入は出来るのですが
(各要素毎に Hoge(a), Hoge(b), Hoge(c), Hoge(d) になりました)

unique_ptr<Hoge[]> p = make_unique<Hoge[]>(4);
だと引数無しのデフォルトコンストラクタが無いといけないし
(そもそも引数無しのデフォルトコンストラクタ作りたくない)

unique_ptr<Hoge[]> p = make_unique<Hoge[]>({a, b, c, d});
とか
unique_ptr<Hoge[]> p = make_unique<Hoge[]>(4){a, b, c, d};
とかはコンパイル出来ませんでした

引数無しのデフォルトコンストラクタがあれば
unique_ptr<Hoge[]> p = make_unique<Hoge[]>(4);
p.reset(new Hoge[4]{a, b, c, d});
だとうまく逝きますが効率が悪い気がします
make_unique は使ってはいけないのでしょうか?
0493デフォルトの名無しさん
垢版 |
2021/02/04(木) 22:20:26.07ID:un3OWVjy
>>486
32bitアプリでも今どきなら64bit整数を使える処理系は多いだろ
そもそもアドレスを整数型に入れるっていつの時代の人よw
0504デフォルトの名無しさん
垢版 |
2021/02/05(金) 14:17:08.86ID:M7C1cdPI
ノーコードていってノードツリーみたいなのでフロー管理するやつ
よくゲーム系ツールにありがちだけど、サンプルみたいな単純な処理ならともかく
こみいったフローになってくるとノード間の接続線がものすごいことになって
とても管理しようという気になれない、まさに見た目どおりのスパゲティプログラムに
0505デフォルトの名無しさん
垢版 |
2021/02/05(金) 14:18:44.73ID:ou/gU5gH
>>503
それはもう50年くらいずっとそうだろ。
ノーコードとか逆に俺様言語作ってるのとほぼ変わらん状態にしかならんという
しょーもない展開しか見たことない。
0506デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:14:07.00ID:zImWQG8r
VCPKGのupdate、upgradeが常に失敗するんだけど、使えてる人いますか?
小まめにupdateしないからだろか?
0507デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:14:37.91ID:zImWQG8r
Goは標準ライブラリが圧倒してる。
0508デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:18:44.78ID:zImWQG8r
半年に一度フルビルドみたいになってしまう。
0510デフォルトの名無しさん
垢版 |
2021/02/05(金) 16:36:26.85ID:zImWQG8r
C++は基本だから、義務教育で習得するべき。
0512デフォルトの名無しさん
垢版 |
2021/02/05(金) 18:21:14.28ID:7P5D6x+s
>>505
昔はアセンブラすら触れない奴がC言語とか笑わせるなとか真顔で言う人がいたんだぜ。

別に仕事ができるのならRustでもPythonでも何でもいいと思うぞ。
0514デフォルトの名無しさん
垢版 |
2021/02/05(金) 20:48:06.29ID:ou/gU5gH
>>512
仕事ができるならなw
できないカスがクソみたいなもん押し付けてくるから文句が出るんだよ。
rustでもpythonでもまともなコード書いてりゃ文句はないわ。
まともじゃないから文句が出る。
0515デフォルトの名無しさん
垢版 |
2021/02/05(金) 21:49:13.85ID:a81hUa+F
というか、プログラマとしてrust(鉄さび、腐食)になるというダブルミーニングを狙ったんだと思うけど。
0516デフォルトの名無しさん
垢版 |
2021/02/05(金) 21:59:53.11ID:kFtfKVND
お前らってド素人のくせになんでいっちょまえの口利くん?
それって不思議だわ
0519デフォルトの名無しさん
垢版 |
2021/02/05(金) 22:48:47.57ID:a81hUa+F
Perl6はRakuになってしまったし、Rustもいずれ「わびさび」の境地でSabiに改名されるでしょ。
0520デフォルトの名無しさん
垢版 |
2021/02/06(土) 03:04:22.39ID:kQVOjfvp
「まともなコードが書けるなら」じゃなくて、まともなコードを強制するのがRustという言語の方針だと思うが
0521デフォルトの名無しさん
垢版 |
2021/02/06(土) 04:45:05.79ID:oQfB5lBJ
>>284
昔からのプログラミング/電気界隈の慣習だから仕方ないけど、2要素のミニマルなブール代数しか扱わないにも関わらずboolean型を称するのがそもそもキモい
プログラミングで使うような半順序関係は、9割booleanで書くのが一番スッキリする
一般のbool型をプリミティブにして、そこからt/fやら三要素やらに派生するのが合理的に思う
0522デフォルトの名無しさん
垢版 |
2021/02/06(土) 04:50:47.70ID:GfZyzG1j
ブーリアン革命。
0523デフォルトの名無しさん
垢版 |
2021/02/06(土) 05:13:59.88ID:oQfB5lBJ
革命というか、クラスシステムでブール代数をエミュレートしてるのが現状のOOPじゃないかと
まあ言語によって可補性はマチマチだけど、全てについてスーパークラス/サブクラスなクラスを設けるのは、メインストリームの言語では大体そうだろ
0525デフォルトの名無しさん
垢版 |
2021/02/06(土) 09:31:12.13ID:rZdEmaWa
>>524
Java、Kotlin、Scala、C#、Ruby、Python、PHP
あたりのどれかを触ってみれば、危険な記述を言語仕様レベルで封印することのありがたさが分かる

他言語も触ってみることをオススメする
0527デフォルトの名無しさん
垢版 |
2021/02/06(土) 10:10:31.61ID:rZdEmaWa
>>526
そんな感じ

まぁ、C++もマスターすれば危険な記述を避けることはできるんだけど...
プログラマーが悪意を持ってプログラムを記述しない限り安全なコードになるようにしようという試みは大切だと思う
0528デフォルトの名無しさん
垢版 |
2021/02/06(土) 10:11:15.51ID:S9Y30hRK
>>525
ありがとう、おまえさんのレベルの低さがよくわかった
文法や動作がよくわかってなくてマシンに警告してもらわなきゃ自分では判断できないんだな
アプリの内容として良からぬ事を企むという次元には程遠いわけか
0530デフォルトの名無しさん
垢版 |
2021/02/06(土) 10:17:55.71ID:u/OM7jGY
>>527
> プログラマーが悪vログラマーが悪意を持ってプログラムを記述しない限り安全なコードになるようにしようという試みは大切だと思う

>>528
> 文法や動作がよくわかってなくてマシンに警告してもらわなきゃ自分では判断できないんだな

この流れは大草原不可避
0531デフォルトの名無しさん
垢版 |
2021/02/06(土) 11:01:19.43ID:PohEB++t
>>504
Unity とか UE はきらい?
0533デフォルトの名無しさん
垢版 |
2021/02/06(土) 11:09:03.81ID:gLiOOG5V
rustの縛りプレイはマルチスレッドでのメモリ管理のクソ面倒さが原因だろう
0534デフォルトの名無しさん
垢版 |
2021/02/06(土) 12:19:39.89ID:S9Y30hRK
>>527
いーや、くだらねえ
プログラマを信頼しない方針はあれもダメこれもダメの制限だらけになるだけだ
おまえさん自身も実社会で職場の誰よりも制限だらけなんだろう
重責を担ったことのないやつは人のせいにすることしか考えねえ
0537デフォルトの名無しさん
垢版 |
2021/02/06(土) 12:53:16.04ID:DutNpJ49
>>528
お前のレベルが極めて高いのは分かったが、お前の共同の開発者もお前のようにハイレベルだとは限らない
0544デフォルトの名無しさん
垢版 |
2021/02/06(土) 13:46:38.15ID:gYQHLnIz
天才の俺が書くプログラムは絶対正しいから無駄なバカよけ機能はいらないしテストのような下等なことはしない
って豪語してたいつぞやの天才くんが帰ってきたのかな
0545◆QZaw55cn4c
垢版 |
2021/02/06(土) 13:50:19.96ID:kbrcRlAn
>>544
私は馬鹿なので天才のコードというのがどんなのか凄く興味があります…
0548デフォルトの名無しさん
垢版 |
2021/02/06(土) 13:59:04.79ID:aJ9IYVGP
どう考えても誰かさんに対する皮肉なんだよなぁ...
まぁ、荒れるから誰とは言わないけど
0551デフォルトの名無しさん
垢版 |
2021/02/06(土) 14:12:51.02ID:aJ9IYVGP
>>550
いや、俺は別にS9Y30hRKは天才だと思ってるぞ!誰もS9Y30hRKの事をゲロカス老害だとか、バグを減らす上での有害な存在だとか、人を見下すだけの無能だとか、自分にとって都合のいい妄想を口に出す病人だとか、構ってちゃんだとか、そんなこと全然思っていないから!!S9Y30hRKは天才!!疑う余地もなく天才!!ハイレベルなバカで誰もついていけないとか、そんなこと思っていないから!!!
だから!それ以上この話はやめろぉおおおお!!!
0552デフォルトの名無しさん
垢版 |
2021/02/06(土) 14:21:36.41ID:rZdEmaWa
>>545
馬鹿でも扱えるくらい綺麗なコードが天才のコードだと思う
C++は表現豊かな言語だから...他の言語も触ると、綺麗な記述方法を学ぶ良い機会になるよ
0554デフォルトの名無しさん
垢版 |
2021/02/06(土) 15:01:56.11ID:S9Y30hRK
綺麗かどうかじゃない
何を実現したのかだ
綺麗に書くのはエチケットだが一番大事なことではない
0555デフォルトの名無しさん
垢版 |
2021/02/06(土) 15:11:21.64ID:f5ipo2xA
>>553
銃殺は銃刀法違反及び殺人罪に接触することすら理解できないお前でも分かるコードが存在したら私はそのコードを書いた天才を尊敬する
0556デフォルトの名無しさん
垢版 |
2021/02/06(土) 15:21:29.14ID:58EQLFGq
行政が法律に基づき行うなら問題無い
人が作った法律なら人が改正することができる
0560デフォルトの名無しさん
垢版 |
2021/02/06(土) 16:36:26.06ID:oR/8CbQ7
やらかしちゃいましたねー
人を見下しておきながら、人を見下す側もウッカリミスはするという事が証明されました

こういうウッカリ屋はプログラミングでも不具合を引き起こします
馬鹿でも天才でもウッカリ屋でも保守できるコードは記述するように心がけましょう
0561デフォルトの名無しさん
垢版 |
2021/02/06(土) 16:38:50.88ID:oR/8CbQ7
>>560
他にもテストの自動化、バージョン管理ツールの導入等もして不具合が流出しない仕組みを揃えておきましょう
以上
0562デフォルトの名無しさん
垢版 |
2021/02/06(土) 16:54:20.22ID:bwIKlxQ8
std::stringにUTF-8のコードを入れてプログラムを書いていますが、これを正しく編集する
にはUTF-8での文字の境界を正しく認識しないと駄目ですよね?
それは一般的にはどう処理するものなのでしょうか。

UTF-8のビットパターンとバイト数のことは知っていますが、それを自分で処理すべきか、
さらには絵文字とか複数のユニコードが組み合わさったものはどうするのか、とか。
0563はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/06(土) 17:05:10.96ID:N9CbrPsc
>>562
コードポイント単位での処理で良いのであれば自分で適当に書いてしまってもいいと思う。

高度なものになると ICU などのライブラリを使う。
書記素クラスタ単位での処理が必要だったり正規化だったりといった場合では
コードを書けば済むというものでもなくて巨大な表が必要だし歴史的な変な規則が盛りだくさんだから
よほどの根性がないと自分ではどうにもならないと思う。
0564蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/06(土) 17:07:58.83ID:gG6zzvvp
>>562 Windowsだったら
#include <windows.h>
MultiByteToWideChar(CP_UTF8, 0, ...);
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, ...);
WideCharToMultiByte(CP_UTF8, 0, ...);
IsTextUnicode(...);
などが使えると思われます。
0565デフォルトの名無しさん
垢版 |
2021/02/06(土) 17:41:00.54ID:GfZyzG1j
スカラー値が一文字を表現するとは限りませんが、ユニコードスカラー値を基本にするのが現実的な妥協点だと思います。
きちんと処理するのは、データベースとアルゴリズムが必要なので、少人数では無理です。
ICUが有力な選択肢となりますが、これも気難しいライブラリなので、用途に合わないかもしれません。

事実上、世界中の様々な民族の文字を統一的に扱う目論見は破綻していると思います。
0568蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/06(土) 17:55:50.63ID:gG6zzvvp
つまり、

uint8_t utf8_byte = ...;
if (!(utf8_byte & 0x80)) {
// 1バイト文字。
} else if ((utf8_byte & 0xC0) == 0xC0) {
// マルチバイト文字の先頭バイト。
} else {
// マルチバイト文字の非先頭バイト。
}
0572デフォルトの名無しさん
垢版 |
2021/02/06(土) 21:07:07.97ID:GfZyzG1j
テストロボットだぞ、ガシャーン!ガシャーン!
0573デフォルトの名無しさん
垢版 |
2021/02/06(土) 21:08:55.93ID:GfZyzG1j
片山さんの自動パズルとか、ウェブだったら☆1万くらいついてそうだけど。
なんでWindowsにこだわるんだろ。
0578デフォルトの名無しさん
垢版 |
2021/02/07(日) 08:26:36.56ID:HYoiJUgB
>>576
俺の質問にアンカーつけといてどの質問はねえだろ
恥ずかしくてとぼけてんのおまえさんだろ
0579デフォルトの名無しさん
垢版 |
2021/02/07(日) 08:29:49.52ID:p49/UnNX
テストはやらないよりもやったほうがはるかに良い
前の版通ったテストが最新版でも通るという品質は担保される
殺虫剤のパラドックスよりも恐れなければならないのは
いっぱい作ったテストコードが事実上同じテストでしかないという事態になることの方
※ 個人の感想です
0580デフォルトの名無しさん
垢版 |
2021/02/07(日) 08:49:47.79ID:m5BD34IK
>>578
別に完璧になくせるなんて誰も言っていないのに勝手にツッコんでるの何?としか思ってないよ
0581デフォルトの名無しさん
垢版 |
2021/02/07(日) 08:57:32.70ID:HYoiJUgB
>>580
おまえさん、こう言ったんだぜ

> 不具合が流出しない仕組みを揃えておきましょう

流出しなくなんかならねえ
不具合はポカミスばかりとは限らない
おまえさんのような浅はかな思想で突っ走った先に
碌でもない結末が待っていることだってある

揃えられるものなら揃えてみな
自分ができねえことを他人に言うな
0582デフォルトの名無しさん
垢版 |
2021/02/07(日) 09:11:28.01ID:p49/UnNX
人は思い込みを反証することで生きていける
だが完璧に反証できないこともある
ユニットテストはそのかけがえのないものを教えてくれた
0583デフォルトの名無しさん
垢版 |
2021/02/07(日) 09:41:41.73ID:m5BD34IK
>>581
え?それ俺じゃないけど
テストやればバグが無いといえるわけじゃないから安心するなってだけで、テストするなって話じゃないよね
主旨は同じだよね
何が気に入らないの?
0585デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:07:20.85ID:jX/y7Db/
>>578
アンカーつけてると言うなら
> >>570ならリンク先読めばいいだけだろ
って書いてあるだろ
よほどアホでもない限りそんなアホなこと言うわけ無いと思ったからどれ?
って聞いたんだけど、想像以上のアホだったってことかな?w
0586デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:10:29.25ID:jX/y7Db/
>>581
不具合はなくせないから仕組みも努力もいらんと言うならそれでいいんじゃね?
お・ま・え・ん・と・ろ・こ・で・は w
0587デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:13:42.72ID:2AGAGJ05
マスクも手洗いもコロナを100%防げるわけじゃないから
マスク付ける必要も手を洗う必要もないね
0588デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:20:21.65ID:HYoiJUgB
テストツールいらねえなんて言ってねえぜ
テストツール万能論はアホの考えだと言っている
0590デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:48:37.66ID:2AGAGJ05
「テストツール万能論」を主張したレスなんて一つも見えないんだけど
存在しないものを見てニヤニヤしてる変態こわい
0597デフォルトの名無しさん
垢版 |
2021/02/07(日) 15:05:54.73ID:HYoiJUgB
>>593
奴は「必要ないね」とぬかしたんだ
別に武漢熱に話をすり替えようとすり替えまいとそこは関係ない
0599デフォルトの名無しさん
垢版 |
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が作られちゃったぽいのですが
これだとメモリを倍使っちゃってるし、時間も掛かってますよね
どういうふうにしたら、喚ばれた側の関数で参照渡しに出来るのでしょう
0602デフォルトの名無しさん
垢版 |
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の例も出してくれたらこれから色々いたスカリマス
0604デフォルトの名無しさん
垢版 |
2021/02/07(日) 17:28:56.01ID:yi1XmM9H
>>599
参照渡し自体はできてるはず。
ただ参照渡ししたvectorをクラスのメンバに代入して、代入されたクラスメンバの方を更新しているからvectorを渡した元の方にはまったく影響が無いというだけ。
0606デフォルトの名無しさん
垢版 |
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"; //値が変わった!(予定
}
};
0607デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:00:52.99ID:HYoiJUgB
>>598
だったら何だとぬかす気だ?
> 存在しないものを見てニヤニヤしてる変態こわい
> 文章を字面通りにしか解釈できない人?

要するに話になんない奴ってことだろ
言ったことにも裏の意味にもコメントされたくない
じゃあ相手しねえでやるから黙ってろゴミ
0608デフォルトの名無しさん
垢版 |
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にして
ポインタを持つようにすべき
0609デフォルトの名無しさん
垢版 |
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を定義するのをやめる
※ 個人の感想です

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

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

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

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

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

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

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

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

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

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

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

ていうかスコープを抜けたら自動的に解放される系のクラスを書いたら
エラー処理上エラー通知先としての生成元オブジェクトの参照保持はほとんど不可避
0643デフォルトの名無しさん
垢版 |
2021/02/08(月) 22:25:23.27ID:bp+4mh0R
すべてスマポで書くスタイルも悪くないと思うけど、メイヤーズ神もツリー構造で子が親のポインタを持つときはナマポで十分と書いている
0645デフォルトの名無しさん
垢版 |
2021/02/08(月) 22:48:15.38ID:NgGwlfwa
自分よりポインタの方が寿命が長いことが保証されているなら確かに生ポで問題ないが
それが成り立つ状況ってなかなかないよな。
0646デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:02:19.81ID:VJ9lplXi
参照先の実体がまだ生存しているかどうか知るにはweak_ptr::expired()を使うしかないのが現状でしょ。
0647デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:07:56.19ID:nKLqWVxG
Chromiumはstd::unique_ptrを全面的に使ってるけど、ポインタを使う設計そのものが古いような気がする。
0648デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:13:28.50ID:BwguerZK
まあcコードを全く使わないってのならいいんでないの。
ただc++のポータビリティーは君が思ってるより低いけどね。
0650デフォルトの名無しさん
垢版 |
2021/02/09(火) 01:58:29.04ID:qUmf+U4D
マウントじゃなくてポインタでは?
0651デフォルトの名無しさん
垢版 |
2021/02/09(火) 02:46:23.52ID:jPnyP+Vp
C++に特化したAPIなんてどこのOSでも提供されないから、結局、Cの配列と互換性のあるstd::vectorやstd::arrayを使わざるを得なくなる。
0652デフォルトの名無しさん
垢版 |
2021/02/09(火) 04:01:45.22ID:qUmf+U4D
>>644
木もコンテナで良いですよね。
所有権がハッキリしてて。
0655デフォルトの名無しさん
垢版 |
2021/02/09(火) 17:49:12.66ID:KrtnTLUi
>Cの配列と互換性のある

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

したがって、子から順番に消さなくてはなりません。
0658デフォルトの名無しさん
垢版 |
2021/02/09(火) 18:56:53.48ID:qUmf+U4D
その様はまるで摩天楼がドミノ倒しのように連鎖倒壊するようでもあり、DOMINOというピザにもなっています・
0662デフォルトの名無しさん
垢版 |
2021/02/09(火) 21:13:02.23ID:5Ac7csWH
探索はループでもできるんで、たとえば数万個の要素を持つツリーを子から消せというのは真理なのかも
0664デフォルトの名無しさん
垢版 |
2021/02/09(火) 21:38:09.75ID:s3p3GZ7R
>>662
DFAとPDAではやれることの範囲の違いがちげう

つかこの場合は安易にスマポとかコンテナを使うから破棄ごときにトラバースの手間がかかるんである
0666デフォルトの名無しさん
垢版 |
2021/02/09(火) 21:50:17.60ID:s3p3GZ7R
ちゅか垂直探索なら木をメモリに持っておく必要が無い
水平探索ならメモリ上に世代1、世代2、....と木を育てていく(らしい)が
兄弟ノードを全部見終えたのでいざ従妹ノードに移ろうとするときに
親ノードへの参照は欲しい木がするがするとshared_ptrなら即循環参照になり、
子の情報で親(子孫がいっぱいぶら下がっている)を生成できるわけもないから、
ウィークポインタの出番でもない
0667デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:37:49.58ID:XIZePh+h
子から消さなかったばかりに。
2000人を乗せた航空機が洋上で消えた。
ってなるかも?
0670デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:53:08.99ID:XIZePh+h
インドでは屋根の上にも乗ります。
0675デフォルトの名無しさん
垢版 |
2021/02/10(水) 06:40:27.16ID:XIZePh+h
東京: TK
京都: KT
大阪: OSK
淡路: AWG
0676デフォルトの名無しさん
垢版 |
2021/02/10(水) 07:59:22.76ID:FGGGEnfF
航空機や原発みたいなクリティカルなシステムでは
全部固定長の配列で書いてあるんじゃないの
0679デフォルトの名無しさん
垢版 |
2021/02/10(水) 14:32:04.65ID:TFzLuCg0
すみません、std::for_each を使っていて continue したくなりましたが、サポートしてないです
よね? これって:
1. for_each は continue する必要がないような処理に限ってに使うべき。
2. ループの中で大きい if ブロックを作って空の処理にすればよい。
3. その他
0681デフォルトの名無しさん
垢版 |
2021/02/10(水) 16:06:00.49ID:HSfvjOUE
return は continue ではなく break じゃないの?
質問者の2.大きなif分で実質何もしないでいいと思う
0684デフォルトの名無しさん
垢版 |
2021/02/10(水) 16:51:31.94ID:HSfvjOUE
あ、ラムダ式になってたのか
0685はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/10(水) 17:51:08.81ID:tNqysU9n
>>679
for 文で書いた方が短く書けそうだけど、
あえて for_each を使いたい理由が何かあったりするの?
0686デフォルトの名無しさん
垢版 |
2021/02/10(水) 18:41:41.17ID:FGGGEnfF
Perlなら問題無くできる(continue→next、だが
C++規格委員会がfor_eachのcontinueを許可しないのは最後の一線なのかもしれん…
0689デフォルトの名無しさん
垢版 |
2021/02/10(水) 21:21:18.68ID:+e+FbMSY
vectorで一億件ほどで、飛ばしたいのが100〜1000件程度なんだろう
0695デフォルトの名無しさん
垢版 |
2021/02/11(木) 11:22:44.35ID:n0GRjtoR
>>685
テンプレのときとか
0696デフォルトの名無しさん
垢版 |
2021/02/11(木) 17:53:02.68ID:Iq2aKjep
679がなぜfor_eachを使うのかを無視するのは
他人の領分を侵すお節介だ

for_eachの使い方をアドバイスできんやつは
しゃしゃり出てくるな
0697デフォルトの名無しさん
垢版 |
2021/02/11(木) 18:00:13.22ID:hRfccug1
よくよく話を聞いてみたらまるで異なる解決策が見つかるなんてよくあることじゃん。そんな経験ないの?
何をしたかったか確認するのは重要
0698デフォルトの名無しさん
垢版 |
2021/02/11(木) 18:15:41.21ID:Iq2aKjep
流れをよく読んでみろよ
for_eachをロクに使ってないやつなのモロバレだろ
質問者が尋ねていないことを答えたいから協力しろなんてぬかすのは
回答者の資格ねえんだよ
0699デフォルトの名無しさん
垢版 |
2021/02/11(木) 18:18:25.32ID:Iq2aKjep
自分が何か尋ねているときに
質問内容に付き合ってやれる懐のねえやつは
うぜえだけだろが
0705デフォルトの名無しさん
垢版 |
2021/02/11(木) 20:19:00.69ID:a/CQbB/Z
>>679はループしたいだけだろ
std::for_eachを何が何でも使わなければならない特殊な事情があるなら仕方ないけどそんなこと言ってないし
0708デフォルトの名無しさん
垢版 |
2021/02/11(木) 21:58:36.08ID:bviF/sLG
Visual Studio 2010(MSVC2010)で
 template<class T>
 void foo(T x) {
  printf("%d: %d\n", targetEntity, x);
 }
という関数テンプレートが定義されているときに、
 namespace bar { const int targetEntity = 1; }
 using bar::targetEntity;
 void baz() { foo(100); }
はコンパイルが通るのに、
 namespace bar { const int targetEntity = 1; }
 void baz() {
  using bar::targetEntity;
  foo(100);
 }
だと
 error C2065: 'targetEntity': 定義されていない識別子です。
と言われるorz
0709デフォルトの名無しさん
垢版 |
2021/02/11(木) 22:06:56.76ID:bviF/sLG
>>688
for_eachを勘違いいてたわサーセン、
確かにfor_each<bgn, end, Function>のFunction(*it)からならreturnするで良さげ
0710デフォルトの名無しさん
垢版 |
2021/02/11(木) 23:28:48.49ID:Ooe4jkn9
>>707
アンパンマンはキミだ。
0711はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/12(金) 01:36:02.90ID:2OOQ6m86
>>708
宣言の有効範囲は宣言された場所からその宣言を含むブロックの終わりまでというのが原則
(クラススコープなどの例外はあるのでその他にも関連するルールはあるかもしれんけど)
なのでどちらもエラーになるのが筋だと思うし、 gcc や clang で試したらどっちもエラーだった。

逆にどういう理屈で前者が通るのかは気になる。
0712デフォルトの名無しさん
垢版 |
2021/02/12(金) 06:02:20.64ID:45Tu3B4L
>>708
当たり前だね
最初の例ではtargetEntryをグローバル空間に導入しているからbaz()とfoo()の両方から見える
2番目の例ではtargetEntryをbaz()のブロック内に導入しているから、そこに包含されないfoo()のブロックからは見えない

ただし、これはfoo()を関数原型と関数定義に分けて関数定義をbarよりも後方に置いた場合の話だ
原文のままでは>>711が言うとおり通るわけがない
0714デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:01:12.63ID:3x5iWh5q
確かにideoneでもVS2019でも両方エラーになるのですだが、
1番目の例はVS2010ではビルドも通って動くもーん

ソース:
https://ideone.com/DC8fMv

実行結果(※ VS2010限定):
1: 100
続行するには何かキーを押してください . . .
0715デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:04:11.00ID:3x5iWh5q
ちな関数テンプレートfoo()の定義をusingよりも後方にしたら全てでビルドが通って動く
まそりゃーそうならないとおかしいが
0719デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:27:26.57ID:3x5iWh5q
全員の主張を再検証しただけでつよ?
>原文のままでは>>711が言うとおり通るわけがない (>>712)
が覆されてご機嫌ななめ??
0720デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:32:07.63ID:45Tu3B4L
覆った?
おまえVS2010限定で逃げただろ
ill-formedはill-formed
これを覆せたら出直して来な
0721デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:34:53.80ID:45Tu3B4L
俺も昔のバージョンのコンパイラは使うがバグ技は使わないし
そういうことをする厨二病とは組みたくない
0722デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:38:38.54ID:3x5iWh5q
>おまえVS2010限定で逃げただろ
VS2010ではビルドが通るというのが話の発端なので…
1番目の例がill-formedであろう点は同意
0723デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:51:23.22ID:45Tu3B4L
orzなんだろ
何が誰が悪いのかわかったら素直になれよ
居直る態度が気に入らねえ
0724デフォルトの名無しさん
垢版 |
2021/02/12(金) 08:12:22.74ID:3x5iWh5q
何が悪いのか、はともかく
誰が悪いのかとは一体…
つか現象(事実)の提示に対してそれを反発と解釈して勝手に炎上しないでいただきたい;;;

個人的にはVS2010のバグである可能性でほぼ確定とは思いつつ、
例1と例2で動きが違うことから、MSVC2010は、グローバルなシンボルについて
template foo()や関数baz()の中の解釈に入る前に名前空間を確定させる実装なのだと感じる
(template foo()の解釈ロジック自体にバグがあるなら例1、2とも同じ結果になるのが自然

再発防止のためには、C++規格のどこをどう読めば良いんじゃorz
0725デフォルトの名無しさん
垢版 |
2021/02/12(金) 08:57:55.62ID:45Tu3B4L
>>719は明らかに煽り口調だろうが
和解したいなら、あの態度を撤回しろ

俺は和解なんかできなくて構わんが
0726デフォルトの名無しさん
垢版 |
2021/02/12(金) 10:26:37.15ID:1W1GlA05
匿名掲示板で誰が何を言ったのどうのとみっともないぞデフォルトの名無しさんよ
0727デフォルトの名無しさん
垢版 |
2021/02/12(金) 11:29:35.12ID:jxDcSv/l
どう見ても>>716がイミフな言いがかりつけてるだけにしか見えんが…

> 確かにideoneでもVS2019でも両方エラーになるのですだが、
> 1番目の例はVS2010ではビルドも通って動くもーん
0728デフォルトの名無しさん
垢版 |
2021/02/12(金) 13:22:44.45ID:x9NfpsA7
匿名でも江副とかQZとか片山やはちみつが糞なのは伝わってくるω
0730蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/12(金) 19:12:56.39ID:fTOQtm+W
どこでも動くように標準化しましょうねって話だよね。
0731蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/12(金) 19:29:19.43ID:WC9JZZt5
G++とかclang++などの複数のコンパイラで警告最大にして自動ビルドすれば再発防止できると思われます。
0732デフォルトの名無しさん
垢版 |
2021/02/12(金) 19:37:54.63ID:3abO7oQ0
流れをぶった切って質問です。

あるクラスで生成、削除を一切合切プライベートにしたい(ファクトリメソッドでスマートポインタを渡す)んだけど、
::deleteを対象クラスだけプライベート、あるいはコンパイルエラーにする
ことって可能かしらん?
0734蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/12(金) 19:55:37.68ID:fTOQtm+W
dtorはデストラクターの略ね。
死のトラクターじゃないよ。
0735デフォルトの名無しさん
垢版 |
2021/02/13(土) 02:57:21.77ID:ZCgeuP6g
映画化決定。
0736◆QZaw55cn4c
垢版 |
2021/02/15(月) 00:20:32.87ID:M7Hs01/T
>>728
私が馬鹿なのは私自身が認めていることですが、片山さんはすごいと思いますよ、何よりも片山さんは多産ですし、私は片山さんを尊敬しています‥‥
0737デフォルトの名無しさん
垢版 |
2021/02/15(月) 12:30:59.56ID:tZ1nblID
>>733
ありがとう。参考になりました。

流石にグローバルdtorの直接呼び出しを気にしている人は居なさそうですね。
通常の使い方じゃないから気にするな、が正解かしらん。
0739デフォルトの名無しさん
垢版 |
2021/02/16(火) 18:59:33.07ID:zTH+X1Xm
つかprivate dtorって何の解決にもなって
なくね?
クラスFooのデストラがprivateな時点で
Fooのfirendでも何でもないstd::shared_ptr<Foo>はビルドエラーになる宿命なのでは…
あとp.get()->Delete()とされるのも恐ろしいすぐる………
0747◆QZaw55cn4c
垢版 |
2021/02/17(水) 21:10:31.90ID:n4obO1jB
>>746
擬順序とか半順序と呼ぶ本もありますね、
ただ、その「比較可能性を満たす」とはなんでしょうか?私の教科書では、擬順序には反射律・推移律だけしか要請されていなかったと記憶しているのですが?
0748デフォルトの名無しさん
垢版 |
2021/02/17(水) 23:46:57.44ID:ZhVk2C4b
普通に言葉通り任意の2つの元を比較できるということなのでは…

木構造で「親は子より大きい」という順序を定義しただけ
(全順序集合(例えば整数)で全ノードをラベル付けしてしまうというチート手段に訴えことなく、
 文字通り「if (aはbの親) { a > b; }」という規則と(a, b)の反射律、推移律を導入しただけ
では兄弟間の大小が定まらない、
みたいな
0750デフォルトの名無しさん
垢版 |
2021/02/17(水) 23:59:39.55ID:ZhVk2C4b
なお{ 全順序集合 }⊂{ 半順序集合 }なのは確定的に明らかなので、
反射律・推移律だけしか要請されていなかったらそれは全順序集合の集合を含む半順序集合の集合の意味となりぬ
つまり全順序集合の集合と半順序集合の集合が区別できん
両社を区別したい議論のときは比較可能性の有無を宣明せねばならんぬ、
0751デフォルトの名無しさん
垢版 |
2021/02/18(木) 00:34:07.44ID:48a8FzyN
a≦b または b≦aが成り立つ時、比較可能
弱順序ってしらなかったけど、半順序とは違うようだ
「半順序?弱順序?二項関係・順序関係まとめ」って記事
0753741
垢版 |
2021/02/18(木) 06:50:20.77ID:brZHVFLx
>>742
まだ何とも言えないが
thx!
0754デフォルトの名無しさん
垢版 |
2021/02/18(木) 10:08:01.17ID:48a8FzyN
弱順序は、半順序よりは制限強いが全順序より弱いもので、
ある種のソートアルゴリズムでは全順序よりは制限緩められるけど
半順序までは緩められない、ってのがあるみたいね
0756デフォルトの名無しさん
垢版 |
2021/02/18(木) 14:43:05.98ID:48a8FzyN
アルゴリズムとの関連はちょっとわからんけど

数学としての束論って単独の本は少なくて、代数学の本に載ってるんじゃないかな
もしくは順序集合の話として集合論の本
0757◆QZaw55cn4c
垢版 |
2021/02/19(金) 04:42:11.06ID:3tFNJrqv
>>748
>普通に言葉通り任意の2つの元を比較できるということなのでは…

いや、それは全順序ですよ
・擬順序
・順序
これらの演算子を≦としたとき、かならずしも任意の二元 a, b について a ≦ b の真偽が定まらなくてもいいと思います

擬順序に対して「a ≦ b かつ b ≦ a ならば a = b」という縛りが追加されるのが順序、
順序に対して、任意の二元 a, b について「a ≦ b」または「b ≦ a」のどちらかである、という縛りが要請されるのが全順序
だったかと
0758デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:38:08.11ID:mpGE+xsF
wikipediaの「推移関係」の項目より

半順序 - 反対称的な擬順序
擬順序 - 推移的であると同時に反射的
全擬順序 - 完全的な擬順序
同値関係 - 対称的な擬順序
厳密弱順序 - 強半順序関係で等価関係での比較が不可能な場合
全順序 - 推移的で反対称的な完全関係

全順序、半順序くらいしか知らんかった
0759デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:51:11.65ID:gWMDVcMR
OOPの本だとサブクラス関係は前順序って書いてるよな?擬順序ともいうのか
推移的、A→B∧B→C |- A→C 、サブクラスのサブクラスはサブクラス
かつ反射的、AはAのサブクラス
0761◆QZaw55cn4c
垢版 |
2021/02/19(金) 21:23:56.68ID:3tFNJrqv
>>760
一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいいのですよ
すべての二項間で順序の真偽が定まるのは、順序の中でも一番強いものである全順序で初めて導入される、と私は解釈しています
0762デフォルトの名無しさん
垢版 |
2021/02/19(金) 21:44:53.04ID:gWMDVcMR
ブール代数 型システムで検索しても出てこないけど>>523
可補分配束の定義見てると確かにそんな気はしてくる

インスタンス関係かサブクラス関係なのか?どっちでも成り立ちそうだけど、取り敢えず静的チェックをパスすることを考える

要素が無いと言う意味でCのvoidを冪集合ブール代数の最小元、空集合とみなす
void *は何でも指せるという意味で最大元
まともな型システムなら(少なくとも)上記の擬順序以上は要求る
演算は多重継承とvirtual 定義が∨/∧に対応?クラス図書いてみたら成り立ちそうに思える
型チェック通らない全ての型を考えられるし、それが¬
型述語で定義してればそのまま!演算子になる
0763デフォルトの名無しさん
垢版 |
2021/02/19(金) 21:55:14.25ID:gWMDVcMR
確証が持てなくてもどかしい…数学できる人ツッコミ待ち

とりあえずダイヤモンド継承を許さない言語だと、常に∧/∨は定義されないからブール代数にはならない事には気付いた
0766デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:01:35.27ID:aORwmd7L
質問ですがムーブコンストラクタを有する基底クラスの
派生クラスでムーブコンストラクタを
派生クラスがムーブコンストラクトされる際に基底クラスにアクセスしようとする場合であっても
安全に書く方法って何かあるんでしたっけ
0767デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:03:03.40ID:6z9jMlRH
作ったクラスをmapにいれるときoperator<を書かなきゃいけないのがめんどい
0768デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:08:24.37ID:aORwmd7L
あとムーブコンストラクタを有するクラスを
詳細を隠ぺいする目的でインターフェースを設けたとき
インターフェース経由でムーブコンストラクトする方法って何かあるんでしたっけ
アブストラクトファクトリイーを作るしか無い?
0769デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:11:39.72ID:aORwmd7L
この場合アブストラクトファクトリイーといっても、元のクラスFooに対して
IFoo IFoo::move() { ... } が定義してあって
 IFoo x = (適当な生成手段)
ののち、
 IFoo y = x.move()
でxが破壊されるやつ!
0771デフォルトの名無しさん
垢版 |
2021/02/20(土) 00:40:16.16ID:iK8Sr3o/
領域が連続しているコンテナなら何でも良いんですが、たとえば array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
memcpy(b.data(), a.data(), n*sezeof(T))
で良いんですかね?

UNIXコマンドと順番が違ったりして間違えそうなのですが、他に良いやり方ありますか
0774デフォルトの名無しさん
垢版 |
2021/02/20(土) 08:11:48.90ID:BRyl48dG
>>761
その「一番弱い」とか言ってるのは前順序だろ。

ククク... 前順序は順序四天王の中でも最弱...
ウィキペディアにも書いてあるのに間違うとは面汚しよ...
0776◆QZaw55cn4c
垢版 |
2021/02/20(土) 11:27:39.73ID:mkFIMg3t
>>774
本によって用語にブレがあるのは数学では常識でしょう?だから>>761 では定義もあわせて書いておきました
0777デフォルトの名無しさん
垢版 |
2021/02/20(土) 11:30:33.89ID:ec7b4JGn
あとは裁判で争うしかないでしょうね。

我々には判決が出せませんから。
0778はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/20(土) 11:52:10.16ID:N5IkYQZo
>>771
前提条件として

・ T の型が trivially copyable である
・ vector の大きさが必要な大きさ分に出来ている

ならそれでもいいよ。
でも、 C の関数を C++ でも使えるのはほとんどが互換性のためでしかなく、
作法的にはあまり使わないに越したことは無いって感じ。
0779はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/20(土) 11:56:56.24ID:N5IkYQZo
>>771
>>778
と思ったけど、 vector<T> ではなくて vector< vector<T> > なのか。
それだと領域が連続するという前提が成り立たないんじゃないんですかね。
0780デフォルトの名無しさん
垢版 |
2021/02/20(土) 12:51:28.34ID:K0wy5MAI
>>770
どういう意味じゃ…
ムーブコンストラクトする手段をインターフェースとして公開したい需要は論理的に有り得る
それともIFoo::move()に実装が伴うからという意味?
0781デフォルトの名無しさん
垢版 |
2021/02/20(土) 14:23:36.69ID:XZPJJfWU
>>779
なぜ?
行優先か列優先かは置いといて、vectorの要素は連続するのだからvectorのvectorも連続するのでは?
サイズやキャパシティが変わったときに不連続になりうるということ?
0783デフォルトの名無しさん
垢版 |
2021/02/20(土) 14:57:30.99ID:upzAgg50
>>781
正しくコピーしたければ、
memcpy(b[0].data(), ...)
みたいにしないと。
このとき当然b[1]のデータ領域はb[0]の後ろに連続していない
0784はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/20(土) 15:27:01.55ID:N5IkYQZo
>>781
vector 型のオブジェクトが連続して並んでいることは保証されるよ。
でも vector 型のオブジェクトのメモリレイアウトがどうなってるかは保証されない。

常識的な実装は >>782 が言う通りヒープから持ってきたメモリのポインタなどを持ってるだけ。
データそのものを内包しているわけではない。
0785デフォルトの名無しさん
垢版 |
2021/02/20(土) 16:22:37.93ID:UDAFNKrx
ほらCと同じ基本の部分を教えずにいきなりSTLとか勧めるからこういう初心者が出てくる・・
0786デフォルトの名無しさん
垢版 |
2021/02/20(土) 17:06:29.35ID:1TZxH4Mg
ある程度出てきても問題ないだろ。ちゃんとドキュメント読んで理解してくれる人も多いんだろうし、
「Cと同じ基本の部分」を教えたところでちゃんと理解してくれない人も居るだろうし。
0790蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/20(土) 19:27:14.79ID:VmESNyRi
>>771

> array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
> memcpy(b.data(), a.data(), n*sezeof(T))
> で良いんですかね?

待てよ、b.data()って&b[0]だから型はvector<T>*だろ。書き換えたらいけないアドレスじゃん。

ダメです。
0791蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/20(土) 19:49:01.06ID:HfYkFRCd
C++のvectorでは、演算子[ ]がオーバーロードされてるから、C言語の常識が通用しないんだよ。

memcpyは危険な関数だから簡単にメモリー破壊できるんだよね。

std::vector v;
int a = 5;
memcpy(&v, &a, sizeof(a)); // vのメモリー破壊。
0793デフォルトの名無しさん
垢版 |
2021/02/20(土) 20:44:29.23ID:Rkd/h2tQ
別にここで何が正しいかを結論できなくてもいいのだが

>>776
そう言うなら「推移的かつ反射的であるのみの順序関係」が「弱順序」と書いてある本を
教えてくれる?
手元になかったらうろ覚えでもいいけど。〇〇の××先生がそう言ってたみたいのでもいいw
知識として一応確認しておきたいかなと。
0794◆QZaw55cn4c
垢版 |
2021/02/20(土) 21:19:47.30ID:mkFIMg3t
>>793

>>761 では「推移的かつ反射的であるのみの順序関係が『弱順序』」とはいっていませんよ、よく読んでくださいね
>>761 で言っているのは「一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいい」としかいっていませんですよね‥‥
曲解もはなはだしいと思いますね

ちなみに私の教科書ではこれを「擬順序」と定義しています、大熊正氏の本ですが、私には一生かかっても私には読めないでしょうから、あとはググってください
0796デフォルトの名無しさん
垢版 |
2021/02/20(土) 21:47:14.25ID:K0wy5MAI
つかこうかorz
std::vector<int> v((size_t)1);
const int a = 5;
memcpy_s(&(v[0]), sizeof(v[0]) * v.size(), &a, sizeof(a));
0797蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/20(土) 21:58:40.54ID:HfYkFRCd
この場合は素直にループを書くか、それとも格好良くstd::copy使うのが楽かな。
0800はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/21(日) 01:32:42.66ID:jd0qgVVy
それほど速くならない・速くなくていい場合のほうが圧倒的に多いってのもあるけどな。
0802770
垢版 |
2021/02/21(日) 03:54:49.57ID:HYHVDYIS
>>780
IFooっていう名前からしてインターフェースってJava/C#的な意味でのそれだと思ってたけど
それならポインタなり参照なりじゃないと機能してないよっていうかコンパイルエラーでしょってツッコミ
0803デフォルトの名無しさん
垢版 |
2021/02/21(日) 03:58:42.63ID:0HHdBuLy
メモリコピーを最適化する前に、他にすべきこと沢山あるだろ的な答えになるよな、確かに。
PG界の真理情報だわ。
0805デフォルトの名無しさん
垢版 |
2021/02/21(日) 07:43:27.01ID:F92hI73d
>>802
オブジェクトAがconstメンバとして保持しているブツの所有権を移してオブジェクトBを構築することは
ムーブコンストラクタでないと_なのでムーブコンストラクタである必要があり
この要請はオブジェクト全体が直接アクセスかポインタや参照経由の間接アクセスかとは独立愚連隊、

>>803
真に高速化を求められる内側のループでstd::vector<int> xとかしないから
>>796はひとつながりの省略のないコードとして読んだら判断を誤りうる
0806デフォルトの名無しさん
垢版 |
2021/02/21(日) 07:51:19.71ID:F92hI73d
じゃなかったorz
 Foo::Foo(const Foo& src) { (srcを変更して新しいインスタンスを初期化) }
はconst_cast<Foo>的な危険手段でないとやれないが
 Foo::Foo(Foo& src) { (srcを変更して新しいインスタンスを初期化) }
とするとなんかコンパイラが警告を出すから
 Foo::Foo(Foo&& src) { (srcを変更して新しいインスタンスを初期化) }
にせざるおえないという、
0808デフォルトの名無しさん
垢版 |
2021/02/21(日) 13:30:17.46ID:YxY+Ievf
こういう馬鹿にはちゃんとベンチマークとれって言ってやるのが正しい行い。
0810デフォルトの名無しさん
垢版 |
2021/02/21(日) 14:47:26.80ID:9WgNecVw
404 Not Found
0812デフォルトの名無しさん
垢版 |
2021/02/21(日) 16:21:41.69ID:u2qGdVDT
過疎ってるし、初心者どころかJavaの質問でもOKでは?
0813◆QZaw55cn4c
垢版 |
2021/02/21(日) 19:01:13.83ID:3Ebck9FU
>>807
この質問に対して回答をつける用意がありますが、しばしお待ちを
0814◆QZaw55cn4c
垢版 |
2021/02/21(日) 19:27:36.57ID:3Ebck9FU
>>807,813
昔のコードを今読んでみたんですが、実のところ関数オブジェクトにする必要性があったかどうか、今の価値観のもとでは首をかしげています
数値計算のプログラムって、無自覚にバンバン書いてると例えばルンゲ食ったをやっているとこと他とかが混ざり合って収拾がつかなくなる、と思って関数オブジェクトにアイソレートした記憶があって、それを思い出して読んでみたんですけれども、今読んでみても、なんだか、ねえ‥‥
https://mevius.5ch.net/test/read.cgi/tech/1434079972/72
0815デフォルトの名無しさん
垢版 |
2021/02/21(日) 20:07:12.76ID:F92hI73d
>>809
Fooはこんなやつ、
https://ideone.com/mPPH8I

IFooは、C++ではよく考えたらIFooのオブジェクトを直接生成できないので(>>802の仰せの通り
std::shared_ptr<IFoo>とかで生成することを考えたのだがエラーになるorz
(上のリンク先のコードでコメントアウトしてあるgenerate_IFoo()
思いのほか闇が深かった\(^o^)/

std::shared_ptr<IFoo>が生成できた暁には、
std::shared_ptr<IFoo> pがリソースの所有権を握ったFooを保持しているとき、
std::shared_ptr<IFoo> qというのがいるとして、
 *q = *p
で所有権を*pから*qに渡したり、
 return *p
で呼び出し元が所有権を有するFooを受け取れるようにしたいワケ
0816デフォルトの名無しさん
垢版 |
2021/02/21(日) 20:09:12.28ID:F92hI73d
ちなみにWandboxでソースコードをフォークする方法は
初心者なので
わかり
ません
0817デフォルトの名無しさん
垢版 |
2021/02/21(日) 20:14:47.49ID:LxNhpnKU
generate_Foo()がコケてるのはnewのところでFooのコピコンがないだけだろ
コピコン書くか、ムーコン使いたいならnew Foo(std::move(foo3))にすればいいだけ

後半も意味不明
*q = *pってそれスライシングだぞ
0818デフォルトの名無しさん
垢版 |
2021/02/21(日) 20:23:47.49ID:F92hI73d
>>817
普通の(ムーブでない)コピコンは書けないなぜなら>>806の理由により

>*q = *pってそれスライシングだぞ
どゆこと?
Foo foo1とFoo foo2だと
foo1 = foo2
とできるのに、
0819デフォルトの名無しさん
垢版 |
2021/02/21(日) 20:26:48.03ID:F92hI73d
ちょっと補足すると、IFooには現状代入手段が無いから、
*q = *pはそもそもコンパイルが通ることはなく、目的とする機能を形而上的に表す仮想コード
のつもり
0820デフォルトの名無しさん
垢版 |
2021/02/21(日) 21:03:58.63ID:+My/Unlg
>>814
処理を意味でまとめるようなことなら積極的にやるべきだと思いますが、それは関数オブジェクトじゃなくて関数でもできますよね?
0821デフォルトの名無しさん
垢版 |
2021/02/21(日) 21:05:03.53ID:HYHVDYIS
>>815
コピー代入演算子とムーブコンストラクタだけ定義するとか意味分からんし
インターフェースによる隠蔽より先にそっち解決しなさい
何がしたいのか自分で本当にわかってる?
0822◆QZaw55cn4c
垢版 |
2021/02/21(日) 21:07:32.53ID:3Ebck9FU
>>820
まあ、そのとおりであり、そうなんですよね…
>>814 は関数オブジェクトである必然性はありません、関数オブジェクトを積極的に使う例としては STL にご登場願うしかないのかもしれませんね
0823デフォルトの名無しさん
垢版 |
2021/02/21(日) 22:29:56.45ID:LxNhpnKU
>>818
shared_ptrは関係ないから普通のポインタで話するぞ(同じ事だ)
IFoo* p = new Foo();
IFoo* q = new Foo();
というのがあったとして*q = *p;ってのは何だと思う?
pとqはIFoo*型だ
だからもちろん*pと*qというのはIFoo型だ
すなわち*q = *p;というのはIFoo::operator=(const Foo&)の呼び出しだ
operator=()はvirtualにできないから、pとqが本当はFoo型オブジェクトを指してることなんか知りもしないし考慮もしない
よってIFoo部分の代入だけが行われて、要はqのIFoo部分だけが首チョンパされてpのIFoo部分が代入される
これをスライシングという
0824はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/21(日) 23:00:12.09ID:jd0qgVVy
>>822
関数オブジェクトに「関数」とついているのは関数と同じ記法で呼び出せるということに意味があって、インターフェイスの問題。
状態を持った関数 (関数オブジェクト) も状態を持たない関数 (関数ポインタ) も統一的に扱えたらうれしいねって話なので、
状態を持たず、高階関数に渡すこともない場合は関数オブジェクトにする意味はないな。
(普通の関数も static 変数への参照を持ってたりする場合もあるので必ずしも状態を持たないわけではないけど。)
0826はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/22(月) 00:10:55.10ID:oiAqsUn6
「ラムダ式が関数オブジェクト (型の定義と生成) の構文糖」というのは
既存のプログラムとの整合性を壊さない上手いアイデアだと思うけど、
しばらくしたら「関数オブジェクトはラムダ式の実体」という説明のほうが
通りがよくなったりするかもしれないね。
0827デフォルトの名無しさん
垢版 |
2021/02/22(月) 04:39:33.19ID:7qATnC1I
関数オブジェクトで状態を渡せるのは結構なんだが、コピーコンストラクタ渡しなので、
手の込んだ状態管理だった場合は結局、C言語と同じくユーザー定義変数を介して状態を読み書きすることになる。
0829デフォルトの名無しさん
垢版 |
2021/02/22(月) 09:54:32.23ID:Y0MZ31oO
>>807,820ですけどQZで始まる人あまりにもレベル低いというか回答者として不適格だと思うのでNGします
0831デフォルトの名無しさん
垢版 |
2021/02/22(月) 11:11:29.17ID:M+ptXBNl
いやでも実際・・・QZはね・・・
50過ぎのおっさんが無理して絡みにいってるけど空回りしてる感じなんだよね
ほんと残念だけども
0832デフォルトの名無しさん
垢版 |
2021/02/22(月) 11:36:36.23ID:7qATnC1I
関数オブジェクトに対するラムダ式の優位性は、ローカル変数を比較的安全かつ手軽に参照渡しできることだろう。
0833デフォルトの名無しさん
垢版 |
2021/02/22(月) 12:08:03.12ID:5Ezd+ZoO
あわしろ氏がQzはアカン言うてたけど、ターゲット変えたのかな?

急にその手の書き込みが増えてあからさますぎる。
0835デフォルトの名無しさん
垢版 |
2021/02/22(月) 17:04:18.35ID:M+ptXBNl
回答者には無条件で感謝しないといかんのか?
気持ち悪いな
0837デフォルトの名無しさん
垢版 |
2021/02/22(月) 19:14:24.66ID:SaDkzfTf
>>835
回答を得るのに適切な行動を取りゃいいよ。
変にヘイトを吐くとつっかかる奴がいるから回答から遠くなる。
>>829は感情を制御する訓練をしないとな。
0838デフォルトの名無しさん
垢版 |
2021/02/22(月) 19:28:11.36ID:M+ptXBNl
たしかに
勝手にNGしとけば十分で煽るように宣言するは意味はまったくないね
擁護した俺が悪かったごめん
0839◆QZaw55cn4c
垢版 |
2021/02/22(月) 19:57:55.16ID:R3R68rti
>>831
認めましょう

>>838
私の意見に一番近いですね
私は、馬鹿な私の意見を見たくない人も多いと想定しており、馬鹿な私が発言するときは馬鹿の印としてトリップをつけるようにしています、それだけは確約しますので、後は好きなように NG に入れていただいて結構ですよ
私はそういう人に干渉するつもりはありません
0840デフォルトの名無しさん
垢版 |
2021/02/22(月) 20:02:59.96ID:5Ezd+ZoO
そういう書き込みを見ると、あわしろ氏よりQzのほうが大人に見えるなあ。
まあでも、あわしろ氏には技術評論社がついてるからね。
謝っといたほうが良いんじゃないの?
0841デフォルトの名無しさん
垢版 |
2021/02/22(月) 20:52:21.84ID:jfkpe4Eh
>>834
俺も以前質問したら、明らかに見当違いなマウント取りたいだけの回答が来て、言い返した時
君みたいな事言われたよ
回答くれるのは有難いが・・・ねぇ。
まぁそういうのはスルーしろ、ってんならまだわかるけど

ちなまともな回答くれた人には礼言ってるからね
0842デフォルトの名無しさん
垢版 |
2021/02/22(月) 21:08:29.88ID:51epSMYu
知らんがな。キミの意見だけ聞いてその時どっちに問題があったかどうやって判断すればいいんだよ
0844デフォルトの名無しさん
垢版 |
2021/02/23(火) 00:38:10.30ID:6MWC7t1x
あるクラスのメソッドを他所で借りたいというか使いたいときって移譲(インスタンス化)するかコピペするしかないの?
0845デフォルトの名無しさん
垢版 |
2021/02/23(火) 00:41:49.01ID:Z5ZYenTn
>>844
メソッドをクラスから分離してテンプレート関数にすれば、クラスの継承関係がなくても使えるので便利。
0846デフォルトの名無しさん
垢版 |
2021/02/23(火) 01:01:30.38ID:48JMuLBY
>>844
メンバアクセスしていないならstatic関数にしてクラス名::メソッド名()で呼べる
ただメンバアクセスしていない時点でその関数は本当にそのクラスに属すべきなのか再考したほうがいいけど

あと継承する手もあるけど「借りたいから」程度の理由で場当たり的にやると確実に泥沼化する
0847デフォルトの名無しさん
垢版 |
2021/02/23(火) 04:11:59.35ID:kBU50DXM
>>846
> ただメンバアクセスしていない時点でその関数は本当にそのクラスに属すべきなのか再考したほうがいいけど
極論、引数をとって返り値を返す関数だけで全てのことが実現できますよね?
そう思ったらクラスのメソッドにするよりも何でもクラス外の関数にする方がお得というか楽な気がしてしまいます
0848デフォルトの名無しさん
垢版 |
2021/02/23(火) 07:21:43.52ID:7kgSemXY
そのとおりで極力フリー関数にするべき
(非静的)メンバ関数というのはデータメンバーの一貫性を保つためだけに使うもんだよ
0849デフォルトの名無しさん
垢版 |
2021/02/23(火) 07:27:00.90ID:ex5XjLGm
>>847
"メンバアクセスしてない"てのが重要だと思うよ
実際、非staticではなくstaticなメンバ関数にしたい場面てあんまり無い(外の関数と大して変わらんから)

>>848みたいなのはオブジェクト指向も理解出来てないド素人が玄人ぶってよく言うんだよなぁ・・一応釘だけ刺しとく
0850デフォルトの名無しさん
垢版 |
2021/02/23(火) 08:19:26.69ID:kBU50DXM
なんかOOPの行き着く先みたいな話してるな

俺も関数が引数と返り値としてメッセージを渡し合って協働していく方が洗練されてると思う
必然、その方が副作用も少ない
0851デフォルトの名無しさん
垢版 |
2021/02/23(火) 08:29:56.96ID:Z5ZYenTn
staticなメンバ関数には、名前衝突しにくい、msvcのインテリセンスのような入力支援を得やすい、という恩恵はある。
0853デフォルトの名無しさん
垢版 |
2021/02/23(火) 09:47:50.72ID:DwnxTU4/
オブジェクト指向の概念の話をするときにメッセージって言葉使いませんか?
C++ならメッセージ=メンバ関数
Javaならメッセージ=メソッド
言語によって呼び方が違うから概念的な話のときはメッセージといったほうが通りがよい
0854デフォルトの名無しさん
垢版 |
2021/02/23(火) 10:07:32.09ID:B3ih21Pc
>>849
「オブジェクト指向も理解出来てないド素人が玄人ぶってよく言う」
の意味がさっぱりわからん
>>848の表現に一切ケチつけられる要素ないと思うけど
0855デフォルトの名無しさん
垢版 |
2021/02/23(火) 10:15:54.38ID:gTQJYaBt
> データメンバーの一貫性を保つためだけに使う

いったい何が言いたいんだろう
他人に分かり易く言えないのは自分が解ってないからというケースがある
0856デフォルトの名無しさん
垢版 |
2021/02/23(火) 10:18:06.26ID:B3ih21Pc
> データメンバーの一貫性を保つためだけに使う

この表現で普通に分かるけど
分からん人もいるのね了解
0859デフォルトの名無しさん
垢版 |
2021/02/23(火) 10:22:34.65ID:7kgSemXY
データメンバに対して想定した扱い方だけをさせるようにして予期しない状態の発生を防ぐため、って言えばお気に召したかしら
普通はそれを短く「一貫性を保つ」って言うのだけど
0860デフォルトの名無しさん
垢版 |
2021/02/23(火) 10:31:05.01ID:u3MMsI1X
>>853
使わない、というか使うな誤解を招くから
SmalltalkとかObjective-Cならわかるけど
C++やJavaのそれはメッセージングではないと考えるのが普通(そう見做せないわけではないが
0864デフォルトの名無しさん
垢版 |
2021/02/23(火) 10:49:29.89ID:7kgSemXY
ごめんねおじいちゃん知らない表現を使われただけでそんなに拗ねるなんて思わなかったんだ
0865デフォルトの名無しさん
垢版 |
2021/02/23(火) 11:07:54.70ID:u3MMsI1X
いや、悪いけど>>859を以って
>データメンバーの一貫性を保つためだけに使うもんだよ
などと言い切れるのは経験不足と見られても仕方ないと思うよ学生ちゃん
0866デフォルトの名無しさん
垢版 |
2021/02/23(火) 11:13:43.78ID:j4L8+y6t
おじいちゃんとか学生ちゃんとか、おまえらマウンティングしながらじゃないと会話できないのかw
0868デフォルトの名無しさん
垢版 |
2021/02/23(火) 12:46:58.74ID:HLi0yp23
昔からこのスレは特に酷いよね
なぜマウントの必要があるのかは少しだけ興味深いけど
0869デフォルトの名無しさん
垢版 |
2021/02/23(火) 13:21:23.20ID:+0nZ2NLW
Linuxを使う以上、C++を嫌わないとダメだろ。
0870デフォルトの名無しさん
垢版 |
2021/02/23(火) 13:45:38.11ID:iu17pC6m
>>857,864
いや、メッセージはわかってるけどなんでC++スレで?
って話だろ
>>860の言うようにC++界隈ではあまり使わんし
単にイキってるだけにしか見えんw
0872デフォルトの名無しさん
垢版 |
2021/02/23(火) 13:47:30.93ID:alqL+AST
オブジェクト指向に関しては、今の人は、昔はメモリが高価だったとでも思っておけば良いよ。
0874デフォルトの名無しさん
垢版 |
2021/02/23(火) 13:59:21.85ID:UMWafFvJ
一貫性というのはオブジェクト内部の整合性のこ
とを言いたい
のでは…
※ 個人の感想です
0875デフォルトの名無しさん
垢版 |
2021/02/23(火) 14:03:58.66ID:UMWafFvJ
C++のメソッドの呼び出しをメッセージと言い出すとウィンドウメッセージと紛らわしい(小並感
ていうかC++においてメッセージと言えるのはメソッドの「呼び出し」であってメソッドそのものではない
(例えば)メッセージ自体は継承メカニズムとは独立の概念なのだから
※ 個人の感想です
0876デフォルトの名無しさん
垢版 |
2021/02/23(火) 14:10:51.07ID:HLi0yp23
Smalltalkはほぼ知らんけど
メッセージ式ってのは
セレクタ+引数のことだったはず
いやこれどうでもいいか
0877デフォルトの名無しさん
垢版 |
2021/02/23(火) 14:18:47.72ID:UMWafFvJ
ていうか今にして思えばstd::shared_ptr<IFoo>がIFooのインスタンスに対する所有権を適切に移譲したり管理するので
std::shared_ptr<T>に持たせることにした時点でIFoo自体がリソースに対する所有権を管理する必要はなさげorz
0878デフォルトの名無しさん
垢版 |
2021/02/23(火) 14:29:34.84ID:+0nZ2NLW
smalltalkなんて誰も使わないのだから、アジソンウェスレイのオブジェクト指向プログラミング入門にそう書かれていたからという理解で良いのでは?

若者もいるので説明しておくと、書店で書籍を買う時代があって、書店に並ばなければ書籍の存在自体わからなかったのですよ。
この本は何処の書店にも並んでいたので、スレの高齢者全員が読んでいます。
この本しかなかったんですよ。
良い本だとは思いませんが、30年たった今でも古書に値が付くはずです。

全員が読んでるので、全員が知っているかのように錯覚する人もいるって事です。
0879デフォルトの名無しさん
垢版 |
2021/02/23(火) 16:09:16.56ID:CS53pw6I
C++のオブジェクト指向でメッセージングのワード出してくるのは
継承を説明するサンプルコードで動物の階層もちだしてくるのと同じ功罪がある
理解のとっかかりにはいいが、リアルな実装の段階ではそういうポエムみたいな話は忘れたほうがいい
0881デフォルトの名無しさん
垢版 |
2021/02/23(火) 16:16:12.25ID:+0nZ2NLW
>>879
功もあると御自分で書かれているのでは?
0882デフォルトの名無しさん
垢版 |
2021/02/23(火) 19:10:57.35ID:48JMuLBY
>>873
これで本当にいいのか?
コピー代入演算子でムーブさせるのが本当にあなたのやりたかったこと?
std::auto_ptrはこの問題があったからdeprecatedになったんだけど
0883◆QZaw55cn4c
垢版 |
2021/02/23(火) 21:53:45.68ID:tPF8d5Rx
>>878
>書店で書籍を買う時代があって、書店に並ばなければ書籍の存在自体わからなかったのですよ。

私の若い頃を思い出します。
当時、神戸の一番大きな本屋さんでは、どうしたわけだかコンピューター関連書籍の部分だけは黒山の人だかりで、いつも二十人くらいがみんな立ち読みしまくっていて、そういう人ごみを押しのけて本を探さなければならなかったくらいでした
最近右翼になった数学者・藤原正彦氏によれば、もっと古い時代には町の小さな本屋さんであっても普通にそんな状態だった、ときいています、とても信じられませんが‥‥

そういうわけで、アマゾン・ウェルカム!
0884◆QZaw55cn4c
垢版 |
2021/02/23(火) 21:57:00.55ID:tPF8d5Rx
>>875
私は例のペゾルド教本を何とか C++ に適応させたくて、ペゾルド本の WM 処理・巨大 switch 文を C++ に適合させようと未だに四苦八苦していますが、やっぱり MFC に移っちゃったほうが楽チンなんでしょうか?
0885デフォルトの名無しさん
垢版 |
2021/02/23(火) 22:05:53.75ID:u3MMsI1X
>>871
あまりに一面的な見方やろ
>>848はカプセル化も多態も、上で話してた関数オブジェクトさえ否定する暴論
よほど拒否反応があるんだろうなー、と
0887デフォルトの名無しさん
垢版 |
2021/02/23(火) 22:15:00.14ID:iu17pC6m
>>885
まあ
> (非静的)メンバ関数というのはデータメンバーの一貫性を保つため「だけ」に使うもんだよ
の「だけ」に引っかかってると思うんだけどそっちの方がどちらかと言うと暴論に見えるよ
0888デフォルトの名無しさん
垢版 |
2021/02/23(火) 22:20:52.65ID:u3MMsI1X
まぁ関数オブジェクトはある意味当てはまってるかもしれんと思うが
>>887
そっちも根拠書いてね
0890デフォルトの名無しさん
垢版 |
2021/02/23(火) 22:44:54.86ID:H7IAWcv9
[selector message]

Objective-Cが良かったな。
0891デフォルトの名無しさん
垢版 |
2021/02/24(水) 06:48:21.60ID:Vo6CI9FQ
>>884
やってみるとわかるけど、MFCと同じものを自分で作ってる感じになるね
ARM C++時代に作るとああなるんだけど、
今どきのC++20で作るとどうなるのかは興味深い
0892はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/24(水) 15:54:28.46ID:EZ8EgbLC
現代的な Windows のフレームワークとしては C++/WinRT に力が入ってるみたいなんで、
今からはこれを使った方がよさげ
0893デフォルトの名無しさん
垢版 |
2021/02/24(水) 17:47:00.67ID:T43vsud+
P/Invokeともこれでおさらば、
と言いたいところだがネイティブC++をwrapするC++/WinRT自体はCLR上の言語なんじゃなかったっけ…
違ったっけ…
0896デフォルトの名無しさん
垢版 |
2021/02/25(木) 12:27:48.18ID:Kp+Bp4Dl
int (int)型のコールバック関数ポインタにて、一応呼ばれるのでnullはマズイけど不要なので空にしたいという場合に
int () { return 0; }という引数が一致しない空関数へのポインタを渡すとまずい事になるんでしょうか?
低レベルの知識がないのでよく分からないんですが、スタックの巻き戻しとかでズレが生じるとかありそうな気がしています
0897はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/25(木) 14:45:58.57ID:ziL/azOs
>>896
使われている ABI による。
x64 環境なら Unix (系の多くの OS) でも Windows でも引数は整数4個分までは
レジスタで渡されるんで、スタックの整合性は壊れないはず。
0898デフォルトの名無しさん
垢版 |
2021/02/25(木) 15:12:23.79ID:bxBNuN1v
>>896
スタックは呼ぶ側で処理するからズレないよ
でないと可変長引数とか実現できないし

>>897
そんなもんは処理系やオプション次第
0899デフォルトの名無しさん
垢版 |
2021/02/25(木) 15:36:41.54ID:SLTnVXDN
静的解析ツールやコード分析で警告が出るだろうから直したほうがいいと思うけどね
0900はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/25(木) 15:44:39.43ID:ziL/azOs
x64 の一般的な ABI ではもう様々な呼出し規約を使い分けないようになってる。
(cdecl と stdcall が混在していた Windows が例外的で
他は 32bit 時代からかなり統一されていたみたいだけど。)

まあそれはともかくとして、
実際には不要でも適当な値が渡るようにして型を併せるほうが良いとは思う。
不整合を残しておくと強い最適化をかけたときにわけのわからないことになりがち。
0901デフォルトの名無しさん
垢版 |
2021/02/25(木) 16:08:57.78ID:0Aa2beUH
はちみつは見所がある弟子にしてやっても良いと、あわしろ氏が褒めてた。
0902デフォルトの名無しさん
垢版 |
2021/02/25(木) 16:57:46.00ID:2x/2jVQO
>>896
古いCから新しいC++まで含め、素朴な観点では原則的には大丈夫では有るが、
あなたが言っているように例外処理が入ってくるとどうなるかは不明。
C/C++では型を厳しくしているのは、そういうことを避けるため。
あなたのやろうとしていることは、関数アドレスをキャストしなくては
関数ポインタへの代入できない。
このようにキャストすることによって、アーキテクチャ依存となり、不具合が起きる
確率が0でなくなる。
0903デフォルトの名無しさん
垢版 |
2021/02/25(木) 17:00:32.01ID:2x/2jVQO
>>902
[補足]
例外処理はとても複雑なことが行なわれることがある。
関数ポインタに代入する際に関数シグネチャが異なるものをキャストして入れると
どうなるかは処理系依存となる。
関数アドレスを同じビット数の整数型の変数との間で相互にキャストするのは構わない。
関数なのに、異なるシグネチャのものを代入しあうのは問題。
0904◆QZaw55cn4c
垢版 |
2021/02/25(木) 19:04:36.48ID:FipxGJhu
>>891
そうですか‥‥
いまどき MFC の教科書が存在するかどうかは疑問ですが、やっぱり MFC に戻るしかないのですか!
でも、あのドキュメント=ビュー構造はいまだによく理解できないですね‥‥
0906デフォルトの名無しさん
垢版 |
2021/02/25(木) 22:34:17.62ID:GHceiqHX
C++は一応明示的に破ろうとしなければ結構ちゃんとチェックしてくれる
C? 知らんな
0908デフォルトの名無しさん
垢版 |
2021/02/26(金) 02:06:22.71ID:uELWbBar
>>907
でも、引数を関数内で参照して無い場合、素朴な呼び出し規約的には問題ない。
例外処理の unwinding は仕様が難しいので良くわからないと言うこと。
実際は大丈夫かも知れない。
0909デフォルトの名無しさん
垢版 |
2021/02/26(金) 07:24:52.91ID:gCkWSKrb
int (int) { return 0; }で埋めて何が嫌なのかが分からないからな
特別な事情があるなら動かすハードとかの仕様調べろ
そんなのないなら素直に安全に書いとけ、でいいじゃん
0910デフォルトの名無しさん
垢版 |
2021/02/26(金) 07:52:48.02ID:M2eccXrm
>>904
一つのデータを複数のウインドウで見るって考え方だよ
テキストエディタでもスプリットバーやマルチビューは普通に使うだろ
0912デフォルトの名無しさん
垢版 |
2021/02/26(金) 12:52:04.91ID:X0njcRoR
cは互換型の概念がガバガバだからなあ…
typedefは当然互換だけど、structは中身のpodが同じでも(typedefしなければ!)タグ名で弾けるので、一々structに包めば論理ミスを防ぐこともできなくもない
0913デフォルトの名無しさん
垢版 |
2021/03/01(月) 02:34:24.68ID:sakgt9rY
規格書を読んでみんなC++覚えてたの?
入門用のドキュメント読んだら規格書読むべきですか?
0914デフォルトの名無しさん
垢版 |
2021/03/01(月) 06:09:14.80ID:N/bll+Sf
趣味のC++オタクでいいんならそれでいいと思うよ
C++を実用したいならそういうのはやめとけ、というかまず手を動かせ
その上で疑問が出てきたら調べるのはアリ
0915はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/01(月) 09:15:36.61ID:770X86Bb
問題に遭遇したときに疑問として感じ取れる人ならいいんだが、
謎理論を自分の中に構築して邁進してしまうやつも
少なからずいるので安易に手を動かせとは言いにくい。
0916デフォルトの名無しさん
垢版 |
2021/03/01(月) 09:31:54.75ID:Qi7MAN5S
各コンパイラに固有の実装依存があるから、結局は試すしかない。
PGが規格と違った動きをしているコンパイラをなじったところで、勝利するのはPGではなくコンパイラ。
0917はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/01(月) 09:41:00.95ID:770X86Bb
商用コンパイラがその商用コンパイラがサポートしているはずの規格と違う挙動だったらそれは文句言ってもいいだろ。
0919デフォルトの名無しさん
垢版 |
2021/03/01(月) 09:46:40.02ID:Qi7MAN5S
>>918
それな
0921デフォルトの名無しさん
垢版 |
2021/03/01(月) 09:52:48.41ID:Qi7MAN5S
PGは、コンパイラが規格準拠してくれる日のために #if #endif で区切ってすぐに切り替えできるようにしておくことしかできない。
dirent周りのカオスを知っているなら、規格準拠をうるさく言う虚しさを理解しているはず。
0922はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/01(月) 10:34:18.93ID:770X86Bb
商用コンパイラを商売で使うならサポート契約とセットじゃねーの?
使い倒さないと契約料丸損やないけ。
0923デフォルトの名無しさん
垢版 |
2021/03/01(月) 10:42:44.99ID:N/bll+Sf
>>922
いつも思うけど、お前仕事で書いたことねーのに何でそんな偉そうなん?

ちな俺はVCのバグ報告(テンプレート周りとか気付かれにくい部分)何度かしてるが、直るのは早くても半年後だよ
仕事でなくともとりあえず何とか回避するしか無いし、報告するにも再現性あるコード提供しないと迷惑かける
皆お前みたいに暇じゃねーんだよ
0924デフォルトの名無しさん
垢版 |
2021/03/01(月) 10:52:02.51ID:f1Pg/hcl
>>923
こういうのって結構な割合で最適化の不具合だったりするよね
特に組み込み系だとしょっちゅうそういうのあるから、該当箇所だけ最適化レベル下げて通したりしてるわ
もちろん不具合の報告もしてるけど修正まで時間かかるからね
0925はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/01(月) 11:11:13.26ID:770X86Bb
すぐにとはいかない現実があるのはわかるが、サポート契約の内容を本当に把握して言ってる?

商品の瑕疵に対応するのはあたりまえだからサポート契約ってのはそれ以上のものだよ。
契約内容によるけど、コンパイラのバグである証明とか全部してやる必要はかならずしもなかったりするぞ。

VC のバグ対応がよくないならそれは VC のサポートチームが良くないってだけだ。
0927はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/01(月) 11:38:15.03ID:770X86Bb
#if での切り分けだってネストはありうるけど、
それが見た目に分かりづらかったりするし、
いいことばかりじゃないよ。
0928デフォルトの名無しさん
垢版 |
2021/03/01(月) 14:12:42.88ID:CPl5J/qU
一昔前なら effective c++ くらいは読もうってとこだったが、
今はどうだろうな。efective modern c++ でも足りない感じがする。
てかc++やるなら自分であれくらいのポイント抑えるくらいの準備が必要かもしれんという地獄。
0929デフォルトの名無しさん
垢版 |
2021/03/01(月) 14:23:24.82ID:Qi7MAN5S
スマートポインタが標準規格に採用されたC++11とそれ以前では、作法が随分違ってくる気がするよ。
0930デフォルトの名無しさん
垢版 |
2021/03/01(月) 17:34:12.59ID:oQ7wqd0O
>>917
「文句」みたいな感情的なものじゃなく
ドライにバグレポだ
再現コードだけじゃなく回避方法もつけて
0932デフォルトの名無しさん
垢版 |
2021/03/01(月) 21:14:48.91ID:Dkl+jirL
>>925
> 契約内容によるけど、コンパイラのバグである証明とか全部してやる必要はかならずしもなかったりするぞ。
無いかも知れんが、「なんかおかしいんです~」でバグの特定がめっちゃ困難なことはプログラマーは身を持って知ってるから
そもそもバグの解決が遠のいたら苦しむのは自分だし
0934はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/01(月) 23:56:40.27ID:770X86Bb
>>932
雑な報告でいいというわけではないが、
サポート契約の利用率が非常に低い (値段は高いのに!) というのはよく聞く話なんで、
報告して対応待ちというだけじゃなくてもっとプロジェクトに巻き込んでいいはずなのになという感じ。

C++ の話じゃないけど、 LispWorks (Common Lisp の処理系) のバグ報告をしたら数日中に暫定パッチが
出てきたりとかワークアラウンドの提案とかもしてくれるという事例を利用者のブログで
見たことがあって商用処理系ってすげーなーと思ってたんだが、
そういう対応のほうが例外的に良すぎるだけなんかね?
0935デフォルトの名無しさん
垢版 |
2021/03/02(火) 00:07:05.02ID:n7F7EI9c
>>934
そういう対応はマイナーメーカーの方がいいことが多いよ
MSの対応が悪いとは言わないけどユーザーがアホほど多いから処理系のバグにぶち当たる可能性も低いし
0936デフォルトの名無しさん
垢版 |
2021/03/02(火) 00:37:21.45ID:wbC9damv
スケジュールきついだけかもよ
バグがあるのわかってたけど数日かかりそうだから放置
バグ報告が出たから優先度上げて修正
0937デフォルトの名無しさん
垢版 |
2021/03/02(火) 02:03:18.16ID:+qoPTldB
そもそもユーザー数がアホみたいに多くてあらゆる層で利用されてるようなコンパイラだと
バグ報告あがってきてもまずそれほんとにバグなの??
ていうかまたコイツのリポートか!!!もしかしてただのいやがらせとかじゃないの??とか
色々まず疑ってかからないケースも半端なく多いだろうしな
0938デフォルトの名無しさん
垢版 |
2021/03/02(火) 05:18:47.46ID:+XzLrHKh
>>923
あわしろ氏は、はちみつのことを褒めてたけどな。
見どころがあるから弟子にしてやっても良いと。
月一万で弟子にしてやるぞ。
0939デフォルトの名無しさん
垢版 |
2021/03/02(火) 05:46:06.48ID:eqvY2Z+d
>>934
サポート契約はどんなに使い倒しても契約料が戻ってくるわけじゃない
自分が頑張ってインカムを増やすのが「元を取る」ということだ
0940デフォルトの名無しさん
垢版 |
2021/03/02(火) 06:15:09.36ID:1/ifTUd4
>>934
VSのサブスク(旧MSDN)入ってる企業なら優先的に対応してくれるかもしれんけどね
ただVS2019の更新は数日とかのスパンでは来てないやろ(しかもベータを経てからじゃなかったか?
Xcodeのclangなんかはもっと遅い
そのLispWorksとかいうのは例外的だろうね

で、みんな回避方法くらいは自分で見つけるし直るまでの間何もしないわけにはいかんからな
0941デフォルトの名無しさん
垢版 |
2021/03/02(火) 06:43:01.65ID:auUulvn4
コンパイラを作っている人は他の誰よりも標準規格に詳しい。
コンパイラが規格準拠できないのはなんらかの事情がある。釈迦に説法はカッコ悪い。
0942デフォルトの名無しさん
垢版 |
2021/03/02(火) 11:52:24.56ID:K6P+Ktrz
cl書くけどlispworksは資料もすごいのでお世話になる、中の人がlisp界隈で愛称で呼ばれるくらい精力的なんで、ただそうなだけだと思う
まあフリーな処理系使うけどな
しかしニッチ過ぎるlispのどこで儲けてるのやら全く謎
0945デフォルトの名無しさん
垢版 |
2021/03/02(火) 22:50:53.20ID:NT1aj9pH
ていうか言語を作った人の本に載っているサンプルコードが
言語の思想を一番正確に表現しているはず……
0946デフォルトの名無しさん
垢版 |
2021/03/03(水) 04:56:27.42ID:W4jJ9FhP
禿の思想はC++03までだろ
頑なにラムダ式とrange-based-for-statementを拒み続けたところまで
4th editionでasyncを持ち上げてたけどその後の展開がアレだし
0947デフォルトの名無しさん
垢版 |
2021/03/03(水) 06:51:09.01ID:gVMBPcTA
>>943
googleさんのImage for ...サジェストに
caution: made with alien technologyって標語の例の生物のロゴが出てきやがるのは風評被害
rplacd、dpb、fmakunboundとかほぼほぼ英語だし明らかにエイリアン語ではない
cも大概だしな
0951デフォルトの名無しさん
垢版 |
2021/03/03(水) 19:15:48.54ID:zRjA/+hm
オライリー表紙絵みたいな動物の絵じゃないと、しっくりこない。
0952デフォルトの名無しさん
垢版 |
2021/03/03(水) 22:54:00.65ID:on2XNxxF
オイリー禿山。
0953デフォルトの名無しさん
垢版 |
2021/03/04(木) 11:11:37.69ID:J6mhpq5t
禿と禿(かむろ)の違いが判らない
0954デフォルトの名無しさん
垢版 |
2021/03/04(木) 13:03:17.03ID:K63vSywh
カムロは半グレ
0958デフォルトの名無しさん
垢版 |
2021/03/04(木) 15:33:34.57ID:9GqbczPP
で、仕事でやるときは、最下層にレベル合わせないとモノが出来上がらないしね
0959デフォルトの名無しさん
垢版 |
2021/03/04(木) 17:35:44.00ID:Ep7EXP13
自分一人ならさぞかしすごいソフトウェアが書けると思ってるんですね。すごいですね。
0964デフォルトの名無しさん
垢版 |
2021/03/05(金) 06:14:45.51ID:ddot6YlQ
std::variant を使い始めたのですが、例えば variant の中身が4種類あって、そのうちの
2種類とか3種類だけに対し共通なコードを実行したい、ときにはどんな書き方がありますかね?
全部に同じコードを適用するなら std::visit() でいいわけですが。
0965デフォルトの名無しさん
垢版 |
2021/03/06(土) 13:33:27.36ID:bGzUu7RI
apply
0966デフォルトの名無しさん
垢版 |
2021/03/06(土) 20:35:43.51ID:aLQdimbx
>>964
共通処理を別の関数にまとめたうえで、visitする時に各型のオーバーロードでそれを呼び出す
visit時にジェネリックラムダを使って内部でif constexprで分岐
visit時にオーバーロードされた関数オブジェクトを用いて、共通処理が必要な型について呼び出されるところをテンプレートにして、他は型を指定しておく
visit時にオーバーロードされた関数オブジェクトを用いて、コンセプトで分岐
.index()とif文で書き分ける
0967デフォルトの名無しさん
垢版 |
2021/03/07(日) 23:48:37.36ID:B2szmBNH
>>962
msvcのバージョン古くて。
c++14に対応してない。c++11でやってるイメージ。再帰でどんどんソースが汚れる。
0968デフォルトの名無しさん
垢版 |
2021/03/10(水) 13:31:16.40ID:b6BdhXEV
int getX() const { return mX; }
みたいな関数があるクラスのメンバ関数内でmXを参照するときに
mX と getX() のどっち使うのが一般的な書き方?
0969デフォルトの名無しさん
垢版 |
2021/03/10(水) 14:04:43.65ID:8PvVb8hX
>>968
確かにこれはいつも悩むなー
きっとアクセサ使うべきなんだろうけどね
頻繁にアクセスするならローカル変数に代入した方が早くなったりするし、一般的にクラス宣言に書いてるのもはインライン展開されてコスト的には変わらないだろうしね

むしろ他の言語のときにインライン展開なんてされないからめちゃくちゃ悩む
0971デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:16:37.41ID:ZK+TZHvn
なんでもかんでもgetterとかはJAVAから来たのかとか思ってしまう
取得時に演算しないならそもそもgetterなんか作らない方が分かりやすいと思うのだが
0972デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:36:26.11ID:pTnyTINd
>>971
C#みたいなのはそれはそれでわかりにくいから、getterも関数がいい。
0973デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:47:37.68ID:qvIOwUBa
無理にgetter作れってのはアホだなと思うけど、まあgetterくらいならそこまで問題になることもないかなとは思う。
やたらめったらsetter作ってたら死ねとは思うが。
0974デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:50:25.97ID:pTnyTINd
const 属性をうまく使えば、getterを減らしても安全にコーディングできる。
0975デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:55:29.61ID:SA6nop04
オブジェクト指向に侵されてるとプロパティが欲しくなるだろう。

しかし、本物のC++は知っている。

それは間違いだと。
0976デフォルトの名無しさん
垢版 |
2021/03/10(水) 19:38:24.39ID:pTnyTINd
クラス外からは以下のようにconst 属性をつけてアクセスさせれば心持ち安全になる。
const MyClass& getInstance() const { return *this; }
0978デフォルトの名無しさん
垢版 |
2021/03/10(水) 20:37:43.62ID:wDDQFNF0
JavaBeans方式のプロパティはリフレクションあってこそのものなのにC++で真似してもなー。
0979デフォルトの名無しさん
垢版 |
2021/03/10(水) 21:11:42.58ID:98wPPrPT
JavaFXのプロパティは観測可能になってたすごかった
データバインディングとかリアクティブとかプログラムの書き方もずいぶん変わったよね
0982デフォルトの名無しさん
垢版 |
2021/03/12(金) 01:32:57.35ID:I1KnPozY
たぶんCから変わってないよな?
(a/b) * b + a%b == a
以上に説明できることはないと思うけど
他になにかあるの?
0983はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/03/12(金) 03:04:36.84ID:ByeOJ4Y7
符号の向きは C++11 から仕様に入った。
(それはでは処理系定義)
C では C99 から。
0984デフォルトの名無しさん
垢版 |
2021/03/12(金) 08:30:25.58ID:GKbHXc3G
プロパティーは継承できたりインターフェースとして定めたりできるのが強み
だがそれしか強みが無i

しいて言えばリフレクションが使える言語なら、getterとsetterを同一の識別子で紐付いた形で列挙できる
というのわある鴨、(関数型のシグネチャでgetterとsetterを与えたらそうはいかん
0985デフォルトの名無しさん
垢版 |
2021/03/12(金) 08:36:14.31ID:GKbHXc3G
P=Q・X+R (0≦R<Q)
ので除数が負の%とか定義不能
被除数が負の場合はしらそん
多分Rが非負でなければならないから多分XはPより負の側に振れねばならないのではないか
0987デフォルトの名無しさん
垢版 |
2021/03/12(金) 16:14:00.58ID:EbD8nxkK
C/C++に限らず界隈では「負数の剰余をとるべからず」という伝承がある
0989デフォルトの名無しさん
垢版 |
2021/03/13(土) 14:10:18.80ID:9o031KiD
0へ丸めるtruncate算だったかと
mod算するときに結構困るのでユークリッド算関数は常にヘッダに入れてる
a % 2 == 1 // -1かもしれない
まあ偶奇判定くらいなら!=0で取り繕えるけど
ネットで見かける拡張ユークリッドのトイプログラムは大体間違ってるね
負の除数を想定してないgcdならそれでいいけど、ベズー係数求める時に負の被除数を扱えないと一般解の公式で他の解出してお茶は濁せるけど
有限体やら他の体とテンプレート共有できない
0994デフォルトの名無しさん
垢版 |
2021/03/24(水) 07:52:17.23ID:PNXF+EC1
struct a{};
struct b:private a{};
b c;
(a*)&c; //ok

この下痢糞仕様は何?
こう決まった理由が知りたい
0995デフォルトの名無しさん
垢版 |
2021/03/24(水) 08:46:44.63ID:QJMmjFss
>>994
C形式のキャストを使ってるからではなくて?
どんなポインタにもキャストできると思うけど
0998デフォルトの名無しさん
垢版 |
2021/03/24(水) 09:40:19.90ID:PNXF+EC1
仮想継承にするとダウンキャストはできなくなるんで
型を無視しているのでもなさそう
0999デフォルトの名無しさん
垢版 |
2021/03/24(水) 10:03:59.75ID:FhOgWspo
ポインタは任意のポインタに変換出来る
未定義動作になる可能性があるのはデリファレンスするコードを書いた場合
1000デフォルトの名無しさん
垢版 |
2021/03/24(水) 10:41:19.80ID:uPqg/PBu
64bitアプリで32bit整数値をvoid*にキャストしようとするとエラーになる場合があるね。
それを親切と感じることが出来れば玄人。
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 74日 16時間 47分 20秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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