[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 01/02 08:18 / Filesize : 209 KB / Number-of Response : 862
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part62



1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part61
pc11.2ch.net/test/read.cgi/tech/1205059063/

620 名前:デフォルトの名無しさん [2008/07/03(木) 12:12:50 ]
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
  shared_ptr<BBB> bbbptr;
public:
  AAA() {
    bbbptr = new BBB;
  }
  shared_ptr<BBB> getBBB1() {
    return bbbptr;
  }
  shared_ptr<BBB>& getBBB2() {
    return bbbptr;
  }
  BBB* getBBB3() {
    return bbbptr;
  }
};


621 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 12:55:48 ]
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。

622 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:00:22 ]
#include <stdio.h>

int main(void)
{
float f;

for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);

return 0;
}

このプログラム実行したら

2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999

と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?


623 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:07:39 ]
>>622
float -> double
もしくは
二進化十進表現でgoogle

624 名前:デフォルトの名無しさん [2008/07/03(木) 13:16:32 ]
>>623
できました><
floatって精度かなり悪いみたいですね・・・

625 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:40:07 ]
>>622
つうか思いっきりC言語じゃね?

626 名前:デフォルトの名無しさん [2008/07/03(木) 13:48:35 ]
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?

できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?

627 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:57:25 ]
マングリング
extern "C"

628 名前:デフォルトの名無しさん [2008/07/03(木) 16:25:02 ]
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。



629 名前:デフォルトの名無しさん [2008/07/03(木) 17:52:58 ]
誰か教えてください。。。

現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。

だれかご存知の方がいましたらご教授いただけると助かります。。

以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);

// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));

よろしくお願いします。

630 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:03:14 ]
スレ違い、Win32APIスレで聞いたら

631 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:18:18 ]
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。

632 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:49:12 ]
BBB2も代入できるだろ

633 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:52:38 ]
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?

634 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:54:36 ]
元から (C89から) そうでは?

635 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:59:52 ]
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?

636 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:08:27 ]
変数のスコープのこといってるんじゃね?

637 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:11:41 ]
>>636
そもそも{}で囲まないと変数は定義できないだろう。

638 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:14:32 ]
もともとif文の構文は
if (expr) statement [ else statement ]

expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない

そんだけのことだ
C99とかは関係ないだろ



639 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:36:13 ]
seclan.dll.jp/c99d/c99d07.htm#dt19991108
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。

そこではこういう例が載せられている。
if (x)
  int i;
このルールによって、if文を抜けたらiはもう使えないという具合。

>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。

640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:17:21 ]
>>639
そんなVC6の時代の知識で語られても。

641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:23:29 ]
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for


642 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:09:27 ]
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが

643 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:13:43 ]
>>642
それは生兵法というもの

644 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:30:48 ]
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね

645 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:36 ]
>>642
OpenSSL脂肪wwwwwwwww

646 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:42:59 ]
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる

647 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:56:32 ]
>>646のコードはメンテしたくない。

648 名前:デフォルトの名無しさん [2008/07/06(日) 20:25:50 ]
同じく



649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 08:09:21 ]
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。

650 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:06 ]
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです

651 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:48 ]
while(1)をやめる

652 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:19:50 ]
whileの代わりにgotoをつかえばいい

653 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:26:15 ]
>>650
フラグかgotoのどちらかを選ぶんだ。

654 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:29:06 ]
>>650
そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?

655 名前:650 mailto:sage [2008/07/08(火) 00:40:53 ]
whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい

656 名前:650 mailto:sage [2008/07/08(火) 00:42:49 ]
ということに気づき自己解決しました。
レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)

657 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 05:41:19 ]
あくまで自己解決と言い張るならもう質問すんなよ

658 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:09:44 ]
何怒ってんだよw



659 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:25:05 ]
657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う

660 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:38:38 ]
>>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw

661 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:56:40 ]
時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと

662 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:15:01 ]
自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。

663 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:20:05 ]
良いなぁこの馬鹿をかばう気持ち悪い空気

664 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:23:10 ]
相当頭に来てる御様子ですね。

665 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:27:14 ]
自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw

666 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:35:03 ]
>>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。

なるほどね。

667 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:46:23 ]
>>666
>>662の後に>>663なら、普通は
>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry

668 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:48:25 ]
もう質問者にとって、このスレは用済みだからこねえよ



669 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:42:48 ]
>>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。

なるほどね。

670 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:49:02 ]
オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。

671 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:50:18 ]
>>669
それは自虐ギャグですか?

672 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:19:05 ]
unique_ptrって本当にC++0xに入ってくれるんだろうか

673 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:47:35 ]
ばかばっか

674 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:18:49 ]
>>673
お前がな

675 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:26:45 ]
>>674
オマエモナー

676 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:27:46 ]
いってよし?

677 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:06:30 ]
逝ってよし

678 名前:デフォルトの名無しさん [2008/07/08(火) 22:11:51 ]
>>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ



679 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:13:35 ]
gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。

680 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:38:18 ]
初心者スレと分けてる意味が無いように思う

