C++相談室 part71at TECH
C++相談室 part71 - 暇つぶし2ch1:デフォルトの名無しさん
09/07/18 02:54:58
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part70
スレリンク(tech板)l50

2:デフォルトの名無しさん
09/07/18 02:57:44
■基本■
[C++ FAQ]
 URLリンク(www.parashift.com)
 URLリンク(www.bohyoh.com) (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 URLリンク(www.cppreference.com) (英語)
 URLリンク(www.cppll.jp) (↑の日本語訳だけど最新は反映していない)
[禿 Stroustrup]
 URLリンク(public.research.att.com)
[C++ International Standard]
 URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
 URLリンク(www.open-std.org)
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 URLリンク(www.jisc.go.jp)
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3:デフォルトの名無しさん
09/07/18 02:58:36
■Books(Templateまわり)■
Effective STL
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
 URLリンク(www.amazon.com)
C++ Template Metaprogramming
 URLリンク(www.amazon.com)


4:デフォルトの名無しさん
09/07/18 02:59:33
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache STDCXX URLリンク(incubator.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(www005.upp.so-net.ne.jp)
 (日本語) URLリンク(www.wakhok.ac.jp)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)


5:デフォルトの名無しさん
09/07/18 03:00:33
> Apache STDCXX URLリンク(incubator.apache.org)
> は
> Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
> というのは指摘済みでした。ごめんなさい。とりあえず訂正。
ごめんなさい。直すの忘れていました。

■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(www005.upp.so-net.ne.jp)
 (日本語) URLリンク(www.wakhok.ac.jp)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

6:デフォルトの名無しさん
09/07/18 03:01:20
Boost C++ Libraries
URLリンク(www.boost.org)

Boost 翻訳プロジェクト
URLリンク(boost.cppll.jp)

Let's Boost
URLリンク(www.kmonos.net)

boost info
URLリンク(shinh.skr.jp)

7:デフォルトの名無しさん
09/07/18 03:04:39
順番間違えました。すみません。

入門ページなど

URLリンク(www.cplusplus.com)

・入門, 一覧, 使い方
URLリンク(www5c.biglobe.ne.jp)
・メソッド一覧
URLリンク(www.wakhok.ac.jp)
・サンプルプログラム集
URLリンク(www.s34.co.jp)

8:前スレ994
09/07/18 03:37:27
typo があったようですみませんでした。
きちんとなおしたものを添付します。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
どうしてもオーバーロードがあいまい、と出てしまうのですが、何が悪いのでしょうか。

9:8
09/07/18 03:39:56
すみません、こちらが最新です。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

10:8
09/07/18 03:41:12
コンパイラは gcc 3.4.4 です

11:デフォルトの名無しさん
09/07/18 03:52:44
ostream operator<<(ostream &stream, coord<U> ob)
istream operator>>(istream &stream, coord<U> &ob)
    ↑
ここに&がないじぇ

12:デフォルトの名無しさん
09/07/18 04:30:57
>>11
ご指摘ありがとうございました。うまくいきました。参照返しなのを忘れておりました。

13:デフォルトの名無しさん
09/07/18 15:41:04
だよね。オブジェクトのコピーか参照かっていうのは本質的な違いだよね。

14:デフォルトの名無しさん
09/07/18 16:20:09
前スレ1000gj

15:デフォルトの名無しさん
09/07/19 01:28:32
もし、(a==真かつb==真かつc==偽)かつ(d==真またはe==)が
真のときf=真
else
 {
  f=偽
 }
endif
なif文書きたい場合、どういった工夫をしたらいいですか?
乱視な俺にはカッコのインデントがチカチカして頭痛が痛い

16:デフォルトの名無しさん
09/07/19 01:29:33
c==偽)または(d==
添削ミスですorz

17:デフォルトの名無しさん
09/07/19 01:44:29
>>15
そのまま書けば?何が不満なんだ?

18:デフォルトの名無しさん
09/07/19 01:44:57
e==真として、そのままf = (a && b && !c) || (d && e);と書き下す以外に書き方ってあるの?

19:デフォルトの名無しさん
09/07/19 02:57:30
if(){if(){if()hoge}endif}endif・・・

20:デフォルトの名無しさん
09/07/19 13:53:01
次のような条件があるなら関数にすればいい
・ 判定方法に名前をつけられる
・ メンバー変数による判定、あるいは、何度か使用する判定


21:デフォルトの名無しさん
09/07/19 19:38:35
シングルトンクラスを作りたいと思います。
インスタンスを得るのにgetInstance()など
作って使うのが一般的だと思いますが、
operator new()の中に含めても、同等の機能が
実現出来る気がします。
operator new()にすると、何か目に見えるデメリットなど
ありますか?

22:デフォルトの名無しさん
09/07/19 19:49:54
>>21
まず無駄にdeleteを実装しなきゃならない上、ユーザーにシングルトンオブジェクト
のライフサイクルを考えさせることになる。
だったらgetInstance()一発の方が楽だと思うが。

23:デフォルトの名無しさん
09/07/19 19:56:47
>>21
newの戻りが常に同じポインタにするのかな?deleteが困っちゃうね。
既存の関数をオーバーロードするときに明らかに違う機能を入れると混乱の元だよ。
「初回使用時生成」でググってみよう


24:デフォルトの名無しさん
09/07/19 19:57:02
その前にまずシングルトンにすることのメリットがあるのかどうか、よく考えたほうがいいだろうな。

25:デフォルトの名無しさん
09/07/19 20:14:57
>>22-24
お答えありがとうございます。

>>その前にまずシングルトンにすることのメリットがあるのかどうか、よく考えたほうがいいだろうな。
対象は、MDIの子ウインドウクラスです。
子ウインドウのインスタンスは唯一になります。
サンプルがシングルトンを使っていたので、
同様に使うようにしましたが、確かにシングルトンでなくても
良い気がします。そっちの方を考えてみます。

>>delete
これは例えば、C#等のガペコレがあるやつだと
無問題になるのでしょうか。

>>明らかに違う機能を入れると混乱の元
確かにそうですね、考え直します。

26:デフォルトの名無しさん
09/07/19 20:28:01
>>25
C#などのガベージコレクタでは問題はおきない。それと引き換えにガベージコレクタの処理が重くなっている。これがいわゆる等価交換である。


27:デフォルトの名無しさん
09/07/19 21:07:48
子ウィンドウがシングルトンなんてありえないだろjk

28:デフォルトの名無しさん
09/07/19 21:11:50
>>25
もし子ウインドウが1つしか存在し得ないのなら、そもそもMDIを使うのが
間違いだな。

29:デフォルトの名無しさん
09/07/19 22:06:31
シングルトンってシングルスレッドでは単に関数の中にstaticな変数をラップするだけなのね。

30:デフォルトの名無しさん
09/07/20 00:40:26
BOOST_TYPEOFってどんな実装なの?コード書いてあるとこよく分んないんだけど…

31:デフォルトの名無しさん
09/07/20 02:01:00
URLリンク(www.boost.org)

32:デフォルトの名無しさん
09/07/20 07:02:32
letsboost::typeof
URLリンク(www.kmonos.net)


33:デフォルトの名無しさん
09/07/20 22:33:10
>>31,32
ありがとう。これは使い物にならんわ…


34:デフォルトの名無しさん
09/07/22 21:52:10
C++の入門書の通り、mainに
cout<<"Hello, world"
って書いたらいきなりコンパイルエラーがでて笑った。
ちょっと調べたらusingでstd::を省略できることはわかったけど、
そうすると全てのstd::の名前空間が含まれてしまうらしいなw

C++って仕様がちょっとマヌケすぎないか?

35:デフォルトの名無しさん
09/07/22 21:58:59
その入門書がマヌケなだけ

36:デフォルトの名無しさん
09/07/22 21:59:11
using std::cout;でおk

37:デフォルトの名無しさん
09/07/22 22:18:27
ろくに知らないのに馬鹿な発言して恥をかく典型。

38:デフォルトの名無しさん
09/07/22 22:21:25
>>34
背伸びをするのも時には必要だもんね。



39:デフォルトの名無しさん
09/07/22 22:24:47
そのクソ入門書がこれ以上売れてしまわないように書名を晒すのが君の義務だ

40:デフォルトの名無しさん
09/07/22 22:25:11
数時間かけて
その入門書片手にくだらないレスを考えていたんだろうから
バカでも許してやろうぜ。

41:デフォルトの名無しさん
09/07/22 23:02:29
GetRand()関数について質問させてください。
0~100の乱数の中のひとつがほしいときは、
GetRand(100)
で受け取れるんですが、100~200の中の乱数がほしいときは
どのように記したらいいんでしょうか。
どうやっても出来ないんで、誰か助けてください。

42:デフォルトの名無しさん
09/07/22 23:09:46
GetRand(100) + 100で問題あるの?

43:デフォルトの名無しさん
09/07/22 23:13:41
>>42
思いつかなかったんだろうな

44:デフォルトの名無しさん
09/07/22 23:26:34
すみません、知識不足すぎました。
GetRand内だけで済ませようとした自分がアフォすぎました。
低レベルすぎてすみませんでした。
お騒がせして申し訳ありませんでした。。。
では。

45:デフォルトの名無しさん
09/07/23 01:56:33
アフォすぎたとへこむより、そう考えるのかーと思えないとなぁ

46:デフォルトの名無しさん
09/07/23 19:50:07
#ifndef HOGE_H
#define HOGE_H
#endif HOGE_H

ヘッダーのインクルードガードの#endifにマクロが記述してあるコードを見たんですが、これってどうなんですか?
どういう役割があるのか、やった方がいいのか悪いのか、誰か解説して下さい。


47:デフォルトの名無しさん
09/07/23 19:59:35
どういう意味もない。無視される

48:デフォルトの名無しさん
09/07/23 20:08:25
無視されることは決められてるの?
#endif //HOGE_H
というスタイルは割と見る

49:デフォルトの名無しさん
09/07/23 20:18:51
無視はされないだろ
普通に#defineが何度も定義されるだけだと思うが

50:デフォルトの名無しさん
09/07/23 20:28:44
詳しくお願いします。

51:デフォルトの名無しさん
09/07/23 20:31:06
>>48
#ifndef HOGE_H
#define HOGE_H ←ここでHOGE_Hを#defineしてるから
#endif HOGE_H ←ここのHOGE_Hは空白に置き換えられる


52:デフォルトの名無しさん
09/07/23 20:33:50
>>51
あ、そうかw

>>49は勘違い?

53:49
09/07/23 20:36:56
勘違いでしたすいませんorz

54:デフォルトの名無しさん
09/07/23 23:40:56
実装方法のスタンダードを教えてください。

自分で作ったクラスに、
 「WM_PAINT時に動かしたい paint メソッド」と、
 「WM_CREATE時に動かしたい create メソッド」と、
 「WM_CLOSE時に動かしたい close メソッド」
があるとします。
今までは、特定ウィンドウのメッセージループでいちいち
paint 等を呼び出していましたが、サブクラス化できるように
構成を変えたいと思います。

サブクラス化する手法として、もっとも一般的な実装方法を
ご教授ください。


55:54
09/07/23 23:42:15
すみません、語弊がありました。

×サブクラス化する手法として
○サブクラス化するためのインターフェイスの手法として

よろしくおねがいします。

56:デフォルトの名無しさん
09/07/24 02:09:55
>>54
その自分で作ったクラスから派生させるなり、
paint,create,closeを持ったインターフェース用意してそれを呼ぶようにしたりしちゃダメなの?

57:デフォルトの名無しさん
09/07/24 02:30:41
いやいや、SetPropとかSetWindowLongPtr使えってテンプレ回答では?

58:デフォルトの名無しさん
09/07/24 13:30:12
>>57
そういうことか
メッセージループでswitch文書きたくないのかと思った

59:デフォルトの名無しさん
09/07/24 14:30:01
 ある関数void foo(unsigned int num)内の出来事。
 引数numに格納された値を使って、
 char* array = new char[num];
 として確保して使いたい。
 ところが使用後(fooスコープを脱出後)には自動的に破棄されるようにしたい。

これを実現するのに一番簡単な方法は何でしょうか?
デストラクタを利用して出来そうな気がするのですが。
よろしくお願いいたします。

60:デフォルトの名無しさん
09/07/24 14:35:52
std::vector<char> v(num);
char *array = &v[0];

61:59
09/07/24 15:01:42
>>60
なるほど、vectorの内部の配列は連続していることが保証されているというのを使うわけですね。
ありがとうございました。

62:デフォルトの名無しさん
09/07/24 15:04:43
#include <boost/scoped_array.hpp>

boost::scoped_array<char> s( new char[num] );
char *array = &s[0];

これだとダメかな?
知ってる人いません?


63:62
09/07/24 15:13:36
char *array = s.get();
でしたね。
失礼。

64:デフォルトの名無しさん
09/07/24 15:56:38
後でサイズ変更しないならいいんじゃねぇの

65:デフォルトの名無しさん
09/07/24 16:12:04
int型のベクターの初期化で楽な方法ってありますか?
int配列はint a[]={1,2,3}みたいにかけるので
今は一時的にint配列をつかってこんな風にやってるんですが

vector<int> v;
int d[]={1,3,2,5,6,17,8,0,2};
copy(d,d+sizeof(d)/sizeof(d[0]),back_inserter(v));


66:デフォルトの名無しさん
09/07/24 16:17:38
vector<int> v(&d[0], &d[sizeof(d)/sizeof(d[0])]);

67:デフォルトの名無しさん
09/07/24 17:03:00
ありがとうございました

68:デフォルトの名無しさん
09/07/24 20:17:36
boostにそれ用のコーポネントがある。
boost::assignでぐぐれ

69:デフォルトの名無しさん
09/07/24 20:55:51
C++ code - 39 lines - codepad
URLリンク(codepad.org)

ここにある関数
call_display_1(&d);
call_display_2(d);
call_display_3(d);
のうち、call_display_1とcall_display_3はdisplay()が仮想関数として
定義されているので挙動は理解出来ます。
call_display_2(d);
は、引数をconst参照で受け取っていますが、これでも仮想関数は必ず有効で
標準出力に"Derived Class."が出力されると保証されていますか?

「参照はポインタを使って実装されている」
と聞いたことがありますが、こういった実装上の理由ではなく、
標準C++の仕様上確かに保証されていますか?


70:デフォルトの名無しさん
09/07/24 22:16:23
はい

71:デフォルトの名無しさん
09/07/25 13:46:26
色々やってみたけど結局templateでjavaジェネリクスのextends条件はできませんでした。

72:デフォルトの名無しさん
09/07/25 14:41:50
こんなのどうよ
class A {};
class B : public A {};
class C {};
template <typename T> class X {
public: X(){
T *t = 0;
A *a = t; // Aの派生クラスでなければここでERROR
}};
int main() {
X<A> a; // OK
X<B> b; // OK
X<C> c; // ERROR
}

73:デフォルトの名無しさん
09/07/25 14:51:32
>>71
じゃあJavaに変えると良いよ。
スレ違い。

74:デフォルトの名無しさん
09/07/25 14:56:28
Boost.ConceptCheckのConceptAssertとTypeTraitsのisBaseOfでできるな

75:デフォルトの名無しさん
09/07/25 14:56:40
// boostだとこうなる。参考書丸パクリだが
#include <iostream>
#include <typeinfo>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
template< typename sub_class, typename super_class, class = void >
class X{
public: X()    { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型ではありません。") << std::endl;}
};

template< typename sub_class, typename super_class >
class X< sub_class, super_class, typename boost::enable_if< boost::is_base_of< super_class, sub_class > >::type >{
public: X()    { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型です。") << std::endl;}
};

struct A{};
struct B : A{};
struct C{};

int _tmain(int argc, _TCHAR* argv[])
{
    X< B, A > x0;   // strect Bは、strect Aの派生型です。
    X< C, A > x1;   // strect Cは、strect Aの派生型ではありません。
    return 0;
}

76:デフォルトの名無しさん
09/07/25 15:17:15
>>71
C++のtemplateは黒魔術だから、大抵何でもできる。
というか、お前釣りだろ?w
URLリンク(alfalfa.livedoor.biz)

最近、知ったか房みてるとどうしても↑に思える

77:デフォルトの名無しさん
09/07/25 15:43:04
>>76
まさに真理だなw

黒魔術というか、テンプレートメタプログラミングはチューリング完全だから
効率を気にしなければ他のプログラミング言語で実現出来ることは何でも出来る。

78:デフォルトの名無しさん
09/07/25 16:04:03
>>77
むしろ実行効率は良いという、恐ろしいことが証明されているんだよね。
ただし開発効率は発狂物だろうがww

79:デフォルトの名無しさん
09/07/25 16:11:28
という事は超頑張ればコンパイル時にMP3を鳴らす事も!・・・

80:デフォルトの名無しさん
09/07/25 16:12:55
>>79
本当にやってるヤツが世界にはいるのではないだろうかw


81:デフォルトの名無しさん
09/07/25 16:15:58
C++ code - 169 lines - codepad
URLリンク(codepad.org)

ここにあるコードを
Windows XP HomeEd SP2
g++ (GCC) 3.4.5 (mingw special)
でコンパイルして実行したところ、
「実行時エラー」
になりました。
本来は上記のサイトにあるようにコンパイル時エラーになって欲しい物ですが、
どうして実行時エラーになってしまうのでしょうか?

ちなみに意図的にコメントアウトしてある
// friend bool operator == (const MyInt& lhs, const MyInt& rhs){return lhs.num==rhs.num;}
の部分をコメント解除すると問題無く動作するようになります。


82:デフォルトの名無しさん
09/07/25 19:07:19
初心の者ですが、派生クラスのコンストラクタで悩んでいます。
派生クラスのコンストラクタをクラスを定義するスコープの外で定義することは可能でしょうか。

class Base {
private:
int x;
public:
Base(int x);
};
Base::Base(int x)
{
this->x = x;
}

class Derived : public Base {
private:
int y;
public:
Derived(int x, int y) : Base(x);
};

Derived::Derived(int x, int y) : Base(x)
{
this->y = y;
}
ではコンパイラから叱られてしまいます。どのように書けばいいのでしょうか。

83:デフォルトの名無しさん
09/07/25 19:20:49
public:
Derived(int x, int y);

84:69
09/07/25 20:14:00
>>70
ありがとうございます。

85:81
09/07/25 20:16:29
自決しました。

どうやらコンパイラ(g++ (GCC) 3.4.5 (mingw special))の仕様のようです。
バグって言い切っていいのかは分かりませんが。


自決方法
  Windows XP HomeEd SP2
  g++ (TDM-1 mingw32) 4.4.0
  この環境でなら問題無く動作するようになります。


86:71
09/07/25 20:30:16
>>73すみません
>>74-76ありがとうございます。そしてごめんなさい。
使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して
コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。
どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても
値は0?とかになってしまうようです。だめですね…

87:デフォルトの名無しさん
09/07/25 20:39:40
>>85
死ぬな死ぬなw

88:82
09/07/25 21:42:32
>>83
ありがとうございました。

89:デフォルトの名無しさん
09/07/25 22:58:33
std::maxのような関数テンプレートは
どの標準ヘッダに定義されていますか??

90:デフォルトの名無しさん
09/07/25 23:09:41
algorithm

91:デフォルトの名無しさん
09/07/25 23:11:15
>>85
いろいろ問題がありそうなコードだけど
コンパイルエラーになることが、
"問題無く動作する"ってことなの?

92:85
09/07/25 23:36:04
>>91
> コンパイルエラーになることが、
> "問題無く動作する"ってことなの?
はい、g++としてはコンパイル時エラーで教えてくれる方が
正しい挙動だと思いまして。

> いろいろ問題がありそうなコードだけど
例えばどこが問題でしょうか?



93:89
09/07/25 23:37:04
>>90
ありがとうございます!!

94:85
09/07/25 23:41:38
>>91
> いろいろ問題がありそうなコードだけど

#define OPERATOR_MY~~
などのマクロが登場していることや
public :
int_t num;
の様にメンバが丸裸のpublicアクセス指定されている事

以上2点はサンプルコードだからです。
さすがにこんなクソコードは実務では書きません。

なんか後出しじゃんけんみたいになってしまって恐縮です。
申し訳ありません。

95:デフォルトの名無しさん
09/07/26 01:18:43
自決でビール吹いたw

96:デフォルトの名無しさん
09/07/26 01:52:39
>>87を見るまで気づかなかったw

97:デフォルトの名無しさん
09/07/26 03:51:31
自決やべー後からくるわ。

98:デフォルトの名無しさん
09/07/26 10:11:31
自決しました
より
自決方法
にじわじわくる

XPとg++でどう死ぬんだと

99:デフォルトの名無しさん
09/07/26 14:57:26
未定義動作とか使うんだろうかw

100:デフォルトの名無しさん
09/07/26 18:15:11
鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ

101:デフォルトの名無しさん
09/07/26 18:27:56
それ自決じゃない
自決といえばdelete thisだろ

102:デフォルトの名無しさん
09/07/27 13:27:12
>>101
うちの会社でよく見るコードだわ
なんとか動いてるけど恐ろしい・・・

103:デフォルトの名無しさん
09/07/27 13:28:30
delete thisは使い方さえ間違わなければ合法だよ

104:デフォルトの名無しさん
09/07/27 18:47:24
>>103
そうなんだけど、よくわからんやつが適当にいじると
そのあとメンバ触ってあぼんぬとかよくあるからさ
おまけにそのデバッグやらされるの俺だし

105:デフォルトの名無しさん
09/07/27 19:22:22
今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る
delete thisは過去の遺物だな

106:デフォルトの名無しさん
09/07/27 21:55:34
delete thisって何だ?
初めて知ったんだが。

ファクトリメソッドやshared_ptrなどは知っています。
delete thisは俺が新参者だから知らないだけか?

107:デフォルトの名無しさん
09/07/27 22:13:43
delete p;
とかと一緒
thisを削除

108:デフォルトの名無しさん
09/07/27 22:20:01
delete thisは、COMみたいに自分で寿命を管理するときに使う。
まぁ、前時代的な実装だね。

109:106
09/07/27 22:53:58
ふーん。
そうなんだ。
思い返してみたけどやっぱ見たこと無ねぇな。

まあ理解しなくても良いよね。
どーも。

110:デフォルトの名無しさん
09/07/27 23:00:07
boost::intrusive_ptrの使用例を検索してみると、
delete thisを見られるよ。

111:デフォルトの名無しさん
09/07/28 11:39:11
Stateパターンで遷移後状態を返す直前に自状態を始末する際に
delete thisすることが多かったかな。最近はsmart pointerを
使うことが多くなったが。

112:デフォルトの名無しさん
09/07/28 11:53:21
delete this じゃないが
デストラクタを明示的に呼ぶコードってのはたまーに使うな。
まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。

113:デフォルトの名無しさん
09/07/28 11:56:11
>>112
そうそう、デストラクタって明示的に呼べるんだよね。
いつ使うのか全然しらない。

114:112
09/07/28 12:00:42
つながりの無い事柄みたいになっちゃったが、
要は

void T::reconstruct() {
 this->~T();
 new (this) T();
}

から連想したんだ。許してくれ。

115:デフォルトの名無しさん
09/07/28 13:30:04
C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか

116:デフォルトの名無しさん
09/07/28 13:43:42
>>115
たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を
間接参照しようとしているから。
これ以上はソースを見ないと言い様が無い。

117:デフォルトの名無しさん
09/07/28 14:28:43
間接参照不可能なポインタ変数を間接参照することは問題ないだろ。
問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。

118:デフォルトの名無しさん
09/07/28 14:33:09
日本語でおk

119:デフォルトの名無しさん
09/07/28 15:04:59
>>118
じゅうぶんわかる。
間接参照不可能なポインタ変数を間接参照することは問題ないね。

120:デフォルトの名無しさん
09/07/28 16:32:18
いやまて
間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?

121:デフォルトの名無しさん
09/07/28 16:52:12
間接参照不可能なポインタ変数ってvoidポインタのことでしょ?
->演算子でアクセスできないことも間接参照不可能っていうの?

122:デフォルトの名無しさん
09/07/28 17:25:55
>>121
じゃあやっぱり>>117でいいよね

123:デフォルトの名無しさん
09/07/28 18:39:08
MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は
const MyClass& temp
で受け取って束縛しても大丈夫ですよね?
そのスコープから外れるまでは有効ですよね?


124:デフォルトの名無しさん
09/07/28 18:44:51
テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。

125:デフォルトの名無しさん
09/07/28 18:55:30
関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される

126:デフォルトの名無しさん
09/07/28 18:57:08
>>125
> 関数の戻り値をconst指定しておけば
おかなくてもだろ?

127:デフォルトの名無しさん
09/07/28 19:16:15
え、まじで?無知ごめん

128:デフォルトの名無しさん
09/07/28 19:17:44
っていうか、そうだよね。constは関係ないね。
ちょっと考えれば分かる話でしたorz

129:デフォルトの名無しさん
09/07/28 19:21:30
>>113 placement new したオブジェクトを消すとき

130:123
09/07/28 19:53:50
みなさんありがとうございます。

131:デフォルトの名無しさん
09/07/28 19:57:50
>>129
placement deleteじゃだめなの?

132:デフォルトの名無しさん
09/07/28 20:02:53
λ式ってブースト使わないと利用不可?

133:デフォルトの名無しさん
09/07/28 20:03:33
placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。

134:デフォルトの名無しさん
09/07/28 20:12:21
>>132
Visual C++ 2010
URLリンク(msdn.microsoft.com)(VS.100).aspx

135:デフォルトの名無しさん
09/07/28 20:14:55
>>132
Intel C++ 11
URLリンク(www.xlsoft.com)


136:デフォルトの名無しさん
09/07/28 20:31:30
ラムダ式なんてオタのオナニー道具です
使っちゃいけません

137:デフォルトの名無しさん
09/07/28 20:45:26
>>134-136
俺の明日はどっちだ…

138:デフォルトの名無しさん
09/07/28 20:57:23
>>132
ラムダはちょっとしたところで使うなら便利。
あまり多用すると自分が困るかもしれないがね。

結局は使いようなんだが。

139:デフォルトの名無しさん
09/07/28 20:58:46
>>133
そうなのか。
ありがとう。



140:132
09/07/28 21:02:17
あり^^

141:デフォルトの名無しさん
09/07/28 21:33:50
データを出力するときにn行おきに空行を入れたいのですがどうすればいいですか?

142:デフォルトの名無しさん
09/07/28 21:39:22
繰り返しつかえばあ

143:デフォルトの名無しさん
09/07/28 21:58:48
>>141
帰れ。
バカ過ぎる。

144:デフォルトの名無しさん
09/07/28 22:23:37
for(int i = 0; i < num; i++)
{
cout << line[i] << endl;
if(i % n == n-1) cout << endl;
}

145:デフォルトの名無しさん
09/07/28 22:34:37
>>144
やってみます

146:デフォルトの名無しさん
09/07/28 22:41:16
なんかもっと初心者向けのスレに行けば?
たぶん宿題だろうし

147:デフォルトの名無しさん
09/07/28 22:58:31
あっそ

148:デフォルトの名無しさん
09/07/28 23:22:02
そういう態度は失礼だってママに言われなかった?

149:デフォルトの名無しさん
09/07/28 23:32:48
ママは彼が物心つく前に鬼籍に入りまして。。。

150:デフォルトの名無しさん
09/07/28 23:43:08
今日からパパがママよ!

151:デフォルトの名無しさん
09/07/28 23:50:33
>>150
ぎゃ^

152:デフォルトの名無しさん
09/07/29 08:51:51
struct Point
{
int x;
int y;

Point(int x, int y) : x(x), y(y) {}
};

struct Size
{
int width;
int height;
};

Size Hoge()
{
Point point;
...
return *reinterpret_cast<Size *>(&point); …(1)
return *reinterpret_cast<Size *>(Point(0, 0)); …(2)
}

例が良くないかも知れないのですが、
この書き方ってC++におけるインスタンスの
生存期間的に問題はあるでしょうか?

153:デフォルトの名無しさん
09/07/29 09:10:29
>>152
(1)はダメ
Hoge()を抜けた途端にpointのインスタンスが消滅してしまう

154:デフォルトの名無しさん
09/07/29 09:12:08
あほくさ

155:デフォルトの名無しさん
09/07/29 09:29:33
>>152
(1) はコピー返しなので問題ない
(2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう


156:デフォルトの名無しさん
09/07/29 13:00:03
>>126
いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。

157:デフォルトの名無しさん
09/07/29 13:44:20
戻り値がconstである必要は無いというお話

158:デフォルトの名無しさん
09/07/29 16:19:06
throwはreturnやbreakと同じようにスコープを抜ける
つまり自動変数のデストラクタ呼び出しが保障されてるんでしょうか?

159:デフォルトの名無しさん
09/07/29 16:58:37
されます。例外が送出された時点でローカルスコープは「突然」終了し、
可能な限りスタックを巻き戻すことになってます。
なので、(一般に)デバッグ用途には使えません。
…メモリダンプを見ても変数の中身が消えちゃってるので。

160:デフォルトの名無しさん
09/07/30 00:15:28
前にbcc5.5でboost::is_base_ofを使おうとしてた者です。あの後いろいろやってたらできました。(多分)
他にも使いたい人はいると思うんで一応載せときます。

struct yes_type{char t[100];};
struct no_type{char u[10];};

template<typename T,typename U>
struct test_helper{

  template<typename S>
  static no_type test(void const volatile * ,S );
  static yes_type test(T const volatile * const,int );
};

template<typename T,typename U>
class is_base_of{
  struct pointer_type{
    operator U const volatile *();
  };
  enum{
    delived = sizeof( test_helper<T,U>::test(pointer_type(),0) )
  };
public:
  enum{
    value = delived == sizeof(yes_type),
  };
};

使い方は
is_base_of< Hoge,Piyo >::value
とし、後のクラスが前のクラスの派生クラスの場合は1をそうでない場合は0を返します。
長文失礼しました。

161:デフォルトの名無しさん
09/07/30 00:29:38
あー、これだと両方同じ型を指定した時は必ず成功してしまいますね…。
型の比較なんてないですよね?どうしよう…

162:デフォルトの名無しさん
09/07/30 00:42:04
bcc5.5なんて糞コンパイラを窓から投げ捨てろ

163:デフォルトの名無しさん
09/07/30 00:48:00
VCの複雑さが無くなれば捨ててもいいけど・・・

164:デフォルトの名無しさん
09/07/30 00:49:51
コマンドラインで単なるC++コンパイラとして使うときに、
VCが特に複雑と言うほどBCCと何か違うことってあるか?

165:デフォルトの名無しさん
09/07/30 01:03:49
さっきのis_base_ofですが、value = ...の条件式に以下を加えてください。
!is_void<T>::value && is_class<U>::value && type_equal == sizeof(no_type) &&
is_voidやis_classや自分で作るかなんかしてください。

次にtest_helperに以下の関数を追加
static yes_type type_equal(T*);
template<typename S>
static no_type type_equal(S*);

最後にis_base_ofの一個目のenumに以下を追加
type_equal = sizeof( test_helper<T,U>::type_equal((U*)NULL) ),

これで、抜けはありそうですが、とりあえず判定はできると思います。

166:デフォルトの名無しさん
09/07/30 05:36:55
>>158
例外がmainでcatchされずに飛び出るとterminateが呼ばれて
破棄処理が実行されない可能性がある

167:デフォルトの名無しさん
09/07/31 15:28:35
お勧めのC++用リファクタリングツールを教えてください。


168:デフォルトの名無しさん
09/07/31 23:23:19
メモ帳

169:デフォルトの名無しさん
09/08/01 00:05:34
mapとかsetをデフォルト引数にする場合ってどの様に書けば良いでしょうか?
下記のように、vectorっぽくやりたいのですが。

void func( set<int> s = set<int>(0) )
{
 if( s.size() == 0 ){ ... }
 else{ ... }
}

int main()
{
 set<int> s; s.insert(100);

 func( s );
 func( );
}

170:デフォルトの名無しさん
09/08/01 00:09:03
>>169
setやmapには、vectorのような要素数を指定するコンストラクタがないから、
単にデフォルトコンストラクタで初期化すればいい。
void func( set<int> s = set<int>() )


171:デフォルトの名無しさん
09/08/01 00:19:28
質問なんですが、
#include<stdio.h>
main()
{int suuji[10],i,x,s,n;
float r;
i=0;
s=0;
while(x!=0){
if(i==50);
printf("数字=");
scanf("%d",&x);
suuji[i]=x;
n=i;
i=i+1;
s=s+y;
}
r=s/n;
printf("平均=%d\n",&r);
}
の形を使って数字を幾つか入れてその平均点をfloatを使った状態でだしたいのですが数字が何も出てきません。
上のプログラムの修正をよろしくお願いします。

172:デフォルトの名無しさん
09/08/01 00:38:18
r=(float)s/n;
printf("平均=%f\n",&r);
あたりでうごく?

173:169
09/08/01 01:25:54
>>170
ありがとうございます。m(_ _)m

174:デフォルトの名無しさん
09/08/01 01:26:36
>>172 r=(float)s/n;
を習ってないので使ってはいけないんですよ…
なんででないのかわからない…
%d→%fは直します。ありがとうございます!

175:デフォルトの名無しさん
09/08/01 01:41:41
ならこう。
#include<stdio.h>
main()
{
  float suuji[10];
  float x, s, r;
  int i, n;
  i = 0;
  s = 0;
  while(x != 0) {
    if (i == 10) break;
    printf("数字=");
    scanf("%f", &x);
    suuji[i] = x;
    n = i;
    i = i + 1;
    s = s + y;
  }
  r = s / n;
  printf("平均=%f\n", r);
}


176:デフォルトの名無しさん
09/08/01 01:50:14
よくみたらx初期化してないし、sに加算してないし
そもそもC++のプログラムじゃないし
レスした自分が恥ずかしい
s+=x;な

177:デフォルトの名無しさん
09/08/01 01:55:47
宿題スレでやれよ

178:デフォルトの名無しさん
09/08/01 01:56:32
まあC++コンパイラで通るからいいかなと思った。今は反省している。

179:デフォルトの名無しさん
09/08/01 01:57:53
>>177
そこはお客に丸投げしていただいたありがたい課題を解いて楽しむという反教育な場ですから。

180:デフォルトの名無しさん
09/08/01 04:01:34
>>177 すいません…
>>178 C++じゃなかったんですか!自分はずっとC++と思い込んでました。
ありがとうございます。


181:デフォルトの名無しさん
09/08/01 04:46:33
>>180
なんていうか、先が思いやられるな。未来のこの人の先輩がんばってください。

182:デフォルトの名無しさん
09/08/01 11:53:51
>>180
いや、間違いなくC++だよ
Cコンパイラでも通るかもしれないというだけで

183:デフォルトの名無しさん
09/08/02 01:21:46
コンストラクタで例外投げてもいいですか?

184:デフォルトの名無しさん
09/08/02 01:22:50
shared_ptrとかauto_ptrとかの類をきちんと使っていれば、全然問題ないですよ。

185:デフォルトの名無しさん
09/08/02 01:22:54
いいですよ。

186:デフォルトの名無しさん
09/08/02 16:24:40
デストラクタで例外投げてもいいですか?

187:デフォルトの名無しさん
09/08/02 16:27:23
恐いお兄さん達にリンチされるのでやめた方がいいです

188:デフォルトの名無しさん
09/08/02 16:28:37
わかりました やめておきますね

189:デフォルトの名無しさん
09/08/02 16:33:52
                       __
    |                 /   /     
 __|__              .__/__
 |   |   |             . |   |    |
 |   |   |   ー――   ..|   |    | 
  ̄ ̄| ̄ ̄              | ̄ ̄ ̄ ̄        ∧ ∧
    |                 \____ノ      / V ヽ
                                 /┏╋┓ \    
                                /  ┗╋┛  \ < 2chでせいぜいほざいてろ。フフン
    (.`ヽ(`> 、                    /_______ \
     `'<`ゝr'フ\                 +.  彡 ⌒   ⌒ ミ;;;!
  ⊂コ二Lフ^´  ノ, /⌒)                , +ゞi" ̄ フ‐! ̄~~|-ゞ+
  ⊂l二L7_ / -ゝ-')´                .+ ヾi `ー‐'、 ,ゝ--、' 〉;r'
       \_  、__,.イ\           +     `,|  / "ii" ヽ |ノ 
        (T__ノ   Tヽ        , -r'⌒! ̄ `":::7't ト‐=‐ァ ./
         ヽ¬.   / ノ`ー-、ヘ<ー1´|  ヽ | :::::::::::::ト、ヽ `ー‐'",/ 、
          \l__,./       i l.ヽ! |   .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、
  ___________________________  ___
 |  |  |  |  |  |  |  |  |  |  |  |  |  ||  |
 |中|中|中|中|中|中|中|中|中|中|中|中|中||中|

190:デフォルトの名無しさん
09/08/02 19:14:40
>>186
デストラクタ内でキャッチするならいいよ

191:デフォルトの名無しさん
09/08/03 07:57:09
ヤフーメッセンジャーのチャットのログを記録したいと思っています。
ブラウザのチャットのログの取得はわかるのですが、メッセンジャーなどのアプリからどのようにしてログを取得できるものなのでしょうか?
サイトを探しましたが、どのサイトもHTMLソースの取得方法しか書いてありませんでした。

どうか教えてください。

192:191
09/08/03 08:19:38
libyahoo2というものがありまして自分で調べます。
ご迷惑おかけしました。

193:デフォルトの名無しさん
09/08/03 18:24:02
教えてください.
変数sに振幅値を入れておいて,
サンプリング周波数fでsを再生したいのですが
以下のプログラムで再生することができません….

よろしくお願いします.

#include <iostream>
#include<windows.h>
#include <math.h>
#pragma comment(lib,"winmm")

#define FILENAME "white-3dB.WAV"
using namespace std;

int test(){
int i;
int f=1000;
double s[48000];
for(i=1;i<48000;i++){
s[i] = sin(2*3.14*f*(i/48000));
}

bool PlaySound (s,f,SND_MEMORY | SND_LOOP | SND_ASYNC);

return 0;
}

194:デフォルトの名無しさん
09/08/03 18:38:07
>>193
PlaySoundの前のboolは何?
それと、PlaySoundにはちゃんと.wavファイルの形をしたデータを与えてやらないとだめだ
波形だけ与えても鳴らない
あと、fって何さ、そこはHMODULEを渡すところでは?
最後に、スレ違い
Win32APIの質問はWin32APIスレへどうぞ

195:デフォルトの名無しさん
09/08/04 08:52:09
static const int MAP_X = 64;


class A
{
int[ MAP_X ];
}


以上が定数式エラー出る
defineではエラーでない。
C++風にconst使ってみたんだが配列確保には使えない認識でおk?

196:デフォルトの名無しさん
09/08/04 08:55:01
変数名が無え…。

197:デフォルトの名無しさん
09/08/04 10:23:25
>>195
ちゃんと書けば、ちゃんと使える。

そうそう、古いコンパイラでは使えないかも知れない。

198:デフォルトの名無しさん
09/08/04 11:12:34
それが最新のVC2008EEなんだな
無料だから制限つけてるのか

199:デフォルトの名無しさん
09/08/04 11:15:31
>>195
実際のコードとコンパイルエラーを「そのまま」貼り付けてみて。

200:デフォルトの名無しさん
09/08/04 11:26:31
原因がわかりました

×static const float MAP_X = 64;
○static const int  MAP_X = 64;

floatにしてたのが原因でした
intに変更したら成功。



201:デフォルトの名無しさん
09/08/04 11:38:22
アホか

202:デフォルトの名無しさん
09/08/04 11:39:20
static const intしかclass内での定数は定義できないと
規格票に書いてある

規格票はintではなく整数と書いてあるが

203:デフォルトの名無しさん
09/08/04 12:19:41
>>202
なら「static const 整数しか~と規格票に書いてある」って最初っから言えよ。

どうせそんな書き方もしてないんだろうけどな。

204:デフォルトの名無しさん
09/08/04 14:52:11
最初からもなにも
>>195
みたいな不完全で実際のものと違うコード提示されたところで
的確な指摘なんて出来るわけないよな

205:デフォルトの名無しさん
09/08/04 17:16:36
enumで妥協

206:デフォルトの名無しさん
09/08/04 17:21:21
このあたり、いいかげんなんとかして

207:デフォルトの名無しさん
09/08/04 20:39:31
PODデータでの値渡しとconst参照渡しの
一般的な速度の分岐点は何バイトくらい?


208:デフォルトの名無しさん
09/08/04 21:44:17
環境も書かずに何聞いてんだ

209:デフォルトの名無しさん
09/08/04 22:06:47
>>203
エラーの出る最低限のサイズのコードを上げろ

210:デフォルトの名無しさん
09/08/04 22:13:00
>>207
エスパーして代表的な環境について述べます。
Linux + gccはどちらの場合も最高速を叩き出します。
Windows + vcはどちらも低速でした。
つまり、プログラムでチマチマ最適化を図るよりLinuxを導入するほうが
良いと思われます。

211:デフォルトの名無しさん
09/08/04 23:03:58
x86なら特に指定がなければVCもgccも同じl呼び出し規約を
使うのだからそんな速度の違いが出るわけない。

212:デフォルトの名無しさん
09/08/04 23:20:54
レジストリにのってるかどうか調べればいいんじゃねぇの

213:デフォルトの名無しさん
09/08/04 23:31:35
sjis→utf8の変換処理を自作したいのですが、
サンプルになるようなサイトてありますか?
CとかVC++はみかけるんですがC++は見つからなくて…
環境はlinux+gccです

214:デフォルトの名無しさん
09/08/04 23:38:47
>>213
お前がほしいのはサンプルじゃなくてコピペ元だろ

たぶんCのやつそのまま使えるから問題なし

215:デフォルトの名無しさん
09/08/04 23:42:54
ああ、レジスタか。
何言い出してんのかと思った

216:212
09/08/04 23:46:41
>>215
ふっ
素で間違えたぜ

ごめんなさい

217:デフォルトの名無しさん
09/08/04 23:56:38
Releaseコンパイル後のexeファイルにクラス名とかがアスキーで残るんですけど(typeid用?)
これを無くしたい場合はどうすればいいとですか…?



218:デフォルトの名無しさん
09/08/05 00:01:25
邪道な方法ではUPXを使うとか?

219:デフォルトの名無しさん
09/08/05 00:14:23
邪道臭いけど、名前丸見えではないようですし(zipのヘッダが見えた気はするけど・・・)
これでも大丈夫そうです。ありがとうございました。

220:デフォルトの名無しさん
09/08/05 02:39:21
>>207
boost::call_traits あたりを見ると参考になるかもしれない。

221:デフォルトの名無しさん
09/08/05 08:11:38
>>217
コンパイルオプションの /GR を取ればいいってことかな?
VS2005 だと、プロジェクトのプロパティの 「ランタイム型情報を有効にする」 → 「いいえ」

typeid の他に dynamic_cast がつかえなくなるっぽい。
そのあたりはややこしい話になるので割愛。

222:デフォルトの名無しさん
09/08/05 11:49:00
>>212
なんの疑問もなく読んでしまった。
だめだ今日は。。。

223:デフォルトの名無しさん
09/08/05 15:17:49
localeをjapaneseにするとlexical_castで整数を文字列に変換したときに
3桁ごとにコンマがついてしまうのですが、これを防止するにはどうしたら
よいのでしょうか?

224:デフォルトの名無しさん
09/08/05 15:21:44
c++でネットワーク上のファイル(天気予報XMLファイル)を取得したいのですが、
方法がわかりません。
ググってみるとVC++ではできるようなのですが、
Linux + gcc環境ですので参考になりません。
最悪 system() + wgetコマンド という手がありますが、
もっとスマートな方法(ライブラリとか)があったら教えて下さい。

225:デフォルトの名無しさん
09/08/05 15:24:05
>>223
localeを"C"に戻す
いちいち面倒ならLC_NUMERICだけjapaneseに変えないでおく

226:デフォルトの名無しさん
09/08/05 20:41:08
>>224
>最悪 system() + wgetコマンド という手がありますが、
の方がスマートだよ.


227:デフォルトの名無しさん
09/08/06 01:36:46
Boost.Asioを使ってゴリゴリ書くとか。

228:デフォルトの名無しさん
09/08/06 02:59:42
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

class A :public boost::enable_shared_from_this< A >
{
 public:
  A(){ /*shared_from_this();*/ }
  void F(){shared_from_this(); }
};

int main()
{
boost::shared_ptr< A > a( new A() );
a->F();
return 0;
}

c-torで、shared_from_this()すると例外が飛ぶんだけど、何で?

229:デフォルトの名無しさん
09/08/06 07:20:09
>>228
まだ生成が済んでないオブジェクトへの shared_ptr は存在しない、と考えれば
わりと自然な気がする。

仮にそこで shared_ptr が得られたとして、その後に例外が発生してコンストラクタが
中断したらどうなるの?とか。

230:デフォルトの名無しさん
09/08/06 07:31:35
>>228
コンストラクタの中では
 A a;
した状態と同じ、ってのもあるな。


URLリンク(www.boost.org)
仕様を確認すると、事前条件 "Requires" に以下の記述がある。
> There must exist at least one shared_ptr instance p that owns t

231:デフォルトの名無しさん
09/08/06 13:08:19
「このクラスを継承してサブクラスを作ることはない」っていうクラスを記述するとき、デストラクタにvirtual付けますか?
自分は「このクラスを継承しちゃダメ」という意思表示の意味でvirtual付けてないんだけど、
そういうやり方って一般的なのかな?
一応どっかでそういう意見を見て、ふーんって思ってやってたことなんだけど、正しいことなのか今になって不安になってきた。


232:デフォルトの名無しさん
09/08/06 14:09:29
コンストラクタをprivateに封じて代わりにstaticファクトリを提供すれば誰も継承できないクラスの完成

233:デフォルトの名無しさん
09/08/06 14:11:42
>>231
付けない。
継承される予定のクラスでも、アップキャストして使う予定のない物は、非virtualのprotectedデストラクタにする。

ここから先は個人的な好みなので参考程度に聞いて欲しいが、
「データメンバを持たない仮想関数のみで構成されたクラス」しか継承する事は考えない。
データメンバを持つクラスを継承したいと思った時は、コンポジションにする。

234:デフォルトの名無しさん
09/08/06 14:11:55
普通は書かないかな

つーか継承をコンパイルエラーにする記述とか無いもんかな
インターフェイスとファクトリだけ提供して実装は隠す、位しか実装の継承を禁止する方法が思い浮かばない

235:デフォルトの名無しさん
09/08/06 14:32:23
final宣言ほしいよね。

236:デフォルトの名無しさん
09/08/06 14:34:41
finalって0xで入るんじゃなかったかな

237:デフォルトの名無しさん
09/08/06 14:46:36
>>231
付けない。例えばstring(basic_string<char>)なんかも継承を前提としていので
仮想デストラクタではなかったと思う。

238:237
09/08/06 14:47:23
>>237
継承を前提としていので×
継承を前提としていないので○

239:デフォルトの名無しさん
09/08/06 15:13:51
boostのvaultとかsandboxにnon derivableとかいうのがあったと思う

240:デフォルトの名無しさん
09/08/06 18:01:01
[[final]]

241:デフォルトの名無しさん
09/08/06 21:35:36
何度見てもキモいシンタックスだ。

242:デフォルトの名無しさん
09/08/06 21:51:58
#define final [[final]]

ってするだけだろ。

243:デフォルトの名無しさん
09/08/07 03:46:33
いいかげん define を捨てたい俺には、
それはもっと悪い。

244:デフォルトの名無しさん
09/08/07 09:12:02
基本的にはC++に関することではなく、Windowsプログラミングに関することですが、
開発環境がC++のため、質問させていただきます。

例えばIE7のようなWebブラウザがあるとします。
そのWebブラウザと連携させるようなツールを使うにはどうすればいいのでしょうか?

具体的には毎回同じ文字でログイン名などを入力するのが面倒なときに、自動で入力して
そのあとにログインボタンをクリックし、勝手にログインしてくれるようなツールを作成したいと思ってます。

一部ではAmazonの激安祭りなどでスクリプトとか呼ばれているものです。
使用用途はそういったものではなく、単純にプログラムの勉強としてそういったものを作る方法が
勉強したいだけです。(これは本当です。)

わかる方がもしいらっしゃれば回答よろしくお願いいたします。

245:デフォルトの名無しさん
09/08/07 09:38:50
じゃ俺は開発環境がC++なんで、RPGの作り方教えてください

246:デフォルトの名無しさん
09/08/07 09:39:36
ついでに開発環境がC++なんで、エロゲの作り方教えてください

247:デフォルトの名無しさん
09/08/07 09:44:38
>>244
鼬害。WebProg板へ。

>>245
鼬害。ゲ製板へ。

>>246
鼬害。Pinkのどっかへ。

248:デフォルトの名無しさん
09/08/07 09:51:38
Pinkのどっか行ってきます

249:272
09/08/07 11:29:26
どうしても参照を付け替えたいのですが、何か良いアイディアはないでしょうか?
int a = 1;
int b = 2;
int& r;
のときに動的にrをaかbを指すように付け替えたいです。
無理は承知でお願いします。

250:デフォルトの名無しさん
09/08/07 11:35:05
>>249
int& r = boolean ? a : b;
ではだめかいな?

251:250
09/08/07 11:36:36
後は
int * p;
if(xxx)
{p = &a;}
else
{p = &b;}
int& r = *p;

252:272
09/08/07 11:42:15
>>251
その方法でいけました! まさかこんな方法があろうとは。
本当に有難うございました。
一回途中にポインターをかませば良かったんですね。


253:272
09/08/07 11:57:59
ウソです。無理でした。ごめんなさい。


254:デフォルトの名無しさん
09/08/07 12:04:01
int &r = *p;
の代わりに
#define r (*p)
と書けばおk

255:251
09/08/07 12:33:29
>>253

#include <iostream>

int main()
{
bool flag;
std::cin >> flag;

int a = 1;
int b = 2;

int * p;
if(flag)
{p = &a;}
else
{p = &b;}
int& r = *p;

std::cout << r << std::endl;
return 0;
}


これでダメだったって事?

256:デフォルトの名無しさん
09/08/07 12:35:29
そんな面倒な事をせずに普通にポインタを使えばいいだろ
参照じゃないと駄目な理由は何だ?

257:デフォルトの名無しさん
09/08/07 12:50:40
参照のほうが綺麗だから

258:272
09/08/07 13:27:42
int a = 1;
int b = 2;
int* p = &a;
int& r = *p;
cout << "r = " << r << "\n";
p = &b;
cout << "r = " << r << "\n";

で、1、2と表示して欲しかった。
(実際は両方とも1)

どうしても参照でなければならない理由があるのです。
理由は内緒。




259:デフォルトの名無しさん
09/08/07 13:30:20
>>285
ポインタへの参照にするとか。

260:デフォルトの名無しさん
09/08/07 13:32:30
みすった。
>>258 だった。

261:デフォルトの名無しさん
09/08/07 13:34:59
そもそも参照は

・初期化しなければいけない
・代入できない

という仕様だから切り替えはできないよ

262:デフォルトの名無しさん
09/08/07 14:03:11
>>258
そういうことか。
ちなみにそんな状況は俺は出くわしたことはないんだが。


263:デフォルトの名無しさん
09/08/07 14:11:57
> 理由は内緒。
馬鹿丸出し

264:デフォルトの名無しさん
09/08/07 14:19:24
プログラムの実行に掛かった時間を表示していて思った疑問です。

#include <ctime>
cerr << clock()/(float)CLOCKS_PER_SEC << " [s] passed." << endl;

上記のプログラムでは、プロセス開始からの時間がミリ秒の桁まで表示されるのですが
ctime の include をしない場合、秒単位の表示が出てきます。
なぜコンパイルエラーにならないのかよくわからんです。

参考にしたサイトはここ↓です
URLリンク(www.sasaraan.net)
環境は WindowsXP + gcc でコマンドラインアプリケーションです。

265:デフォルトの名無しさん
09/08/07 14:21:27
そこだけ別関数として切り出すのがいいんじゃね
void hoge(int& r)
{
std::cout << r << std::endl;
}

int a=1;
int b=2;
hoge(a);
hoge(b);

266:デフォルトの名無しさん
09/08/07 14:30:34
>>264
秒単位の表示って、 0, 1, 2, ... とか?
それとも 0.0, 1.0, 2.0, ... なの?

あと、上記のプログラムって言ってコンパイルも通らないソースが貼ってあるのが怪しい。
省略したところに問題があるのかもしれない。

267:デフォルトの名無しさん
09/08/07 14:33:27
265よ
ここはC++スレだぞ何故その方向へ逸れるの?

268:デフォルトの名無しさん
09/08/07 14:36:50
参照じゃないといけない理由のほうがすごく気になるな
既存ソースの改造でもやってんのかな

269:デフォルトの名無しさん
09/08/07 14:46:25
個人的に >>256-257 ってのは同意できるな

void hoge(char **pp)
return *(*pp)++; // わかりにくい。ってかタイピングが面倒
}



void hoge(char *&rp)
{
return *rp++; // ほらきれい
}

270:デフォルトの名無しさん
09/08/07 14:47:13
voidじゃねえcharだた

271:デフォルトの名無しさん
09/08/07 14:51:16
C++ code - 22 lines - codepad
URLリンク(codepad.org)

このようにコンパイル時エラーになってしまうのですが、
どうすれば解決できるでしょうか?

11行目と14行目のzeroを別名(hogehogeなど)にすれば
解決するのですが、そうではなく同名のまま(zeroのまま)解決したいと
思っています。

よろしくお願いいたします。

272:デフォルトの名無しさん
09/08/07 15:04:55
>>271
メンバに同名の zero がある限り、クラス外の zero を指すなら ::zero などとスコープを
明示する必要がある。

template<typename int_t>
class MyTempl;

template<typename int_t>
bool zero(const MyTempl<int_t>& arg);

template<typename int_t>
class MyTempl
{
  int_t m_num;
public :
  MyTempl(int_t arg = 0) : m_num(arg) {}
  static MyTempl zero()
    {return MyTempl<int_t>(0);}
  friend bool ::zero<>(const MyTempl& arg);
  bool is_zero() const
  {return ::zero(*this);}
};

template<typename int_t>
bool zero(const MyTempl<int_t>& arg)
  {return arg.m_num ? true : false;}

template class MyTempl<int>;

273:デフォルトの名無しさん
09/08/07 15:13:43
>>269
そんなことは誰も問題視していない

274:デフォルトの名無しさん
09/08/07 15:14:13
More C++ Idioms/friend 関数の生成(Making New Friends) - Wikibooks
URLリンク(ja.wikibooks.org)(Making_New_Friends)

ここを読んではいたので、
friend bool zero<>(const MyTempl& arg);
とする方法は知っておりました。

しかし
friend bool ::zero<>(const MyTempl& arg);
この発想はありませんでした。

ありがとうございました!!

275:デフォルトの名無しさん
09/08/07 15:20:33
本来初期化しかできない参照を変な使い方して
ほら綺麗 とか言われても

276:デフォルトの名無しさん
09/08/07 15:50:50
変な使い方ってどこが?

277:デフォルトの名無しさん
09/08/07 16:10:15
ポインタと参照は原理は同じだが違うものだよ。


278:デフォルトの名無しさん
09/08/07 17:05:08
質問というか相談。以下のような多相性を目的としないクラス階層がある。

struct A {}; // 空の基底
struct B: virtual A { Foo foo; };
template<typename T> struct C: virtual A { T t; };
template<typename T> struct D: B, C<T> {}; // fooとtを両方持つ
// B, C, Dを保持するクラス、後でaをダウンキャストして使う
struct Holder { A *a; };

Holderを使う時に必要な型(Foo, T)は判っているが、A*の実際の型(B, C, D)は判らない。
この例だとAを仮想継承しないといけないが、そうするとB, C, Dのどれを実体化しても
サイズがポインタ分増えてしまう。これらを持つHolderは大量に作成されるので、
各オブジェクトのサイズは少しでも減らしたい。
どうしたらいいだろうか?やはり仮想継承するしかない?

279:デフォルトの名無しさん
09/08/07 17:12:12
>>277
> ポインタと参照は原理は同じ
って何を根拠に。

確かに
参照はポインタを使って実現している実装が多いけど
それは言語仕様には規定されていないだろ。

正確には
ポインタと参照は同じ原理で実現できる
とかだな。



280:デフォルトの名無しさん
09/08/07 17:17:57
>>278
よくわからないな・・・なんで仮想継承が必要?
普通に継承するのはだめなの?

281:デフォルトの名無しさん
09/08/07 17:28:05
オレだったら struct Bのインスタンスを持った struct Cの特殊化を struct Dの親か Dの実装にするね

282:デフォルトの名無しさん
09/08/07 17:28:15
>>264
int clock()
と仮定されて、intが返ってる可能性はないかね。

283:278
09/08/07 17:58:59
>>280
D<T>*からA*にアップキャストするときB*経由かC<T>*経由かで
曖昧になるから仮想継承が必要…だよね?
ちなみにHolderから値を取り出すにはこんな感じの関数を使う。

Foo get_foo(const Holder &h) { return static_cast<B*>(h.a)->foo; }
template<typename T>
T get_t(const Holder &h) { return static_cast<C<T>*>(h.a)->t; }

>>281
済まないけどよくわからない…
特殊化するとA*からTを取り出すときにCを特殊化したかどうかの
情報が必要にならない?

284:デフォルトの名無しさん
09/08/07 18:13:52
クラスの宣言中、そこに直接メンバ関数を実装すると
自動的にそのメンバ関数はインライン要請がなされると
聞きました。
では
クラステンプレートで
template<typename int_t>
class MyTempl
{
public:
void foo() const{std::cout << "foo";}
};
この様にした場合、foo()はインライン関数として扱われますか?
それとも
template<typename int_t>
class MyTempl
{
public:
inline void foo() const{std::cout << "foo";}
};
とする必要がありますか?

285:デフォルトの名無しさん
09/08/07 18:21:58
>>283
つねにB経由にするなどと決めておけばいいかと
キャスト自体は曖昧な部分をちゃんと明示すれば通るし
D<T>* d = ... ;
A* a = static_cast<A*>(static_cast<B*>(d));

286:デフォルトの名無しさん
09/08/07 18:25:58
>>284
扱われます
inlineは付けても付けなくても一緒
インライン展開したくない場合は

template<typename int_t>
class MyTempl {
public: void foo() const;
};

template<typename int_t>
void MyTempl<int_t>::foo() const {
std::cout << "foo";
};

などのように別に中身を書く

287:284
09/08/07 18:31:54
>>286
分かりやすい解説ありがとうございました。

288:デフォルトの名無しさん
09/08/07 18:48:31
逆に宣言に定義を含めてインライン化しないようにするにはどうするの?


289:デフォルトの名無しさん
09/08/07 18:59:04
インライン関数をインライン展開しないというコンパイルオプションを付けてコンパイルする
クラス定義の中に定義を書いた関数はインライン関数だと規格で決まっているから、そこはどうにもならんよ

290:デフォルトの名無しさん
09/08/07 19:00:22
>>286
テンプレート使った場合ってインライン展開されないようにできるの?
コンパイル単位的に難しい気がするんだけど

291:デフォルトの名無しさん
09/08/07 19:06:34
>>290
普通にできる
ただしクラスの定義も各関数の定義も両方ともヘッダに書く
同じものがコンパイル単位ごとにコンパイルされても、リンカが重複分を破棄する等して上手くやる

292:デフォルトの名無しさん
09/08/07 19:10:13
インライン展開は関数呼び出しのオーバーヘッドがなくなるけど
テンプレート関数はオーバーヘッドなくならんでしょ。

293:デフォルトの名無しさん
09/08/07 19:28:56
そりゃなくならない
別物だし

294:デフォルトの名無しさん
09/08/07 21:57:42
>>292
一人だけ別の話題をしているようにしか見えないぞw

295:デフォルトの名無しさん
09/08/07 21:58:55
インラインのテンプレート関数使えばいいだけじゃん

296:デフォルトの名無しさん
09/08/07 22:05:57
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

297:デフォルトの名無しさん
09/08/07 22:12:41
>>294
つまり、テンプレートはそもそも淫乱展開じゃないんじゃないの?って話。

298:244
09/08/07 22:17:43
やはり難しいかったでしょうか?

わかる方がおられない残念な結果となったため、質問への回答を打ち切らせていただきます。

299:デフォルトの名無しさん
09/08/07 22:25:45
アイちゃんより下がいるとは。

300:デフォルトの名無しさん
09/08/07 22:44:16
>>298
単にスレ違いなだけ。
せめて、環境依存OKと言っているとことか、WindowsならWin32APIスレのほうで聞きなさい。
まあ、そこ行っても答えが貰える保証はないけど。

301:デフォルトの名無しさん
09/08/07 22:53:20
スクリプトをC++で作るのって難しいと思うが、どうなの?

302:デフォルトの名無しさん
09/08/07 23:06:09
難しくないよ

303:デフォルトの名無しさん
09/08/07 23:17:23
class A{
A(char *buf);

}

A::A(char *buf){

buf= new char[10];
buf="gomi"

}
int main(){

char *buf
A kakuho(buf)

printf("%s",buf);

};

コンストラクタの中でメモリ確保したいんですが
できません。助けてください


304:デフォルトの名無しさん
09/08/07 23:25:05
class A{
A(char **buf);
}

A::A(char **buf){
*buf= new char[10];
strcpy(buf,"gomi");
}
int main(){
char *buf
A kakuho(&buf)
printf("%s",buf);
};

かな

305:デフォルトの名無しさん
09/08/07 23:25:47
strcpy(*buf,"gomi");だた

306:デフォルトの名無しさん
09/08/07 23:30:19
なんでchar*を使うの?メモリ的な制約か?stringとか使えばいいじゃん。

307:デフォルトの名無しさん
09/08/07 23:31:16
>>302
そなの?
COMとかActiveXなら作れるけどスクリプトはなんだか大変そうな気がして

308:デフォルトの名無しさん
09/08/08 00:13:27
>>298
せめてアイちゃんレベルにはなって欲しいな。

309:デフォルトの名無しさん
09/08/08 00:15:33
三項演算子a?b:cと
if elseを用いた構文が
意味的に同じ場合、
どちらが望ましいでしょうか?
(速さや可読性など。)


310:デフォルトの名無しさん
09/08/08 00:46:36
俺のイメージでは、
式の一部として使うなら、三項演算子が読みやすく、
そうでなければif elseが読みやすい。
デバッグトレースするならif else。
実行速度はどっちもほとんど変わらん。

311:309
09/08/08 00:48:23
>>310
ありがとうございます。


312:デフォルトの名無しさん
09/08/08 01:06:19
>>309
自分の場合、三項演算は、参照型と const 変数の初期化や、戻り値
の分岐に限定して使用している。

313:デフォルトの名無しさん
09/08/08 01:29:28
>>297
別に実体化してリンクしても問題ないが。

314:デフォルトの名無しさん
09/08/08 01:31:00
並列化やベクトル化をするコンパイラの場合、分岐を使うと最適化を拒否られるが三項演算子だと最適化してくれたりする。
豆知識な

315:デフォルトの名無しさん
09/08/08 02:08:21
コンパイラの例を挙げてくれてればよかったなあ。。。

316:デフォルトの名無しさん
09/08/08 05:51:46
条件演算子と呼んでください。
いつか三項の仲間が増えてもごっちゃにならないように。

317:デフォルトの名無しさん
09/08/08 05:59:05
>>309
よく考えたら、意味的に同じなんてありえなくね?

条件演算子は「 a が真のとき b 、そうじゃなければ c 」
if else 文は「 a が真のとき b をする、そうじゃなければ c をする」

処理の意味によってどっちに当てはめたほうが読みやすいかは決まってくるでしょ。
たとえば b, c が副作用を持つ場合に条件演算子だと読みにくいだろうなぁ、とか。

318:デフォルトの名無しさん
09/08/08 06:20:51
a == true ? printf("true") : printf("false");

319:デフォルトの名無しさん
09/08/08 06:43:47
printf(a ? "true" : "false");
こうだろjk

320:デフォルトの名無しさん
09/08/08 07:04:50
printf("true\0false"+5*!a);

321:デフォルトの名無しさん
09/08/08 07:05:25
無名namespace内でのtypedefについてなんですが、以下のコードは正しいでしょうか?

#include <iostream>
namespace{
typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;
}
ulong a() { return 1; }
uint b() { return 2; }
ushort c() { return 3; }
uchar d() { return 4; }
int main(int argc, char** argv)
{
a(); b(); c(); d();
return 0;
}

これをCygwinのg++ 3.4.4でコンパイルすると
error: `uint' does not name a type
error: `ushort' does not name a type
というエラーが出ます(ulong, ucharについては何もエラーが出ません)。
ただし、#include <iostream> の行をコメントアウトするか、関数 a(), b(), c(), d() を無名namespace内に入れると
コンパイルが通ります。

これはCygwinのg++がおかしいのか、それともコードに問題があるのか、どっちなんでしょうか?

322:デフォルトの名無しさん
09/08/08 08:11:30
無名namespaceって

::ulong

で参照しなかったっけ。

323:デフォルトの名無しさん
09/08/08 08:19:57
今の時代Cygwinでファーストコード通してる人が居るんだなぁと
ちょっと意外に感じた。

324:デフォルトの名無しさん
09/08/08 08:23:24
>>322
それはグローバルnamespaceじゃないですか?

325:phenix
09/08/08 09:45:36
>>301
boost::spiritを使うと簡単

326:デフォルトの名無しさん
09/08/08 10:03:46
>>322
それはグローバルだな。
無名は特に外部から参照は出来ない。
その翻訳単位内でのみ参照可能。

327:314
09/08/08 10:12:26
>>315
日立SR8000の最適化コンパイラ
って言っても縁ないでしょ。

328:デフォルトの名無しさん
09/08/08 10:26:48
>>327
確かに縁がなさ過ぎるw

329:デフォルトの名無しさん
09/08/08 13:46:31
>>327
縁がないから言ってもしょうがないでしょって思ってんのかな

330:デフォルトの名無しさん
09/08/08 17:58:04
return で返される値は
返り値
戻り値
など色々呼び名があると思いますが、
C++用語としてはどれが正しいでしょうか?

331:デフォルトの名無しさん
09/08/08 18:28:25
>>321
gcc -E してみたら、 /usr/include/sys/types.h でグローバルに uint と ushort の typedef が
あった。どうもこいつらが影響してるみたい。

ちなみに、ソース先頭で #define _POSIX_SOURCE しとくとこれらの typedef が無くなるんで、
ふつうに通るようになる。

というわけで、問題を縮小していくと以下の3行で同じ問題が発生する。

typedef int I;
namespace{ typedef int I; }
I i;

> :3: error: `I' does not name a type
> :3: error: extra `;'

typedef に限らず、グローバルスコープと無名名前空間の中に同じ名前の宣言があると、
宣言自体は通るのに、その後で実際には宣言された名前が使えなくなるみたい。

gcc のバグっぽいけど、標準ではどうなるべきなんだろうか?
2つの宣言のどっちを使うのか曖昧だからエラーになってほしいところ。

332:デフォルトの名無しさん
09/08/08 18:31:18
>>330
いちおう、 JIS 規格では「返却値」。
ほとんどの場合はどれでも通じるから、どれが正しいとも正しくないとも思わないけどね。

333:デフォルトの名無しさん
09/08/08 18:33:05
>>332
返却値ですか。
ありがとうございました。

334:デフォルトの名無しさん
09/08/08 18:46:09
>>331
検証サンクスです。グローバルnamespaceと無名namespaceで重複するとおかしくなるんですね。
どっちが優先されるべきなのか少し調べてみましたが、よくわかりませんでした。
というか、宣言の時点でエラーなり警告なり出して欲しいですね。

とりあえずtypedefについては無名namespace外でも使う場合はグローバルスコープに置くことにしようと思います。

335:デフォルトの名無しさん
09/08/08 18:51:42
でも、仮にグローバルnamespaceが無名namespaceより優先されるとしたら
名前の重複が起こった場合、無名namespaceの方には外側からアクセスできなくなっちゃいますね。
とすると本来は無名namespaceが優先されるべきなのかな??

336:デフォルトの名無しさん
09/08/09 00:39:45
An unnamed-namespace-definition behaves as if it were replaced by
namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

つまり

typedef int Integer;
namespace{
typedef long Integer;
Integer l; //OK:long
}

Integer i; //NG
::Integer i; //OK:int

グローバルと重複したとき無名名前空間外から参照する方法はない
無名名前空間内では無名名前空間側が優先

337:デフォルトの名無しさん
09/08/09 01:27:03
MyClassは自作のクラスで、そのコピーコンストラクタは重いとします。

MyClass foo()
{
//とても重い処理
return 〇〇;
}
この関数を呼び出した側で返り値を長く使いたい(ただし変更はしない)場合、
const MyClass retval
=foo();
とするべきか、
const MyClass& retval
=foo();
とするべきか
どちらが望ましいでしょうか?
コンパイラによる「戻り値最適化」が行われないとすれば前者は後者より重いと推測されますが、
コンパイラによる「戻り値最適化」が行われるとすれば前者は後者より参照の解決が不要な分 速いのではと思っているのですが、この理解で正しいでしょうか?

338:デフォルトの名無しさん
09/08/09 01:38:44
>>337
戻り値最適化を行うような、処理速度について配慮されたコンパイラであれば、
テンポラリを束縛した参照について「参照の解決」などという処理に時間をかけることは
無いだろう。

339:314
09/08/09 02:42:42
>>329
ひねくれたやっちゃな。
コンパイラ個別の特徴じゃないしな。
if文があったらループの最適化をサボるってのは。
それを3項演算子で抜けられる可能性があるってのは一般論として知っておいて損はないだろ。
具体的なコンパイラの名前が必要な話か?

340:デフォルトの名無しさん
09/08/09 02:53:37
縁がないだろって思ってるコンパイラでしか有効じゃない機能をわざわざ紹介する理由は確かに分からん

341:デフォルトの名無しさん
09/08/09 03:59:56
一般論に対して例外の存在を補足しただけじゃねーの。

342:337
09/08/09 10:12:42
>>338
ということは、最適化が出来るコンパイラなら
どちらも同じだろうと言うことですね。

ありがとうございました。

343:デフォルトの名無しさん
09/08/09 15:39:44
struct B
を継承するときに、
class cD : B
struct sD : B
これら二つの違いは何でしょうか?

cDはBをprivate継承していて、sDはBをpublic継承しているだけだと
いう理解でよろしいでしょうか?

344:デフォルトの名無しさん
09/08/09 15:40:38
はい

345:デフォルトの名無しさん
09/08/09 15:40:57
>>343 はい。

346:デフォルトの名無しさん
09/08/09 15:41:38
ごめん

347:デフォルトの名無しさん
09/08/09 15:48:53
えっ?

348:デフォルトの名無しさん
09/08/09 15:49:51
えっ?

349:デフォルトの名無しさん
09/08/09 15:50:17
えっ?

350:デフォルトの名無しさん
09/08/09 15:51:36
えっ?

351:343
09/08/09 15:53:36
ありがとうございました。

352:デフォルトの名無しさん
09/08/09 15:54:23
いえいえ、どういたしまして。

353:デフォルトの名無しさん
09/08/09 16:10:44
numeric_limits - C++ Reference
URLリンク(www.cplusplus.com)
ここを読んでみましたが、
staticメンバ関数の
min()
epsilon()
この二つの違いが分かりません。
std::numeric_limits<double>::min()
std::numeric_limits<double>::epsilon()
の例で違いを教えていただけませんでしょうか?

なお、私の環境
Windows XP SP2
g++ (TDM-1 mingw32) 4.4.0
では
std::numeric_limits<double>::min() = 2.22507e-308
std::numeric_limits<double>::epsilon() = 2.22045e-016
となりました。


354:デフォルトの名無しさん
09/08/09 16:20:14
>>353
min() は浮動小数点で表現できる最小の数
epsilon() は「機械イプシロン」を調べていただければわかるが、数値 1.0 とそのとなりにある実数との差
この二つは異なる概念なんですね。

355:353
09/08/09 16:21:31
>>354
理解出来ました。
ありがとうございます。


356:デフォルトの名無しさん
09/08/09 16:26:04
>>353
minというのは、その名の通り、double型で表現できる(絶対値が)最小の値。
epsilonというのは、double型で表現できる、「1の次の」値から1を引いた値。

詳しくはIEEE754をよく読んで欲しいんだけど、要するにdouble型で表現できる値っていうのは
0付近では密で、絶対値が大きくなればなるほど疎になる性質がある。
例えばdouble型は0~1の間には10億個ぐらいの表現できる値があるけど、
1~2の間には800万個ぐらいしかない。

357:デフォルトの名無しさん
09/08/09 16:42:12
みなさんありがとうございます。
申し訳ないのですが、

quiet_NaN()
Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN()
Representation of signaling "Not-a-Number", if available.

この二つの違いも教えていただけますでしょうか。
前者が「静かな」というのが今ひとつ分かりません。

358:デフォルトの名無しさん
09/08/09 17:06:50
>>357
一般的に、NaNというのはなんかエラーな感じの数のこと。
NaN+普通の数とか、普通の数÷NaNとか、とにかくNaNがどっかに含まれる演算を行なったとき、
・Quiet NaNを使ったときは、演算結果としてNaNを返す
・Signaling NaNを使ったときは、浮動小数点例外が発生する(0除算を行った時みたいに、プログラムの実行が停止する)

359:デフォルトの名無しさん
09/08/09 17:11:27
多分だけど計算中にNaNが現れたときsignalを発生するかしないかじゃないかな?

360:デフォルトの名無しさん
09/08/09 20:46:22
プログラム技術2ch掲示板のC++のスレ見ても、dynamic_cast演算子を使ったソース
がほとんど見掛けないな。皆そんなに使わないのかいな。大変な努力をして、
C++を学習したのに、それを使う機会が無いって、物足りないな、困ったもんだ。

361:デフォルトの名無しさん
09/08/09 20:49:16
ダウンキャストかクロスキャストの時しか使わないじゃん

普通は仮想関数だけで十分

362:デフォルトの名無しさん
09/08/09 21:27:55
>>360
goto と似たようなもんだ。使わないで済むならそれでいい。

363:デフォルトの名無しさん
09/08/09 21:31:35
C++には多用しちゃいけない機能もあるからな
dynamic_castやtypeidもそうだし、あと例外指定とか

364:デフォルトの名無しさん
09/08/09 21:39:06
>>363
mutable もだな。
reinterpret_cast 級の危険機能だと思う。

365:デフォルトの名無しさん
09/08/09 21:53:38
使い方を間違えなければmutableは非常に役立つよ。

366:デフォルトの名無しさん
09/08/09 21:54:10
いざという時に、せめて可能な限り安全にわかりやすく
ダーティーなやり口に手を染めるためのもの、という感じかな。

漫画によくある場面で喩えるなら、主人公が出発前に
「できればこれを使わずに済ませたいものだが・・・」
とか言いながら見つめてる武器みたいな。

367:デフォルトの名無しさん
09/08/09 21:55:31
それ絶対使うじゃんw

368:デフォルトの名無しさん
09/08/09 21:55:41
もうCでいいじゃん。

369:デフォルトの名無しさん
09/08/09 21:58:44
>>367
この手の場面に相当するような「デカい仕事」では、実際結構な確率で
いま出ているような物を使うことになると思う。

370:デフォルトの名無しさん
09/08/09 22:02:12
危険な機能を使わないためと言って変な黒魔術で無理矢理回避する方がよっぽど危険だしな

371:デフォルトの名無しさん
09/08/09 22:25:27
Windowsでプログラムしていると
reinterpret_cast と dynamic_cast のオンパレードですよ^^

372:デフォルトの名無しさん
09/08/09 22:30:33
>>371
キャストが必要になるのはわかるが、オンパレードはおかしいだろ。
同じ意味のキャストはてきとうにラップしろよ。

373:デフォルトの名無しさん
09/08/09 22:39:44
ダウンキャストの意味わかってるのか?
存在しないメンバにアクセスして鼻から悪魔が出るのを承知で
使わないといけないんだぞ

374:デフォルトの名無しさん
09/08/09 22:43:35
HWND(構造体へのポインタ)をCWndクラスにキャストさせたり、Windowsプログラミングは楽しいなぁ^^

375:デフォルトの名無しさん
09/08/09 23:12:24
C++やりたての頃はこういう鼻から悪魔の意味もわからなかった

#include <iostream>

class Base {
int i;
public:
virtual void print() const {
std::cout << "Base" << std::endl;
}
};

class Derived : public Base {
public:
void print() const {
std::cout << "Derived" << std::endl;
}
};

int main()
{
Base *p;

p = dynamic_cast<Derived*>(new Base);

p->print(); // ouch!
}

376:デフォルトの名無しさん
09/08/09 23:17:31
>>375
これはどの辺が鼻から悪魔?


377:デフォルトの名無しさん
09/08/09 23:18:56
>>376
BaseにはDerived::print()がない

実行してみればわかるが正しく動かない

378:デフォルトの名無しさん
09/08/09 23:20:46
>>376
dynamic_cast<Derived*>(new Base) この結果がヌルポインタになる。
その後の p-> でヌルポインタをデリファレンスして未定義動作。

379:デフォルトの名無しさん
09/08/09 23:21:39
>>377 えっ?

380:デフォルトの名無しさん
09/08/09 23:25:38
ごめんこういう場合に使うんだったね

#include <iostream>

class Base {
int i;
public:
virtual void print() const {
std::cout << "Base" << std::endl;
}
};

class Derived : public Base {
public:
void print() const {
std::cout << "Derived" << std::endl;
}
};

int main()
{
Base* p;

p = dynamic_cast<Base*>(new Derived);

if (!p)
std::cout << "dynamic_cast failed." << std::endl;

p->print(); // ouch!
}

381:376
09/08/09 23:27:43
すみません
>>377

>>378
はどちらが正しいですか?

382:デフォルトの名無しさん
09/08/09 23:29:07
>>381
>>378が正しい
ダウンキャストはポインタが正しい本体を指している時にのみ成功する

383:デフォルトの名無しさん
09/08/09 23:37:32
>>380
これは何でouch!なの?

384:デフォルトの名無しさん
09/08/09 23:38:21
>>380
いや、 Derived* → Base* は暗黙変換で通るから、 dynamic_cast の出番じゃない。

しかも、せっかく dynamic_cast の結果にチェックを入れたのにメッセージ表示の後に
結局 p-> してたらダメじゃん。

385:デフォルトの名無しさん
09/08/09 23:40:07
わかんね
dynamic_castの正しい使い方知ってる人教えて

386:デフォルトの名無しさん
09/08/09 23:48:07
DerivedがBaseとBase2を継承してるとして

・Derived* → Base* (アップキャスト)
常に成功し、Baseのポインタが得られる

・Base* → Derived* (ダウンキャスト)
DerivedのBase部分を指してるポインタだったら正しいDerivedのポインタが得られる
そうでなければヌルポインタが返ってくる

・Base* → Base2* (クロスキャスト)
DerivedのBase部分を指してるポインタだったら正しいBase2のポインタが得られる
そうでなければヌルポインタが返ってくる

・Base* → int* (無関係)
常にヌルポインタが返ってくる

参照の場合は、以上の「ポインタ」を「参照」、「*」を「&」、
「ヌルポインタが返ってくる」を「std::bad_cast例外が投げられる」に読み替えればいい

387:デフォルトの名無しさん
09/08/10 00:01:23
よく見ろよw
>>375のは
p = dynamic_cast<Derived*>(new Base);
どこにもDerivedのインスタンスは生成されない
そりゃNULLが帰ってくるだろうって


388:357
09/08/10 00:18:37
>>358-359
ありがとうございます。
NaNについてはもっと勉強してきます。


389:デフォルトの名無しさん
09/08/10 00:45:20
>>369
そういう話ではなく
> 「できればこれを使わずに済ませたいものだが・・・」
といったらそれは使うフラグ

390:デフォルトの名無しさん
09/08/10 01:35:06
>>389
まさにそういう話だと思うが。

391:デフォルトの名無しさん
09/08/10 02:23:56
仕事のデカさは関係ないってことじゃないの?

392:デフォルトの名無しさん
09/08/10 12:33:39
dynamic_castの意味を今まで勘違いしてたわ
ダウン・キャストしても安全に使用できるかどうかの判定なのね

393:デフォルトの名無しさん
09/08/10 15:40:20
VS2008のVC++MFCで
ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。

以下ソース
CImage img;
CImage img2;
HDC hdc;
img2.Create(80,60,24);
img.Load("jpgファイルのフルパス");
hdc = img2.GetDC();
SetStretchBltMode(hdc, HALFTONE);
img.Draw(hdc, 0, 0, 80, 60);
img2.ReleaseDC();
m_xcPic01.SetBitmap( (HBITMAP)img2 );
img.Destroy();
img2.Detach();
img2.Destroy();

jpgファイルが変わる毎に、画面上の画像も切り替えたいので
上の処理を呼び出して、画面を切り替えてます。
しばらく動かしていたところで気付いたのですが、
メモリの使用量がかなり多くなっていました・・・
ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか?
わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。

394:デフォルトの名無しさん
09/08/10 15:45:28
Detachしてしまったビットマップは削除されないのでは

395:デフォルトの名無しさん
09/08/10 15:48:42
ヘッダーに変数を定義することって出来たんでしたっけ?
いや、さっき書いてみたら出来たんで、ちょっとびっくりしたんですが。
インクルードガードしてないとエラーが出るってだけなのかな。Cではどうなんでしょう。
まあ、作法としてはインクルードガードしててもやっちゃダメなのかもしれないですけど。ですよね?



396:デフォルトの名無しさん
09/08/10 15:54:56
本当ならリンカが多重定義のエラーを吐くはずだが、デフォルトでは吐かない奴もいる

397:393
09/08/10 15:58:12
>>394
レスありがとうございます
Detach後にDestroyすると、メモリ上に残る・・・
つまり、リサイズ後用のimg2がどんどん溜まっている状態
ってことでしょうか?

ためしにimg2.Detach();をコメントアウトして動作させると、
別ウィンドウの後ろに隠れると画像が消えると言う症状がでました。
私、根本的に作り方を間違えているのかも・・・

398:デフォルトの名無しさん
09/08/10 16:18:59
>>397
MFCスレでやってくれ

399:393
09/08/10 16:28:29
>>398
MFC相談室の方に移動させていただきます。
スレ汚しすみませんでした。

400:デフォルトの名無しさん
09/08/10 16:45:42
>>395
ヘッダだからできない事というのはないよ
やるべきじゃないことは、ある。

401:デフォルトの名無しさん
09/08/10 17:42:52
>>400
>ヘッダだからできない事というのはないよ

へー、そうなんですか。
逆に、ソースだとできないことってのはありますよね?
テンプレートの定義とか。


402:デフォルトの名無しさん
09/08/10 18:00:51
>>401
.hも.cppもC++の上では本質的には変わりないんだよ。
テンプレートの定義だって、別に.cppの上でやったっていい。
その定義が他の.cppから見えるかどうかは別問題だがな。

403:デフォルトの名無しさん
09/08/10 18:06:33
>>401
だからできないことはないって。
逆に聞くが、ヘッダとソースってどうやって区別してんの?

404:デフォルトの名無しさん
09/08/10 18:08:23
定義そのまま他の.cppに丸ごとコピペすればいいわけだが、
後々修正する際に全部直して回るのが面倒だからそういうことはやらないだけだ

405:デフォルトの名無しさん
09/08/10 18:09:46
#include "header.cpp"
この場合、header.cpp はヘッダなのかソースなのか

406:デフォルトの名無しさん
09/08/10 18:38:26
>>405
いわゆるクソコードってやつだよ。

407:デフォルトの名無しさん
09/08/10 18:46:46
オブジェクト指向について質問なんだけど。

クラスAのインスタンスをクラスBで作り
クラスBのメソッドからクラスAのprivateにあるメンバ変数をゲッターセッターを使って弄る(クラスBのメンバ変数にも同期させる)。
そして、又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。

そういう風に包含を重ねて行くのがオブジェクト指向なの?
C++をやって間もないんだけど、俺のプログラムはこんな感じなんだ。
良いのか悪いのか分からない、アドバイスお願い

408:デフォルトの名無しさん
09/08/10 18:48:16
>>405
学生の時にバイトしていた会社のコードにそういうのがあった
日本のロケットがクソ高くて落ちるわけだ、と思った

409:デフォルトの名無しさん
09/08/10 18:54:57
クソコードでバグを入れて、
そのバグを取るのが仕事ですから
それでいいんです。

410:デフォルトの名無しさん
09/08/10 18:56:03
>>407
俺はメソッドとかC++標準にない用語を使われても起こらない。
しかし
>>クラスAのインスタンスをクラスBで作り
これはどういう意味だい?

411:デフォルトの名無しさん
09/08/10 18:58:28
>>410
えっと
クラスBのprivate領域に、クラスAの実体を包含するって意味で書いたつもりだった

412:デフォルトの名無しさん
09/08/10 19:03:01
>>406
クソかどうかは関係ない。
できないことがあるのかどうかが論点であり、やるべきではないことはまた別の話

413:デフォルトの名無しさん
09/08/10 19:44:54
>>407
>又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。
クラスBでクラスBのメンバ変数を参照して判定するようにして、外からメンバ変数を
見せないように隠蔽するのが、オブジェクト指向のカプセル化の基本かな。
セッタ/ゲッタはそれを破ってしまうから避ける様に設計するのがお勧め。

414:デフォルトの名無しさん
09/08/10 20:12:31
雪駄とか下駄はオブジェクト指向じゃないと個人的には思う。
単一責任原則をはたすためにも、
メソッドは単に状態を書き換えるだけでは十分でないと思うから。


415:デフォルトの名無しさん
09/08/10 20:15:25
セッタ/ゲッタは最終手段であり、
それに突入した瞬間からクソコードが始まると考えて
「一般には」さしつかえないくらい。


416:デフォルトの名無しさん
09/08/10 20:33:13
C++ code - 95 lines - codepad
URLリンク(codepad.org)
この
std::numeric_limits
の明示的特殊化のコードは、
g++ 4.4.0では問題無くコンパイル・実行できました。
しかし
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
では
 error C2910: 'std::numeric_limits<MyTempl<MyInt>>' : 明示的な特殊化にすることはできません。
となり、コンパイルエラーとなってしまいます。
VCでも通す方法はありませんでしょうか?

Compiler Error C2910
URLリンク(msdn.microsoft.com)(VS.71).aspx
このあたりを読んでみましたが、よく分かりませんでした。
よろしくお願いします。




次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch