トップページ⇒tech
1002コメント293KB

C++相談室 part126 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/08/13(土) 11:24:45.65ID:NPYsKJkE
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part125
http://echo.2ch.net/test/read.cgi/tech/1463761261/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
0175デフォルトの名無しさん2016/08/26(金) 12:59:54.61ID:3Yp6hByU
>>174
「侮辱的だ」と繰り返すばかり
0176デフォルトの名無しさん2016/08/26(金) 13:16:58.62ID:R92D0kaL
streamの何も考えずガンガン流し込めばいいというスタイルは悪くないと思う
ただ特に標準出力に関してはデータを整形したいケースが多いから噛み合ってない
0177デフォルトの名無しさん2016/08/26(金) 13:22:39.50ID:FOeYYSc0
何も考えず?
iostreamってstd::size_tを流し込めること保証されてたっけ
0178デフォルトの名無しさん2016/08/26(金) 13:28:03.42ID:XS8ZF2FO
std::cout << std::hex << std::setw(2) << std::setfill('0') << int('A');
printf("%02x", 'A');
0179デフォルトの名無しさん2016/08/26(金) 18:00:13.51ID:ZiaxvSyE
https://t.co/wOBgDeY9iG
これわかる人いる?
deleteしたポインタにnullいれてないとおもったんだけど、それではないらしい…
0180デフォルトの名無しさん2016/08/26(金) 18:10:38.59ID:PiJ4eTCv
ヌルポチェックの外でメンバ関数呼び出している。
0181デフォルトの名無しさん2016/08/26(金) 18:21:32.60ID:RLEpnGOr
>>179
こんな超絶クソコード作る奴の頭がそもそも虫湧いてるので答えなんてないと思うよ
なんだよnewと対になっていないdeleteとか、しかもdeleteの前に無意味なnullチェックしてるし
0182デフォルトの名無しさん2016/08/26(金) 18:23:08.82ID:RLEpnGOr
前提条件が曖昧すぎて問題にすらなっていない
マルチスレッド環境なら話にならないコードだし
0183デフォルトの名無しさん2016/08/26(金) 18:26:56.70ID:3Yp6hByU
for (auto charactor はfor (auto& charactor でなくていいんだろうか?
0184デフォルトの名無しさん2016/08/26(金) 18:35:20.55ID:RLEpnGOr
ViewPortのコンストラクタにnullptrが渡される可能性があるなら
ViewPort::Updateは何もする必要がないのであって、Updateの冒頭でnullチェックしてreturnすればいいだろ
とにかく問題作った奴が馬鹿丸出し過ぎてイライラする
0185デフォルトの名無しさん2016/08/26(金) 18:36:33.86ID:ZiaxvSyE
色々思いつくけど >>180 が当たりっぽい
腑に落ちないw
0186デフォルトの名無しさん2016/08/26(金) 18:52:19.14ID:wMnlcyg3
rule of three(five)を無視しといてバグとか語るなって感じだが
>>182のいうように想定してる不具合実演のサンプルコードなのか実用コードの一部なのかすら
わからんのではどうにもなあ
0187デフォルトの名無しさん2016/08/26(金) 20:37:16.13ID:dDBcLzC2
>>178
これなw
いいかげん、正式な「1byte幅の整数型」が欲しいね。
0188デフォルトの名無しさん2016/08/26(金) 20:45:01.75ID:Xz0onrQ7
参考にしたいからお前らの頭の良い実装を見せてくれ
これくらいなら数分で書き直せるだろ
0189デフォルトの名無しさん2016/08/26(金) 23:13:22.52ID:mRE0T9bN
>>179
描画完了通知がNullチェックしてない??

>>187
現在策定中。
0190デフォルトの名無しさん2016/08/27(土) 08:43:16.25ID:SmFG8gRK
      ク    ク || プ  //
      ス  ク ス  | | │ //
       / ス    | | ッ //   ク   ク  ||. プ  //
       /         //   ス ク ス _ | | │ //
         / ̄ ̄\     /  ス   ─ | | ッ //
       /  _ノ  .\     /         //
       |  ( >)(<)       ___
.        |  ⌒(__人__)     ./ ⌒  ⌒\
        |    ` Y⌒l    /  (>) (<)\
.         |    . 人__ ヽ /  ::::::⌒(__人__)⌒ \
        ヽ         }| | |        ` Y⌒ l__   |
         ヽ    ノ、| | \       人_ ヽ /
.         /^l       / /   ,─l       ヽ \
0191デフォルトの名無しさん2016/08/27(土) 12:49:21.98ID:06SnK2FS
>>179
デストラクタでわざわざnull代入するかどうかよりdelete前にnullチェックしていることをつっこもうぜ
0192デフォルトの名無しさん2016/08/27(土) 13:15:37.85ID:s3YfawhT
nullptrだったら描画開始しちゃダメなんじゃないの?
0193デフォルトの名無しさん2016/08/27(土) 21:26:23.95ID:mslVqKaF
null をdelete しても無視されるから無駄って事かな
0194デフォルトの名無しさん2016/08/27(土) 22:04:43.54ID:sEFObQol
>>189
ソースは?
0195デフォルトの名無しさん2016/08/27(土) 22:19:45.68ID:nxWT+PHC
あってもなくても動作に影響しないものがあってもそこはバグとはいわないだろう
0196デフォルトの名無しさん2016/08/27(土) 22:42:36.92ID:OFUg9SIZ
バグとは言われないがゴミコードとは言われるだろう。
0197デフォルトの名無しさん2016/08/28(日) 01:03:52.09ID:IZ16EciY
>>194
https://cpplover.blogspot.jp/
上経由で知ったが、
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0257r1.pdf
これだと思う。
0198デフォルトの名無しさん2016/08/28(日) 01:09:59.02ID:3Myecdh+
delete前のnullptrチェックなあ
assertならわかるんだけどね
0199デフォルトの名無しさん2016/08/28(日) 01:19:06.19ID:jX9FVgVh
お前らが理想のコードに書き直してくれるのを待ってるんだが
0200デフォルトの名無しさん2016/08/28(日) 01:37:02.68ID:qNvxLYrv
お前らが知ったかぶりばかりなのが分かった。
別にdelete前にnullチェックするのは悪いことではないし、
newと対になってないdeleteとかも指摘としては噴飯もの。
まああえて言えばdelete後にnull代入しておくべきだが。

問題はforeachでautoになってるところだろ。
これだとvector内の要素ではなく、そのコピーに対して操作してることになる。
明らかに意図していない動作だろう。
0201デフォルトの名無しさん2016/08/28(日) 01:39:40.85ID:IZ16EciY
バグは1つではない説。
0202デフォルトの名無しさん2016/08/28(日) 01:39:43.61ID:60yVMOKI
>そのコピーに対して操作してることになる。
あの超絶クソコードの中では一番どうでもいい点だな
0203デフォルトの名無しさん2016/08/28(日) 01:41:06.73ID:qNvxLYrv
他のはバグの温床にはなりえても、あのコードだけではバグとは言えない。
お前ら学校のテストの問題とかでもケチつけてたタイプだろ?w
0204デフォルトの名無しさん2016/08/28(日) 01:45:52.06ID:7bU6M/B0
>>200
デストラクタ内でのdelete後にnullptrいれるのって何かメリットあるの?
通常の関数なら二重delete防止のためというのは分かるんだけど
デストラクタは複数回呼ばれないよね?
0205デフォルトの名無しさん2016/08/28(日) 01:50:09.68ID:qNvxLYrv
>>204
デストラクタ以外のどこか別の場所でdeleteされる可能性があるからだろう。
viewObjは外から渡された変数だから、知らないところでdeleteされてる可能性もある。
そのための防止だね。徹底するならデストラクタ内でもちゃんとnull代入しなきゃだめだけど。
0206デフォルトの名無しさん2016/08/28(日) 01:52:56.61ID:60yVMOKI
>>199
甘えてんじゃねーよこのウンコ量産野郎
0207デフォルトの名無しさん2016/08/28(日) 01:53:52.21ID:7bU6M/B0
>>205
なるほど
この問題の場合はそうですね
0208デフォルトの名無しさん2016/08/28(日) 01:54:04.96ID:60yVMOKI
>>205
バカですか?
0209デフォルトの名無しさん2016/08/28(日) 01:54:21.49ID:lPJVAstL
>>205
別の場所でdeleteされてる可能性があるとするなら、null代入があってもなくてもダメでしょ?
何言ってんの?
0210デフォルトの名無しさん2016/08/28(日) 01:55:42.67ID:60yVMOKI
デストラクタ以外のどこか別の場所でdeleteされてたなんてキチガイじみた状況に
nullチェックが役に立つとかどういう頭してんだよ
0211デフォルトの名無しさん2016/08/28(日) 01:55:50.77ID:qNvxLYrv
>>209
ごめん。一定レベル未満の人には回答しないことにする。
そこまでは面倒見切れん。
0212デフォルトの名無しさん2016/08/28(日) 01:56:03.58ID:Ux2eHzia
>>200
描画だけだから状態を変更しない可能性は高いし
vectorにいれてるくらいだからコピーコストは十分に低いんじゃないかと無理矢理
0213デフォルトの名無しさん2016/08/28(日) 02:00:10.83ID:qNvxLYrv
>>212
もちろん値型やstringとかならコピーでも問題はないよ。
でも状態を持った型だってしつこいくらいアピールされてるでしょ。
notifyして状態切り替えてうんぬんの箇所はその根拠となるよう書かれたもの。
問題を読めれば難しくはないはず。
0214デフォルトの名無しさん2016/08/28(日) 02:01:04.63ID:jX9FVgVh
デストラクタで解放することが分かってるのに他の場所で解放するのはクラスの使用者の責任ではないのか
0215デフォルトの名無しさん2016/08/28(日) 02:01:08.18ID:60yVMOKI
こういうバカが次から次に湧いてくるからアプリケーション層ではnewもdeleteも書くなって言ってるの
あの糞コードみたいなnewとdeleteが対になっていないようなのはその設計思想自体がバグであって
論ずる必要などはなく、こういうことやるバカは速やかにプロジェクトから排除するべし
0216デフォルトの名無しさん2016/08/28(日) 02:02:18.11ID:lPJVAstL
>>205
あ、クラス内の別の場所でdeleteを追加した場合にnull代入が要るって話してんのかな?
それだと>204への答えにはなってないし、>179の「問題」はクラス定義が全部見えてるのに、
コード追加でバグる可能性を考え始めたらきりがないでしょ。

コード変更による多重deleteの心配するなら、他の問題への対処も含めてunique_ptrを使えばいい話しだし。
0217デフォルトの名無しさん2016/08/28(日) 02:04:40.29ID:qNvxLYrv
>>216
>>211
0218デフォルトの名無しさん2016/08/28(日) 02:06:59.88ID:jX9FVgVh
ここまで1行も無し
やっぱり口だけか
他のフォーラムじゃあり得ないな
0219デフォルトの名無しさん2016/08/28(日) 02:08:06.28ID:a4amypBO
最初からnullptrで渡されることがあるんじゃないの
nullptrチェックしても別の場所でdeleteされてるかどうかなんか判断出来なくない?
ポインタのポインタ使って他所でdeleteした時にnullptr入れてるならわかるけど
0220デフォルトの名無しさん2016/08/28(日) 02:09:26.72ID:7bU6M/B0
デストラクタ内でdelete&nullptr代入しておけばデストラクタ呼び出し後に
外でdeleteされても大丈夫と理解しました

でも、デストラクタ呼び出しより先に外でdeleteされてnullptrが代入されてない場合はダメですね
0221デフォルトの名無しさん2016/08/28(日) 02:27:55.51ID:lPJVAstL
>>220
大丈夫じゃないから、騙されないで。
0222デフォルトの名無しさん2016/08/28(日) 02:50:59.20ID:a4amypBO
ポインタがコピーされてるから内部と外部じゃ別物だよ
片方にnullptr代入したってもう片方は変わらない

これnewして直でコンストラクタに入れるんかな
それならコピーでもされない限り外部で消されることは無いけど
0223デフォルトの名無しさん2016/08/28(日) 02:56:39.81ID:jX9FVgVh
スマポだって外部でdeleteされることなんか考慮してない
正しい使い方をしない方に全ての責任があるから考慮する必要性がない
0224デフォルトの名無しさん2016/08/28(日) 03:50:58.71ID:VK4fyJjM
まさかポインターのコピーがわかってない奴がいようとは驚きだ
それより例外安全が考慮されていないのが気になって仕方ない
0225デフォルトの名無しさん2016/08/28(日) 03:54:18.30ID:d5NA/60H
また無意味な部分にツッコミを入れてるのか
バグを見つける為の例題なのであって
完全なコードを示してるわけではないってのが理解できないのかな
0226デフォルトの名無しさん2016/08/28(日) 04:21:07.87ID:hSYh5tBq
>>225
簡略化したはずのコードに無意味なnullポインタチェックがあるのはなんでなん?
簡略化する前ですら冗長なのに
0227デフォルトの名無しさん2016/08/28(日) 06:24:16.40ID:a4amypBO
速攻指摘されてるじゃん
0228デフォルトの名無しさん2016/08/28(日) 06:32:42.06ID:VK4fyJjM
>>226
>>225の理屈だと、矛盾以外の不足は「完全なコードじゃないから」になってしまうらしいから
本当は開始・描画・終了の全てにチェックがあったのを一部省略してるだけだろう
0229デフォルトの名無しさん2016/08/28(日) 07:20:04.01ID:ERRoyT16
>>197
論文見たら全てが策定中になっちゃうのかよ
おめでてーな
0230デフォルトの名無しさん2016/08/28(日) 07:40:09.72ID:hSYh5tBq
>>228
デストラクタでdeleteする前にviewObjに対してなにかしてるって事?
もしそうならもっと糞コードやん。
viewObj自身で片付けろよと。
0231デフォルトの名無しさん2016/08/28(日) 07:47:04.27ID:ERRoyT16
ビューポートがビューを破棄するクソ設計にこれ以上突っ込まないでw
0232デフォルトの名無しさん2016/08/28(日) 08:20:20.55ID:lCXt6uga
>>200
>>183
0233デフォルトの名無しさん2016/08/28(日) 21:30:38.37ID:NaGSjNyA
質問
実引数が2個以上必要なコンストラクタをexplicitにする意味ってある?
0234デフォルトの名無しさん2016/08/28(日) 21:34:04.63ID:NaGSjNyA
自己解決しました。
すみません忘れて
0235デフォルトの名無しさん2016/08/30(火) 08:09:06.98ID:ftymYuoJ
ハゲの好きそうなコード
f ( { p1, p2, p3 } ) // explicitだとエラー
0236デフォルトの名無しさん2016/08/30(火) 15:46:08.79ID:0Xvfpf4x
ハゲの嫌いなことは、言語に機能を追加すること。
もともとC with classesとか始めた張本人がハゲなんだけど、
まあ今のC++を見てると気持ちはわかるね。
0237デフォルトの名無しさん2016/08/30(火) 19:30:10.07ID:0Xvfpf4x
ハゲの論理を、ハゲロンという。
1価の陰イオンとなる第17族元素である。
0238デフォルトの名無しさん2016/08/30(火) 23:18:33.93ID:lqTGpbVF
もっと増やせと言いたいところだがこれ以上大きく変えるような機能はあるのか?
C#みたいなプロパティは欲しいけど
0239デフォルトの名無しさん2016/08/30(火) 23:37:14.11ID:ocxqe0WR
そんなんtemplateで書けばいいじゃん
0240デフォルトの名無しさん2016/08/30(火) 23:42:07.71ID:xMG6EfaL
は?テンプレートでC#のようなプロパティどうやって実現するんだ?
0241デフォルトの名無しさん2016/08/31(水) 00:35:52.45ID:ityOLHmm
それっぽいのは出来なくはなさそうだけど
プロパティの簡潔さには程遠いな
0242デフォルトの名無しさん2016/08/31(水) 00:39:34.42ID:yHeo0PbI
C#を知らんやつにも分かるように説明汁
0243デフォルトの名無しさん2016/08/31(水) 01:23:54.91ID:/ANAyxIk
こんな感じか?
きっちり書くと更に手間かかるな
https://ideone.com/HVRzE1

C#だとこう書ける
https://ideone.com/idjL0A
0244デフォルトの名無しさん2016/08/31(水) 01:38:11.88ID:1fkGDbVO
>>240
> は?テンプレートでC#のようなプロパティどうやって実現するんだ?
今年一の名言だなw
0245デフォルトの名無しさん2016/08/31(水) 01:57:19.27ID:6ukDv4b6
>>243
ダッサ
お前C#のプロパティの便利さ全然理解してないね
0246デフォルトの名無しさん2016/08/31(水) 01:59:51.36ID:j3ifnVdn
何が名言なのかさっぱり分からんのだが
こんな書き方で満足する人いるの?
0247デフォルトの名無しさん2016/08/31(水) 02:07:02.38ID:BDrnIBJY
C++のstd::vector<bool>がクソ扱いされていることを
理解している気配は全く無いな
0248デフォルトの名無しさん2016/08/31(水) 02:09:05.10ID:BDrnIBJY
むしろ今年一の名言は>>211
0249デフォルトの名無しさん2016/08/31(水) 02:21:29.37ID:/ANAyxIk
>>245
アスペ
0250デフォルトの名無しさん2016/08/31(水) 02:44:37.65ID:AgvBQXnk
プロパティって最初に採用されたのはVBっていうかCOMだよね確か。
0251デフォルトの名無しさん2016/08/31(水) 09:31:40.10ID:+TzIiYAW
プロパティも欲しいけど簡単に使える部分配列も欲しいな
0252デフォルトの名無しさん2016/08/31(水) 09:57:43.27ID:WLaQrr/5
>>243
なんじゃこりゃ。全然違うじゃん。
これをC#のプロパティと思ってるの?
もっと普通のケース(各メンバ変数にgetメソッドとsetメソッド)
で例示してくれよ。
0253デフォルトの名無しさん2016/08/31(水) 10:03:12.25ID:WLaQrr/5
こういうコードをC#のプロパティのように
テンプレートで実装する方法を書けっつってるのに、
なんであんなひねくれた例が出てくるんだよw

class employee
{
public:
employee(int id, std::string name);
int GetID();
void SetID(int id);
std::string GetName();
void SetName(std::string name);
private:
int id;
std::string name;
}
0254デフォルトの名無しさん2016/08/31(水) 10:03:54.93ID:sRpVtXPN
ほならね
0255デフォルトの名無しさん2016/08/31(水) 10:14:08.99ID:WLaQrr/5
上のダサい例だとgetterやsetter書くよりコードも複雑化してるじゃねーか。
意味ねーじゃん。
0256デフォルトの名無しさん2016/08/31(水) 10:40:08.79ID:N4JrJ9XH
プロパティやりたいならC++Builder
0257デフォルトの名無しさん2016/08/31(水) 11:12:33.68ID:utsO37AQ
お手本はよ
0258デフォルトの名無しさん2016/08/31(水) 11:18:56.64ID:N4JrJ9XH
こういうコードをC#のプロパティのように
テンプレートで実装する方法を書けっつってるのに、
なんであんなひねくれた例が出てくるんだよw

class employee
{
public:
employee(int id, std::string name);
__property int ID = { read = GetID, write = SetID } ;
__property std::string Name = { read = GetName, write = SetName } ;
private:
int id;
std::string name;
int GetID();
void SetID(int id);
std::string GetName();
void SetName(std::string name);
}
0259デフォルトの名無しさん2016/08/31(水) 11:20:17.85ID:N4JrJ9XH
うわw赤の他人のコメントまでコピペしてしもうたw

class employee
{
public:
employee(int id, std::string name);
__property int ID = { read = GetID, write = SetID } ;
__property std::string Name = { read = GetName, write = SetName } ;
private:
int id;
std::string name;
int GetID();
void SetID(int id);
std::string GetName();
void SetName(std::string name);
}
0260デフォルトの名無しさん2016/08/31(水) 11:40:45.52ID:utsO37AQ
標準で頼む
0261デフォルトの名無しさん2016/08/31(水) 11:53:46.21ID:N4JrJ9XH
標準じゃないけどめっちゃ便利やよ
0262デフォルトの名無しさん2016/08/31(水) 12:18:33.24ID:XvHw9frf
教えてください。

Qt creatorで作成しており、GUIのボタンからwin7の拡大鏡(magnify.exe)を起動したいと思っています。

問題は、shellexecuteやQProcessで実行すると拡大鏡の画面が真っ黒になり適切に使用できません。
キーボードから、winと+のショートカットでで起動すると問題なく起動すると真っ黒になることはないので、これを行いたいです。

そこで、GUIのボタンクリックでキーボードのショートカットを実行するほうほうがあれば教えていただきたいです。
よろしくお願いします
0263デフォルトの名無しさん2016/08/31(水) 13:33:26.19ID:6ukDv4b6
Qtスレに行ってください
http://echo.2ch.net/test/read.cgi/tech/1438593408/
0264デフォルトの名無しさん2016/08/31(水) 14:02:00.01ID:XvHw9frf
誘導ありがとうございます。

Qt抜きで、c++的には実現できないのでしょうか?
0265デフォルトの名無しさん2016/08/31(水) 14:22:32.78ID:mqymnS7Z
Qt使ったこと無いけど呼び出し時の権限が足りないんじゃないかな
0266デフォルトの名無しさん2016/08/31(水) 14:25:22.52ID:utsO37AQ
とりあえずsystem("magnify");して同じ症状なら別の問題
0267デフォルトの名無しさん2016/08/31(水) 16:18:18.52ID:f/lfR+US
プロパティ標準で書いたらこんな感じ?
getを使う時c#にはない()がいるけど
https://ideone.com/BazQ1D
0268デフォルトの名無しさん2016/08/31(水) 16:56:40.77ID:/MnV3wL6
リファレンサオブジェクトをpublicデータメンバで持てって?
0269デフォルトの名無しさん2016/08/31(水) 17:50:46.05ID:WLaQrr/5
>>267
合格。絶対にこんなコード書かないけど、
プロパティの要件は一応満たしている。
0270デフォルトの名無しさん2016/08/31(水) 18:02:51.48ID:N4JrJ9XH
vectorとかの配列リファレンサがこんな形だよな
0271デフォルトの名無しさん2016/08/31(水) 18:55:44.77ID:gRHWeOr5
ここを見てるとC++のダメさ加減がよくわかる。
0272デフォルトの名無しさん2016/08/31(水) 19:41:02.78ID:YUscqvM8
不要だからコア言語に追加されなかったんだろう
0273デフォルトの名無しさん2016/08/31(水) 20:06:57.16ID:XvHw9frf
>>266のアドバイスで、使い方が間違っていなさそうだったので、違う拡大鏡ソフトを使用することで解決しました
0274デフォルトの名無しさん2016/08/31(水) 20:41:02.91ID:+TzIiYAW
プロパティ不要とか苦行かよ
■ このスレッドは過去ログ倉庫に格納されています