X



C++相談室 part133
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 1fcf-H1rY)
垢版 |
2017/11/24(金) 16:52:50.43ID:WoNXR2ax0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part132
http://mevius.5ch.net/test/read.cgi/tech/1507561894/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0532デフォルトの名無しさん (ワッチョイ 17b3-qmOZ)
垢版 |
2017/12/13(水) 19:43:44.26ID:YreXArfE0
[][][] [][][] [] [][][][] [][] [][][][][] [][] [][] [] [][][][][]
[] [][][][ [][][][][] [][ [][] [] [][][] [] [][][] []
[][][][] [] [] [][][][][][ [] [][][] [][] [][] []
0533デフォルトの名無しさん (ワッチョイ 5704-IpD3)
垢版 |
2017/12/13(水) 20:46:34.93ID:SIeP7pZg0
>>527
えー?stringのメンバ呼べない?const参照してるだけだから呼べない道理はないはずだけど。
まぁ、マズそうなら一回static_castかませないとダメなんだっけ?うーむ。
まぁ、難しいことは考えずサンプルとして見てくれ。
0535デフォルトの名無しさん (ワッチョイ 57b3-wlc6)
垢版 |
2017/12/13(水) 21:31:45.92ID:VGyxWnO70
>>533
Test<std::string> T;
size_t a = T.P.size();
とかやった場合の話ね(もちろん明示・暗黙に関わらずキャストされたらいける

継承使えばメンバ関数もいけるだろうけど・・・・そうすると多分、スライシング等の問題が・・・・

そんなこんなでプロパティか、それに近い機能入ってもいんじゃね?と思っただけw
0537デフォルトの名無しさん (ワッチョイ 579f-F7Qh)
垢版 |
2017/12/13(水) 22:11:05.97ID:uoR9h+SG0
つかな、使ってもないのに使用感を予想で語るの止めい。
そりゃ話がループする。
他言語には普通にあるんだし、使ってる奴のレポートを待てばいいんだよ。


利点は、フィールド←→メソッドを変更するときに、記述変更が少なくて済むことだ。
場合によっては戻すこともあるから、その時も助かる。
従って、アジャイルで既に動いているコードを変更しまくるときには便利だが、
ウォーターフォールで基本書いて終わりなら大してメリットはない。()が付くだけだ。

これとは別に、JavaScriptの場合はフィールドとメソッドを区別してないので、オーバーヘッド無しの遅延評価にも使える。
(プロパティ《関数ポインタ、ここで遅延評価する》をフィールド《遅延評価の結果》で直接上書きできる)
C++でこれをやる場合、オーバーヘッドが生じるし、そもそもメソッドコールでいい。

結果、C++には記述上のメリットしかなく、
これはIDEが進歩してリファクタリング出来るようになれば解消する話でもある。
だからそれを待つ、という作戦もありだろうし、
それ以前にIDE側のプリプロセッサでpropertyをサポートしてしまえ、ってのもありだと思う。
まあ、あれば便利程度で、あまり本質的ではない機能なのも事実だ。
0540デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 05:16:24.25ID:fPDEs5uN0
>>537
C++を他言語にしたがるやつはどこにでも湧くダニみたいなもんだ
#define begin {
#define end }
0544デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 09:19:33.65ID:fPDEs5uN0
かつて禿がcfrontを作ったようにか
0546デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 09:38:06.70ID:fPDEs5uN0
追加する仕様によるな
禿がCに「追加した」機能はマクロじゃ済まない
0547デフォルトの名無しさん (スプッッ Sd97-xd0q)
垢版 |
2017/12/14(木) 16:58:09.71ID:WeKtNL6id
そんなにプロパティ欲しいとは思わんが、単純な値操作ならメンバの参照返すメソッド作れば事足りるんじゃね?
それよりconst地獄ってホントにあるの?
const使いまくってて体感したことないんだけと。
0548デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 17:04:38.91ID:fPDEs5uN0
メンバの参照を返したらprivateにしている意味が完全に失われるぞ
0550デフォルトの名無しさん (ワッチョイ 9ee7-iA8U)
垢版 |
2017/12/14(木) 19:25:05.92ID:xcUKDly80
自作クラスのメンバ関数にconst全く付けてないタコが聞きかじりで中途半端に付け始めて
「メソッド呼べない!ムキー!このconstってやつ使えねー」ってパターンが大半だと思ってる
0551デフォルトの名無しさん (ワッチョイ 1f7f-mLIQ)
垢版 |
2017/12/14(木) 19:27:31.22ID:gH71C6kZ0
const地獄になるってことはそのコードが間違ってるって事だからな
全部直せ
0555デフォルトの名無しさん (ワッチョイ dfb3-hRZ1)
垢版 |
2017/12/14(木) 21:01:34.68ID:jk+byjKr0
No.1
1 2 3 4 5
2 3 4 5 6
No.2
1 2 3 4 5
2 2 2 2 2
3 3 3 3 3
No.3
3 4 5 6 7


No.n
というtxtファイルがあり。No.〇の次の行に整数が記入されている(何行あるかわからない)
整数の左からx1[ i ][ k ]、y1[ i ][ k ]、x2[ i ][ k ]、y2[ i ][ k ]、A[ i ][ k ]の配列にそれぞれ書き込み
もし次の行整数があればi+1をしまたそれぞれの配列に整数を書き込む
もし次の行に整数がなければ(No.の行)k+1を次の行にいき整数をそれぞれの配列に書き込む。
これをNo.nまで繰り返す。

このプログラムをfopenを使ってプログラムどなたかつくってくれませんかー?
0560デフォルトの名無しさん (ワッチョイ 92a6-ak+6)
垢版 |
2017/12/15(金) 09:14:14.38ID:2/eH7rfa0
>>559
どういう意味?
0562デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/15(金) 11:55:37.18ID:GBd6F7vt0
>>561
std::shared_ptr<int> a{std::make_shared<int>()};
delete a; //C2440
0565デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/15(金) 16:14:46.51ID:GBd6F7vt0
>>564
後出しはきたねえよ
0567デフォルトの名無しさん (ワンミングク MM42-B5ak)
垢版 |
2017/12/15(金) 18:52:20.56ID:6JtV0wHMM
そんなもん何の役にたつのか解らんわ
0569デフォルトの名無しさん (ワッチョイ 9ee7-iA8U)
垢版 |
2017/12/16(土) 06:55:04.26ID:7q5uIVqU0
ところでスマポのコンストラクタの書き方ってどっちがいいの?

class Foo
{
std::shared_ptr<Bar> bar;
Foo(): bar(new Bar(42, 100.5, "xxx")){}
Foo(): bar(std::make_shared<Bar>(42, 100.5, "xxx")){}
};

下の書き方されてるのよく見るけどこれって
「newがあるのにdeleteがない!111」って発狂するアホコードチェッカを黙らせる以外にメリットなんかあるの?
0572デフォルトの名無しさん (ワッチョイ ff78-H+11)
垢版 |
2017/12/16(土) 07:29:56.22ID:O0/bhlaM0
俺もmake_uniqueはいらねーよなぁって思ってたけど使った方が例外安全なんだとよ
0573デフォルトの名無しさん (ワッチョイ 1f7f-mLIQ)
垢版 |
2017/12/16(土) 09:33:48.78ID:RDTsLSUc0
むしろmake_uniqueが11に無くてキレた
0574デフォルトの名無しさん (ワッチョイ a7b3-mLIQ)
垢版 |
2017/12/16(土) 22:08:09.44ID:d76HZF+i0
point cloud libraryというライブラリを読んでいます。

kdtreeクラスはsearchクラスをパブリック継承しており、
kdtreeクラスの冒頭で、searchクラスのデータメンバやメンバ関数の一部をusingしています。

これはどういう意味があってやっているのか教えて頂けないでしょうか。
0576デフォルトの名無しさん (ワッチョイ ef04-RjCm)
垢版 |
2017/12/17(日) 18:17:59.07ID:4ntht7mR0
質問です。

#include "classB.h"
class A{
private:
B* b;
public:
void set(B* b){this->b=b;}
B* get(){return b;}
};

クラスAのメンバーにクラスBのポインタとアクセサがあります。
しかし、set()を使わずに、get()を使ってメンバーにアクセスできてしまいます。
例:a->get()=b;

ポインタではなく、複製したインスタンスを返すことも考えたのですが
クラスBのサイズが非常に大きいため、
可能であれば複製はしたくありません。

どうかご助力をお願い致します。
0579デフォルトの名無しさん (ワッチョイ ff78-H+11)
垢版 |
2017/12/17(日) 18:37:56.02ID:iUXjeeD00
B* b = nullptr;
B* get(){ assert(b != nullptr); return b;}

こうでもしとけばいいよ
0583デフォルトの名無しさん (ワッチョイ ef04-RjCm)
垢版 |
2017/12/17(日) 18:56:03.60ID:4ntht7mR0
>>577-582
ありがとうございます!
なるほどconst、普段しっかり使っていないツケが来ましたorz
ただ、そのままだと代入できなかったので、勉強してきます。
ありがとうございましたm( _ _)m
>>580
すみません、ご指摘の通りです。ありがとうございます!
0586デフォルトの名無しさん (ワッチョイ 921b-zGdT)
垢版 |
2017/12/17(日) 20:35:52.39ID:eYk9JmcH0
gtkmmググっても英語含めて17ページしかないんだわ(´・ω・`)
0587デフォルトの名無しさん (ワッチョイ 72bd-E651)
垢版 |
2017/12/17(日) 20:39:57.73ID:wJJJkdkz0
オブジェクトの内部データへの変更を許すフリーパスを外に与えるようなsetterやgetterはNG、

しかしあまり杓子定規にそれを言い立てるとファイルハンドルとかもgetterで返して良いかどうかビミョーに…
ファイルはオブジェクトの内部データではないお客様という解釈で乗り切る?
0588デフォルトの名無しさん (ワッチョイ af39-zS+j)
垢版 |
2017/12/17(日) 22:46:35.33ID:AbfI68c80
いいわけないだろ
教条主義にとらわれていると
そういうことがわからなくなる
0592 ◆QZaw55cn4c (ワッチョイ b260-E7Ol)
垢版 |
2017/12/18(月) 00:10:07.85ID:gAjOsIcg0
>>295 >>292
accelerated c++ をぼちぼちやっています。
>>295 にもバグがあり、正しくは
https://ideone.com/sK4aJ2

一行を最後まで読んでしまったのなら、即座にループを抜けないといけない
なんだか最近 while() の使い道がなくなってきたように思えるのです…いつも for(::) { break; } ばかり書くようになってしまった…
0594 ◆QZaw55cn4c (ワッチョイ b260-E7Ol)
垢版 |
2017/12/18(月) 00:20:14.98ID:gAjOsIcg0
>>593
停止性の確認を行った後、余計なことを一切してはいけない、という制約が加わると
途中判定の break 脱出以外に手がない、と考えています
あまり思い出したくないんですが、DOS/Windows の findfirst/findnext なんかも似た類かと
0596デフォルトの名無しさん (ワッチョイ d298-Ll2t)
垢版 |
2017/12/18(月) 02:19:29.29ID:+LmA4Igx0
アプリケーション上で確保されたヒープ領域を追跡したいです。
operator new/delete と allocator を弄ればできると思い調査していたころ
「プログラミング言語C++ 第4版」P997 に
「標準ライブラリのすべてのコンテナは、newによってメモリを確保して、deleteによって解放するデフォルトアロケータを(デフォルトで)もっている」
と書かれていました。つまり、new をグローバルでオーバーロードすれば追跡可能です。
実際、手元のコンパイラでは std::vector のメモリ確保と解放を追跡できました。
ここまでの内容は規格で保証されている事柄ですか?
実際のアプリケーションに組込むことを考えています。
0598デフォルトの名無しさん (ワッチョイ b780-AB+M)
垢版 |
2017/12/18(月) 03:43:10.43ID:vrG0ZJDQ0
>>596
>アプリケーション上で確保されたヒープ領域を追跡したいです。
つgperftools
0599デフォルトの名無しさん (ワッチョイ 1233-4pIx)
垢版 |
2017/12/18(月) 07:43:59.76ID:dmyIL21e0
>>596
std::allocator<T> (The default allocator) についての [allocator.members] で規定されてる。
> Remarks: the storage is obtained by calling ::operator new, but it is unspecified when or
> how often this function is called.

標準コンテナにアロケータを指定しなければ std::allocator が使われるから、それでいける。
「実際のアプリケーション」に変なものが混ざってなければね。
0602デフォルトの名無しさん (ブーイモ MMdb-ak+6)
垢版 |
2017/12/18(月) 12:58:24.39ID:D6kxD+M8M
>>596
グローバルnew/deleteのオーバーロード自体は、規格で許されてるので合法。

ただ、注意深くやらないと吹っ飛ぶ。
とある処理系の標準ライブラリで、ユーザー回避不可能な不具合に当たったこともあった。
0604デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/19(火) 13:02:14.85ID:MoA6J0CR0
うむ、ご苦労。
0605デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 13:42:16.45ID:63AN+5MK0
sleep_untilで「何秒後」ではなく「何時に」という絶対時刻を指定する方法なんだけどさ
mktimeとfrom_time_tを使う方法しかないかね? なんかダサくてやなんだけど
0607デフォルトの名無しさん (ワッチョイ b723-54vE)
垢版 |
2017/12/20(水) 22:19:15.39ID:WOX+3yjn0
IDE:Visual Studio Express 2015 for Windows Desktop
浮動小数点モデル設定:Fast Math
コンパイルモード:Release

wWinMain関数内で

wchar_t str[ 16 ];

DirectX::XMMatrixOrthographicLH( 1.0f, 1.0f, 0.0f, 1.0f );

for( int i = 0;; i++ )
{
 float f = i;

 if( f > 0.0f ) break;

 swprintf_s( str, L"%f", f );
}

と書くと、swprintf_sの結果が、期待される0.0ではなく、-0.0になります。
swprintf_sの行と上のif文の行を入れ替えると、0.0になります。

XMMatrixOrthographicLHがなかったり、Debugモードだったり、
Fast MathではなくデフォルトのPreciseだったりすると、
行の入れ替え関係なく0.0。

-0.0になるときは、何が始ま・・・起こってるんです?
0611607 (ワッチョイ 0323-of2o)
垢版 |
2017/12/21(木) 01:46:36.50ID:tbJ2Dsuk0
>>608
やっぱそれですよね(汗)

>>609
やはりそうですか・・・。
詳しい方なら、何が起こっているかだいたい読めたりしないかなと期待しましたw

>>610
たしかに、符号ビットがコロコロしてそうな感じですよね。
ちなみにif文で比較する定数は1.0fとか2.0fでも結果は同じになりますので、
swprintf_sだけが残るためではないですね。
0612デフォルトの名無しさん (ワッチョイ cf3f-tRgI)
垢版 |
2017/12/21(木) 08:39:02.54ID:ZD2kjVCM0
>>606
thx
0613デフォルトの名無しさん (ワッチョイ ff1b-7a68)
垢版 |
2017/12/21(木) 14:03:31.02ID:T6iOcz130
Gtkmmは4.0も出たのに、詳しい解説ページは2.4のママ・・・(´・ω・`)

でも俺はAPI見ながら頑張るぜ!
0620デフォルトの名無しさん (スプッッ Sd1f-k/7O)
垢版 |
2017/12/22(金) 06:57:32.16ID:v69hnew3d
基本的な動作について知りたい
msgrcvは、msgsndされた瞬間にキューがたまるから、キューが追加されたと同時に待機状態をやめて動き出す

これであってる??

あと、msgsndする先やmsgrcvで確認する先はmsggetで動的に確保された番号を知らないといけない
こうであってるかな?
0621デフォルトの名無しさん (ワッチョイ a378-STQK)
垢版 |
2017/12/22(金) 10:05:15.55ID:H4ZK8i5q0
知らんわその関数の実装者に聞いてくれよ
0623デフォルトの名無しさん (ブーイモ MM67-Wig1)
垢版 |
2017/12/23(土) 00:52:53.65ID:KIhrhFKZM
>>620
TRON系のOSかな?
0624デフォルトの名無しさん (ワッチョイ 339f-mAIl)
垢版 |
2017/12/23(土) 09:50:06.14ID:DCeTZoHD0
これ実行すると0と2が表示されるので一応は問題ないですか?汚いとは思うけど。

int main(void)
{
vector<int> vec;
vec.push_back(0);
vec.push_back(1);
vec.push_back(2);

for(vector<int>::iterator ite = vec.begin(); ite != vec.end();){
if(*ite == 1){
vec.erase(ite++);
printf("num: %d\n", *ite);
}else{
printf("num: %d\n", *ite);
++ite;
}
}

return 0;
}
0626デフォルトの名無しさん (ワッチョイ 7f25-I6sZ)
垢版 |
2017/12/23(土) 10:16:01.07ID:pfQ4NECA0
おっと、質問は問題あるかどうかだった。
結論から言うと、問題はある。
0〜2までではなく0〜3までvectorに入れてから実行すれば、
まともに動作していないのは分かるはず。
0627デフォルトの名無しさん (ワッチョイ 339f-mAIl)
垢版 |
2017/12/23(土) 11:00:02.97ID:DCeTZoHD0
>>626
やっぱこうしないとダメですね。
ite = vec.erase(ite);
どうもでした。
0628デフォルトの名無しさん (ワッチョイ 339f-mAIl)
垢版 |
2017/12/23(土) 11:17:57.62ID:DCeTZoHD0
一応はこれでもいけるってことですかね?削除した時は次の要素になるという理解でいいですか?
for(vector<int>::iterator ite = vec.begin(); ite != vec.end();){
if(*ite == 1){
vec.erase(ite);
}else{
++ite;
}
}
0630デフォルトの名無しさん (ワッチョイ 339f-mAIl)
垢版 |
2017/12/23(土) 11:40:33.04ID:DCeTZoHD0
これlistとvectorでも違いました。

listだと++しないと正常に動作せず
for(list<int>::iterator ite = lst.begin(); ite != lst.end();){
lst.erase(ite++);
}
vectorだと++すると上手く動作しない
for(vector<int>::iterator ite = vec.begin(); ite != vec.end();){
vec.erase(ite);
}

でもeraseの戻り値取得するのが一番いいですね。
0631デフォルトの名無しさん (ワッチョイ 7f25-I6sZ)
垢版 |
2017/12/23(土) 11:45:41.24ID:pfQ4NECA0
std::vector::eraseのリファレンスに、こう書いてある。

https://cpprefjp.github.io/reference/vector/erase.html
削除された要素またはそれ以降の要素を指すイテレータや参照は無効になる。

これによると、vec.erase(ite); 実行後にはiteが無効になることになる。

あなたの環境だと、たまたまiteが削除した次の要素になったのかもしれないが、
それがすべての環境で成り立つ保証はない。
■ このスレッドは過去ログ倉庫に格納されています

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