681 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:06 ]
初心者スレってVC++しかなくね?

682 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:08 ]
newで動的確保をする際の質問なのですが
Base* foo = new Base(int bar);
この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが
動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか?

イメージ的には↓のようなことをしたいです
Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };

683 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:08 ]
出来ません

684 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:54 ]
>>683
ありがとうございます

685 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:03:55 ]
一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。
デストラクタに注意

686 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:38:32 ]
まずメモリに連続した領域内に生成したいものが、ほんとうに
クラスのインスタンスじゃないとダメなのか再考してみたら?

687 名前:デフォルトの名無しさん [2008/07/09(水) 12:41:11 ]
引き数つきのnewか…これはわりと難しいので、
あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。


688 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:09:17 ]
VC6以前のVS持っている人はいませんか?
DDE spyを分けて欲しいのですが・・・



689 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:18:31 ]
2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・

690 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:56:05 ]
>>688
それってダメなんじゃないの?

691 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:29 ]
>>682
vectorじゃだめなのかい?

692 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 06:15:03 ]
最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると
思っていいの?

693 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 07:29:57 ]
C99はまだスルーされてる

694 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:04:51 ]
まだどころか多分永遠にスルーされる
今の所C99に準拠しているのはIntel C++程度

695 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:05:45 ]
C99なんて有ったの… とか

696 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 12:30:01 ]
対応させるメリットないしな

697 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 14:39:59 ]
一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや

698 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:25:18 ]
たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。
C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。
Variable-length arrayなんて、いまどき誰が使うんだ。



699 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:51:39 ]
C++があるからねえ・・・

700 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:16:02 ]
gccでは可変長配列に対応してたりするけどな

701 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:36:42 ]
C99欲しい人は何が目当てなの?

702 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:39:47 ]
>>698
歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。

703 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:04:05 ]
>歴史的経緯でalloca()が実装されてない
どこのはなし?

704 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:53:10 ]
stdint.hが欲しいんだ。


705 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:07:41 ]
よろしい

706 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:49:43 ]
そもそもallocaはC89、C99の規格の中には存在しない。
ありゃPOSIX規格のモンだ。
このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。

なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。
とはいえ、90年代ならまだしも、
今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。
現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。

707 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:24:39 ]
C99を策定していた委員会の連中もC++98がこれだけ
広く使われるようになるとは夢にも思ってなかったろう。

でないとあれだけ緻密なC99の規格、しかもC89と互換性を
犠牲にしてわざわざ新しい規格を作るはずがない。

708 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:42:07 ]
>>706
>702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。
確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。
それこそ、今時スタックサイズをけちることもないんだし。



709 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:50:59 ]
ケチる必要は無いかもしれんが多用するのはバカのやることだぞ。
例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。
何GBもメモリがある時代にたったの1MBだぞ。
*unixのことはよく知らんが、そう変わらんだろうよ。
現状の32bitコードで、スタックサイズが大きすぎると、
スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。
だからスタックのサイズは小さいんだよ。

710 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:06:44 ]
>>708
_alloca()ならVC++でも普通に使えるよ

711 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:50:21 ]
こんなこともallocaと
って一度言ってみたいです

712 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 22:03:10 ]

         |:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;|
           |;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
        |______|_____|
        | 三|  _     _   |三 !
        | 三|  三シ   ヾ三  |三 |
        | 三′  .._     _,,..  i三 |
        ト、ニ| <でiンヽ  ;'i"ィでiン |三.|
        ', iヽ!  、 ‐' /  !、 ーシ |シ,イ
         i,ヽリ    ,' :  !.     |f ノ
         ヾ!    i ,、 ,..、ヽ   lノ
          |      _ _    イ l       malloca
            l    ,ィチ‐-‐ヽ  i /、
             ゙i、   ゝ、二フ′ ノ/'"\
              | \  ー一 / /   _,ン'゙\
          ,ィ|、  \     /_,、-'" _,.-''´ `丶、__
       _, イ  | ヽ_ 二=''" _,. -''´  """""´´  ``ー



713 名前:デフォルトの名無しさん [2008/07/10(木) 22:19:03 ]
alloca は gcc の configure でもチェックあるよな

714 名前:デフォルトの名無しさん [2008/07/10(木) 22:20:10 ]
> バカのやることだぞ

まだそんなカキコしてるんですか? にっぽんのドクターさん

715 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:11:49 ]
プログラム=PCアプリだと思ってる連中は気楽でいいのう・・

716 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:15:46 ]
どう気楽なのかキッチリ説明してもらおう。  (と言ってみる

717 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:06:24 ]
C99は無かったことにならないかな。下手にこんなのがあると、コンパイラ
ベンダーが、C99実装しかねない。

718 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:13:54 ]
たいていのコンパイラベンダはC++を優先するだろ

sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ



719 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:51:13 ]
・conio.hを何とかして欲しい。
・stdint.hの声が何故大きくない?

720 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:58:56 ]
それにしてもC++自体が変態化してきて誰にも使われなくなりそうな気がするのは俺だけだろうか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<209KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef