C++相談室 part71 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
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のやつそのまま使えるから問題なし


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

5015日前に更新/217 KB
担当:undef