トップページ⇒tech
1001コメント243KB

C++相談室 part99

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/02/21(木) 17:37:08.31
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part98
http://toro.2ch.net/test/read.cgi/tech/1347964922/

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

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
0159デフォルトの名無しさん2013/02/28(木) 09:56:46.26
本来はconstの参照などメンバに持たず、単に参照をメンバに持つ
こうすればコピーしか初期化出来なくなるので正常動作するわけだ
0160デフォルトの名無しさん2013/02/28(木) 10:26:03.94
そんなバッドノウハウは忘れていいよ
0161デフォルトの名無しさん2013/02/28(木) 10:29:53.35
C++FAQに書いてあるんだが・・・
0162デフォルトの名無しさん2013/02/28(木) 10:53:28.22
VCとかじゃ通用しないテクニックだし
右辺値禁止したければオーバーロードをdeleteするのが正道なんだよなあ
0163デフォルトの名無しさん2013/02/28(木) 10:56:00.16
C++使いって基本アホだよな
0164デフォルトの名無しさん2013/02/28(木) 10:58:09.34
そうだよアホだよ
0165デフォルトの名無しさん2013/02/28(木) 11:02:29.68
なんだ、俺は例外中の例外の異端児だったのか
0166デフォルトの名無しさん2013/02/28(木) 11:11:19.32
ハンドルされていない例外が発生しました
人事部にお問い合わせください
01671262013/02/28(木) 12:34:17.03
>>127
なるほど、
>C c(*s);
で生成されたオブジェクト '*s' は一時オブジェクト、コンストラクタのコールが終わると消えてC::printf() までは生きていないと。
http://toro.2ch.net/test/read.cgi/tech/1359924126/294 ではよくある返り値の一時オブジェクトが話題でしたが、今度は引数の一時オブジェクト例とは、感謝。

>なんだQか
どうしてそう思ったの?
0168デフォルトの名無しさん2013/02/28(木) 12:57:18.10
戻りの束縛は有用だけど、引数の束縛は何のメリットもないぞ。
0169デフォルトの名無しさん2013/02/28(木) 14:06:33.92
>>168
いいんだって
それより文法を正しく理解しているかどうかだ
0170デフォルトの名無しさん2013/02/28(木) 14:13:56.71
C++0xで追加されたrandomを使おうと思うのですが、
std::mt19937 myrand();
の()内に乱数の種を入れることはわかったのですが、
ここではsrand()のように、種を入れる初期化用関数は存在しないのでしょうか?
初期化用の処理にsrand()を入れていたので、どうしていいのか戸惑っています
0171デフォルトの名無しさん2013/02/28(木) 14:18:29.06
インスタンスごとに独立してない種なんか本当に欲しいか?
0172デフォルトの名無しさん2013/02/28(木) 14:21:31.69
myrand(初期化用の数値)
0173デフォルトの名無しさん2013/02/28(木) 14:53:54.98
>>158
なに言ってるんだ?
>constの参照はコンストラクタで初期化しないとコンパイルエラーになる
当たり前だカス。ドヤ顔でいうことじゃないだろ。
お前がド素人丸出しなんだよ。
それに何よQって?知らんよそんなもん
0174デフォルトの名無しさん2013/02/28(木) 15:43:53.57
◆QZaw55cn4c
0175デフォルトの名無しさん2013/02/28(木) 15:57:39.44
ようQ
顔真っ赤にしてファビョらなくてもいいぞ老害
0176片山博文MZパンク ◆0lBZNi.Q7evd 2013/02/28(木) 20:19:56.19
class MyRand {
static unsigned m_seed;
std::mt19937 m_rand;
public:
MyRand() : m_rand(m_seed) {
}
...
};

unsigned MyRand::m_seed;

void MySRand(unsigned seed) {
MyRand::m_seed = seed;
}
0177デフォルトの名無しさん2013/02/28(木) 20:20:16.83
ム板もそうだが、マには精神壊れている奴が多いよな
そんな奴が就くからドカタ職業になるんだろうなと思う
いや、ドカタ職業だから精神壊れている奴ぐらいしか就かないのかも
0178デフォルトの名無しさん2013/02/28(木) 21:02:19.68
>>176
friend か public が必要だけどね。
0179デフォルトの名無しさん2013/02/28(木) 21:26:56.69
>>177
精神の壊れ方にもいろいろ種類があるけど、他人に迷惑を掛けない壊れ方(自己破壊的)と、
他人に迷惑を掛けまくり(他罰的)な壊れ方の二種類に大別出来る。

前者は統失・双極性障害・うつ病、後者は人格障害がほとんど。後者はアスペではないかと
思う人もいるかもしれないが、それは単にアスペが人格障害を伴っている場合が多いから。
0180デフォルトの名無しさん2013/02/28(木) 22:20:16.61
無駄な分類をするのも習い性だな
01811702013/02/28(木) 23:19:28.02
>>171
いえそういうことではなく、乱数クラス内に種を渡す用のメンバ関数がないのかなと思ったのです

>>176>>178
ありがとうございます。しかしかえって使いにくくなっているような気がしますが…

皆さまありがとうございました、自己解決しました。
ttp://ideone.com/6QYWl1
例えばあるクラスで使う場合、コンストラクタで初期化をするのはどうすればいいのかと思っていたのですが、
このようにすればいいのですね。
0182デフォルトの名無しさん2013/02/28(木) 23:19:46.26
無駄な分類(クス

分類せずに人を見る事が可能だと思ってるのか?

プログラムで言えばソートアルゴリズムにいろいろあるようなもんだ
0183デフォルトの名無しさん2013/02/28(木) 23:24:56.87
>>181
解決したようだけど一応、種の再初期化をしたいってことならseedメンバ関数がある。
0184デフォルトの名無しさん2013/02/28(木) 23:35:49.16
なんだ、またいつもの粘着君かよ
0185デフォルトの名無しさん2013/02/28(木) 23:56:09.93
(クス

これは流行る
01861702013/03/01(金) 01:29:46.12
>>183
あ、あるにはあるのですね。ありがとうございます。
01871262013/03/01(金) 02:42:21.24
const 修飾子の有無によって、メモリイメージが変わるものなの?
0188デフォルトの名無しさん2013/03/01(金) 02:46:46.78
メモリイメージって何のこと言ってるのかな?
01891262013/03/01(金) 03:16:18.13
>>188

>>127を例にとると
C::C(const std::string& s) : cs(s) {}
に対して C c(*s); としたときにスタック上に展開される *s の内容と
C::C(std::string& s) : cs(s) {}
に対してのそれとが異なるかどうか?

あるいは一般的に const をつけるかつけないかで、スタック上に展開される内容が異なるかどうか、気になるのです。
0190デフォルトの名無しさん2013/03/01(金) 04:15:14.40
変わらないよ
その場合constは魔法でも何でもない
ただ書き換えのエラーチェックがコンパイル時に為されるだけ
0191デフォルトの名無しさん2013/03/01(金) 04:16:09.94
実体は単なるポインターでしかないんだから
0192デフォルトの名無しさん2013/03/01(金) 08:01:03.66
>>189
気になるなら自分でアセンブリ吐かせて見ろよ。
0193デフォルトの名無しさん2013/03/01(金) 10:19:49.22
>>189
強いて言えばリファレンスをメンバに持たせるとそのメンバはコンストラクタで必ず初期化しないと
コンパイルが通らない位の違い
0194デフォルトの名無しさん2013/03/01(金) 20:25:00.31
レファレンスってポンタ渡ししてデリファレンスを自動でやるぽ機能だろ
ho(T&& ge)の場合、引数にはポンタ以外何か渡しているのか
01951262013/03/01(金) 21:49:39.03
>>191
http://toro.2ch.net/test/read.cgi/tech/1354116880/806 でそう書いたらぼろくそだった‥‥
0196デフォルトの名無しさん2013/03/01(金) 23:32:58.04
>>195
そこであなたが言ってることはほとんど正しいと思うけどね
ボロクソ言ってる奴は何も考えていないシッタカ素人としか思えない
参照がポインタconstの糖衣構文とは言い切れないのって
const参照による一時オブジェクト束縛くらいじゃないの?

そうじゃないって言うなら、そうじゃない例を挙げて欲しいものだよ
0197デフォルトの名無しさん2013/03/01(金) 23:46:01.85
配列の扱いがまず違う。
0198デフォルトの名無しさん2013/03/02(土) 00:30:45.10
ポインタと参照は概念が違うのに、実装が同じという理由だけで故意か低脳なのか
混同している輩には呆れる
0199デフォルトの名無しさん2013/03/02(土) 00:48:26.96
また社会的に弱いのがわいてきたな
0200デフォルトの名無しさん2013/03/02(土) 01:00:10.53
概念ガー
0201デフォルトの名無しさん2013/03/02(土) 01:32:42.82
無能な味方とか蛇足でスレが縞模様になるのは避け様の無い現実。
0202デフォルトの名無しさん2013/03/02(土) 02:50:34.74
>>198
混同している、とはどういう意味?今現在混同している事例が進行中なの?
0203デフォルトの名無しさん2013/03/02(土) 03:00:58.98
>>202
その前にお前は敵なのか味方なのかそれをはっきりさせろ
0204デフォルトの名無しさん2013/03/02(土) 03:02:24.29
敵(笑)味方(笑)
無能の言うことはいつもこれ
0205デフォルトの名無しさん2013/03/02(土) 09:35:00.44
自己顕示が目的だからな
0206デフォルトの名無しさん2013/03/02(土) 10:10:30.20
このスレで餌付けに成功しただけ
0207デフォルトの名無しさん2013/03/02(土) 11:45:49.73
今日もQzは炎上学習法の実践中
0208デフォルトの名無しさん2013/03/02(土) 12:26:11.80
餌付けされたのは金魚の糞のほうであって金魚は昔からいたというか人気に嫉妬
0209デフォルトの名無しさん2013/03/02(土) 13:22:24.76
低能ってホント女の腐ったような発想しかしないんだな
0210デフォルトの名無しさん2013/03/02(土) 13:58:05.02
c系スレは雑談、罵倒がたくさんないとつまらんよな
APIスレみたいになると楽しいよな
0211デフォルトの名無しさん2013/03/02(土) 16:14:45.45
wcsncpy_sについて教えてください。
今、次のようなコードがあるとします。

wchar_t * src = L"aabbcc";
wchar_t dest[3];
size_t lenToCpy = 2;
wcsncpy_s(dest, 3 * sizeof(wchar_t), src, lenToCpy);
dest[6] = L'\0';

"aa"だけコピーしたいんですけど。
使い方はこれであってますか?

なんか、wcsncpy_sでsrcの長さ(この場合6文字xsizeof(wchar_t) = 12バイト)だけdestが0xfeで埋められてから
len文字分だけコピーされているように見えます。@VS2008

なのでdestでヒープが壊れるってデバッグ終了時に言われるんですが。。
(この例ではdestはローカルだけど、実際にやってるコードだとヒープです。)
0212デフォルトの名無しさん2013/03/02(土) 16:19:47.41
>>211
>dest[6] = L'\0';
ダメ
0213デフォルトの名無しさん2013/03/02(土) 16:21:10.46
>>212
あ、すみません。。
そこは2chに書くときに治し忘れてました。。dest[2]=L'\0'って読み替えてください。。
本当に申し訳ない。
0214デフォルトの名無しさん2013/03/02(土) 16:24:00.68
>これらの関数のデバッグ バージョンは、最初に 0xFE のバッファーに格納します。
>この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。

正常動作ですが何か
0215デフォルトの名無しさん2013/03/02(土) 16:45:35.26
>>214
え?
FEで埋めるのはいいんですが、与えられたバッファサイズを超えて埋めるのってどうなんですか?

なんか追っかけていくと最後に_FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
って処理があって、これがバッファをバーンと壊してますね。
その直前まではいい感じなのに。
0216デフォルトの名無しさん2013/03/02(土) 16:45:35.54
第2引数はバイト数じゃなくて文字数だろ。
マニュアルちゃんと読めよ
0217デフォルトの名無しさん2013/03/02(土) 16:46:40.72
wcsncpy_s の第二、第四引数はバイト数じゃなくて要素数
3 * sizeof(wchar_t) の * sizeof(wchar_t) が要らない
0218デフォルトの名無しさん2013/03/02(土) 16:46:55.73
そもそも”3 * sizeof(wchar_t)”これ要らん
配列ならテンプレートが勝手に要素数埋めてくれる
0219デフォルトの名無しさん2013/03/02(土) 16:47:48.62
>>216
ありがとうございます!
やっぱり使い方が間違っていたんですね。
スレ汚しすみませんでした
0220デフォルトの名無しさん2013/03/02(土) 16:58:21.75
何気に0xFDで埋めると書いてあるままになってるマニュアルが(2005までは0xFD、2008からは0xFE)
0221デフォルトの名無しさん2013/03/03(日) 09:07:14.32
ヘッダファイルでincludeしたくないヘッダがあるんだけど、
template使ったらヘッダでincludeしなきゃならなくなる。
template使わない方がいいのかな?
0222デフォルトの名無しさん2013/03/03(日) 09:10:02.15
>>221
それもテンプレートにすりゃいいじゃん
0223デフォルトの名無しさん2013/03/03(日) 09:20:01.48
どういうこと?

例を出すと、Windows.hをヘッダでインクルードしないぞと決めていて、
template使ってしまうと、実装部分にSleep関数あるから困るみたいな感じ。
0224デフォルトの名無しさん2013/03/03(日) 09:23:12.51
template<class F>
void func(int a, F f) { f(a); }
で使う側で func(10, Sleep); としてやればいい
0225デフォルトの名無しさん2013/03/03(日) 09:46:52.12
なるほど
関数渡してやればいいわけですか
ありがとうございました
あとは自分の中で保守性とか考えてどうするか決めたいと思います
0226デフォルトの名無しさん2013/03/03(日) 13:18:41.66
薄いテンプレートを挟むのも良い
0227デフォルトの名無しさん2013/03/03(日) 23:29:17.69
>>222, >>226
俺質問者じゃないけど、興味あるから具体的にどうするか教えて
0228デフォルトの名無しさん2013/03/03(日) 23:48:08.45
template<void(&F)(DWORD)>void func(DOWRD a,F f=Sleep){f(a);}
0229デフォルトの名無しさん2013/03/03(日) 23:49:28.26
template<void(&F)(DOWRD)=Sleep>void func(DOWRD a){F(a);}
0230デフォルトの名無しさん2013/03/04(月) 00:11:32.68
>>229
それじゃ汎用性なさ杉
Sleepが一つならともかく、引数型・数や返値が違うapiを使うたびに書くようじゃ
おいおいじゃないか
0231デフォルトの名無しさん2013/03/04(月) 00:16:13.93
非テンプレートの基底クラスで実装して
それを継承するのが定石じゃね?
0232デフォルトの名無しさん2013/03/04(月) 02:23:19.72
template<class F, class... Args>
auto func(F f, Args... args) -> decltype(f(args...))
{ return f(args...); }
0233デフォルトの名無しさん2013/03/04(月) 03:17:04.21
>>211
String.copyValueOf(char[] data)使いなよ
0234デフォルトの名無しさん2013/03/04(月) 03:22:25.60
>>233
スレタイ見ろよ
0235デフォルトの名無しさん2013/03/04(月) 03:25:27.52
どの??
0236デフォルトの名無しさん2013/03/04(月) 03:27:25.04
C++って書いてるのが見えないのか
0237デフォルトの名無しさん2013/03/04(月) 03:33:28.25
??
0238デフォルトの名無しさん2013/03/04(月) 03:36:24.64
今気づいた。。。

    ∧_∧
     ( ・ω・ )   何も思い残すことはない
     (====)    ボコボコにされてやんよ
  ______( ⌒) )
/\   ̄`J ̄ ̄ ̄\
 ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄
        | |
      / \
0239デフォルトの名無しさん2013/03/04(月) 03:37:47.11
>>233
Javaのメソッド紹介してどうする?
0240デフォルトの名無しさん2013/03/04(月) 03:44:51.16
どういう勘違いだw
0241デフォルトの名無しさん2013/03/04(月) 20:57:34.98
>>227
亀ですまんな
薄いテンプレートは型を動的に判定する処理を書いて、テンプレートでラップする事によって型安全性を確保するもの
ttp://ideone.com/l2aW9M
他にも、特定のコンセプトを満たす型を消去したい場合はBoost.TypeErasureが使える
Boost使ってないけどおおよそ以下の感じになる
ttp://ideone.com/l2aW9M
他にもBoost.Variant(Any)など何らかの方法で型を消去してやれば処理の隠蔽が実現できる
0242デフォルトの名無しさん2013/03/04(月) 23:07:21.04
すんません、VC++使わないでDXライブラリ使う方法教えてくださいな
winでcygwin使ってます
0243デフォルトの名無しさん2013/03/04(月) 23:09:12.31
http://homepage2.nifty.com/natupaji/DxLib/dxuse.html
0244デフォルトの名無しさん2013/03/04(月) 23:09:59.23
dllのがあるから探せば?
0245デフォルトの名無しさん2013/03/04(月) 23:44:22.91
訂正
総合開発環境使わないでDXライブラリ使う方法を教えてください
0246デフォルトの名無しさん2013/03/04(月) 23:50:07.99
適切なディレクトリに置く
コード書く
コンパイルする
リンクする
0247デフォルトの名無しさん2013/03/04(月) 23:50:51.90
まず君は総合開発環境使わないでHello worldのプログラム書けるところまではできるの?
0248デフォルトの名無しさん2013/03/05(火) 00:23:33.03
BCCコマンドラインとDirectXSDKだけで開発している俺に隙はなかった
0249デフォルトの名無しさん2013/03/05(火) 00:44:45.62
>>247
普段Eclipse使っててCDTなるC/C++開発環境プラグインを導入したのだがコンパイラがついていなかった
なのでcygwin導入したもののEclipseで実行するとバイナリが見つからないチックなエラーが出る
そこで総合開発環境はあきらめて質問した
0250デフォルトの名無しさん2013/03/05(火) 00:48:12.87
なんで諦めるんだそこで!
0251デフォルトの名無しさん2013/03/05(火) 00:49:21.83
EclipseでC/C++とかドMだな
0252デフォルトの名無しさん2013/03/05(火) 01:24:36.88
VC++入れてcl.exeでも叩いてみたら
0253デフォルトの名無しさん2013/03/05(火) 09:22:27.18
MAX_PATH
の記述はOKなのに、
MAX_DRIVE や MAX_DIR は、前に _ をつけなければならない理由を教えてください。

あと、普段記述するのに、
MAX_PATH
_MAX_PATH
のどちらがいいですか?
0254デフォルトの名無しさん2013/03/05(火) 09:31:35.01
>>253
http://www.google.co.jp/search?q=%22MAX_PATH%22+%22_MAX_PATH%22
0255デフォルトの名無しさん2013/03/05(火) 09:33:39.83
Cランタイム由来(Windows APIでそれを使わない)だから
変な言い方だがWindowsアプリケーションなのかC/C++アプリケーションなのかで決めろ
_が付く→C/C++実装系の為
付かない->Windows APIのもので言語依存とか知らんがな
0256デフォルトの名無しさん2013/03/05(火) 19:57:24.85
MAX_PATHは
C言語コンパイラで決められているんですか
C言語ではなくOSで決められいるてるんですか
それとも、他のなにかでですか
0257デフォルトの名無しさん2013/03/05(火) 20:14:51.81
OSの提供するヘッダかな
0258片山博文MZパンク ◆0lBZNi.Q7evd 2013/03/05(火) 21:33:52.52
だからMAX_PATHはWindows APIで定義されているんだってばよ
■ このスレッドは過去ログ倉庫に格納されています