C++相談室 part71

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part70
http://pc12.2ch.net/test/read.cgi/tech/1244942050/l50
2デフォルトの名無しさん:2009/07/18(土) 02:57:44
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映していない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2009/07/18(土) 02:58:36
4デフォルトの名無しさん:2009/07/18(土) 02:59:33
5デフォルトの名無しさん:2009/07/18(土) 03:00:33
> Apache STDCXX http://incubator.apache.org/stdcxx/
> は
> Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
> というのは指摘済みでした。ごめんなさい。とりあえず訂正。
ごめんなさい。直すの忘れていました。

■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
6デフォルトの名無しさん:2009/07/18(土) 03:01:20
Boost C++ Libraries
http://www.boost.org/

Boost 翻訳プロジェクト
http://boost.cppll.jp/HEAD/

Let's Boost
http://www.kmonos.net/alang/boost/

boost info
http://shinh.skr.jp/boost/
7デフォルトの名無しさん:2009/07/18(土) 03:04:39
順番間違えました。すみません。

入門ページなど

http://www.cplusplus.com/

・入門, 一覧, 使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
8前スレ994:2009/07/18(土) 03:37:27
typo があったようですみませんでした。
きちんとなおしたものを添付します。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9780.txt
どうしてもオーバーロードがあいまい、と出てしまうのですが、何が悪いのでしょうか。
9:2009/07/18(土) 03:39:56
すみません、こちらが最新です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9781.txt
10:2009/07/18(土) 03:41:12
コンパイラは gcc 3.4.4 です
11デフォルトの名無しさん:2009/07/18(土) 03:52:44
ostream operator<<(ostream &stream, coord<U> ob)
istream operator>>(istream &stream, coord<U> &ob)
    ↑
ここに&がないじぇ
12デフォルトの名無しさん:2009/07/18(土) 04:30:57
>>11
ご指摘ありがとうございました。うまくいきました。参照返しなのを忘れておりました。
13デフォルトの名無しさん:2009/07/18(土) 15:41:04
だよね。オブジェクトのコピーか参照かっていうのは本質的な違いだよね。
14デフォルトの名無しさん:2009/07/18(土) 16:20:09
前スレ1000gj
15デフォルトの名無しさん:2009/07/19(日) 01:28:32
もし、(a==真かつb==真かつc==偽)かつ(d==真またはe==)が
真のときf=真
else
 {
  f=偽
 }
endif
なif文書きたい場合、どういった工夫をしたらいいですか?
乱視な俺にはカッコのインデントがチカチカして頭痛が痛い
16デフォルトの名無しさん:2009/07/19(日) 01:29:33
c==偽)または(d==
添削ミスですorz
17デフォルトの名無しさん:2009/07/19(日) 01:44:29
>>15
そのまま書けば?何が不満なんだ?
18デフォルトの名無しさん:2009/07/19(日) 01:44:57
e==真として、そのままf = (a && b && !c) || (d && e);と書き下す以外に書き方ってあるの?
19デフォルトの名無しさん:2009/07/19(日) 02:57:30
if(){if(){if()hoge}endif}endif・・・
20デフォルトの名無しさん:2009/07/19(日) 13:53:01
次のような条件があるなら関数にすればいい
・ 判定方法に名前をつけられる
・ メンバー変数による判定、あるいは、何度か使用する判定
21デフォルトの名無しさん:2009/07/19(日) 19:38:35
シングルトンクラスを作りたいと思います。
インスタンスを得るのにgetInstance()など
作って使うのが一般的だと思いますが、
operator new()の中に含めても、同等の機能が
実現出来る気がします。
operator new()にすると、何か目に見えるデメリットなど
ありますか?
22デフォルトの名無しさん:2009/07/19(日) 19:49:54
>>21
まず無駄にdeleteを実装しなきゃならない上、ユーザーにシングルトンオブジェクト
のライフサイクルを考えさせることになる。
だったらgetInstance()一発の方が楽だと思うが。
23デフォルトの名無しさん:2009/07/19(日) 19:56:47
>>21
newの戻りが常に同じポインタにするのかな?deleteが困っちゃうね。
既存の関数をオーバーロードするときに明らかに違う機能を入れると混乱の元だよ。
「初回使用時生成」でググってみよう
24デフォルトの名無しさん:2009/07/19(日) 19:57:02
その前にまずシングルトンにすることのメリットがあるのかどうか、よく考えたほうがいいだろうな。
25デフォルトの名無しさん:2009/07/19(日) 20:14:57
>>22-24
お答えありがとうございます。

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

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

>>明らかに違う機能を入れると混乱の元
確かにそうですね、考え直します。
26デフォルトの名無しさん:2009/07/19(日) 20:28:01
>>25
C#などのガベージコレクタでは問題はおきない。それと引き換えにガベージコレクタの処理が重くなっている。これがいわゆる等価交換である。
27デフォルトの名無しさん:2009/07/19(日) 21:07:48
子ウィンドウがシングルトンなんてありえないだろjk
28デフォルトの名無しさん:2009/07/19(日) 21:11:50
>>25
もし子ウインドウが1つしか存在し得ないのなら、そもそもMDIを使うのが
間違いだな。
29デフォルトの名無しさん:2009/07/19(日) 22:06:31
シングルトンってシングルスレッドでは単に関数の中にstaticな変数をラップするだけなのね。
30デフォルトの名無しさん:2009/07/20(月) 00:40:26
BOOST_TYPEOFってどんな実装なの?コード書いてあるとこよく分んないんだけど…
31デフォルトの名無しさん:2009/07/20(月) 02:01:00
32デフォルトの名無しさん:2009/07/20(月) 07:02:32
33デフォルトの名無しさん:2009/07/20(月) 22:33:10
>>31,32
ありがとう。これは使い物にならんわ…
34デフォルトの名無しさん:2009/07/22(水) 21:52:10
C++の入門書の通り、mainに
cout<<"Hello, world"
って書いたらいきなりコンパイルエラーがでて笑った。
ちょっと調べたらusingでstd::を省略できることはわかったけど、
そうすると全てのstd::の名前空間が含まれてしまうらしいなw

C++って仕様がちょっとマヌケすぎないか?
35デフォルトの名無しさん:2009/07/22(水) 21:58:59
その入門書がマヌケなだけ
36デフォルトの名無しさん:2009/07/22(水) 21:59:11
using std::cout;でおk
37デフォルトの名無しさん:2009/07/22(水) 22:18:27
ろくに知らないのに馬鹿な発言して恥をかく典型。
38デフォルトの名無しさん:2009/07/22(水) 22:21:25
>>34
背伸びをするのも時には必要だもんね。

39デフォルトの名無しさん:2009/07/22(水) 22:24:47
そのクソ入門書がこれ以上売れてしまわないように書名を晒すのが君の義務だ
40デフォルトの名無しさん:2009/07/22(水) 22:25:11
数時間かけて
その入門書片手にくだらないレスを考えていたんだろうから
バカでも許してやろうぜ。
41デフォルトの名無しさん:2009/07/22(水) 23:02:29
GetRand()関数について質問させてください。
0〜100の乱数の中のひとつがほしいときは、
GetRand(100)
で受け取れるんですが、100〜200の中の乱数がほしいときは
どのように記したらいいんでしょうか。
どうやっても出来ないんで、誰か助けてください。
42デフォルトの名無しさん:2009/07/22(水) 23:09:46
GetRand(100) + 100で問題あるの?
43デフォルトの名無しさん:2009/07/22(水) 23:13:41
>>42
思いつかなかったんだろうな
44デフォルトの名無しさん:2009/07/22(水) 23:26:34
すみません、知識不足すぎました。
GetRand内だけで済ませようとした自分がアフォすぎました。
低レベルすぎてすみませんでした。
お騒がせして申し訳ありませんでした。。。
では。
45デフォルトの名無しさん:2009/07/23(木) 01:56:33
アフォすぎたとへこむより、そう考えるのかーと思えないとなぁ
46デフォルトの名無しさん:2009/07/23(木) 19:50:07
#ifndef HOGE_H
#define HOGE_H
#endif HOGE_H

ヘッダーのインクルードガードの#endifにマクロが記述してあるコードを見たんですが、これってどうなんですか?
どういう役割があるのか、やった方がいいのか悪いのか、誰か解説して下さい。
47デフォルトの名無しさん:2009/07/23(木) 19:59:35
どういう意味もない。無視される
48デフォルトの名無しさん:2009/07/23(木) 20:08:25
無視されることは決められてるの?
#endif //HOGE_H
というスタイルは割と見る
49デフォルトの名無しさん:2009/07/23(木) 20:18:51
無視はされないだろ
普通に#defineが何度も定義されるだけだと思うが
50デフォルトの名無しさん:2009/07/23(木) 20:28:44
詳しくお願いします。
51デフォルトの名無しさん:2009/07/23(木) 20:31:06
>>48
#ifndef HOGE_H
#define HOGE_H ←ここでHOGE_Hを#defineしてるから
#endif HOGE_H ←ここのHOGE_Hは空白に置き換えられる
52デフォルトの名無しさん:2009/07/23(木) 20:33:50
>>51
あ、そうかw

>>49は勘違い?
5349:2009/07/23(木) 20:36:56
勘違いでしたすいませんorz
54デフォルトの名無しさん:2009/07/23(木) 23:40:56
実装方法のスタンダードを教えてください。

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

サブクラス化する手法として、もっとも一般的な実装方法を
ご教授ください。
5554:2009/07/23(木) 23:42:15
すみません、語弊がありました。

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

よろしくおねがいします。
56デフォルトの名無しさん:2009/07/24(金) 02:09:55
>>54
その自分で作ったクラスから派生させるなり、
paint,create,closeを持ったインターフェース用意してそれを呼ぶようにしたりしちゃダメなの?
57デフォルトの名無しさん:2009/07/24(金) 02:30:41
いやいや、SetPropとかSetWindowLongPtr使えってテンプレ回答では?
58デフォルトの名無しさん:2009/07/24(金) 13:30:12
>>57
そういうことか
メッセージループでswitch文書きたくないのかと思った
59デフォルトの名無しさん:2009/07/24(金) 14:30:01
 ある関数void foo(unsigned int num)内の出来事。
 引数numに格納された値を使って、
 char* array = new char[num];
 として確保して使いたい。
 ところが使用後(fooスコープを脱出後)には自動的に破棄されるようにしたい。

これを実現するのに一番簡単な方法は何でしょうか?
デストラクタを利用して出来そうな気がするのですが。
よろしくお願いいたします。
60デフォルトの名無しさん:2009/07/24(金) 14:35:52
std::vector<char> v(num);
char *array = &v[0];
6159:2009/07/24(金) 15:01:42
>>60
なるほど、vectorの内部の配列は連続していることが保証されているというのを使うわけですね。
ありがとうございました。
62デフォルトの名無しさん:2009/07/24(金) 15:04:43
#include <boost/scoped_array.hpp>

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

これだとダメかな?
知ってる人いません?
6362:2009/07/24(金) 15:13:36
char *array = s.get();
でしたね。
失礼。
64デフォルトの名無しさん:2009/07/24(金) 15:56:38
後でサイズ変更しないならいいんじゃねぇの
65デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/24(金) 16:17:38
vector<int> v(&d[0], &d[sizeof(d)/sizeof(d[0])]);
67デフォルトの名無しさん:2009/07/24(金) 17:03:00
ありがとうございました
68デフォルトの名無しさん:2009/07/24(金) 20:17:36
boostにそれ用のコーポネントがある。
boost::assignでぐぐれ
69デフォルトの名無しさん:2009/07/24(金) 20:55:51
C++ code - 39 lines - codepad
ttp://codepad.org/6eGTAvJT

ここにある関数
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デフォルトの名無しさん:2009/07/24(金) 22:16:23
はい
71デフォルトの名無しさん:2009/07/25(土) 13:46:26
色々やってみたけど結局templateでjavaジェネリクスのextends条件はできませんでした。
72デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/25(土) 14:51:32
>>71
じゃあJavaに変えると良いよ。
スレ違い。
74デフォルトの名無しさん:2009/07/25(土) 14:56:28
Boost.ConceptCheckのConceptAssertとTypeTraitsのisBaseOfでできるな
75デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/25(土) 15:17:15
>>71
C++のtemplateは黒魔術だから、大抵何でもできる。
というか、お前釣りだろ?w
http://alfalfa.livedoor.biz/archives/51489493.html

最近、知ったか房みてるとどうしても↑に思える
77デフォルトの名無しさん:2009/07/25(土) 15:43:04
>>76
まさに真理だなw

黒魔術というか、テンプレートメタプログラミングはチューリング完全だから
効率を気にしなければ他のプログラミング言語で実現出来ることは何でも出来る。
78デフォルトの名無しさん:2009/07/25(土) 16:04:03
>>77
むしろ実行効率は良いという、恐ろしいことが証明されているんだよね。
ただし開発効率は発狂物だろうがww
79デフォルトの名無しさん:2009/07/25(土) 16:11:28
という事は超頑張ればコンパイル時にMP3を鳴らす事も!・・・
80デフォルトの名無しさん:2009/07/25(土) 16:12:55
>>79
本当にやってるヤツが世界にはいるのではないだろうかw
81デフォルトの名無しさん:2009/07/25(土) 16:15:58
C++ code - 169 lines - codepad
ttp://codepad.org/0JbIj2qe

ここにあるコードを
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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/25(土) 19:20:49
public:
Derived(int x, int y);
8469:2009/07/25(土) 20:14:00
>>70
ありがとうございます。
8581:2009/07/25(土) 20:16:29
自決しました。

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


自決方法
  Windows XP HomeEd SP2
  g++ (TDM-1 mingw32) 4.4.0
  この環境でなら問題無く動作するようになります。
8671:2009/07/25(土) 20:30:16
>>73すみません
>>74-76ありがとうございます。そしてごめんなさい。
使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して
コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。
どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても
値は0?とかになってしまうようです。だめですね…
87デフォルトの名無しさん:2009/07/25(土) 20:39:40
>>85
死ぬな死ぬなw
8882:2009/07/25(土) 21:42:32
>>83
ありがとうございました。
89デフォルトの名無しさん:2009/07/25(土) 22:58:33
std::maxのような関数テンプレートは
どの標準ヘッダに定義されていますか??
90デフォルトの名無しさん:2009/07/25(土) 23:09:41
algorithm
91デフォルトの名無しさん:2009/07/25(土) 23:11:15
>>85
いろいろ問題がありそうなコードだけど
コンパイルエラーになることが、
"問題無く動作する"ってことなの?
9285:2009/07/25(土) 23:36:04
>>91
> コンパイルエラーになることが、
> "問題無く動作する"ってことなの?
はい、g++としてはコンパイル時エラーで教えてくれる方が
正しい挙動だと思いまして。

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

9389:2009/07/25(土) 23:37:04
>>90
ありがとうございます!!
9485:2009/07/25(土) 23:41:38
>>91
> いろいろ問題がありそうなコードだけど

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

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

なんか後出しじゃんけんみたいになってしまって恐縮です。
申し訳ありません。
95デフォルトの名無しさん:2009/07/26(日) 01:18:43
自決でビール吹いたw
96デフォルトの名無しさん:2009/07/26(日) 01:52:39
>>87を見るまで気づかなかったw
97デフォルトの名無しさん:2009/07/26(日) 03:51:31
自決やべー後からくるわ。
98デフォルトの名無しさん:2009/07/26(日) 10:11:31
自決しました
より
自決方法
にじわじわくる

XPとg++でどう死ぬんだと
99デフォルトの名無しさん:2009/07/26(日) 14:57:26
未定義動作とか使うんだろうかw
100デフォルトの名無しさん:2009/07/26(日) 18:15:11
鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ
101デフォルトの名無しさん:2009/07/26(日) 18:27:56
それ自決じゃない
自決といえばdelete thisだろ
102デフォルトの名無しさん:2009/07/27(月) 13:27:12
>>101
うちの会社でよく見るコードだわ
なんとか動いてるけど恐ろしい・・・
103デフォルトの名無しさん:2009/07/27(月) 13:28:30
delete thisは使い方さえ間違わなければ合法だよ
104デフォルトの名無しさん:2009/07/27(月) 18:47:24
>>103
そうなんだけど、よくわからんやつが適当にいじると
そのあとメンバ触ってあぼんぬとかよくあるからさ
おまけにそのデバッグやらされるの俺だし
105デフォルトの名無しさん:2009/07/27(月) 19:22:22
今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る
delete thisは過去の遺物だな
106デフォルトの名無しさん:2009/07/27(月) 21:55:34
delete thisって何だ?
初めて知ったんだが。

ファクトリメソッドやshared_ptrなどは知っています。
delete thisは俺が新参者だから知らないだけか?
107デフォルトの名無しさん:2009/07/27(月) 22:13:43
delete p;
とかと一緒
thisを削除
108デフォルトの名無しさん:2009/07/27(月) 22:20:01
delete thisは、COMみたいに自分で寿命を管理するときに使う。
まぁ、前時代的な実装だね。
109106:2009/07/27(月) 22:53:58
ふーん。
そうなんだ。
思い返してみたけどやっぱ見たこと無ねぇな。

まあ理解しなくても良いよね。
どーも。
110デフォルトの名無しさん:2009/07/27(月) 23:00:07
boost::intrusive_ptrの使用例を検索してみると、
delete thisを見られるよ。
111デフォルトの名無しさん:2009/07/28(火) 11:39:11
Stateパターンで遷移後状態を返す直前に自状態を始末する際に
delete thisすることが多かったかな。最近はsmart pointerを
使うことが多くなったが。
112デフォルトの名無しさん:2009/07/28(火) 11:53:21
delete this じゃないが
デストラクタを明示的に呼ぶコードってのはたまーに使うな。
まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。
113デフォルトの名無しさん:2009/07/28(火) 11:56:11
>>112
そうそう、デストラクタって明示的に呼べるんだよね。
いつ使うのか全然しらない。
114112:2009/07/28(火) 12:00:42
つながりの無い事柄みたいになっちゃったが、
要は

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

から連想したんだ。許してくれ。
115デフォルトの名無しさん:2009/07/28(火) 13:30:04
C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか
116デフォルトの名無しさん:2009/07/28(火) 13:43:42
>>115
たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を
間接参照しようとしているから。
これ以上はソースを見ないと言い様が無い。
117デフォルトの名無しさん:2009/07/28(火) 14:28:43
間接参照不可能なポインタ変数を間接参照することは問題ないだろ。
問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。
118デフォルトの名無しさん:2009/07/28(火) 14:33:09
日本語でおk
119デフォルトの名無しさん:2009/07/28(火) 15:04:59
>>118
じゅうぶんわかる。
間接参照不可能なポインタ変数を間接参照することは問題ないね。
120デフォルトの名無しさん:2009/07/28(火) 16:32:18
いやまて
間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?
121デフォルトの名無しさん:2009/07/28(火) 16:52:12
間接参照不可能なポインタ変数ってvoidポインタのことでしょ?
->演算子でアクセスできないことも間接参照不可能っていうの?
122デフォルトの名無しさん:2009/07/28(火) 17:25:55
>>121
じゃあやっぱり>>117でいいよね
123デフォルトの名無しさん:2009/07/28(火) 18:39:08
MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は
const MyClass& temp
で受け取って束縛しても大丈夫ですよね?
そのスコープから外れるまでは有効ですよね?
124デフォルトの名無しさん:2009/07/28(火) 18:44:51
テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。
125デフォルトの名無しさん:2009/07/28(火) 18:55:30
関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される
126デフォルトの名無しさん:2009/07/28(火) 18:57:08
>>125
> 関数の戻り値をconst指定しておけば
おかなくてもだろ?
127デフォルトの名無しさん:2009/07/28(火) 19:16:15
え、まじで?無知ごめん
128デフォルトの名無しさん:2009/07/28(火) 19:17:44
っていうか、そうだよね。constは関係ないね。
ちょっと考えれば分かる話でしたorz
129デフォルトの名無しさん:2009/07/28(火) 19:21:30
>>113 placement new したオブジェクトを消すとき
130123:2009/07/28(火) 19:53:50
みなさんありがとうございます。
131デフォルトの名無しさん:2009/07/28(火) 19:57:50
>>129
placement deleteじゃだめなの?
132デフォルトの名無しさん:2009/07/28(火) 20:02:53
λ式ってブースト使わないと利用不可?
133デフォルトの名無しさん:2009/07/28(火) 20:03:33
placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。
134デフォルトの名無しさん:2009/07/28(火) 20:12:21
135デフォルトの名無しさん:2009/07/28(火) 20:14:55
136デフォルトの名無しさん:2009/07/28(火) 20:31:30
ラムダ式なんてオタのオナニー道具です
使っちゃいけません
137デフォルトの名無しさん:2009/07/28(火) 20:45:26
>>134-136
俺の明日はどっちだ…
138デフォルトの名無しさん:2009/07/28(火) 20:57:23
>>132
ラムダはちょっとしたところで使うなら便利。
あまり多用すると自分が困るかもしれないがね。

結局は使いようなんだが。
139デフォルトの名無しさん:2009/07/28(火) 20:58:46
>>133
そうなのか。
ありがとう。

140132:2009/07/28(火) 21:02:17
あり^^
141デフォルトの名無しさん:2009/07/28(火) 21:33:50
データを出力するときにn行おきに空行を入れたいのですがどうすればいいですか?
142デフォルトの名無しさん:2009/07/28(火) 21:39:22
繰り返しつかえばあ
143デフォルトの名無しさん:2009/07/28(火) 21:58:48
>>141
帰れ。
バカ過ぎる。
144デフォルトの名無しさん:2009/07/28(火) 22:23:37
for(int i = 0; i < num; i++)
{
cout << line[i] << endl;
if(i % n == n-1) cout << endl;
}
145デフォルトの名無しさん:2009/07/28(火) 22:34:37
>>144
やってみます
146デフォルトの名無しさん:2009/07/28(火) 22:41:16
なんかもっと初心者向けのスレに行けば?
たぶん宿題だろうし
147デフォルトの名無しさん:2009/07/28(火) 22:58:31
あっそ
148デフォルトの名無しさん:2009/07/28(火) 23:22:02
そういう態度は失礼だってママに言われなかった?
149デフォルトの名無しさん:2009/07/28(火) 23:32:48
ママは彼が物心つく前に鬼籍に入りまして。。。
150デフォルトの名無しさん:2009/07/28(火) 23:43:08
今日からパパがママよ!
151デフォルトの名無しさん:2009/07/28(火) 23:50:33
>>150
ぎゃ^
152デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/29(水) 09:10:29
>>152
(1)はダメ
Hoge()を抜けた途端にpointのインスタンスが消滅してしまう
154デフォルトの名無しさん:2009/07/29(水) 09:12:08
あほくさ
155デフォルトの名無しさん:2009/07/29(水) 09:29:33
>>152
(1) はコピー返しなので問題ない
(2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう
156デフォルトの名無しさん:2009/07/29(水) 13:00:03
>>126
いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。
157デフォルトの名無しさん:2009/07/29(水) 13:44:20
戻り値がconstである必要は無いというお話
158デフォルトの名無しさん:2009/07/29(水) 16:19:06
throwはreturnやbreakと同じようにスコープを抜ける
つまり自動変数のデストラクタ呼び出しが保障されてるんでしょうか?
159デフォルトの名無しさん:2009/07/29(水) 16:58:37
されます。例外が送出された時点でローカルスコープは「突然」終了し、
可能な限りスタックを巻き戻すことになってます。
なので、(一般に)デバッグ用途には使えません。
…メモリダンプを見ても変数の中身が消えちゃってるので。
160デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/30(木) 00:29:38
あー、これだと両方同じ型を指定した時は必ず成功してしまいますね…。
型の比較なんてないですよね?どうしよう…
162デフォルトの名無しさん:2009/07/30(木) 00:42:04
bcc5.5なんて糞コンパイラを窓から投げ捨てろ
163デフォルトの名無しさん:2009/07/30(木) 00:48:00
VCの複雑さが無くなれば捨ててもいいけど・・・
164デフォルトの名無しさん:2009/07/30(木) 00:49:51
コマンドラインで単なるC++コンパイラとして使うときに、
VCが特に複雑と言うほどBCCと何か違うことってあるか?
165デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/07/30(木) 05:36:55
>>158
例外がmainでcatchされずに飛び出るとterminateが呼ばれて
破棄処理が実行されない可能性がある
167デフォルトの名無しさん:2009/07/31(金) 15:28:35
お勧めのC++用リファクタリングツールを教えてください。
168デフォルトの名無しさん:2009/07/31(金) 23:23:19
メモ帳
169デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/01(土) 00:09:03
>>169
setやmapには、vectorのような要素数を指定するコンストラクタがないから、
単にデフォルトコンストラクタで初期化すればいい。
void func( set<int> s = set<int>() )
171デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/01(土) 00:38:18
r=(float)s/n;
printf("平均=%f\n",&r);
あたりでうごく?
173169:2009/08/01(土) 01:25:54
>>170
ありがとうございます。m(_ _)m
174デフォルトの名無しさん:2009/08/01(土) 01:26:36
>>172 r=(float)s/n;
を習ってないので使ってはいけないんですよ…
なんででないのかわからない…
%d→%fは直します。ありがとうございます!
175デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/01(土) 01:50:14
よくみたらx初期化してないし、sに加算してないし
そもそもC++のプログラムじゃないし
レスした自分が恥ずかしい
s+=x;な
177デフォルトの名無しさん:2009/08/01(土) 01:55:47
宿題スレでやれよ
178デフォルトの名無しさん:2009/08/01(土) 01:56:32
まあC++コンパイラで通るからいいかなと思った。今は反省している。
179デフォルトの名無しさん:2009/08/01(土) 01:57:53
>>177
そこはお客に丸投げしていただいたありがたい課題を解いて楽しむという反教育な場ですから。
180デフォルトの名無しさん:2009/08/01(土) 04:01:34
>>177 すいません…
>>178 C++じゃなかったんですか!自分はずっとC++と思い込んでました。
ありがとうございます。
181デフォルトの名無しさん:2009/08/01(土) 04:46:33
>>180
なんていうか、先が思いやられるな。未来のこの人の先輩がんばってください。
182デフォルトの名無しさん:2009/08/01(土) 11:53:51
>>180
いや、間違いなくC++だよ
Cコンパイラでも通るかもしれないというだけで
183デフォルトの名無しさん:2009/08/02(日) 01:21:46
コンストラクタで例外投げてもいいですか?
184デフォルトの名無しさん:2009/08/02(日) 01:22:50
shared_ptrとかauto_ptrとかの類をきちんと使っていれば、全然問題ないですよ。
185デフォルトの名無しさん:2009/08/02(日) 01:22:54
いいですよ。
186デフォルトの名無しさん:2009/08/02(日) 16:24:40
デストラクタで例外投げてもいいですか?
187デフォルトの名無しさん:2009/08/02(日) 16:27:23
恐いお兄さん達にリンチされるのでやめた方がいいです
188デフォルトの名無しさん:2009/08/02(日) 16:28:37
わかりました やめておきますね
189デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/02(日) 19:14:40
>>186
デストラクタ内でキャッチするならいいよ
191デフォルトの名無しさん:2009/08/03(月) 07:57:09
ヤフーメッセンジャーのチャットのログを記録したいと思っています。
ブラウザのチャットのログの取得はわかるのですが、メッセンジャーなどのアプリからどのようにしてログを取得できるものなのでしょうか?
サイトを探しましたが、どのサイトもHTMLソースの取得方法しか書いてありませんでした。

どうか教えてください。
192191:2009/08/03(月) 08:19:38
libyahoo2というものがありまして自分で調べます。
ご迷惑おかけしました。
193デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/03(月) 18:38:07
>>193
PlaySoundの前のboolは何?
それと、PlaySoundにはちゃんと.wavファイルの形をしたデータを与えてやらないとだめだ
波形だけ与えても鳴らない
あと、fって何さ、そこはHMODULEを渡すところでは?
最後に、スレ違い
Win32APIの質問はWin32APIスレへどうぞ
195デフォルトの名無しさん:2009/08/04(火) 08:52:09
static const int MAP_X = 64;


class A
{
int[ MAP_X ];
}


以上が定数式エラー出る
defineではエラーでない。
C++風にconst使ってみたんだが配列確保には使えない認識でおk?
196デフォルトの名無しさん:2009/08/04(火) 08:55:01
変数名が無え…。
197デフォルトの名無しさん:2009/08/04(火) 10:23:25
>>195
ちゃんと書けば、ちゃんと使える。

そうそう、古いコンパイラでは使えないかも知れない。
198デフォルトの名無しさん:2009/08/04(火) 11:12:34
それが最新のVC2008EEなんだな
無料だから制限つけてるのか
199デフォルトの名無しさん:2009/08/04(火) 11:15:31
>>195
実際のコードとコンパイルエラーを「そのまま」貼り付けてみて。
200デフォルトの名無しさん:2009/08/04(火) 11:26:31
原因がわかりました

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

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

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

規格票はintではなく整数と書いてあるが
203デフォルトの名無しさん:2009/08/04(火) 12:19:41
>>202
なら「static const 整数しか〜と規格票に書いてある」って最初っから言えよ。

どうせそんな書き方もしてないんだろうけどな。
204デフォルトの名無しさん:2009/08/04(火) 14:52:11
最初からもなにも
>>195
みたいな不完全で実際のものと違うコード提示されたところで
的確な指摘なんて出来るわけないよな
205デフォルトの名無しさん:2009/08/04(火) 17:16:36
enumで妥協
206デフォルトの名無しさん:2009/08/04(火) 17:21:21
このあたり、いいかげんなんとかして
207デフォルトの名無しさん:2009/08/04(火) 20:39:31
PODデータでの値渡しとconst参照渡しの
一般的な速度の分岐点は何バイトくらい?
208デフォルトの名無しさん:2009/08/04(火) 21:44:17
環境も書かずに何聞いてんだ
209デフォルトの名無しさん:2009/08/04(火) 22:06:47
>>203
エラーの出る最低限のサイズのコードを上げろ
210デフォルトの名無しさん:2009/08/04(火) 22:13:00
>>207
エスパーして代表的な環境について述べます。
Linux + gccはどちらの場合も最高速を叩き出します。
Windows + vcはどちらも低速でした。
つまり、プログラムでチマチマ最適化を図るよりLinuxを導入するほうが
良いと思われます。
211デフォルトの名無しさん:2009/08/04(火) 23:03:58
x86なら特に指定がなければVCもgccも同じl呼び出し規約を
使うのだからそんな速度の違いが出るわけない。
212デフォルトの名無しさん:2009/08/04(火) 23:20:54
レジストリにのってるかどうか調べればいいんじゃねぇの
213デフォルトの名無しさん:2009/08/04(火) 23:31:35
sjis→utf8の変換処理を自作したいのですが、
サンプルになるようなサイトてありますか?
CとかVC++はみかけるんですがC++は見つからなくて…
環境はlinux+gccです
214デフォルトの名無しさん:2009/08/04(火) 23:38:47
>>213
お前がほしいのはサンプルじゃなくてコピペ元だろ

たぶんCのやつそのまま使えるから問題なし
215デフォルトの名無しさん:2009/08/04(火) 23:42:54
ああ、レジスタか。
何言い出してんのかと思った
216212:2009/08/04(火) 23:46:41
>>215
ふっ
素で間違えたぜ

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

218デフォルトの名無しさん:2009/08/05(水) 00:01:25
邪道な方法ではUPXを使うとか?
219デフォルトの名無しさん:2009/08/05(水) 00:14:23
邪道臭いけど、名前丸見えではないようですし(zipのヘッダが見えた気はするけど・・・)
これでも大丈夫そうです。ありがとうございました。
220デフォルトの名無しさん:2009/08/05(水) 02:39:21
>>207
boost::call_traits あたりを見ると参考になるかもしれない。
221デフォルトの名無しさん:2009/08/05(水) 08:11:38
>>217
コンパイルオプションの /GR を取ればいいってことかな?
VS2005 だと、プロジェクトのプロパティの 「ランタイム型情報を有効にする」 → 「いいえ」

typeid の他に dynamic_cast がつかえなくなるっぽい。
そのあたりはややこしい話になるので割愛。
222デフォルトの名無しさん:2009/08/05(水) 11:49:00
>>212
なんの疑問もなく読んでしまった。
だめだ今日は。。。
223デフォルトの名無しさん:2009/08/05(水) 15:17:49
localeをjapaneseにするとlexical_castで整数を文字列に変換したときに
3桁ごとにコンマがついてしまうのですが、これを防止するにはどうしたら
よいのでしょうか?
224デフォルトの名無しさん:2009/08/05(水) 15:21:44
c++でネットワーク上のファイル(天気予報XMLファイル)を取得したいのですが、
方法がわかりません。
ググってみるとVC++ではできるようなのですが、
Linux + gcc環境ですので参考になりません。
最悪 system() + wgetコマンド という手がありますが、
もっとスマートな方法(ライブラリとか)があったら教えて下さい。
225デフォルトの名無しさん:2009/08/05(水) 15:24:05
>>223
localeを"C"に戻す
いちいち面倒ならLC_NUMERICだけjapaneseに変えないでおく
226デフォルトの名無しさん:2009/08/05(水) 20:41:08
>>224
>最悪 system() + wgetコマンド という手がありますが、
の方がスマートだよ.
227デフォルトの名無しさん:2009/08/06(木) 01:36:46
Boost.Asioを使ってゴリゴリ書くとか。
228デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/06(木) 07:20:09
>>228
まだ生成が済んでないオブジェクトへの shared_ptr は存在しない、と考えれば
わりと自然な気がする。

仮にそこで shared_ptr が得られたとして、その後に例外が発生してコンストラクタが
中断したらどうなるの?とか。
230デフォルトの名無しさん:2009/08/06(木) 07:31:35
>>228
コンストラクタの中では
 A a;
した状態と同じ、ってのもあるな。


http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
仕様を確認すると、事前条件 "Requires" に以下の記述がある。
> There must exist at least one shared_ptr instance p that owns t
231デフォルトの名無しさん:2009/08/06(木) 13:08:19
「このクラスを継承してサブクラスを作ることはない」っていうクラスを記述するとき、デストラクタにvirtual付けますか?
自分は「このクラスを継承しちゃダメ」という意思表示の意味でvirtual付けてないんだけど、
そういうやり方って一般的なのかな?
一応どっかでそういう意見を見て、ふーんって思ってやってたことなんだけど、正しいことなのか今になって不安になってきた。
232デフォルトの名無しさん:2009/08/06(木) 14:09:29
コンストラクタをprivateに封じて代わりにstaticファクトリを提供すれば誰も継承できないクラスの完成
233デフォルトの名無しさん:2009/08/06(木) 14:11:42
>>231
付けない。
継承される予定のクラスでも、アップキャストして使う予定のない物は、非virtualのprotectedデストラクタにする。

ここから先は個人的な好みなので参考程度に聞いて欲しいが、
「データメンバを持たない仮想関数のみで構成されたクラス」しか継承する事は考えない。
データメンバを持つクラスを継承したいと思った時は、コンポジションにする。
234デフォルトの名無しさん:2009/08/06(木) 14:11:55
普通は書かないかな

つーか継承をコンパイルエラーにする記述とか無いもんかな
インターフェイスとファクトリだけ提供して実装は隠す、位しか実装の継承を禁止する方法が思い浮かばない
235デフォルトの名無しさん:2009/08/06(木) 14:32:23
final宣言ほしいよね。
236デフォルトの名無しさん:2009/08/06(木) 14:34:41
finalって0xで入るんじゃなかったかな
237デフォルトの名無しさん:2009/08/06(木) 14:46:36
>>231
付けない。例えばstring(basic_string<char>)なんかも継承を前提としていので
仮想デストラクタではなかったと思う。
238237:2009/08/06(木) 14:47:23
>>237
継承を前提としていので×
継承を前提としていないので○
239デフォルトの名無しさん:2009/08/06(木) 15:13:51
boostのvaultとかsandboxにnon derivableとかいうのがあったと思う
240デフォルトの名無しさん:2009/08/06(木) 18:01:01
[[final]]
241デフォルトの名無しさん:2009/08/06(木) 21:35:36
何度見てもキモいシンタックスだ。
242デフォルトの名無しさん:2009/08/06(木) 21:51:58
#define final [[final]]

ってするだけだろ。
243デフォルトの名無しさん:2009/08/07(金) 03:46:33
いいかげん define を捨てたい俺には、
それはもっと悪い。
244デフォルトの名無しさん:2009/08/07(金) 09:12:02
基本的にはC++に関することではなく、Windowsプログラミングに関することですが、
開発環境がC++のため、質問させていただきます。

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

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

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

わかる方がもしいらっしゃれば回答よろしくお願いいたします。
245デフォルトの名無しさん:2009/08/07(金) 09:38:50
じゃ俺は開発環境がC++なんで、RPGの作り方教えてください
246デフォルトの名無しさん:2009/08/07(金) 09:39:36
ついでに開発環境がC++なんで、エロゲの作り方教えてください
247デフォルトの名無しさん:2009/08/07(金) 09:44:38
>>244
鼬害。WebProg板へ。

>>245
鼬害。ゲ製板へ。

>>246
鼬害。Pinkのどっかへ。
248デフォルトの名無しさん:2009/08/07(金) 09:51:38
Pinkのどっか行ってきます
249272:2009/08/07(金) 11:29:26
どうしても参照を付け替えたいのですが、何か良いアイディアはないでしょうか?
int a = 1;
int b = 2;
int& r;
のときに動的にrをaかbを指すように付け替えたいです。
無理は承知でお願いします。
250デフォルトの名無しさん:2009/08/07(金) 11:35:05
>>249
int& r = boolean ? a : b;
ではだめかいな?
251250:2009/08/07(金) 11:36:36
後は
int * p;
if(xxx)
{p = &a;}
else
{p = &b;}
int& r = *p;
252272:2009/08/07(金) 11:42:15
>>251
その方法でいけました! まさかこんな方法があろうとは。
本当に有難うございました。
一回途中にポインターをかませば良かったんですね。
253272:2009/08/07(金) 11:57:59
ウソです。無理でした。ごめんなさい。
254デフォルトの名無しさん:2009/08/07(金) 12:04:01
int &r = *p;
の代わりに
#define r (*p)
と書けばおk
255251:2009/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デフォルトの名無しさん:2009/08/07(金) 12:35:29
そんな面倒な事をせずに普通にポインタを使えばいいだろ
参照じゃないと駄目な理由は何だ?
257デフォルトの名無しさん:2009/08/07(金) 12:50:40
参照のほうが綺麗だから
258272:2009/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デフォルトの名無しさん:2009/08/07(金) 13:30:20
>>285
ポインタへの参照にするとか。
260デフォルトの名無しさん:2009/08/07(金) 13:32:30
みすった。
>>258 だった。
261デフォルトの名無しさん:2009/08/07(金) 13:34:59
そもそも参照は

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

という仕様だから切り替えはできないよ
262デフォルトの名無しさん:2009/08/07(金) 14:03:11
>>258
そういうことか。
ちなみにそんな状況は俺は出くわしたことはないんだが。
263デフォルトの名無しさん:2009/08/07(金) 14:11:57
> 理由は内緒。
馬鹿丸出し
264デフォルトの名無しさん:2009/08/07(金) 14:19:24
プログラムの実行に掛かった時間を表示していて思った疑問です。

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

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

参考にしたサイトはここ↓です
ttp://www.sasaraan.net/program/cpp/cpp_time.html
環境は WindowsXP + gcc でコマンドラインアプリケーションです。
265デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/07(金) 14:30:34
>>264
秒単位の表示って、 0, 1, 2, ... とか?
それとも 0.0, 1.0, 2.0, ... なの?

あと、上記のプログラムって言ってコンパイルも通らないソースが貼ってあるのが怪しい。
省略したところに問題があるのかもしれない。
267デフォルトの名無しさん:2009/08/07(金) 14:33:27
265よ
ここはC++スレだぞ何故その方向へ逸れるの?
268デフォルトの名無しさん:2009/08/07(金) 14:36:50
参照じゃないといけない理由のほうがすごく気になるな
既存ソースの改造でもやってんのかな
269デフォルトの名無しさん:2009/08/07(金) 14:46:25
個人的に >>256-257 ってのは同意できるな

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



void hoge(char *&rp)
{
return *rp++; // ほらきれい
}
270デフォルトの名無しさん:2009/08/07(金) 14:47:13
voidじゃねえcharだた
271デフォルトの名無しさん:2009/08/07(金) 14:51:16
C++ code - 22 lines - codepad
ttp://codepad.org/QgkLwIsV

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

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

よろしくお願いいたします。
272デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/07(金) 15:13:43
>>269
そんなことは誰も問題視していない
274デフォルトの名無しさん:2009/08/07(金) 15:14:13
More C++ Idioms/friend 関数の生成(Making New Friends) - Wikibooks
ttp://ja.wikibooks.org/wiki/More_C++_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)

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

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

ありがとうございました!!
275デフォルトの名無しさん:2009/08/07(金) 15:20:33
本来初期化しかできない参照を変な使い方して
ほら綺麗 とか言われても
276デフォルトの名無しさん:2009/08/07(金) 15:50:50
変な使い方ってどこが?
277デフォルトの名無しさん:2009/08/07(金) 16:10:15
ポインタと参照は原理は同じだが違うものだよ。
278デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/07(金) 17:12:12
>>277
> ポインタと参照は原理は同じ
って何を根拠に。

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

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

280デフォルトの名無しさん:2009/08/07(金) 17:17:57
>>278
よくわからないな・・・なんで仮想継承が必要?
普通に継承するのはだめなの?
281デフォルトの名無しさん:2009/08/07(金) 17:28:05
オレだったら struct Bのインスタンスを持った struct Cの特殊化を struct Dの親か Dの実装にするね
282デフォルトの名無しさん:2009/08/07(金) 17:28:15
>>264
int clock()
と仮定されて、intが返ってる可能性はないかね。
283278:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/07(金) 18:21:58
>>283
つねにB経由にするなどと決めておけばいいかと
キャスト自体は曖昧な部分をちゃんと明示すれば通るし
D<T>* d = ... ;
A* a = static_cast<A*>(static_cast<B*>(d));
286デフォルトの名無しさん:2009/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";
};

などのように別に中身を書く
287284:2009/08/07(金) 18:31:54
>>286
分かりやすい解説ありがとうございました。
288デフォルトの名無しさん:2009/08/07(金) 18:48:31
逆に宣言に定義を含めてインライン化しないようにするにはどうするの?
289デフォルトの名無しさん:2009/08/07(金) 18:59:04
インライン関数をインライン展開しないというコンパイルオプションを付けてコンパイルする
クラス定義の中に定義を書いた関数はインライン関数だと規格で決まっているから、そこはどうにもならんよ
290デフォルトの名無しさん:2009/08/07(金) 19:00:22
>>286
テンプレート使った場合ってインライン展開されないようにできるの?
コンパイル単位的に難しい気がするんだけど
291デフォルトの名無しさん:2009/08/07(金) 19:06:34
>>290
普通にできる
ただしクラスの定義も各関数の定義も両方ともヘッダに書く
同じものがコンパイル単位ごとにコンパイルされても、リンカが重複分を破棄する等して上手くやる
292デフォルトの名無しさん:2009/08/07(金) 19:10:13
インライン展開は関数呼び出しのオーバーヘッドがなくなるけど
テンプレート関数はオーバーヘッドなくならんでしょ。
293デフォルトの名無しさん:2009/08/07(金) 19:28:56
そりゃなくならない
別物だし
294デフォルトの名無しさん:2009/08/07(金) 21:57:42
>>292
一人だけ別の話題をしているようにしか見えないぞw
295デフォルトの名無しさん:2009/08/07(金) 21:58:55
インラインのテンプレート関数使えばいいだけじゃん
296デフォルトの名無しさん:2009/08/07(金) 22:05:57
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

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

                  京都大学霊長類研究所
297デフォルトの名無しさん:2009/08/07(金) 22:12:41
>>294
つまり、テンプレートはそもそも淫乱展開じゃないんじゃないの?って話。
298244:2009/08/07(金) 22:17:43
やはり難しいかったでしょうか?

わかる方がおられない残念な結果となったため、質問への回答を打ち切らせていただきます。
299デフォルトの名無しさん:2009/08/07(金) 22:25:45
アイちゃんより下がいるとは。
300デフォルトの名無しさん:2009/08/07(金) 22:44:16
>>298
単にスレ違いなだけ。
せめて、環境依存OKと言っているとことか、WindowsならWin32APIスレのほうで聞きなさい。
まあ、そこ行っても答えが貰える保証はないけど。
301デフォルトの名無しさん:2009/08/07(金) 22:53:20
スクリプトをC++で作るのって難しいと思うが、どうなの?
302デフォルトの名無しさん:2009/08/07(金) 23:06:09
難しくないよ
303デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/07(金) 23:25:47
strcpy(*buf,"gomi");だた
306デフォルトの名無しさん:2009/08/07(金) 23:30:19
なんでchar*を使うの?メモリ的な制約か?stringとか使えばいいじゃん。
307デフォルトの名無しさん:2009/08/07(金) 23:31:16
>>302
そなの?
COMとかActiveXなら作れるけどスクリプトはなんだか大変そうな気がして
308デフォルトの名無しさん:2009/08/08(土) 00:13:27
>>298
せめてアイちゃんレベルにはなって欲しいな。
309デフォルトの名無しさん:2009/08/08(土) 00:15:33
三項演算子a?b:cと
if elseを用いた構文が
意味的に同じ場合、
どちらが望ましいでしょうか?
(速さや可読性など。)
310デフォルトの名無しさん:2009/08/08(土) 00:46:36
俺のイメージでは、
式の一部として使うなら、三項演算子が読みやすく、
そうでなければif elseが読みやすい。
デバッグトレースするならif else。
実行速度はどっちもほとんど変わらん。
311309:2009/08/08(土) 00:48:23
>>310
ありがとうございます。
312デフォルトの名無しさん:2009/08/08(土) 01:06:19
>>309
自分の場合、三項演算は、参照型と const 変数の初期化や、戻り値
の分岐に限定して使用している。
313デフォルトの名無しさん:2009/08/08(土) 01:29:28
>>297
別に実体化してリンクしても問題ないが。
314デフォルトの名無しさん:2009/08/08(土) 01:31:00
並列化やベクトル化をするコンパイラの場合、分岐を使うと最適化を拒否られるが三項演算子だと最適化してくれたりする。
豆知識な
315デフォルトの名無しさん:2009/08/08(土) 02:08:21
コンパイラの例を挙げてくれてればよかったなあ。。。
316デフォルトの名無しさん:2009/08/08(土) 05:51:46
条件演算子と呼んでください。
いつか三項の仲間が増えてもごっちゃにならないように。
317デフォルトの名無しさん:2009/08/08(土) 05:59:05
>>309
よく考えたら、意味的に同じなんてありえなくね?

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

処理の意味によってどっちに当てはめたほうが読みやすいかは決まってくるでしょ。
たとえば b, c が副作用を持つ場合に条件演算子だと読みにくいだろうなぁ、とか。
318デフォルトの名無しさん:2009/08/08(土) 06:20:51
a == true ? printf("true") : printf("false");
319デフォルトの名無しさん:2009/08/08(土) 06:43:47
printf(a ? "true" : "false");
こうだろjk
320デフォルトの名無しさん:2009/08/08(土) 07:04:50
printf("true\0false"+5*!a);
321デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/08(土) 08:11:30
無名namespaceって

::ulong

で参照しなかったっけ。
323デフォルトの名無しさん:2009/08/08(土) 08:19:57
今の時代Cygwinでファーストコード通してる人が居るんだなぁと
ちょっと意外に感じた。
324デフォルトの名無しさん:2009/08/08(土) 08:23:24
>>322
それはグローバルnamespaceじゃないですか?
325phenix:2009/08/08(土) 09:45:36
>>301
boost::spiritを使うと簡単
326デフォルトの名無しさん:2009/08/08(土) 10:03:46
>>322
それはグローバルだな。
無名は特に外部から参照は出来ない。
その翻訳単位内でのみ参照可能。
327314:2009/08/08(土) 10:12:26
>>315
日立SR8000の最適化コンパイラ
って言っても縁ないでしょ。
328デフォルトの名無しさん:2009/08/08(土) 10:26:48
>>327
確かに縁がなさ過ぎるw
329デフォルトの名無しさん:2009/08/08(土) 13:46:31
>>327
縁がないから言ってもしょうがないでしょって思ってんのかな
330デフォルトの名無しさん:2009/08/08(土) 17:58:04
return で返される値は
返り値
戻り値
など色々呼び名があると思いますが、
C++用語としてはどれが正しいでしょうか?
331デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/08(土) 18:31:18
>>330
いちおう、 JIS 規格では「返却値」。
ほとんどの場合はどれでも通じるから、どれが正しいとも正しくないとも思わないけどね。
333デフォルトの名無しさん:2009/08/08(土) 18:33:05
>>332
返却値ですか。
ありがとうございました。
334デフォルトの名無しさん:2009/08/08(土) 18:46:09
>>331
検証サンクスです。グローバルnamespaceと無名namespaceで重複するとおかしくなるんですね。
どっちが優先されるべきなのか少し調べてみましたが、よくわかりませんでした。
というか、宣言の時点でエラーなり警告なり出して欲しいですね。

とりあえずtypedefについては無名namespace外でも使う場合はグローバルスコープに置くことにしようと思います。
335デフォルトの名無しさん:2009/08/08(土) 18:51:42
でも、仮にグローバルnamespaceが無名namespaceより優先されるとしたら
名前の重複が起こった場合、無名namespaceの方には外側からアクセスできなくなっちゃいますね。
とすると本来は無名namespaceが優先されるべきなのかな??
336デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/09(日) 01:27:03
MyClassは自作のクラスで、そのコピーコンストラクタは重いとします。

MyClass foo()
{
//とても重い処理
return 〇〇;
}
この関数を呼び出した側で返り値を長く使いたい(ただし変更はしない)場合、
const MyClass retval
=foo();
とするべきか、
const MyClass& retval
=foo();
とするべきか
どちらが望ましいでしょうか?
コンパイラによる「戻り値最適化」が行われないとすれば前者は後者より重いと推測されますが、
コンパイラによる「戻り値最適化」が行われるとすれば前者は後者より参照の解決が不要な分 速いのではと思っているのですが、この理解で正しいでしょうか?
338デフォルトの名無しさん:2009/08/09(日) 01:38:44
>>337
戻り値最適化を行うような、処理速度について配慮されたコンパイラであれば、
テンポラリを束縛した参照について「参照の解決」などという処理に時間をかけることは
無いだろう。
339314:2009/08/09(日) 02:42:42
>>329
ひねくれたやっちゃな。
コンパイラ個別の特徴じゃないしな。
if文があったらループの最適化をサボるってのは。
それを3項演算子で抜けられる可能性があるってのは一般論として知っておいて損はないだろ。
具体的なコンパイラの名前が必要な話か?
340デフォルトの名無しさん:2009/08/09(日) 02:53:37
縁がないだろって思ってるコンパイラでしか有効じゃない機能をわざわざ紹介する理由は確かに分からん
341デフォルトの名無しさん:2009/08/09(日) 03:59:56
一般論に対して例外の存在を補足しただけじゃねーの。
342337:2009/08/09(日) 10:12:42
>>338
ということは、最適化が出来るコンパイラなら
どちらも同じだろうと言うことですね。

ありがとうございました。
343デフォルトの名無しさん:2009/08/09(日) 15:39:44
struct B
を継承するときに、
class cD : B
struct sD : B
これら二つの違いは何でしょうか?

cDはBをprivate継承していて、sDはBをpublic継承しているだけだと
いう理解でよろしいでしょうか?
344デフォルトの名無しさん:2009/08/09(日) 15:40:38
はい
345デフォルトの名無しさん:2009/08/09(日) 15:40:57
>>343 はい。
346デフォルトの名無しさん:2009/08/09(日) 15:41:38
ごめん
347デフォルトの名無しさん:2009/08/09(日) 15:48:53
えっ?
348デフォルトの名無しさん:2009/08/09(日) 15:49:51
えっ?
349デフォルトの名無しさん:2009/08/09(日) 15:50:17
えっ?
350デフォルトの名無しさん:2009/08/09(日) 15:51:36
えっ?
351343:2009/08/09(日) 15:53:36
ありがとうございました。
352デフォルトの名無しさん:2009/08/09(日) 15:54:23
いえいえ、どういたしまして。
353デフォルトの名無しさん:2009/08/09(日) 16:10:44
numeric_limits - C++ Reference
ttp://www.cplusplus.com/reference/std/limits/numeric_limits/
ここを読んでみましたが、
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デフォルトの名無しさん:2009/08/09(日) 16:20:14
>>353
min() は浮動小数点で表現できる最小の数
epsilon() は「機械イプシロン」を調べていただければわかるが、数値 1.0 とそのとなりにある実数との差
この二つは異なる概念なんですね。
355353:2009/08/09(日) 16:21:31
>>354
理解出来ました。
ありがとうございます。
356デフォルトの名無しさん:2009/08/09(日) 16:26:04
>>353
minというのは、その名の通り、double型で表現できる(絶対値が)最小の値。
epsilonというのは、double型で表現できる、「1の次の」値から1を引いた値。

詳しくはIEEE754をよく読んで欲しいんだけど、要するにdouble型で表現できる値っていうのは
0付近では密で、絶対値が大きくなればなるほど疎になる性質がある。
例えばdouble型は0〜1の間には10億個ぐらいの表現できる値があるけど、
1〜2の間には800万個ぐらいしかない。
357デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/09(日) 17:06:50
>>357
一般的に、NaNというのはなんかエラーな感じの数のこと。
NaN+普通の数とか、普通の数÷NaNとか、とにかくNaNがどっかに含まれる演算を行なったとき、
・Quiet NaNを使ったときは、演算結果としてNaNを返す
・Signaling NaNを使ったときは、浮動小数点例外が発生する(0除算を行った時みたいに、プログラムの実行が停止する)
359デフォルトの名無しさん:2009/08/09(日) 17:11:27
多分だけど計算中にNaNが現れたときsignalを発生するかしないかじゃないかな?
360デフォルトの名無しさん:2009/08/09(日) 20:46:22
プログラム技術2ch掲示板のC++のスレ見ても、dynamic_cast演算子を使ったソース
がほとんど見掛けないな。皆そんなに使わないのかいな。大変な努力をして、
C++を学習したのに、それを使う機会が無いって、物足りないな、困ったもんだ。
361デフォルトの名無しさん:2009/08/09(日) 20:49:16
ダウンキャストかクロスキャストの時しか使わないじゃん

普通は仮想関数だけで十分
362デフォルトの名無しさん:2009/08/09(日) 21:27:55
>>360
goto と似たようなもんだ。使わないで済むならそれでいい。
363デフォルトの名無しさん:2009/08/09(日) 21:31:35
C++には多用しちゃいけない機能もあるからな
dynamic_castやtypeidもそうだし、あと例外指定とか
364デフォルトの名無しさん:2009/08/09(日) 21:39:06
>>363
mutable もだな。
reinterpret_cast 級の危険機能だと思う。
365デフォルトの名無しさん:2009/08/09(日) 21:53:38
使い方を間違えなければmutableは非常に役立つよ。
366デフォルトの名無しさん:2009/08/09(日) 21:54:10
いざという時に、せめて可能な限り安全にわかりやすく
ダーティーなやり口に手を染めるためのもの、という感じかな。

漫画によくある場面で喩えるなら、主人公が出発前に
「できればこれを使わずに済ませたいものだが・・・」
とか言いながら見つめてる武器みたいな。
367デフォルトの名無しさん:2009/08/09(日) 21:55:31
それ絶対使うじゃんw
368デフォルトの名無しさん:2009/08/09(日) 21:55:41
もうCでいいじゃん。
369デフォルトの名無しさん:2009/08/09(日) 21:58:44
>>367
この手の場面に相当するような「デカい仕事」では、実際結構な確率で
いま出ているような物を使うことになると思う。
370デフォルトの名無しさん:2009/08/09(日) 22:02:12
危険な機能を使わないためと言って変な黒魔術で無理矢理回避する方がよっぽど危険だしな
371デフォルトの名無しさん:2009/08/09(日) 22:25:27
Windowsでプログラムしていると
reinterpret_cast と dynamic_cast のオンパレードですよ^^
372デフォルトの名無しさん:2009/08/09(日) 22:30:33
>>371
キャストが必要になるのはわかるが、オンパレードはおかしいだろ。
同じ意味のキャストはてきとうにラップしろよ。
373デフォルトの名無しさん:2009/08/09(日) 22:39:44
ダウンキャストの意味わかってるのか?
存在しないメンバにアクセスして鼻から悪魔が出るのを承知で
使わないといけないんだぞ
374デフォルトの名無しさん:2009/08/09(日) 22:43:35
HWND(構造体へのポインタ)をCWndクラスにキャストさせたり、Windowsプログラミングは楽しいなぁ^^
375デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/09(日) 23:17:31
>>375
これはどの辺が鼻から悪魔?
377デフォルトの名無しさん:2009/08/09(日) 23:18:56
>>376
BaseにはDerived::print()がない

実行してみればわかるが正しく動かない
378デフォルトの名無しさん:2009/08/09(日) 23:20:46
>>376
dynamic_cast<Derived*>(new Base) この結果がヌルポインタになる。
その後の p-> でヌルポインタをデリファレンスして未定義動作。
379デフォルトの名無しさん:2009/08/09(日) 23:21:39
>>377 えっ?
380デフォルトの名無しさん:2009/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!
}
381376:2009/08/09(日) 23:27:43
すみません
>>377

>>378
はどちらが正しいですか?
382デフォルトの名無しさん:2009/08/09(日) 23:29:07
>>381
>>378が正しい
ダウンキャストはポインタが正しい本体を指している時にのみ成功する
383デフォルトの名無しさん:2009/08/09(日) 23:37:32
>>380
これは何でouch!なの?
384デフォルトの名無しさん:2009/08/09(日) 23:38:21
>>380
いや、 Derived* → Base* は暗黙変換で通るから、 dynamic_cast の出番じゃない。

しかも、せっかく dynamic_cast の結果にチェックを入れたのにメッセージ表示の後に
結局 p-> してたらダメじゃん。
385デフォルトの名無しさん:2009/08/09(日) 23:40:07
わかんね
dynamic_castの正しい使い方知ってる人教えて
386デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/10(月) 00:01:23
よく見ろよw
>>375のは
p = dynamic_cast<Derived*>(new Base);
どこにもDerivedのインスタンスは生成されない
そりゃNULLが帰ってくるだろうって
388357:2009/08/10(月) 00:18:37
>>358-359
ありがとうございます。
NaNについてはもっと勉強してきます。
389デフォルトの名無しさん:2009/08/10(月) 00:45:20
>>369
そういう話ではなく
> 「できればこれを使わずに済ませたいものだが・・・」
といったらそれは使うフラグ
390デフォルトの名無しさん:2009/08/10(月) 01:35:06
>>389
まさにそういう話だと思うが。
391デフォルトの名無しさん:2009/08/10(月) 02:23:56
仕事のデカさは関係ないってことじゃないの?
392デフォルトの名無しさん:2009/08/10(月) 12:33:39
dynamic_castの意味を今まで勘違いしてたわ
ダウン・キャストしても安全に使用できるかどうかの判定なのね
393デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/08/10(月) 15:45:28
Detachしてしまったビットマップは削除されないのでは
395デフォルトの名無しさん:2009/08/10(月) 15:48:42
ヘッダーに変数を定義することって出来たんでしたっけ?
いや、さっき書いてみたら出来たんで、ちょっとびっくりしたんですが。
インクルードガードしてないとエラーが出るってだけなのかな。Cではどうなんでしょう。
まあ、作法としてはインクルードガードしててもやっちゃダメなのかもしれないですけど。ですよね?

396デフォルトの名無しさん:2009/08/10(月) 15:54:56
本当ならリンカが多重定義のエラーを吐くはずだが、デフォルトでは吐かない奴もいる
397393:2009/08/10(月) 15:58:12
>>394
レスありがとうございます
Detach後にDestroyすると、メモリ上に残る・・・
つまり、リサイズ後用のimg2がどんどん溜まっている状態
ってことでしょうか?

ためしにimg2.Detach();をコメントアウトして動作させると、
別ウィンドウの後ろに隠れると画像が消えると言う症状がでました。
私、根本的に作り方を間違えているのかも・・・
398デフォルトの名無しさん:2009/08/10(月) 16:18:59
>>397
MFCスレでやってくれ
399393:2009/08/10(月) 16:28:29
>>398
MFC相談室の方に移動させていただきます。
スレ汚しすみませんでした。
400デフォルトの名無しさん:2009/08/10(月) 16:45:42
>>395
ヘッダだからできない事というのはないよ
やるべきじゃないことは、ある。
401デフォルトの名無しさん:2009/08/10(月) 17:42:52
>>400
>ヘッダだからできない事というのはないよ

へー、そうなんですか。
逆に、ソースだとできないことってのはありますよね?
テンプレートの定義とか。
402デフォルトの名無しさん:2009/08/10(月) 18:00:51
>>401
.hも.cppもC++の上では本質的には変わりないんだよ。
テンプレートの定義だって、別に.cppの上でやったっていい。
その定義が他の.cppから見えるかどうかは別問題だがな。
403デフォルトの名無しさん:2009/08/10(月) 18:06:33
>>401
だからできないことはないって。
逆に聞くが、ヘッダとソースってどうやって区別してんの?
404デフォルトの名無しさん:2009/08/10(月) 18:08:23
定義そのまま他の.cppに丸ごとコピペすればいいわけだが、
後々修正する際に全部直して回るのが面倒だからそういうことはやらないだけだ
405デフォルトの名無しさん:2009/08/10(月) 18:09:46
#include "header.cpp"
この場合、header.cpp はヘッダなのかソースなのか
406デフォルトの名無しさん:2009/08/10(月) 18:38:26
>>405
いわゆるクソコードってやつだよ。
407デフォルトの名無しさん:2009/08/10(月) 18:46:46
オブジェクト指向について質問なんだけど。

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

そういう風に包含を重ねて行くのがオブジェクト指向なの?
C++をやって間もないんだけど、俺のプログラムはこんな感じなんだ。
良いのか悪いのか分からない、アドバイスお願い
408デフォルトの名無しさん:2009/08/10(月) 18:48:16
>>405
学生の時にバイトしていた会社のコードにそういうのがあった
日本のロケットがクソ高くて落ちるわけだ、と思った
409デフォルトの名無しさん:2009/08/10(月) 18:54:57
クソコードでバグを入れて、
そのバグを取るのが仕事ですから
それでいいんです。
410デフォルトの名無しさん:2009/08/10(月) 18:56:03
>>407
俺はメソッドとかC++標準にない用語を使われても起こらない。
しかし
>>クラスAのインスタンスをクラスBで作り
これはどういう意味だい?
411デフォルトの名無しさん:2009/08/10(月) 18:58:28
>>410
えっと
クラスBのprivate領域に、クラスAの実体を包含するって意味で書いたつもりだった
412デフォルトの名無しさん:2009/08/10(月) 19:03:01
>>406
クソかどうかは関係ない。
できないことがあるのかどうかが論点であり、やるべきではないことはまた別の話
413デフォルトの名無しさん:2009/08/10(月) 19:44:54
>>407
>又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。
クラスBでクラスBのメンバ変数を参照して判定するようにして、外からメンバ変数を
見せないように隠蔽するのが、オブジェクト指向のカプセル化の基本かな。
セッタ/ゲッタはそれを破ってしまうから避ける様に設計するのがお勧め。
414デフォルトの名無しさん:2009/08/10(月) 20:12:31
雪駄とか下駄はオブジェクト指向じゃないと個人的には思う。
単一責任原則をはたすためにも、
メソッドは単に状態を書き換えるだけでは十分でないと思うから。
415デフォルトの名無しさん:2009/08/10(月) 20:15:25
セッタ/ゲッタは最終手段であり、
それに突入した瞬間からクソコードが始まると考えて
「一般には」さしつかえないくらい。
416デフォルトの名無しさん:2009/08/10(月) 20:33:13
C++ code - 95 lines - codepad
ttp://codepad.org/xR4PHa3G
この
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
ttp://msdn.microsoft.com/en-us/library/cx7k7hcf(VS.71).aspx
このあたりを読んでみましたが、よく分かりませんでした。
よろしくお願いします。

417デフォルトの名無しさん:2009/08/10(月) 20:52:34
stdの中を無理矢理いじくってるからかなあ
多分ヘッダーlimitsのどこかとぶつかってるよ
418416:2009/08/10(月) 20:56:41
std名前空間は
新しい物を追加したりすれば未定義の動作となる。
しかし関数・クラステンプレートの特殊化のみ
認められる。

ということは知っているのですが、
私のやり方がまずいのでしょうか。。。

419デフォルトの名無しさん:2009/08/10(月) 20:57:14
template <typename MyInt>
この行いらない
420416:2009/08/10(月) 21:04:44
すみません。
その辺確かにまずかったです。

C++ code - 95 lines - codepad
ttp://codepad.org/yovzUoIJ

これはどうでしょうか?
やりたいことは
template <typename hoge_t>
struct numeric_limits< MyTempl<hoge_t> > : numeric_limits< hoge_t >
の部分で現れていると思います。
421デフォルトの名無しさん:2009/08/10(月) 21:07:00
template <typename hoge_t>
の前の
template <>
が要らないんじゃ
422416:2009/08/10(月) 21:25:35
>>421
それで通りました!

皆様ありがとうございます。
本気で助かりました。。。
423デフォルトの名無しさん:2009/08/10(月) 21:32:54
そのままで通るBCC6.1.3は欠陥コンパイラという事か
424デフォルトの名無しさん:2009/08/10(月) 21:36:47
いやg++も通っているから別に欠陥ではないのでは?
VCが厳しいのかな。

g++ + 訂正前 -> 通る
g++ + 訂正後 -> 通る

VC++ + 訂正前 -> 通らない
VC++ + 訂正後 -> 通る

BCC6.1.3 + 訂正前 -> 通る
BCC6.1.3 + 訂正後 -> ???

訂正後はBCCで通る?
425デフォルトの名無しさん:2009/08/10(月) 21:43:25
>>424
訂正後も通るよBCC
426デフォルトの名無しさん:2009/08/10(月) 21:47:26
g++ + 訂正前 -> 通る
g++ + 訂正後 -> 通る
VC++ + 訂正前 -> 通らない
VC++ + 訂正後 -> 通る
BCC6.1.3 + 訂正前 -> 通る
BCC6.1.3 + 訂正後 -> 通る

じゃあ通る動作と通らない動作、
どっちが規格的には正しいのだろう?
427デフォルトの名無しさん:2009/08/10(月) 21:55:42
BCCは歴代的にテンプレート周りが怪しいとして(もっとも
今回のバージョンからboostに部分的に対応しているんだが)
g++が通ってるんだからvc++が厳しすぎるんじゃね?
428デフォルトの名無しさん:2009/08/10(月) 22:29:15
@aaaaaaaaa.cpp
ttp://codepad.org/8b4slwrj
こうすると、VC++では
 error C3767: 'foo': 候補の関数はアクセス可能ではありません。
 'aaaaaaaaa.cpp(26)' の friend 関数である可能性があります : 'foo' [引数依存の
 照合を使って検出される可能性があります]
というエラーになります。
ところが
namespace MyNS
を外してグローバルスコープにすると
ttp://codepad.org/nBmNHA3H
このコードのようになりますが、VC++で通ります。
なお、g++ではどちらも通ります。

Aまた、//問題の箇所2の行をコメントアウトした
C++ code - 50 lines - codepad
ttp://codepad.org/J3kjckz1
はg++, VCどちらも通らなくなります。
(インスタンス化されていないため?)

@Aの問題の原因としては
//問題の箇所1
あたりのやりかたがまずいのかと思っているのですが、
正解のコーディングをご教示いただけますでしょうか?

よろしくお願いいたします。
429デフォルトの名無しさん:2009/08/10(月) 22:55:18
BCC6.1.3はg++に準ずる結果となりました
VC++だけ挙動が違うね
430デフォルトの名無しさん:2009/08/10(月) 23:07:02
VC++, g++, BCC 以上に
標準C++準拠度が高いコンパイラって無いのかな?

性能は悪くても良いから標準C++準拠度だけを命にしているコンパイラ。
431デフォルトの名無しさん:2009/08/10(月) 23:17:19
Comeau C++とかか?
432デフォルトの名無しさん:2009/08/10(月) 23:20:27
using namespace MyNS;で通るね
MSDNによると Friend function names are no longer introduced into containing namespace
だそうなのでMyNS::fooの時点でADLが利かなくなるってことかな?規格なんて読んだことないから知らないけど。
433デフォルトの名無しさん:2009/08/10(月) 23:22:02
補足 using namespaceしてからMyNS::fooをfooだけに
434デフォルトの名無しさん:2009/08/10(月) 23:34:50
違いますか?
どのあたりが違いますか?
435430:2009/08/10(月) 23:35:35
Comeau C/C++ - Wikipedia, the free encyclopedia
ttp://en.wikipedia.org/wiki/Comeau_C/C%2B%2B
こんなん初めて聞いた俺がいる。
ありがとう。>>431
436デフォルトの名無しさん:2009/08/10(月) 23:36:44
事実上exportキーワードに対応させてるコンパイラは
今の所これだけだしな
437434:2009/08/10(月) 23:37:55
誤爆しました。
失礼しました。
438428:2009/08/10(月) 23:56:23
Comeau C++のWebサイトで

ttp://codepad.org/J3kjckz1
を実行してみました。

Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ noC++0x_extensions

"ComeauTest.c", line 44: error: namespace "MyNS" has no member "foo"
MyNS::foo<double>(MyNS::MyTempl<MyNS::MyInt>());
^

"ComeauTest.c", line 44: error: type name is not allowed
MyNS::foo<double>(MyNS::MyTempl<MyNS::MyInt>());
^

2 errors detected in the compilation of "ComeauTest.c".

だそうです。
439デフォルトの名無しさん:2009/08/11(火) 00:01:41
という事は例のダイヤモンド継承のバグを除けば
VC++の方が標準に近いわけか
440428:2009/08/11(火) 00:05:46
>>420

ttp://codepad.org/yovzUoIJ
のtemplate <>あり&無しについて

g++ + 訂正前 -> 通る
g++ + 訂正後 -> 通る
VC++ + 訂正前 -> 通らない
VC++ + 訂正後 -> 通る
BCC6.1.3 + 訂正前 -> 通る
BCC6.1.3 + 訂正後 -> 通る
Comeau C++ + 訂正前 -> 通らない
Comeau C+++ 訂正後 -> 通る

でした。
441428:2009/08/11(火) 00:07:05
>>428の@の
ttp://codepad.org/8b4slwrj
ttp://codepad.org/nBmNHA3H
は両方とも通りません。
(VC++で通った)グローバルスコープにおいたら方のttp://codepad.org/nBmNHA3H
でも
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ noC++0x_extensions

"ComeauTest.c", line 41: error: identifier "foo" is undefined
foo<double>(MyTempl<MyInt>());
^

"ComeauTest.c", line 41: error: type name is not allowed
foo<double>(MyTempl<MyInt>());
^

2 errors detected in the compilation of "ComeauTest.c".

となりました。

どうやらComeau C++が正しいとすれば、
私の@のコードはどちらも「通る方がおかしい」コードという事になるようです。
442デフォルトの名無しさん:2009/08/11(火) 15:32:28
気になったので少し調べてみた
でも憶測も入ってるので間違ってたら突っ込みキボン

1. グローバルかMyNSかで違う
クラス内で定義されたfriend関数はADLを通してしか利用できないっぽい

なので、定義をグローバルに置いたからじゃなくて、
利用側で名前空間を指定しなくなったからコンパイルが通るようになるんだと思う

2. それでもComeauでは通らない
これはワカンネ
関数テンプレートのテンプレート実引数が暗黙的に決まるようにして、
関数呼び出し時に明示的な指定をしないように変えたら、MyNSに入っていてもコンパイルできるようになった
明示的にテンプレート実引数を指定するとダメ
誰か理由を教えてくれ
443428:2009/08/11(火) 15:55:47
ttp://codepad.org/405cfVvH
とりあえずfooがテンプレートかつクラス内定義friend関数であることが問題である
可能性が高いと考え、
この様にbar関数(テンプレートでないクラス内定義friend関数)にしてみましたところ
g++ 4.4.0
VC++ 2008
BCC5.5.1
Comeau C++
の4つで問題無くコンパイル・実行できました。

ちなみにbar(MyNS::MyTempl<MyNS::MyInt>());の場所を

MyNS::bar(MyNS::MyTempl<MyNS::MyInt>());
にするとttp://codepad.org/wewb2LHcの様にエラーになります
::bar(MyNS::MyTempl<MyNS::MyInt>());
にしてもttp://codepad.org/hj2uJmG0の様にエラーになります

グローバルスコープを明示的に指定するとダメになるところをみますと、
どうやら>>442さんがおっしゃる1.が理由の一つである可能性が高いですね。
444デフォルトの名無しさん:2009/08/11(火) 15:59:07
どこで聞いたのか失念したけど
friendとtemplateを併用するとADLがうまく働かなくなるって話を
聞いた事がある
445デフォルトの名無しさん:2009/08/11(火) 16:03:18
ちなみにbcc6.1.3では

>MyNS::bar(MyNS::MyTempl<MyNS::MyInt>());
>にするとttp://codepad.org/wewb2LHcの様にエラーになります
>::bar(MyNS::MyTempl<MyNS::MyInt>());
>にしてもttp://codepad.org/hj2uJmG0の様にエラーになります

どちらも通ります

どうもADL周りの作り込みが甘いのか構文解析の手抜きをしているのか
446428:2009/08/11(火) 16:07:21
みなさんありあがとうございます。

とりあえずfriendにすることを諦めて、次のような逃げ道に走ってみました。
C++ code - 55 lines - codepad
ttp://codepad.org/yBp6Lo3p
こちらのコードは、
g++ 4.4.0
VC++ 2008
BCC5.5.1
Comeau C++
の4つで問題無くコンパイル・実行できました。
事前のインスタンス化なども不要なので、
逃げたような気がしてなりませんが一応解決はできました。。。
447デフォルトの名無しさん:2009/08/11(火) 16:16:22
規格票を持っていたら§14.5.3 Friends
を参照してみて欲しい

いろいろと制限がきついことがわかると思う
448428:2009/08/11(火) 16:45:41
>>447
すみません。
一介の趣味プログラマ(職業とは関係ない)でして、
規格票は買ってはおりません。

日本工業標準調査会:データベース-JIS詳細表示
ttp://www.jisc.go.jp/app/pager?id=40240
ここで探してみます。
449デフォルトの名無しさん:2009/08/11(火) 17:05:27
namespace MyNS
{
//省略

template<typename int_t>
class MyTempl;

template <typename hoge_t, typename boke_t>
hoge_t foo(const boke_t& arg);

template<typename int_t>
class MyTempl
{
public :

int_t num;

MyTempl(int_t n = 0) : num(n) {}


template <typename hoge_t>
friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1
{
return static_cast<hoge_t>(arg.num.num);
}
};
}//namespace MyNS
450449:2009/08/11(火) 17:06:42
Comeau C++でコンパイルOK
VC++2008で実行可能

だった。
451449:2009/08/11(火) 17:16:19
template<typename int_t>
class MyTempl;

この前方宣言は要らなかった。スマソ。
452449:2009/08/11(火) 17:17:00
namespace MyNS
{
//省略

template <typename hoge_t, typename boke_t>
hoge_t foo(const boke_t& arg);

template<typename int_t>
class MyTempl
{
public :

int_t num;

MyTempl(int_t n = 0) : num(n) {}


template <typename hoge_t>
friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1
{
return static_cast<hoge_t>(arg.num.num);
}
};
}//namespace MyNS
453428:2009/08/11(火) 17:22:28
>>449さん
その方法なら
テンプレートかつクラス内定義friend関数に
できるのですね。

ありがとうございます。
454428:2009/08/11(火) 17:47:41
>>449さんのコードを記しました。
ttp://codepad.org/xotYKfl3
g++ 4.4.0
VC++ 2008
Comeau C++
では通りましたが、
BCC5.5.1
では通りません。
まあどうせBCCが悪いのだろうとは思いますが。

BCC6.1.3をお持ちの方、試していただけませんでしょうか?
455デフォルトの名無しさん:2009/08/11(火) 17:49:51
struct { ... } var; という感じで名前のないクラス/構造体を作れると思いますが、
これにコンストラクタ/デストラクタを付けたいなら名前を付けるしかないですか。
456デフォルトの名無しさん:2009/08/11(火) 17:51:28
ということは、
>>446の言う逃げのコード(>>446ttp://codepad.org/yBp6Lo3p
はbcc5.5.1ですら通る互換性の高いコードということか。

bcc5.5.1を見捨てるならどうでもいいんだろうけど。
457デフォルトの名無しさん:2009/08/11(火) 17:52:29
458デフォルトの名無しさん:2009/08/11(火) 17:56:08
>>454
エラー E2015 codepad9.cpp 49: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad9.cpp:8' と
'MyNS::double foo<double>(const MyNS::MyTempl<MyNS::MyInt> &)' の区別が曖昧(関数 main() )

と出てしまいます
459428:2009/08/11(火) 18:02:27
>>458
ありがとうございます。
BCC6.1.3でも無理なようですね。

・・・ちなみに、
少し改変した
ttp://codepad.org/LQvoBRSP
g++ 4.4.0
VC++ 2008
Comeau C++
では通りましたが、
BCC5.5.1
では通りません。

460デフォルトの名無しさん:2009/08/11(火) 18:10:33
>>457
#include <cstdio>
class {
int foo;
public:
void func() {printf("Whee!:%d\n", foo);}
void set(int v) {foo = v;}
} bar;

int main()
{
bar.set(3);
bar.func();
return 0;
}
--
無事に実行できるけど?
461デフォルトの名無しさん:2009/08/11(火) 18:11:59
>>460
元質はコンストラクタ/デストラクタが作れるか聞いているのは判る?
462457:2009/08/11(火) 18:12:22
>>460
正直スマンかった。
463デフォルトの名無しさん:2009/08/11(火) 18:17:56
>>460
つまり、そのサイトはダメダメということで宜しいか?
464デフォルトの名無しさん:2009/08/11(火) 18:34:44
>>459
エラー E2015 codepad10.cpp 59: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:8' と
'MyNS::double foo<double,MyNS::MyInt>(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:38' の区別が曖昧(関数 main() )

となってやはりbcc6.1.3でも無理です
465428:2009/08/11(火) 18:45:35
>>464
Borlandはこのあたり伝統的に対応がおそいようですね。

ありがとうございます。

466デフォルトの名無しさん:2009/08/11(火) 18:50:23
template <typename T>
bool is_not_zero(const T& arg);
テンプレート引数T型はint型からT型へ暗黙のキャストが可能なものを選ぶとするとき、
operator!=(const T&, const T&)が定義されていれば
template <typename T>
bool is_not_zero(const T& arg)
{return arg!=static_cast<T>(0);}
とし、定義されていないならoperator==(const T&, const T&)を利用して
template <typename T>
bool is_not_zero(const T& arg)
{return !(arg==static_cast<T>(0));}
とする。
こんな方法は可能でしょうか?
可能でしたらご教示ください。
467デフォルトの名無しさん:2009/08/11(火) 18:56:51
今朝来たMSDNのメールて、 【64 ビット プログラミング ガイド日本語版を公開中!】 次世代 Windows 環境に備えよう
なんてのが届いたので、みていたら。
int i1 = -2;
unsigned int i2 = 1;
char *s = "Hello";
printf("%s", s + 1 + (i1 + i2));
このコードは32ビットなら動くけれども、64bitだと修正しろとあります。
ぱっと見た目変なところはなさそうにみえるのですが・・・
1.int が 64bit → 問題なし
2.int/unsigend は 32bit で64bit int にキャストされる → 問題なし
3.int + unsigned = unsigned → 0x000000000ffffffffL になるから?
 なんで long int になんねーんだよwなのだろうか?

64bitもっている人誰かいたら解説ください。
468デフォルトの名無しさん:2009/08/11(火) 19:00:50
そんな不気味なコード書かないだろうたぶん
たしかWindowsはlongも32ビットだから、size_tやptrdiff_tを使わないとだめなんじゃ?
469デフォルトの名無しさん:2009/08/11(火) 19:40:33
printfの行がキモすぎるwww
たぶんポインタまわりのことを言いたいんだと思うが。
470デフォルトの名無しさん:2009/08/11(火) 19:41:28
windowsはLLP64だから
i1 + i2 -> unsigned int (0xffffffffU:32bit)
s + 1 -> char* (64bit)
s + 1 + (i1 + i2) -> s + 1 + 0x000000000ffffffffULL

何ビットだろうがそんなコード書くな
471デフォルトの名無しさん:2009/08/11(火) 21:14:40
もっと他のまともな例があった気がする。
どこで見たっけな。
472デフォルトの名無しさん:2009/08/11(火) 21:45:42
class
{

class testのメンバ変数hogeを返す場合
以下の定義で何が違うのでしょうか?

inline const Hoge getHoge(...)
const Hoge & getHoge(...)
Hoge getHoge(...)
473デフォルトの名無しさん:2009/08/11(火) 21:48:28
VC++2005だとこんなコードを32bitでコンパイルしても64bit移植性警告出るね。
char* s="hello";
int a=reinterpret_cast<int>(s);
474デフォルトの名無しさん:2009/08/11(火) 21:49:20
>>473
ああそれ鬱陶しかったよね。
2008にして良かった。
475デフォルトの名無しさん:2009/08/11(火) 22:37:46
>>474
鬱陶しいなら警告切ればいいだけだと思うのだけど……。
デフォルトで、2005はオン、2008はオフというだけなのだから。
476デフォルトの名無しさん:2009/08/11(火) 23:04:41
>>473-474
妥当な警告じゃないの?
intptr_t とか、適切なサイズの整数を使えって意味で。
477デフォルトの名無しさん:2009/08/11(火) 23:09:42
>>476
32bitでコンパイルする場合に出るんだよ。
まあ、10年は32bitの時代だね。
478デフォルトの名無しさん:2009/08/11(火) 23:22:17
>>444
それはたぶん、暗黙の型変換とごっちゃになってるんじゃ…
479デフォルトの名無しさん:2009/08/11(火) 23:33:54
>>477
何ビットだろうが、ポインタと int のビット数の大小を決め付けてるのはおかしいってことね。
480デフォルトの名無しさん:2009/08/11(火) 23:49:33
>>472
inline const Hoge getHoge は、
 - 戻ってくるときにHogeのコピーコンストラクタが呼び出される
 - 戻ってきたHogeの非constメンバ関数は呼べない

const Hoge &getHoge は、
 - 戻ってくるときにHogeのコピーコンストラクタは呼び出されない
 - 戻ってきたHogeの非constメンバ関数は呼べない

Hoge getHoge は、
 - 戻ってくるときにHogeのコピーコンストラクタが呼び出される
 - 戻ってきたHogeのメンバ関数は全て呼べる
481デフォルトの名無しさん:2009/08/12(水) 00:25:09
クラスのデストラクタがvirtualではないクラス
を継承する安全な方法はないですよね?
482デフォルトの名無しさん:2009/08/12(水) 00:28:38
boost::shared_ptrを使うと、デストラクタがvirtualじゃなくても適切なデストラクタが呼び出される
はず
483デフォルトの名無しさん:2009/08/12(水) 00:35:33
protected継承にする。
484デフォルトの名無しさん:2009/08/12(水) 02:08:51
>>457
そのリンク先の
> out.num1 = 10;
という使い方を初めて知った。これって合法なのかな
無名構造体のメンバを作ってそれ経由しかしたことなかった(>>460の方法)
485デフォルトの名無しさん:2009/08/12(水) 09:39:03
>>484
無名クラスはスルーできるみたいよ。
例えばgccだと`int OuterClass::<anonymous class>::num1'と解釈するみたい。
つーか、>460の型名のないクラスは無名クラスとは呼ばないのかな?
言葉の定義は誰か詳しい人よろしく。
486デフォルトの名無しさん:2009/08/12(水) 16:53:23
                  `丶´ ̄ ̄ '' ‐- - - - ァ
             /)ヾ  /  /ア|      ,, -‐ '' /
            ///)::/\/ /'  |∧ヾ    `丶  /
          /,.=゙''"//::_/        ',   ミ  /
   /     i f ,.r='"-‐'つ/  \   /  i  ::l  /
  /      /   _,.-‐'~ :::} f:(_)ヽ   .r(_)、l :::l  ',   こまけぇこたぁいいんだし!!
  .   /   ,i   ,二ニ⊃..::ノ {O:c::j    {::c::::}| :::|  ヽ
    /    ノ    il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::|  ;;\ゞ
      ,イ「ト、  ,!,!ヽ、|/レ小、.   {  _ノ   ノ :/|/ヾ、l
      / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/
487デフォルトの名無しさん:2009/08/12(水) 16:54:16
誤爆した
すまん
488デフォルトの名無しさん:2009/08/12(水) 16:54:49
池田ァ!!
489デフォルトの名無しさん:2009/08/12(水) 17:46:01
まさかム板でこまけぇこたあAAしかも池田かよw
490デフォルトの名無しさん:2009/08/12(水) 18:04:22
そんなやつは絶対プログラミングできないなw
491デフォルトの名無しさん:2009/08/12(水) 19:09:52
>>487
                  `丶´ ̄ ̄ '' ‐- - - - ァ
             /)ヾ  /  /ア|      ,, -‐ '' /
            ///)::/\/ /'  |∧ヾ    `丶  /
          /,.=゙''"//::_/        ',   ミ  /
   /     i f ,.r='"-‐'つ/  \   /  i  ::l  /
  /      /   _,.-‐'~ :::} f:(_)ヽ   .r(_)、l :::l  ',   こまけぇこたぁいいんだし!!
  .   /   ,i   ,二ニ⊃..::ノ {O:c::j    {::c::::}| :::|  ヽ
    /    ノ    il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::|  ;;\ゞ
      ,イ「ト、  ,!,!ヽ、|/レ小、.   {  _ノ   ノ :/|/ヾ、l
      / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/
492デフォルトの名無しさん:2009/08/12(水) 20:16:59
C++でシステム毎に定義された円周率の値を求めることは出来ますか?
例えばnumeric_limitsの様な感じで。
493デフォルトの名無しさん:2009/08/12(水) 20:25:39
>>487
486を除く
このスレ書き込み自己申告して下さい。
494デフォルトの名無しさん:2009/08/12(水) 20:28:30
>>492
#include <cmath>
M_PI
とか?
495486:2009/08/12(水) 20:32:17
誤爆した
すまん
496デフォルトの名無しさん:2009/08/12(水) 20:41:10
円周率定数は標準にはないので
2*asin(1)でも使うといい
497デフォルトの名無しさん:2009/08/12(水) 20:45:24
>>496
それって毎回計算されたりするの?
498492:2009/08/13(木) 00:24:02
ありがとうございます。
両方とも考慮していきます。
499デフォルトの名無しさん:2009/08/13(木) 06:37:53
x87ならFLDPI命令呼びたいよなー。
500デフォルトの名無しさん:2009/08/13(木) 08:42:49
#include <stdio.h>

int main(void)
{
double d;

__asm {
FLDPI
FSTP [d]
}

printf("%16.15f\n", d);

return 0;
}

3.141592653589793
501デフォルトの名無しさん:2009/08/13(木) 09:58:26
2.0*asin(1.0)をFLDPIにしてくれるコンパイラが欲しいゾ
502デフォルトの名無しさん:2009/08/13(木) 10:20:24
幾つかpieを計算する関数を試してみた。
処理時間は概ね、acos(-1) > asin(1) * 2 >> atan2(0, -1)になった。
503デフォルトの名無しさん:2009/08/13(木) 10:27:25
>>502
興味深い結果だ。
504デフォルトの名無しさん:2009/08/13(木) 11:27:17
環境を変えたら入れ替わったりするんだろうか?

関数呼び出しのオーバーヘッド分とか
2倍する演算の分とかその辺の差のような気がする。
505デフォルトの名無しさん:2009/08/13(木) 11:32:44
調査している人がいてもおかしくない気もするが。
とりあえずdoubleに限るなら
#IFDEFでM_PIがあるかどうかで分けるのが正解な気がしますが。
506デフォルトの名無しさん:2009/08/13(木) 12:25:19
>>502
それって本当に「時間」?
507デフォルトの名無しさん:2009/08/13(木) 12:27:49
ぐぐると6*asin(0.5)ってのがよく出てくるけどこの方がいいのかな
508デフォルトの名無しさん:2009/08/13(木) 12:33:08
結果定数なんだから定数で置き換えてくれればいいのに。
そういうのをコンパイラに伝える機能って新しく追加されたりしないんだっけ?
javaだったかな。
509デフォルトの名無しさん:2009/08/13(木) 12:34:48
constexprっていうまさにそういう機能がC++0xで追加されるよ
510デフォルトの名無しさん:2009/08/13(木) 12:35:51
thx
511502:2009/08/13(木) 12:36:11
>>506
はいな、時間だよ。勿論、atan2(0, -1) >>>>> 定数 だろうけれど。
因みに、gccはpow(2, -23)とかは定数にしてくれるけど>502はM_PIにもfldpiにもならなかった。
尤も、fld1も使う場合と使わない場合があるようだけど。
512466:2009/08/13(木) 12:51:27
確かに、πを数値計算する場合、
asin(x)のテイラー展開(正確にはマクローリン展開)が一番自然で、
しかも誤差の項にx^nがかかるため
asin(1)よりもasin(0.5)の方が圧倒的に収束は速いと考えられますね。

そのため6*asin(0.5)が良いという可能性はありますよね。


ところでどなたか
>>466
をお答えいただけませんでしょうか?
513デフォルトの名無しさん:2009/08/13(木) 14:18:09
Cの関数を使わず直接FPUを叩いてみた

結果は>>502と同じ
というか、ソースを見てもらうとわかるが、acosを求めるのに一番
手間がかかり、次はasinであり、atanはfpatan一発で求まるので
一番簡単なので結果は予測できる

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9897.txt

ここにソースを置いておく
>>502と違う結果が出た人がいたら環境を教えて欲しい
514デフォルトの名無しさん:2009/08/13(木) 14:23:35
C++と関係ない話は他でやれ
515デフォルトの名無しさん:2009/08/13(木) 14:25:46
別にこれ位いいだろ
>>504の疑問に答えただけだ
516デフォルトの名無しさん:2009/08/13(木) 14:31:29
ご教示願います。

詳説C++ではデストラクタは継承されないとあります。
Accelerated C++では仮想デストラクタは継承されるとあります。

非仮想のデストラクタは継承されない。
仮想デストラクタは継承される。

という認識で正しいでしょうか?
517デフォルトの名無しさん:2009/08/13(木) 14:33:52
So death.
518デフォルトの名無しさん:2009/08/13(木) 14:43:20
>>516
「継承される」ってどういう状態のこと言ってんの?

デストラクタは必ず派生クラスで再定義されるから、普通のメンバ関数や
メンバ変数みたいに基底クラスのものがそのまま使われるってことは無いよ。

あ、少なくとも言語仕様上はね。派生側で追加の処理が無ければまったく
同じ関数が走るようにコンパイルされることは考えられる。

でも、これは virtual 付いてようが付いてなかろうが同じ話。
519デフォルトの名無しさん:2009/08/13(木) 15:01:08
>>512 メンバ関数(演算子)の有無で切り替えたいというのなら、C++はできなかったと思う。
その代わり、関数の有無を継承したクラスで示すタグディスパッチという手法がある。
class EQ_tag{};//==があることを示すタグのクラス
class NE_tag{};//!=があることを示すタグのクラス
class A :public EQ_tag
{
public:
bool operator==(int val)const{return val==3;};
};
class B :public NE_tag
{
public:
bool operator!=(int val)const{return val!=3;};
};

template<class T>bool _isEQ(const T& s,int val,const EQ_tag&){return s==val;}
template<class T>bool _isEQ(const T& s,int val,const NE_tag&){return !(s!=val);}
template<class T>bool isEQ(const T& s,int val){return _isEQ(s,val,s);}// この第3引数で切り替える。

int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
isEQ(a,3); //==が呼ばれる
isEQ(b,3); //!=が呼ばれる
return 0;
}
520デフォルトの名無しさん:2009/08/13(木) 15:06:26
>>517
>>518
結局、基底クラスのデストラクタを仮想にしておけば

・派生クラスのデストラクタ
・基底クラスのデストラクタ

がこの順番で呼び出されるので納得しました。
521デフォルトの名無しさん:2009/08/13(木) 15:08:22
>>520
仮想で宣言した場合としていない場合、
どう違うか
たぶん理解してないよ、それ。

基底クラスのポインタにキャストしてdeleteした場合について
限定しているわけじゃないでしょ?
522466:2009/08/13(木) 15:10:29
>>519
タグディスパッチとは、
input_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
output_iterator_tag
と同じような物でしょうか?
523デフォルトの名無しさん:2009/08/13(木) 15:14:36
template <class T>
class Hoge
{
T val;
//詳細が続く。
}
こんなTクラスのラッパクラスであるHogeに対して、
hoge->T方向のキャスト演算子をオーバーロードしたいのですが、
const operator T()const{return val;}
operator T(){return val;}
のような2通りのバージョンを用意すべきでしょうか?
それとも上の1つだけにした方が望ましいですか?
524523:2009/08/13(木) 15:16:12
正しくは
operator const T &()const{return val;}
operator T &(){return val;}
かもしれません。
参照をいまいち理解出来ていなくて。。。
525519:2009/08/13(木) 15:18:09
>>522
うん
526デフォルトの名無しさん:2009/08/13(木) 15:21:55
参照でない(コピーを返す)なら、const版だけでいい
参照を返すなら、valを変更されてもよければ2つとも用意する
valを変更されたくなければconst版だけ
527466:2009/08/13(木) 15:22:22
>>525
ありがとうございます。
そのあたり、もっと勉強してきます。
528523:2009/08/13(木) 15:27:36
>>526
valはHogeのプライベートメンバなのですが、

T型へのキャストでvalを変更可能にするのとしないのと、
クラス設計としてはどちらが望ましいとかはありますか?
529デフォルトの名無しさん:2009/08/13(木) 15:32:01
そのラッパクラスの目的、どういう利用方法を想定しているかによる
530デフォルトの名無しさん:2009/08/13(木) 15:41:16
なるほど、一概には言えませんということですか。
ありがとうございました。
531デフォルトの名無しさん:2009/08/13(木) 16:32:09
class hogeのインスタンスメソッドbokeをthreadや、
APIのコールバック設定関数の引数void (*arg)(void)に渡したいんですが、どうすればいいでしょうか?
頼みのboost.bindやfunctionも、boost内部のクラスで定義され、void (*arg)()にキャスト不可能でした
532デフォルトの名無しさん:2009/08/13(木) 16:38:01
APIのコールバック関数は大抵void*のパラメータを渡せるようになってるはずなので、
それ使ってthisを渡してstatic関数経由で呼べばいいと思います
533デフォルトの名無しさん:2009/08/13(木) 16:39:09
      - -―- 、
    /...::::::::::::::.. ヽ
  / ..:::::::::::::::::::/\ ヽ
  /..:::/::::/::::// ヽ l:. l.
  l:::::!::::/●)  (●)|:: |
.  !:::l::::l///  ,, ///l:i:l  ェェエエ工工
  ヽ:i::!、 r ― ァ ノノ'     
    ` l\`ー './
   ノヽ \_フ.ヽ
   |_ 丶   ヽ
.   | |' 初心者)
534デフォルトの名無しさん:2009/08/13(木) 16:47:14
>>521
いえ大丈夫です。
ありがとうございます。
535531:2009/08/13(木) 16:47:58
>>532
が、できたら苦労はないんですけど、
引数void (*arg)(void)からわかる通り、指定できるコールバック関数の引数が0個なんですよ…
なので、クラスメソッド→インスタンスメソッド経由だと、インスタンスのアドレスもわからないですし
複数のインスタンスを扱う事を考えるとグローバル変数も使えずで…途方に暮れてます
536デフォルトの名無しさん:2009/08/13(木) 16:58:49
じゃあ、適当に10個くらいコールバック関数を用意して、
どのオブジェクトがどのコールバック関数を使用中か管理して、
空いてるコールバック関数を使う
一杯だったらリソース不足ってことにしてあきらめる

CPUが決まってるなら、実行時に各オブジェクト用のコードを
その場で生成するっていう手もないこともない・・・
537531:2009/08/13(木) 17:18:23
>>536
そうですね…、やはり管理クラスを別で作るしかなさそうな感じです。
コールバックごときに時間も掛けてられないので、この仕様で行こうと思います。
ありがとうございました。
538519:2009/08/13(木) 18:02:35
>>535
プライベートなスタティック変数を経由する。

539デフォルトの名無しさん:2009/08/13(木) 19:07:06
複数のグローバル変数を1つのclassで包めば安全度あがる?
540デフォルトの名無しさん:2009/08/13(木) 19:15:11
オブジェクトとして扱うなら
541デフォルトの名無しさん:2009/08/13(木) 19:15:27
あがりません。
グローバル変数のまずい点の一つは
密結合であるということだからです。
542デフォルトの名無しさん:2009/08/13(木) 20:47:43
安全度ってものが何を意味するか微妙だけど、
とりあえず何の名前空間にも含まれていないグローバル変数が
複数あるならその段階でコードがクソ設計である可能性は高い。
・・・って誰もこんな事聞いてないか。
543デフォルトの名無しさん:2009/08/13(木) 21:26:18
MapDataというマップダータの変数があるとして
マップ描写、当たり判定、キャラなどのクラスからアクセスがあるなら
グローバル変数以外にどう実装すればおk?

全部ひとつのクラスで包めばいいかもしれないが
それぞれのクラスにMapDataを渡すとなれば引数が多くなりスマートにならないんじゃね
544デフォルトの名無しさん:2009/08/13(木) 21:33:05
今日はじめてC++の文法解説サイトを読みました。
C++というか構造体++に見えてしまうんですが、
オブジェクト指向とか仰々しい名前が付いててこんなもんですか?
545デフォルトの名無しさん:2009/08/13(木) 21:34:28
>>544
継承と仮想関数があってもですか?
546デフォルトの名無しさん:2009/08/13(木) 21:39:25
オブジェクト指向なんて今時珍しくもなんともないだろ
547デフォルトの名無しさん:2009/08/13(木) 21:39:44
テンプレート超楽しい
548デフォルトの名無しさん:2009/08/13(木) 21:41:50
>>543
マップデータを内包するMapDataというクラスにマップ描写や当たり判定を行うメンバ関数を用意する。
キャラクラスからのアクセスはどんなものかわからんので知らない。
549デフォルトの名無しさん:2009/08/13(木) 21:43:18
オブジェクト指向の入門書はJavaやC#の方が多いくらいだし
C++学ぶ段階でオブジェクト指向ってなんですか?って言う人は減ったわな。
550デフォルトの名無しさん:2009/08/13(木) 21:44:26
C++特有の物といったら多重継承ぐらいなもんだしな
それを使ったオブジェクト指向入門書というのは割と少ない
551デフォルトの名無しさん:2009/08/13(木) 21:48:23
普通はMapDataのインスタンスを受け取ってデータ取得や当り判定、描画を行うクラスを用意する。
552デフォルトの名無しさん:2009/08/13(木) 21:51:41
>>545
>継承と仮想関数があってもですか?
これから読んできます!

クラスの解説読んでるとSQLとRelationalDatabaseで良いじゃん!と思ってしまんですが、
クラスのありがたみってどのあたりで現れてきますか?
553デフォルトの名無しさん:2009/08/13(木) 21:52:58
>>552
君はGoF読むか独習デザインパターンC++を読みなさい
554デフォルトの名無しさん:2009/08/13(木) 22:00:40
>>543
唯一絶対の正解なんてのはねーが、マップ描写なら
ttp://marupeke296.com/OOD_No6_CS2_ShootBullet2.html
描画対象の基底クラスを作ってうにゃむにゃ。
描画対象が抽象化されるからレンダラーで奥行描画の調整もしやすい。
いま漏れが思いつく限りでは一番好きなやり方。
キャラなら適当なクラスを作ってインスタンスをプール。
当たり判定はmapdataのお仕事って感じかな?
555デフォルトの名無しさん:2009/08/13(木) 22:01:05
>>552
おいっす、明日ジュンク堂あたりでじっくり読んできます。

とは言うものの、デザインパターンって昔読んでさっぱり分からなかったんですが、
デザインパターンその物の解説本よりも、
デザインパターンを使って作ってみましょう!見たいな本はないですか?
556デフォルトの名無しさん:2009/08/13(木) 22:06:33
>>555
推薦図書/必読書のためのスレッド 51
http://pc12.2ch.net/test/read.cgi/tech/1250040767/

このスレで聞いてみたら?
出来るだけ詳しく「これこれこういう本が欲しいんです」と
自分の意志を伝える事かな

それからweb上にも役立つ所がある
俺は

http://www.01-tec.com/document/cpp_design_pattern.html

ここを良く読んでるけどな
557デフォルトの名無しさん:2009/08/13(木) 22:11:42
>>556
ありがとうございます。
聞いてくる前にまず読んできます。
558デフォルトの名無しさん:2009/08/13(木) 22:12:40
クラス解説とSQLがどうしても結びつくのかわからない・・・
559デフォルトの名無しさん:2009/08/13(木) 22:17:25
だから初心者なんだろ
560デフォルトの名無しさん:2009/08/13(木) 22:18:22
いやー、なんか値の代わりに関数が登録されてるように見えて、
検索して値を取り出すのが、関数の呼び出しに見えてしまったんですが、
SQL勉強しなおしですかね・・・・
561デフォルトの名無しさん:2009/08/13(木) 22:25:12
いあいあ、なるほどそういう見方もあるのかと
思ってしまった
ありかとう
562デフォルトの名無しさん:2009/08/13(木) 22:31:50
オブジェクト指向データベースってあったなぁ…あれどうなったんだろう。
563デフォルトの名無しさん:2009/08/13(木) 22:33:11
構造体+アクセス・セキュリティ強化 → 関数管理ライブラリ?
構造体+データ処理特化 → リレーショナルデータベース?
見たいなあいまいな知識しかもってません(笑)

むかーし、Cの構造体でDB組んでて、
DBが大規模化して手に負えなくなって、
構造体に機能追加してったら、
関数ライブラリを管理するのにちょうど良いので
その方向に進化させたのがクラスなのかなーとか
564デフォルトの名無しさん:2009/08/13(木) 22:34:32
Cで構造体に機能追加って、Cの構造体はメンバ関数持てないでしょ
565デフォルトの名無しさん:2009/08/13(木) 22:37:44
>>564
メンバ関数として第一変数を構造体へのポインタにすればいいだけでは?
566デフォルトの名無しさん:2009/08/13(木) 22:38:30
Cの構造体に機能追加(メンバ関数を持てる様にした)したのが
C++のクラスなのかなーという認識で、
初心者の戯言です。
567デフォルトの名無しさん:2009/08/13(木) 22:39:38
>>566
それはカプセル化ね

データと手続きを今まで別々に扱っていた不自然さを
統一して解決したわけですよ

仮想関数と継承はまた別
568デフォルトの名無しさん:2009/08/13(木) 22:41:52
C++はテンプレートを利用したコンパイル時静的多相解決という
とんでもない仕組みも持っているけどね

そのおかげでBoostという怪物ライブラリが現れて来た
569デフォルトの名無しさん:2009/08/13(木) 22:46:17
>>567
ありがとうございます。
データと手続きは別個の方が自然だと思ってましたorz

>>568
奥が深いですね・・・
もう一度解説サイト読み直してきます。

C++でGUIのあるアプリケーションを作ろうとしたら.net?とかいうライブラリを使うんでしょうか。
570デフォルトの名無しさん:2009/08/13(木) 22:47:02
>>568
テンプレートメタプログラミングってすげぇよな。
俺できないけど、みんなは出来る物なの?

ライブラリ作る職業の人すら出来るのかあやしいんだが。
571デフォルトの名無しさん:2009/08/13(木) 22:47:20
コンパル時に結果を演算してしまうというのはものすごい技術だけど、
一方で、エラーメッセージが意味不明だったり、
リアルタイムコンパイルによって実現されているMicroshiftのインテリセンスと相性が悪かったり…
VS2010で改善されないかなぁ。
572デフォルトの名無しさん:2009/08/13(木) 22:48:02
>>569
データと手続きが別個だとプログラムの規模が上がった時に
一人で扱える限度を超えて手に負えなくなるんですよ

.NETはC++/CLIという全く別個の言語ですので混同しないように
他にC#とかVB.NETなどもある
573デフォルトの名無しさん:2009/08/13(木) 22:48:09
>>569
自然かどうかはちょっと微妙なところがあるとおもうけど、
自分や他人の作った複数のクラスが
うまく組み合わさって動くその様は、まさに壮観。
574デフォルトの名無しさん:2009/08/13(木) 22:50:35
盛り上がっているところ失礼します。

const unsigned int num = 10;
と書くと、numはコンパイル時に定数となると聞きました。

const unsigned int hoge = 3 + 4;

const unsigned int piyo = (3 + 4 - 1) * 2 / 3;
はコンパイル時に定数になりますか?
575デフォルトの名無しさん:2009/08/13(木) 22:51:08
なります
576デフォルトの名無しさん:2009/08/13(木) 23:02:04
なるかどうかはコンパイラ次第だったりしない?

最適化を禁止してアセンブラコード出させてみるとか。

577デフォルトの名無しさん:2009/08/13(木) 23:05:50
>>572
>データと手続きが別個だとプログラムの規模が上がった時に
>一人で扱える限度を超えて手に負えなくなるんですよ
なるほどー

>.NETはC++/CLIという全く別個の言語ですので混同しないように
>他にC#とかVB.NETなどもある
あさってな質問ですいませんorz
GUIのあるアプリケーション作ろうとするなら開発環境のスレに移るべきでしょうか?

>>573
>自然かどうかはちょっと微妙なところがあるとおもうけど、
>自分や他人の作った複数のクラスが
>うまく組み合わさって動くその様は、まさに壮観。
多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか?
呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。

578574:2009/08/13(木) 23:06:11
>>575
>>576
ありがとうございます。

const unsigned int num = 10;
const unsigned int hoge = 3 + 4;
const unsigned int piyo = (3 + 4 - 1) * 2 / 3;
char a[10], b[num], c[hoge], d[piyo];
がg++で通ることは確認しました。
579デフォルトの名無しさん:2009/08/13(木) 23:06:44
>>554
よく理解できないがすげー参考になったわ
580デフォルトの名無しさん:2009/08/13(木) 23:08:12
>>577
GUIの話題ならコンパイラスレに行った方がいいな

>呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。

それは仕様書の話だね
OOPとは関係ない
581デフォルトの名無しさん:2009/08/13(木) 23:08:48
>>577
>多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか?
いい表現だね。
まあ工夫の一つってことだけど。

クラスはテンプレートと組み合わせたときもまたすごいことになる。
例えば君が有理数クラスを作ったとして普通に使うとintが分母分子の型になるけど、
誰かが多倍長整数クラスを作ってくれていればそれを使うことで
多倍長桁数で分母分子を管理する有理数クラスが一瞬で出来る。


582デフォルトの名無しさん:2009/08/13(木) 23:12:42
そうだなクラスの目玉機能の一つとして演算子の多重定義というのがあるな
これをテンプレートと組み合わせるとtraitsになる
583デフォルトの名無しさん:2009/08/13(木) 23:18:08
>>580
了解しました。コンパイラスレ探しに行ってきます。
初心者の的はずれな質問に付き合って頂いてありがとうございます。

>>581
難しいですねw
理解するにはまだまだ勉強が必要みたいです。
大は小を兼ねる的な、
基本的な関数を、継承使ってちょっとカスタマイズすることで、
ゼロから書くよりは大幅に工数を削減して欲しい関数を実現する見たいな?
584デフォルトの名無しさん:2009/08/13(木) 23:20:05
大規模開発ではクラスは使わない
クラスと言う名の構造体しか使わない
585デフォルトの名無しさん:2009/08/13(木) 23:22:12
>>583
実際は仮想関数を使うために仕方なくpublic継承を使うけど
できることならコンポジションで対応出来る所はそうしたい

継承は使いすぎるとプログラムの見通しが悪くなるんですよ
実際にプログラム書いてみるとわかるけど

それからUML図にも慣れるといいね
UML無しにOOPしようとすると頭が爆発します

templateは継承とはまた全然別の機能
ジェネリック・プログラミングのための機能でこれがあるために
C++は特別な言語になっちゃってます
586デフォルトの名無しさん:2009/08/13(木) 23:29:26
>>585
ありがとうございます。

実のところ、
UMLライクなお絵かきするとCコードを生成してくれる環境に慣れすぎてて、
裏で何が起きてるのかさっぱ分からないという状況に慌てて、
連休利用してCの文法見直してたらいつの間にかここに辿り着いたといった次第です。
(作って覚えるVC#とかの本でキーボード叩くのえらい難儀しました。)

継承とtemplateの違いがまださっぱりなので、
明日もじっくり解説サイト読んで来ることにします。

レスくれた人ありがとうございます。&おやすみなさいー
587デフォルトの名無しさん:2009/08/14(金) 10:50:36
一応Cは理解していると思っているのですが
C++を最初から勉強しようとした時、何かオススメの書籍なりサイトはありますか?

猫とかやさしい〜ってのはやめとけみたいな話を「C言語なら俺に聞け」というスレで目にしたもので
588デフォルトの名無しさん:2009/08/14(金) 11:03:33
>>587
ロベールのC++を読んでおけ
規格書に近い内容まで知りたいなら詳説C++も読め
589デフォルトの名無しさん:2009/08/14(金) 11:12:34
ロベール=ピエール
590デフォルトの名無しさん:2009/08/14(金) 11:26:36
>>587
AcceralatedC++一択じゃないか?
それはいいけど、折角書籍スレがあるんだから見てきたら?
591デフォルトの名無しさん:2009/08/14(金) 11:34:09
>>590
C++を「一から」理解したい人に「AcceralatedC++」は
違うだろうと思うんだけど

それよりC++ in-depth seriesそのものが違うだろうと思う
あれは中級者が上級者に進むためのシリーズだろう
592デフォルトの名無しさん:2009/08/14(金) 12:31:06
>>587
猫はそこまでは悪くないよ。
ロベールのC++教室
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
ここはお薦め。
ここと猫は併用して学んで欲しい。

入門者ならエクスメディアの『ビジュアルラーニングC++』って本が
個人的なオススメだったけど、会社が倒産した。
593デフォルトの名無しさん:2009/08/14(金) 14:09:29
Webサイトの方のロベールはだめだ。いろいろ古い。
推奨されないコーディングもある。
本はそういうところ直されてるから、そっちを読んだほうがいい。
594デフォルトの名無しさん:2009/08/14(金) 20:27:14
gotoって処理自体は軽いでしょうか?

gotoを使うと無駄なコンストラクタを一回さけられる状況なんですが。
595デフォルトの名無しさん:2009/08/14(金) 20:34:11
そのコンストラクタを避けるのは本当に必要なことか?
何か速度的に重要な場面?

gotoは、ローカル変数のデストラクタを呼ばなきゃいけなかったり
tryブロックの出入りが必要な場合を除けば、軽い
596デフォルトの名無しさん:2009/08/14(金) 20:51:40
goto使うなんて言ったら最後、
何回レビューして注意書き何箇所に追記せにゃならんか・・・

って状況でもなければ作って走らせて比較してみては?
597594:2009/08/14(金) 21:05:25
>>595
> そのコンストラクタを避けるのは本当に必要なことか?
そのコンストラクタはhoge_t型をテンプレート引数にもつクラステンプレートの
ものであるため、hoge_t次第で重さが変わります。
> 何か速度的に重要な場面?
速度はあまり重要ではありません。

>>596
gotoを使ってあると、
「こいつ(の技術や作ったクラステンプレートは)大丈夫か?」
って思われますかね、やっぱ。
598デフォルトの名無しさん:2009/08/14(金) 21:10:01
使う理由とドキュメンテーションがしっかりしてればいいんじゃね
599594:2009/08/14(金) 21:19:45
びびってきたんで止めときます。
こうして一生gotoを使わないまま過ごしそうです。
600デフォルトの名無しさん:2009/08/14(金) 21:23:24
テンプレートの初心者です。
次のキューを実装するコード
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9901.txt

でデータの型についてテンプレート化しようとして
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9902.txt
とすると、上記ファイルの末尾にあるようなエラーが発生します。

これは、テンプレート関係の記述をどのようにすればいいのでしょうか。
理由あって、仮想関数を仕様しています。(スタックも実装する予定なのです。)
もしよろしければ見てやってください。よろしくお願いいたします。
601600:2009/08/14(金) 21:31:02
エラーの表示を忘れておりました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9903.txt
なにとぞお願いいたします。
602デフォルトの名無しさん:2009/08/14(金) 21:34:57
class queue { 〜 } の中に using DataStruct<T>::buff; と書く
603600:2009/08/14(金) 21:40:38
ありがとうございました。
テンプレートについて詳しく書かれた教科書を探さなければ。
604デフォルトの名無しさん:2009/08/14(金) 21:41:26
>>597
MISRA-Cなんかだと例外処理の時のみ認められてるかな?

gotoその物は悪くないんだ、ただ下手な使い手が多かっただけで、
このあたりはアメリカの銃問題と似たような感じ、
銃が悪いのか銃を使った人間が悪いのか、
銃が悪いのか、子供の手の届くところに銃を放置した親が悪いのか、ってな感じでね。

そのgoto使う箇所ってどのくらいの頻度で呼ばれるの?
CPUもメモリも豊かな時代だからよほどのことがない限り使わないけど。
605デフォルトの名無しさん:2009/08/14(金) 21:44:41
>>597
よく読んでなかったスマソ

実行速度はもちろん、コードの可読性が上がるみたいな理由がなければ、
基本的に使わないのが無難かな、

イスラム教徒とか黒人だってだけで差別されるっしょ?
あんな感じよ。
606デフォルトの名無しさん:2009/08/14(金) 22:19:34
そこまでの差別意識はないけど、ここ十数年gotoは使ったことない。
使う理由が見出せないだけだがな。もしgoto使った人間が近くにいたら、
理由を聞いて見たい、いや問い詰めたい気分がするのは間違いない。
607597 :2009/08/14(金) 22:48:52
>>604
呼ばれる頻度はたいしたこと無いと思います。

>>605
可読性はむしろ下がると思います。

>>606
ですよね、自分も他の人間が使っていたら是非聞いてみたいと思います。


やはり使わないのが無難という感じでしょうか。。。
608デフォルトの名無しさん:2009/08/14(金) 22:57:04
俺はそれほど気にしない派
しかし可読性が下がるのは戴けない
速度がよほど気になる場合以外は、可読性を取るべき
609デフォルトの名無しさん:2009/08/14(金) 23:02:02
末尾再帰したいけど最適化が保証されないからgoto使ったことあったかも
610デフォルトの名無しさん:2009/08/15(土) 00:32:54
gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・
611デフォルトの名無しさん:2009/08/15(土) 03:07:19
条件演算子で避けられたりしないか?
612597:2009/08/15(土) 08:12:23
ありがとうございます。

> gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・
既に作ってあるオブジェクトを返せばいいっていう状況です。
ちょっとここのあたり(もしgotoを使ったら)スパゲティプログラムに突入します。

> 条件演算子で避けられたりしないか?
さけがたいです。
613デフォルトの名無しさん:2009/08/15(土) 09:10:29
>>612
ifとauto_ptrで回避できると思うんだがどうよ
もっとも、実行速度にあまり影響ないなら分岐を避けたほうがいいかもね
614デフォルトの名無しさん:2009/08/15(土) 11:44:18
VC++6.0をもってるんだけど、これで勉強すればいいのかなぁ?7.0とかあるの?
615デフォルトの名無しさん:2009/08/15(土) 11:48:38
VC6は窓から捨てるべき
2008のExpressを使いなさい
616612:2009/08/15(土) 12:51:19
>>613
newして得たオブジェクトでしたらauto_ptrを使うことも考えますが、そうではないのでこのまま分岐を避けようと思います。

>>614
VC6で勉強するのは、今現在は相当悪い選択肢だと思いますよ。
VC8かgccがオススメです。
617デフォルトの名無しさん:2009/08/15(土) 12:56:27
>>614
特別な理由がなければ、VC++6.0より下記の製品のどれかの方が断然いいよ。全部タダだし。

Microsoft Visual Studio 2008 Express Edition
http://www.microsoft.com/japan/msdn/vstudio/express/
618デフォルトの名無しさん:2009/08/15(土) 13:06:23
>>617
dクス
619デフォルトの名無しさん:2009/08/15(土) 13:15:06
VC6は現行の標準C++じゃないと思ったほうがいい。
C++ライクなVC6独自言語だと思いましょう。

620デフォルトの名無しさん:2009/08/15(土) 13:40:27
>>619
kwsk
621デフォルトの名無しさん:2009/08/15(土) 14:02:26
コンストラクタで配列の要素数を自動で取得したいのですが...

TCHAR a[] = _T("123");
my_array<TCHAR> v = a;
見たいなことをやりたい
理想は、
my_array<TCHAR> v = _T("123");
だけどこっちはまあいいや
622デフォルトの名無しさん:2009/08/15(土) 14:42:39
my_arrayが何かわからないけどこういうこと?
std::basic_string<TCHAR> v = _T("123");
623デフォルトの名無しさん:2009/08/15(土) 14:45:04
こうですねわかります
template<typename T>
struct my_array {
 template<std::size_t L>
 my_array(T (&a)[L]) {
  std::cout << "length: " << L << std::endl;
 }
 template<std::size_t L>
 my_array(T const (&a)[L]) {
  std::cout << "length: " << L << std::endl;
 }
};
int main() {
 my_array<TCHAR> v = _T("123");
}
624デフォルトの名無しさん:2009/08/15(土) 14:48:17
次のコードをコンパイルすると、リンカがエラーを吐きます。
http://codepad.org/Lrswof7O

何処が悪いのでしょうか?
625デフォルトの名無しさん:2009/08/15(土) 14:58:01
変数の実体がない。
myclassスコープ外で
int myclass::i=0;

626デフォルトの名無しさん:2009/08/15(土) 14:59:28
>>622
ごめんクラスを作りたかったんだ
>>623
おーすげーまさにそれです
C++は奥が深い
627デフォルトの名無しさん:2009/08/15(土) 17:24:21
>>624
実体を定義しろ。
C++ code - 23 lines - codepad
ttp://codepad.org/XPEjNpOy
これが正解。
628624:2009/08/15(土) 19:38:06
>>625, >>627
ありがとうございます。そういうことなんですね。
これからもちょくちょくこのような初心の質問にあがると思いますが、どうかよろしくお願いいたします。
629デフォルトの名無しさん:2009/08/16(日) 08:13:54
C++で、
誤差のない小数計算(実数計算)が出来るライブラリは
ありませんか?
Boostにはなさそうで。
630デフォルトの名無しさん:2009/08/16(日) 08:30:11
どんな計算をしたいのか?
631デフォルトの名無しさん:2009/08/16(日) 08:45:45
三角関数です。

誤差のない小数計算型 x;
sin(x)+cos(x)
とかです。
632デフォルトの名無しさん:2009/08/16(日) 08:48:26
その計算結果をどのような形で受け取りたいの?
633デフォルトの名無しさん:2009/08/16(日) 08:50:58
>>629
有限ビットで誤差が無いなんて可能なんですかね?
僕も知りたいです。
634デフォルトの名無しさん:2009/08/16(日) 08:55:51
>>633
有理数ならboost::rationalで表現できる。
635デフォルトの名無しさん:2009/08/16(日) 09:02:25
RealLibでも使えば?
636デフォルトの名無しさん:2009/08/16(日) 11:02:56
三角関数は一部の結果を除いて無理数でしょ。
637デフォルトの名無しさん:2009/08/16(日) 11:39:52
>>635
RealLibは遅延評価で計算してるのかな?
638デフォルトの名無しさん:2009/08/16(日) 12:23:49
>>634
三角関数といっているではないか。
639629:2009/08/16(日) 12:33:08
>>632
同じ型の変数で受け取りたいです

>>635
ありがとうございます。
スレがあるんですね。
ttp://pc12.2ch.net/test/read.cgi/tech/1248060999/
このスレの>>8さんの発言
「こんなの使わなくたってVW使えばふんがっふんぐっ」
の、VWって何でしょうか?
そういうライブラリがあるのでしょうか?
640デフォルトの名無しさん:2009/08/16(日) 12:46:20
710 名前:□7×7=4□□[sage] 投稿日:2009/07/29(水) 19:17:00 ID:X3ZTVshE
[タイトル] Cargo Bridge
[タイプ] 橋かけ・構造力学パズル
[URL] http://www.limexgames.com/
[感想]
bridge builderとかやったことある人ならわかりやすいとおもう。
キャラクタが荷物を押して倉庫まで運ぶために、途中の谷に橋をかけるゲーム。
パーツは4種類あり、足場になるパーツと足場にならず支えにだけなるパーツ、それぞれが木製と鉄製の2種類ずつ。
足場になるものの方が高価で、鉄製の方が高価。はじめは木製の2種類だけが使える。
使用できるパーツは右上の予算範囲内に抑えなければならない。安上がりでできるほど高得点。

橋にかかる負荷が、キャラクタが運ぶ荷物の種類によっても大きく変化したり、片道でいいところと往復するところがあったり、
いろいろ考える要素の多いゲーム。今16面挑戦中。
キャラクタが谷に落ちていくときの声がシュールw

こういうゲームがあるんだけど、参考ソースとかってどっかにないかな・・・
641デフォルトの名無しさん:2009/08/16(日) 12:50:14
linear programmingでwikipedia.enれ
642デフォルトの名無しさん:2009/08/16(日) 13:13:29
>>641
それは計算機にゲームを解かせる場合の方法論であって、ゲームの作り方の
ガイドにはならんだろ。
643デフォルトの名無しさん:2009/08/16(日) 13:26:01
>>639
最終的に計算結果として数値が欲しいのでは?
644デフォルトの名無しさん:2009/08/16(日) 13:27:18
>>640
デザインパターンのどれかに当てはまりそうだけどちょっと思いつかないわ。
645639:2009/08/16(日) 13:35:21
>>643
最終的には文字列表記で計算結果が欲しいです。
646デフォルトの名無しさん:2009/08/16(日) 13:38:44
>>640
こういうゲーム大好きだw
参考ソースは思い浮かばないけど、
高校物理の力学をシミュレートしてるだけに過ぎないのでは?
647デフォルトの名無しさん:2009/08/16(日) 14:00:32
>>646
数理計画法(シンプレックス法)では?
648デフォルトの名無しさん:2009/08/16(日) 14:12:22
FEMだろ
649デフォルトの名無しさん:2009/08/16(日) 14:14:17
>>648
有限要素法ではないと思う。別に力学的解析が必要なわけではないし。
650デフォルトの名無しさん:2009/08/16(日) 14:20:28
>>648
それだ!
651デフォルトの名無しさん:2009/08/16(日) 14:32:00
具体的に何桁の精度が必要なのか明示しないと無理なんじゃない?
浮動小数点とかの概念も知らなさそうだし。
652デフォルトの名無しさん:2009/08/16(日) 14:36:39
   ∧_∧  / ̄ ̄ ̄ ̄ ̄
  ( ‘∀‘)< オマエガナー
  (    )  \_____
  | | |
  (__)_)
653デフォルトの名無しさん:2009/08/16(日) 14:39:13
>>640
コードは知らないが、ニュートン力学で十分シミュレートできるだろうね。
パラメータの調整が面倒だと思うが。

>>647
既に上で言及されている。linear programming = 線形計画法。
シンプレックス方は線形計画法の解き方の一つ。
654デフォルトの名無しさん:2009/08/16(日) 14:48:58
線形計画法は関係ないな
655デフォルトの名無しさん:2009/08/16(日) 14:53:36
くみ上げるのはユーザーなんだから、
最適解の算出とか不要でしょ
656642:2009/08/16(日) 15:22:35
だから関係ないって言っているんだが。
657デフォルトの名無しさん:2009/08/16(日) 16:32:42
>>645
文字列って、数式の文字列?だったらmathmaticaを使えばいいんじゃないかな。
658デフォルトの名無しさん:2009/08/16(日) 16:40:48
>>657
ライブラリを求めてるんだろ。
お前ライブラリの意味分かってる?
659デフォルトの名無しさん:2009/08/16(日) 16:55:36
数式処理ライブラリがあるなら教えて
660658 :2009/08/16(日) 17:19:14
>>659
しらね。
自分で探せよ。
661639:2009/08/16(日) 17:30:05
>>657
いえ、ただ出力するときに
std::cout << static_cast<double>(計算結果)
などいうバカなことはしないってことです。

ようするに出力時には精度指定で
std::stringもしくはconst char* const型
で結果が得られると良いのですが。
662デフォルトの名無しさん:2009/08/16(日) 17:49:04
>>691
最終的に有限の精度で返すなら誤差は存在することになりますね。
従って計算は、最終的に必要な精度が得られる有限の精度で(誤差のある)計算をすればよいことになります。
663デフォルトの名無しさん:2009/08/16(日) 17:52:37
>>662
ttp://gmplib.org でも使っとけ
664639:2009/08/16(日) 18:19:31
>>662
そうでも無いのです。
例えば
sin(acos(-1))
などです。
665デフォルトの名無しさん:2009/08/16(日) 18:24:51
だから数式処理システム使えよ
666デフォルトの名無しさん:2009/08/16(日) 18:36:18
>>665
ライブラリが欲しいのです。
数式処理システムだと使い物になりません。

あと、数式には文字式はありません。
667デフォルトの名無しさん:2009/08/16(日) 19:37:37
>>644
>>646
>>653
dクス

あぁ〜作ってみてぇ シンプレックス法か
668デフォルトの名無しさん:2009/08/16(日) 19:54:08
>>664
結果が0にならないね。有限の精度ならそうなるし、数値演算ではよくある話になる。
その辺はいろいろテクニックを使うんだ。たとえばsqrt(1.0-x*x)を使うとか。
数値演算の誤差について調べたほうがいい。

669デフォルトの名無しさん:2009/08/16(日) 20:32:39
そんなことは知った上で聞いてると思うが
670639:2009/08/16(日) 20:41:50
皆さんありがとうございました

紹介されたRealLibのスレのリンク先などを見て挑戦してみます。
671デフォルトの名無しさん:2009/08/17(月) 00:12:10
>>666
バックエンドで数式処理システム動かしておいて
そいつと通信するライブラリを自作したら?

いまいち何がやりたいのか伝わってこないんだけど
672デフォルトの名無しさん:2009/08/17(月) 00:13:44
>>671
お前は何でそこまでライブラリを嫌うんだ?

> バックエンドで数式処理システム動かしておいて
> そいつと通信するライブラリを自作したら?
まじめに言ってるの?
開発したことある?
673デフォルトの名無しさん:2009/08/17(月) 00:32:07
俺ライブラリのブラのあたりが嫌いだわ。 なんかブラブラ揺れてそうで。
674デフォルトの名無しさん:2009/08/17(月) 00:35:08
>>667
シンプレックス法は関係ないってw
675デフォルトの名無しさん:2009/08/17(月) 00:54:25
>>672
なぜ俺に食いつく?
この件に関しては初カキコなんだが
少し落ち着け
676デフォルトの名無しさん:2009/08/17(月) 07:50:28
もう本人いねーんじゃね。
677デフォルトの名無しさん:2009/08/17(月) 10:40:50
int型の変数hogeにビット演算を施したいのですが、
ビット演算は環境依存になってしまったりしますか?

2で除算したりするときはビット演算のが速いのではないかと思いまして。
(それともコンパイラの最適化があれば変わらないのでしょうか。)
678デフォルトの名無しさん:2009/08/17(月) 10:44:04
>>677
そんな判断ができないくらいなら、素直に2で割っておけ。
速度比較結果自体は最近見掛けたが、結論は出てないと思うぞ。
679677:2009/08/17(月) 10:46:58
>>678
レスありがとうございます。
ビット演算は実はやったことがないので、
もし速いのならこの機会に勉強してみようかなと思いまして。
でもint型なので負の数が混ざると複雑になりますかね。
680デフォルトの名無しさん:2009/08/17(月) 10:52:45
速さについての云々は、
まず実測してみたらってのがいつもの結論じゃね。
681677:2009/08/17(月) 10:56:18
>>680
やっぱ実測なんでしょうか?

まあビット演算は腰が重いので、速さを追求する時までは止めておきます。

ありがとうございました。
682デフォルトの名無しさん:2009/08/17(月) 10:58:39
VC++2008にて
const int b = 2;
c = a / b;
このソースが sar eax, 1になる件。

素人が思ってる以上にコンパイラはうまいことやってくれるよ。
683677:2009/08/17(月) 11:01:26
>>682
私よりコンパイラの方が頭が良さそうなので
コンパイラの最適化に頼る事とします。
684デフォルトの名無しさん:2009/08/17(月) 13:08:46
>>682
正確には
cdq
sub eax,edx
sar eax, 1
だな。
でないと負の数で端数を切り下げてしまう。
685デフォルトの名無しさん:2009/08/17(月) 13:13:31
アセンブラって全然分からないんですが
勉強しなきゃダメですかね。。。
686デフォルトの名無しさん:2009/08/17(月) 13:35:35
>>685
必要になるまでしなくていいと思うよ。
少なくとも、ビット演算がどうのこうのと言うよりも後でいいし、
そもそも他にやるべきことは幾らでもある。
687デフォルトの名無しさん:2009/08/17(月) 13:42:54
class base
class a : public base
class b: public base

func(base *pb){

if(typeid(pb) == typeid(a*){
aアクセス用のポインタ作成
}else{
bアクセス用のポインタ作成
}

オーライドされたそれぞれの関数にアクセス

}

ってことがやりたんだけどポインタ作成の部分がわかりません
こういう場合って同じ処理をif文の中に2回書かないと出来ないの?
688デフォルトの名無しさん:2009/08/17(月) 13:45:39
>>687
C++の初歩を勉強してください。
そうすれば、pb->func()で事が足りるかどうか判断できるでしょう。
689デフォルトの名無しさん:2009/08/17(月) 13:49:05
base の関数をvirtualにしたら出来た
690デフォルトの名無しさん:2009/08/18(火) 18:18:00

#undefしていようがいまいが
別のソースで同名のマクロがあったらどうしようも無いわけですので、
#undefすることの意義がいまいち分かりません。

#undefは心がけた方が良いのでしょうか?

691690:2009/08/18(火) 18:28:15
×別のソースで
○別のヘッダーで
692デフォルトの名無しさん:2009/08/18(火) 18:41:04
おまえはまだC++でマクロを使いたいのか。
693デフォルトの名無しさん:2009/08/18(火) 18:55:01
はい。
694690:2009/08/18(火) 19:13:22
>>692
「マクロって超便利!」
→「inline関数ってすげー!
templateもすげー!」
→「やっぱりマクロにしか出来ないこともあるじゃん。両立が大事だよな。」

今の私はこの心境なんです。
例えば似たような演算子を一斉に定義するときなど、
#define MACRO(..., op,...)
のようにしてopに演算子を入れたりとか
まあ色々使い道はあるじゃないですか。
695デフォルトの名無しさん:2009/08/18(火) 19:16:37
それはない。
696デフォルトの名無しさん:2009/08/18(火) 19:18:52
ほとんど重複してるけどちょっと違うコードとかマクロ使っちゃうよね
697デフォルトの名無しさん:2009/08/18(火) 19:23:13
確かにね。MFCやATLのメッセージマップなんかはマクロの恩恵なしには実現し得ないしね。
Effective C++でもまだまだ必要な部分もあると認めてはいる。

でもやっぱり危険だから、なるべく使わないに越したことはない。でも使いたい?
なら、他人のプログラム領域に踏み込まないように最大限の注意を払うべきだ。

自分の管理していないようなヘッダーに自作ヘボうんこマクロを混入させてしまうようなまねは厳に慎むべきで
自分の書くマクロは1翻訳単位内に限定し、ヘッダに宣言するような真似はやめにして
もしヘッダに書くなら必ず末尾で#undefして、あるいはヘッダの冒頭に
「このヘッダファイルは俺専用だからお前のプロジェクトでインクルードするなよ?絶対するなよ?」
と注意書きをしておくべき。
なんだったらヘッダファイル作らないというのも手だ。
俺の書いた関数が使いたい奴は手書きで宣言しろ、と。
698デフォルトの名無しさん:2009/08/18(火) 19:25:14
>>696
関数化するか、テンプレートを使うか、データ構造を見直せば、そんな気持ちの悪いことはしなくて済むと思う。
699デフォルトの名無しさん:2009/08/18(火) 19:28:31
C++2003でvariadic templateをやろうとしたらプリプロセッサ使ってパラメタ変えながら
再帰#includeとかする必要もありますしね
700デフォルトの名無しさん:2009/08/18(火) 19:50:20
再帰リスト作ればいいじゃん
701デフォルトの名無しさん:2009/08/18(火) 19:51:06
嫌だね
702デフォルトの名無しさん:2009/08/18(火) 19:52:52
まともなライブラリ(Boostとか)のコードを
お読みになれば、結構使われていることも
ご理解いただけると思いますよ。
コンパイラ毎にコードをかえるためとかそれだけのため
だけではありません。

703デフォルトの名無しさん:2009/08/18(火) 20:00:01
話し中すみません。

boost\date_time\int_adapter.hpp
等で

(::std::numeric_limits<int_type>::max)();
と書かれているのですが、これはどうしてこの様な記法になっているのでしょうか?
704デフォルトの名無しさん:2009/08/18(火) 20:00:44
より高級な機能がないから仕方なく使われてる、って以外に
マクロが重要になるケースって何かあるの?
705デフォルトの名無しさん:2009/08/18(火) 20:04:07
>>704
基本的には「仕方なく」使われていますよね。
仕方なくじゃない使い方としては
Boost.Preprocessor
に代表されるプリプロセッサメタプログラミングがあるのではないでしょうか?
706デフォルトの名無しさん:2009/08/18(火) 20:37:14
>>703
Boost本家スレで

773 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 20:59:38
BOOST_PREVENT_MACRO_SUBSTITUTION
っていうマクロはどういった用途で使う(or使われている)のでしょうか?
そもそも定義されている部分すら見つけられません。。。

774 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:14:07
boost/config/suffix.hpp にあるよ

775 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:15:44
>>773
prefix.hppで定義されてる
使い方は,たとえば某MSのヘッダファイルのように
#define min(a,b) ...
#define max(a,b) ...
と定義されてあった場合,
std::min(lhs, rhs) や std::max(lhs, rhs) や std::numeric::limits<hoge>::max()
などの min, max がマクロで置換されてしまうけど,
std::min BOOST_PREVENT_MACRO_SUBSTITUTION (lhs, rhs)
と呼び出せばこれを防げる.
つっても,冗長すぎるから普通は(std::min)(lhs, rhs)ってやるけどNE

776 名前:773 [sage] 投稿日:2009/07/28(火) 22:25:46
ありがとうございます。
理解出来ました!

てな会話が行われていたよ。
707703:2009/08/18(火) 20:44:37
>>706
ありがとうございます。
そうしますと、私がこれから定義するmaxテンプレートなども
全て(max)にした方が望ましいと言うことですよね。
ありがとうございました。

708デフォルトの名無しさん:2009/08/19(水) 00:10:40
>>531
http://www.boostpro.com/vault/index.php?&direction=0&order=&directory=Function%20Objects
ここのc_functionってのがおもしろい。
関数オブジェクトを関数へのポインタに変換してしまう代物。
ググれば日本語での解説も少しは見付かると思う。
709デフォルトの名無しさん:2009/08/19(水) 20:29:32
#include <vecter>

とやっているのですがerrorC1083が出てしまいます
VC++2008EEを仕様しています。
ちなみに#include <list.とかはエラーを出しません
710デフォルトの名無しさん:2009/08/19(水) 20:33:03
ごめんなさいvectorでした・・・
711デフォルトの名無しさん:2009/08/19(水) 20:35:48
(´ー`)
712デフォルトの名無しさん:2009/08/19(水) 22:14:51
ウヒヒ
713デフォルトの名無しさん:2009/08/20(木) 00:40:25
このスレ過疎ってるな。
714713:2009/08/20(木) 00:43:37
いや過疎ってなかったか。
見間違えた、
715デフォルトの名無しさん:2009/08/20(木) 00:44:10
過疎ってねーだろ
716デフォルトの名無しさん:2009/08/20(木) 00:49:12
int foo(double val)
{
if(
  val == 0.0
  /*その他重い判定処理*/
  )
  assert(false);

//処理
}
こんな関数があります。
この処理の部分で、valの値によってはfooを再帰呼び出ししたいことがあります。
その場合に単に普通に再帰呼び出しをしてもいいのですが、
再帰呼び出しでは無駄な処理(引数の範囲エラーチェックなど)を飛ばせるように
フラグ変数をboolで引数に持たせる事はしても問題ありませんか?
717716:2009/08/20(木) 00:51:58
つまり
int foo(double val, bool recursive_call = false)
{
if(
  !recursive_call
  &&
  val == 0.0
  /*その他重い判定処理*/
  )
  assert(false);

//処理
}
として、再帰時はfoo(val, true)とすることで無駄な処理を飛ばせるようにするのは
設計上まずいとかありますでしょうか?
718デフォルトの名無しさん:2009/08/20(木) 00:58:16
liboctaveについて質問なのですが
Matrix型などで各要素でlong double型を扱うことはできますか?

標準だとdouble型になってしまうのですが・・・
できればやり方も教えていただけるとうれしいです
719718:2009/08/20(木) 01:01:39
すいません

octaveのスレがあるようなのでそちらで聞くことにします
それでは失礼します
720デフォルトの名無しさん:2009/08/20(木) 01:10:34
>>717
無駄を飛ばすと言って無駄なフラグを足すのがアホっぽい。
721デフォルトの名無しさん:2009/08/20(木) 01:15:38
int foo(double val)
{
/*無駄な処理(引数の範囲エラーチェックなど)*/

foo_r(val);
}

int foo_r(double val)
{
if(
  val == 0.0
  /*その他重い判定処理*/
  )
  assert(false);

//処理
foo_r(val);
}
722716:2009/08/20(木) 01:19:16
>>720
処理の無駄は実行時間の無駄ですが
フラグ引数はコンパイル時間の無駄なわけですので
必ずしもおかしなことでは無いと思っております。
どうすればよろしいでしょうか?

>>721
確かに処理を分けるのがよさそうですね。
ありがとうございます。

723デフォルトの名無しさん:2009/08/20(木) 01:24:50
それ以前に重い処理を再帰すんな
設計を見直せ
724デフォルトの名無しさん:2009/08/20(木) 01:27:01
>>722
> 処理の無駄は実行時間の無駄ですが
> フラグ引数はコンパイル時間の無駄なわけですので

何を根拠にそんなこと言ってんの?
余計な引数があれば実行時間も食うしスタック消費量も増える。
725デフォルトの名無しさん:2009/08/20(木) 01:27:45
「増える」は言い過ぎた。
「増えてもおかしくない」だな。
726722:2009/08/20(木) 01:56:45
>>723
再帰と言えば再帰ですが、最大で2回までの再帰でして
これ以上軽量化は厳しい状況です。

>>725
> 処理の無駄は実行時間の無駄ですが
> フラグ引数はコンパイル時間の無駄なわけですので
は主として困る弊害をあげたものです。
bool引数が一つ増えたところで
if(
  val == 0.0
  /*その他重い判定処理*/
  )
  assert(false);
を上回るほど実行時間は食いませんしスタック消費量も増えないと
思うのですが。
というか確定的だと。
727デフォルトの名無しさん:2009/08/20(木) 07:50:58
>>726
最大2回までの再帰ってのがすでに何かおかしい気がする
関数の役割や関係を見なおしてみたら?
728デフォルトの名無しさん:2009/08/20(木) 08:09:32
>>726
そんなに判定が重いなら、判定部分とその後の処理部分を別の関数に
分ければいいだろう。
そういう風に分けたら、結局再帰なんて必要なくなると思うが。
729デフォルトの名無しさん:2009/08/20(木) 08:30:46
>>726
>> 処理の無駄は実行時間の無駄ですが
>> フラグ引数はコンパイル時間の無駄なわけですので
>は主として困る弊害をあげたものです。

引数にフラグを追加すると、コンパイル時間の無駄が「主として困る弊害」になるの?
すごいコンパイラを使ってるんだなぁ。
730デフォルトの名無しさん:2009/08/20(木) 09:25:33
本当にその無駄が処理のボトルネックになってるならそういう書き換えをやるのもアリだろうが、
そうでなければ全く意味が無いぞ
ちゃんとプロファイルとって調べたか?
731デフォルトの名無しさん:2009/08/20(木) 09:29:58
compile time debugger
compile time profiler
732デフォルトの名無しさん:2009/08/20(木) 12:12:13
class A{
int a;
...
void func(){sizeof(*this);}
};
class B : public A{};

Aの仮想関数func()内でsizeof(*this)したところ、サイズは128でした。
ところが、Bのfunc()での実行結果はクラスサイズが176なのに、Aと同じ128という結果でした。

Bのfunc()でも176というサイズを得るにはどのようにすれば良いでしょうか?
B側でfunc()を定義し直せば解決するのですが、できればAのfunc()のみをいじって解決したいと思います。
環境はVC++2005です。
733732:2009/08/20(木) 12:16:58
virtual void func(){sizeof(*this);}
でした。すみません。
734デフォルトの名無しさん:2009/08/20(木) 12:19:43
>>731
TMPやってると欲しかったりする
あるのかな
735デフォルトの名無しさん:2009/08/20(木) 12:42:32
>>732
こんな感じの醜いコードを書くくらいしかできないと思う

if (typeid(*this) == typeid(A)) {
return sizeof(A);
} else if (typeid(*this) == typeid(B)) {
return sizeof(B);
} else {
throw std::runtime_error();
}
736デフォルトの名無しさん:2009/08/20(木) 12:44:28
>>732
A の側では B の存在すら知らない状態だし、実行時型情報として sizeof を取り出す
標準的な方法も無いので、無理。
737デフォルトの名無しさん:2009/08/20(木) 13:01:49
こういうのはだめ?
クラスBなどAの派生クラスにも、継承元をAからAImplBase<B>へと変更するという修正を加える必要があるけど。
#include <iostream>
class A
{
char a[128];
public:
virtual std::size_t this_size() {return sizeof (A);};
};
template<typename T>
class AImplBase : public A
{
public:
virtual std::size_t this_size() {return sizeof (T);};
};
class B : public AImplBase<B>
{
char b[128];
};
int main()
{
B b;
std::cout << b.this_size() << std::endl;
}
738732:2009/08/20(木) 14:28:26
>735-737
回答ありがとうございます。
難しいようですね。勉強になりました。
>737さんの案を元にちょっと考えてみます。
739デフォルトの名無しさん:2009/08/20(木) 18:06:11
MFC勉強してるんだけど動画の再生ってできるのかな?
フレーム取り出して一枚一枚ペイントしてくしかない?
740デフォルトの名無しさん:2009/08/20(木) 18:12:59
>>739
Yes
741デフォルトの名無しさん:2009/08/20(木) 18:13:07
>>739
DirectShowで再生するのが一般的かと
DirectShowの質問は専用スレがあるからそっちでどうぞ
742デフォルトの名無しさん:2009/08/20(木) 19:31:24
動画再生するのが一番の目的じゃなくて
入力動画→処理→出力動画ってのを並べて同時再生とかできれば
こんなに変わったんだよって分かりやすいかなと思ったんですよね
とりあえずDirectShowについて少し調べてみますありがとうございます
743デフォルトの名無しさん:2009/08/20(木) 21:34:53
きっと泥沼になる
744デフォルトの名無しさん:2009/08/20(木) 21:39:45
処理がリアルタイムじゃないならそんなに難しくないけど・・・
745デフォルトの名無しさん:2009/08/20(木) 22:44:36
配置のニュアンスとしては

入力動画1 入力動画2
    合成動画

のように表示したいので
MFC上で動画表示したいなと思ったのですが無理そうなら画像列で表示しようと思います

746デフォルトの名無しさん:2009/08/21(金) 00:17:13
クラス設計に関しては割とましになってきたような気がするけど
クラス間の連携がどうもうまくいかない・・・
Mediatorとかためして見たんだけど、メディエータのメンバ関数が増えまくってしまう・・・
747デフォルトの名無しさん:2009/08/21(金) 07:32:07
http://codepad.org/7lYft1tr
bad_weak_ptrが出ちゃう。誰か助けて。
ライブラリ側にBaseクラスがあって、何も変更できない。
やりたいことは、Derivedクラスのメンバ関数のファンクタを作りたい。
(コールバック用のファンクタがほしい)
オブジェクトのライフタイムの関係上、
shared_from_this()の代わりにthisを渡したくない。
くそーわけわかめだぜ
748デフォルトの名無しさん:2009/08/21(金) 11:00:30
>>747
enable_shared_from_this が2つあるからダメなんじゃないの?
Base が変更できないなら Derived のほうは enable_shared_from_this つけなくて
いいでしょ。
749デフォルトの名無しさん:2009/08/21(金) 15:32:03
>>747こうすると、shared_ptrに捕まえられたファンクタがfに代入される。ただ、F()でF()のファンクタを作る意味がないけど。さらにfで保持すると参照カウンタが0にならなくなる。
ファンクタを作りたいなら、mainで bind(&Derived::F,d)とすればすむ筈。
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/function.hpp>
typedef boost::function< void () > func_t;
class Base
{
public:
void N(){};
};
class Derived :public Base,
public boost::enable_shared_from_this< Derived >
{
public:
void F()
{
f = boost::bind( &Derived::F, this->shared_from_this() );
};
func_t f;
};
int main()
{
boost::shared_ptr< Derived > d( new Derived );
d->F();
func_t x=boost::bind(&Derived::F,d);
return 0;
}
750デフォルトの名無しさん:2009/08/21(金) 20:11:27
>>748
>>749
レスさんすこ。

単純に、enable_shared_(ryだと、
BaseクラスにFメンバ関数がないから、コンパイルが通らないから、
Derivedでも継承させた。
今ぶち当たってる問題を単純なコードに落としただけだから、意味は考えないでくだしあw

>さらにfで保持すると参照カウンタが0にならなくなる。
メンバに自分自身を持たせるとダメなの?
よくわからん。確かにdtorが走ってなかった・・・
751デフォルトの名無しさん:2009/08/21(金) 21:00:57
>>747
Baseのenable_sahred_from_thisを活用する、つまりダウンキャストはだめ?
class Derived : public Base
{
public:
void F()
{
f = boost::bind( invoke_f, shared_from_this() );
};
static void invoke_f(boost::shared_ptr<Base> b)
{
boost::shared_polymorphic_downcast<Derived>(b)->F();
}
func_t f;
};
invoke_fはlambdaやbindで実装できるなら不要。
Baseに仮想関数がないなら、shared_polymorphic_downcastの代わりにshared_static_castを使えばいい。
あと、お前の例でも通用するか分からないが、安直にweak_ptrを使えば当然デストラクタも呼ばれるようになる。
void F()
{
boost::weak_ptr<Base> wp = shared_from_this();
f = boost::bind( invoke_f, wp );
};
static void invoke_f(boost::weak_ptr<Base> b)
{
if (boost::shared_ptr<Base> sp = b.lock())
{
boost::shared_static_cast<Derived>(sp)->F();
}
}
752デフォルトの名無しさん:2009/08/21(金) 21:40:42
>>750
fがDerivedをつかんでいる限りDerivedは開放されない。fがDeriviedを放すのはDerivedが開放されるときだから。
DerivedでFのファンクタを保持する必要性はほとんど無いと思われるので、その辺を検討しよう。
753デフォルトの名無しさん:2009/08/21(金) 23:51:26
質問があるのですが、
以下のソースのように、例外をいっさい投げれない関数内で例外を投げる処理を書いていまして、
プログラムが異常終了するのを期待しているのですが、VC++2008のコンパイラだと例外をキャッチしてしまいます。
これって理由ありますでしょうか? ちなみに他のコンパイラ(bcc32, g++)では期待通りに異常終了します。

#include <iostream>
using namespace std;

void test() throw()
{
throw 0;
}

int main()
{
try {
test();
}
catch(...)
{
cout << "test\n";
}

return 0;
}
754デフォルトの名無しさん:2009/08/22(土) 01:11:25
>>753
VC++の仕様。VC++は基本的に例外指定を無視する。
throw()も最適化のヒントになるだけ。
http://msdn.microsoft.com/en-us/library/wfa0edys.aspx
755デフォルトの名無しさん:2009/08/22(土) 02:01:59
C++ Coding Standards 第75項によると
「強制されない限り、自分の関数に例外仕様を書かないこと」と書いてありまっする。
756753:2009/08/22(土) 06:07:01
>>754, 755
どうもありがとうございました!
すっきりしました。
757デフォルトの名無しさん:2009/08/22(土) 12:00:03
>>753
以前vc9(betaだったかも)でいろいろ試したときは
throw()つきの関数内で例外を投げるコードをreleaseビルドしたバイナリを実行したときは異常終了したと思う
嘘だったらごめん
758デフォルトの名無しさん:2009/08/22(土) 14:09:05
>>755
その理由は?
その関数が投げる例外が正体不明になったら普通困らないかな?
759デフォルトの名無しさん:2009/08/22(土) 14:48:54
>>758
まずコストとして、
try-catchブロックが挿入される
でそれが最適化の妨害をする
違反した際はunexpected_handlerに飛ぶだけになって、
指定しなかった場合において得られる可能性のある例外の情報は失われる

得られるものは動的なチェックだけ、
それも例外仕様に違反したら精々「違反した」だけ言って落ちるだけの貧相なもの

備考として、
テンプレートが関わるとどんな例外が来るかは定義時点では決定不能なので
適切な例外のリストを作ることは無理

こういう性質のもので関数が投げる例外が明確になる?
使う価値あると思う?
760デフォルトの名無しさん:2009/08/22(土) 15:29:34
それってthrow()も駄目なのか?
まぁ別に大抵は書く必要も無いけどなthrow()なんて
761デフォルトの名無しさん:2009/08/22(土) 15:59:06
throw()だけは価値がある場合もあるかもしれない、俺は書かないけどね

と書いてある
762753:2009/08/22(土) 16:17:01
>>757
IDEを起動してreleaseで実行したところ異常終了しました。
違いがよく分かりませんが、debugにすると例外をキャッチしました。
763デフォルトの名無しさん:2009/08/22(土) 16:52:10
デフォルトだと例外仕様違反するとunexpected()->terminate()->abort()が呼ばれることになってるから
異常終了するのが正常
764デフォルトの名無しさん:2009/08/22(土) 18:15:05
throw(hoge)って書いても関数仕様変更すると広域に波及して変更が大変。労力に見合ったメリットってない気がする。
ただthrow()は例外安全を示すメリットはあると思う。
そういえばデストラクタにthrow()はなんで書かないんだろうか?
765デフォルトの名無しさん:2009/08/22(土) 18:29:39
アホなコンパイラがtryブロック挿入する可能性があるから
766デフォルトの名無しさん:2009/08/22(土) 19:09:44
例外投げない保証は有用なのにthrow()がクソすぎるから
C++0xでnoexceptというのを型システムに組み込もうぜという話がある
767デフォルトの名無しさん:2009/08/22(土) 19:15:56
allocator とか auto_ptr とか vector<bool> とか
どんどんゴミがたまっていきますね^^
768デフォルトの名無しさん:2009/08/22(土) 19:54:45
おまえallocatorとauto_ptrなめんなよ
769デフォルトの名無しさん:2009/08/22(土) 20:07:24
まあauto_ptrはunique_ptrに移行してdeprecatedの予定ですけどね
770デフォルトの名無しさん:2009/08/22(土) 20:12:35
だがゴミではない。現行の規格では重要なものだ。
771デフォルトの名無しさん:2009/08/22(土) 20:22:29
同情の余地がないvector<bool>さんパネェ
772デフォルトの名無しさん:2009/08/22(土) 20:32:02
おまえら予約語なのにスルーされてるexportさんに謝れ
773デフォルトの名無しさん:2009/08/22(土) 20:35:31
export は普通に関数名とかに使いたいときがあって困るな。
キーワードは変に短縮されてるほうがいいんじゃないかとすら思うよ。
int とか const とか、まず自分で使う気にはならん。
774デフォルトの名無しさん:2009/08/22(土) 20:38:16
まともな実装がないexportを何故標準に入れたのか
標準化委員会は狂っているとしか思えない
775デフォルトの名無しさん:2009/08/22(土) 20:39:05
Comeauなめんな
776デフォルトの名無しさん:2009/08/22(土) 22:00:12
>>747
コールバックのための関数オブジェクトはこれ Derived オブジェクトの外に配るんですよね?
コールバックのための関数オブジェクトをメンバとして保持せずに
外に配るときに毎回作る + shared_ptr<Base> を downcast したものを持たせる,
で良いのでは?
777デフォルトの名無しさん:2009/08/22(土) 23:56:22
>>774
>435-436

時々で良いから、Comeauの事を思い出してあげて下さい
778デフォルトの名無しさん:2009/08/23(日) 00:15:02
>>766
確かに、constメンバ関数と同じように例外安全性の指定ができればいいなーと思ったことはある
C++ Sourceにテンプレートを使って実現する技法が投稿されてたけど、
あれを実践するのは正直ムリだと思った
779デフォルトの名無しさん:2009/08/23(日) 00:34:50
export の実装ってそんなに難しいかなあ。
オブジェクトファイルにソースコード埋め込んで、リンカからコンパイラ呼べば
済むと思うんだけど。
780デフォルトの名無しさん:2009/08/23(日) 00:37:50
>>779
よく分からんがそのお前の案とやらで
gccでexportが実装できたら
このスレの神プログラマとして
あがめられるな。

すくなくともテンプレには確実に入る。
781デフォルトの名無しさん:2009/08/23(日) 01:14:34
Comeauが3人年かけてexport実装して「もうやだ実装したくない」って禿に泣きついた話が
D&Eに載ってるから読むがいい
782デフォルトの名無しさん:2009/08/23(日) 02:07:50
その話に関してはどちらかというと Exceptional C++ Style を紹介したほうが良いような?
783デフォルトの名無しさん:2009/08/23(日) 03:08:52
boost::functionの型引数について教えてください。
boost::function<int (int)>と宣言したときに、
どうやってシグネチャから戻り値の型と引数の型を取り出しているのでしょうか?
784デフォルトの名無しさん:2009/08/23(日) 03:11:35
template<typename T>
class function<T()>{/******/};
template<typename T, typename U>
class function<T(U)>{/******/};
template<typename T, typename U, typename V>
class function<T(U,V)>{/******/};
;
とかやってんじゃないの
知らないけど
785デフォルトの名無しさん:2009/08/23(日) 03:38:58
全力でソース追いかければ何とかなるんじゃね、知らんけど
786デフォルトの名無しさん:2009/08/23(日) 07:35:23
プログラミングエキスパートの皆さんの力が必要です。
どうかどうかツールを作っていただけないでしょうか。
もはや風前の灯状態のスレを救ってやってください。


yahooきっずで先生1位にして教育委員泣かそうぜwww
http://yutori7.2ch.net/test/read.cgi/news4vip/1250954051/
787デフォルトの名無しさん:2009/08/23(日) 07:37:58
  H S P で や れ
788デフォルトの名無しさん:2009/08/23(日) 07:41:18
本気で宣伝するならまとめページ作ってそこのリンク張るようにしてくれ
vipのスレのリンクなんか張ってもすぐdat落ちして見れなくなってしまうじゃないか
本当に見る人のこと考えてないんだな
789デフォルトの名無しさん:2009/08/23(日) 11:33:48
なんでさりげなく適切なアドバイスしてんだよw

>>783
>>784 をプリプロセッサで展開
790デフォルトの名無しさん:2009/08/23(日) 11:49:15
valarray<T>::apply(T func(T))が,ふつうの関数しか受け付けないのですが,
関数オブジェクトを関数へのポインタに変換する関数って標準で用意されていますか?
つまりptr_funの逆関数はあるでしょうか?という質問です.
(自分で書けば一行ですが,メソッドが増えるのはよくないでしょう)

唐突ですが,よろしくお願いします.
791デフォルトの名無しさん:2009/08/23(日) 13:25:24
関数オブジェクトは関数の形をしてはいるものの、
それ自身のアドレスは持ってないから逆関数なんてないよ
792デフォルトの名無しさん:2009/08/23(日) 14:06:41
なるほど.わかりやすい説明ありがとうございます.
793デフォルトの名無しさん:2009/08/23(日) 15:47:50
あれ、なんか調子悪い?
794デフォルトの名無しさん:2009/08/23(日) 15:55:34
c_functionとかいうのがあるんじゃなかったっけ
使ったことないけど
795デフォルトの名無しさん:2009/08/23(日) 16:17:05
なるほど.これですね.
ttp://d.hatena.ne.jp/faith_and_brave/20090107/1231316933
まさに探していたものです.ありがとうございます!

が,Boostがないところで困りそうなのでやめときます.
valarray<T>もSTLライクな実装を加えてくれたらいいんだけど,
たぶん遅くなるのがイヤなんでしょうね.
796デフォルトの名無しさん:2009/08/23(日) 16:22:50
うわっ.っていうかBoost VaultはBoostですらないんですね.
みなさん,ありがとうございました.
797デフォルトの名無しさん:2009/08/23(日) 17:41:03
>>796
Boost File Vault
Boostライブラリには入っていないけれど、その叩き台としたい、 というようなソースが転がっています。宝の山。^^

ってk.inaba氏が言ってた。
798デフォルトの名無しさん:2009/08/23(日) 18:39:58
valarrayを捨てる手もありそうだが
799デフォルトの名無しさん:2009/08/23(日) 19:07:21
>>790
valarray<T> y = x.apply(functor);としたいとして、
代わりにこれで我慢するのはだめ?
valarray<T> y(x.size());
std::transform(&x[0], &x[0] + x.size(), &y[0], functor);
valarrayも要素が連続している保証があるからこんなことして平気なはず。
800デフォルトの名無しさん:2009/08/23(日) 20:45:54
void関数ではその処理を終えて外のスコープに処理を戻したい場合は
return;
を記述しても良いということでしたが、
コンストラクタでも同様にreturn;を記述しても
良いのでしょうか?
記述した際にはそれより後ろにある処理は実行されないと期待してよろしいですか?

g++ではこの通りの動作でしたが、これがC++の仕様なのでしょうか。
801デフォルトの名無しさん:2009/08/23(日) 22:20:28
>800
大丈夫です.
蛇足ながら対応するであろう規格の文言は (6.6.3/2), (12.1/12)
802デフォルトの名無しさん:2009/08/23(日) 23:33:21
795があぼんなんだがまたfaith and braveでも貼ったのか?
いい加減にしろ。
803デフォルトの名無しさん:2009/08/24(月) 02:10:07
あぼんしてるなら触れるなよ
アホなのか?
804デフォルトの名無しさん:2009/08/24(月) 04:28:47
何のためのあぼーんなんだよなw
805デフォルトの名無しさん:2009/08/24(月) 06:56:27
何でFaith and Braveを貼っちゃいけないんですか?
806デフォルトの名無しさん:2009/08/24(月) 06:59:04
あぼーんであれスルーであれ、「お前の言葉は俺に効いてない」とアピールしたいあまり、
それを自分から言い出して、効いてるのがバレバレになる奴はたまに見かける。

たぶん居留守を使う時なんかも、居ないとアピールしたい一心で
ドアの向こうの人に「いま居ません」とか言っちゃうんだろう。
807デフォルトの名無しさん:2009/08/24(月) 07:03:18
「レス番飛んでるんだけど、何きたの? ねぇ、何きたの?」

「お前、NGに入れたから」
「あ、そう。でさぁ(ry」
「NGに入れたっつってんだろぉぉぉぉぉ!」
808デフォルトの名無しさん:2009/08/24(月) 07:21:54
言葉にしない間しか成立しない主張を、言葉にすることで殺しちゃうんだよな。
「誰もお前にレスする奴なんかいねえよ」とか。

自分の言葉で直接相手を悔しがらせたい衝動、みたいなもんが低脳にはあって、
それに勝てずに自爆してしまうんだろうか。
809デフォルトの名無しさん:2009/08/24(月) 10:43:00
あ…あんたのことなんて、何とも思ってないんだからねっ!

ってパターンも。
810デフォルトの名無しさん:2009/08/24(月) 12:23:02
あるあるwww
811デフォルトの名無しさん:2009/08/24(月) 17:06:45
すみません.レス遅れました.

>>797
自分で適当にソースを改竄すればいいってことですね.

>>798
valarray<bool> って嬉しくないですか?
(vector<bool>のかわりに・・・)

>>799
コピーコストに目をつぶって,これでいこうと思います.

>>802-6
まったく議論が理解できないのですが,気分を害したのならすみません.
c_function って検索してもあまり出てこなかったので便利かと思って
リンク貼りました.他意はありません.

正直,あまり回答には期待していなかったのですが,
色々アイディアをもらえて感激しています.ありがとうございました.
812デフォルトの名無しさん:2009/08/24(月) 21:22:59
> 正直,あまり回答には期待していなかったのですが,
> 色々アイディアをもらえて感激しています.ありがとうございました.

この一言はどうして書いちゃったんだ。
 「お前らには大して期待してなかったけど
  いないよりは役に立ったな」
って意味にしかとれないんだけど。
実生活でこれいったらもう目も当てられない
ようなことになるぞ。
813デフォルトの名無しさん:2009/08/24(月) 21:24:35
それはお前の読解力がおかしいんじゃないのか
814デフォルトの名無しさん:2009/08/24(月) 21:27:44
>>813
いやおかしくないだろ。
別に悪意を持って読んだわけじゃないけど、
そう思った人は俺以外にもいるだろ。
815デフォルトの名無しさん:2009/08/24(月) 21:35:51
>>813
お前の読解力だと
> あまり回答には期待していなかった
これは「誰の回答に期待してなかった」んだと思う?
816デフォルトの名無しさん:2009/08/24(月) 21:44:25
書き方が悪いのは確かだな。
あまり反応してもらえるとは思わなかったが、と書くべき所。
817デフォルトの名無しさん:2009/08/24(月) 21:48:21
> あまり回答が付くことは期待していなかった
ならいいけど、
> あまり回答には期待していなかった=ろくな回答は無いと思っていた
と取られるとね。

まあ2chだから当然な予測かもしれないけど、
わざわざ書かなくても良かったかもね。

でもそこは噛みつく程でもない気がするが。
818デフォルトの名無しさん:2009/08/24(月) 22:37:42
むしろ>>812みたいなことをいちいち言っちゃう人のほうが
実社会では目も当てられない。

最近キレる人が増えたのは、
無礼な人が増えたよりも
他人の無礼をまったく許容できない赤ん坊のような糞人間が増えたからだって
どっかの新聞に書かれてたなぁ。
819デフォルトの名無しさん:2009/08/25(火) 00:07:27
で?
820デフォルトの名無しさん:2009/08/25(火) 01:29:40
平謝りです.ごめんなさい.
> 実生活でこれいったらもう目も当てられない
この通りですね,弁解の余地はありません.
人によって2ちゃんねるとの付き合い方は違うのに,
それを無視した迂闊な発言でした.

感謝を伝えたかったのに・・・(涙)
821デフォルトの名無しさん:2009/08/25(火) 01:56:50
>人によって2ちゃんねるとの付き合い方は違うのに,
>それを無視した迂闊な発言でした.

別にダメじゃないが何というか、一言多いよね。
再帰的に迂闊。
822デフォルトの名無しさん:2009/08/25(火) 02:27:13
再帰的わろたうぇw
823デフォルトの名無しさん:2009/08/25(火) 03:22:47
要するに、回答内容に期待してなかったんじゃなくて、回答されることを期待して
なかったんだろ?
824デフォルトの名無しさん:2009/08/25(火) 07:31:11
>>821
そこ、俺も同じこと思った。
「俺の2chとの付き合い方を、迂闊どころか当然の顔をして無視し、踏みにじるお前ら」
って言いたいのかなと。

ある要素xを、自分より相手のほうがより強く持っていると判断した時に、
「xを持つことは悪いこと」という概念を大仰に押し立てて「xを持っててすみません」と平身低頭、
実はそういう皮肉攻撃、っていうデザインパターン。
825デフォルトの名無しさん:2009/08/25(火) 08:01:05
べつにいいんじゃね
826デフォルトの名無しさん:2009/08/25(火) 08:23:48
ぶっちゃけ何をそこまで絡んでるのか分からん
827デフォルトの名無しさん:2009/08/25(火) 08:55:56
世の中うぜえ奴ばっか
828デフォルトの名無しさん:2009/08/25(火) 08:57:50
ケンカ売る気なら最初から本気でかかってこいや
この偽善者め

とまあ、そんなことではないかと
829デフォルトの名無しさん:2009/08/25(火) 10:43:38
普通の
#ifndef HOGE
#define HOGE
本文
#endif
というインクルードガードがあるにも関わらず、
同時に
「コンパイラの種類がVCであるか、
もしそうならVCのバージョンを調べて
#pragma once」
としているものがあるのですが
これは意味があるのでしょうか?
どうして前者のインクルードガードだけでは不足なのでしょうか?
830デフォルトの名無しさん:2009/08/25(火) 10:59:10
>>829
微妙。

http://pc12.2ch.net/test/read.cgi/tech/1186262298/316
316 :306:2009/02/14(土) 04:46:01
>>313
マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを
読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が
考えられる。

そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの
コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。

http://en.wikipedia.org/wiki/Pragma_once
831デフォルトの名無しさん:2009/08/25(火) 11:04:55
>>830
なるほど、
昔の冗長インクルードガードと同じですか。


ありがとうございます。
832デフォルトの名無しさん:2009/08/25(火) 11:19:17
尚、pragma onceの使える環境であればインクルードガードを省略できると言う考えは間違いである。
833デフォルトの名無しさん:2009/08/25(火) 11:28:03
え?
#pragma once を使える環境でインクルードガード書かないと何かマズイの?
834デフォルトの名無しさん:2009/08/25(火) 11:31:28
シンボリックリンクとかの関係でファイルの同一性がどうのこうのって問題?
835デフォルトの名無しさん:2009/08/25(火) 11:35:23
そりゃ昔のバギーな実装の問題だろ。
836デフォルトの名無しさん:2009/08/25(火) 11:58:05
滅多なことでは問題にならんからなぁ。 gcc3.4で解決されたって話もあるし。
それにVCとgccとで使えるから、ふつーのひとはもう何も考えずに#pragma onceしちゃっていいんじゃないかなぁ。
837デフォルトの名無しさん:2009/08/25(火) 12:32:29
同じ内容の別のファイルをインクルードするときにバッティングが発生するのを防止することができない。
インクルードガードなら、それができる。その点を無視していいのなら、prgama onceで充分。
838デフォルトの名無しさん:2009/08/25(火) 12:48:41
#pragma onceの問題点は非標準であるという一点に尽きる。
一々各コンパイラが対応しているかを調べるのは面倒。

ちなみに、上で#pragma onceの時のみに最適化される可能性があると書いてあるが
GCCではインクルードガードを使った場合に同様の最適化が効く。
839デフォルトの名無しさん:2009/08/25(火) 14:43:19
VC++2005なんだがDLLを配布したいんだけど
libとh同封しとけばVC6とかVC++2008とかの人でも使えるんかな?
840デフォルトの名無しさん:2009/08/25(火) 14:52:59
VC8で#pragma onceの効果があるかどうか調べたけど効果はあったよ
841デフォルトの名無しさん:2009/08/25(火) 17:14:58
毎回インクルードガード書くより#pragma onceに対応してるか調べた方が結局楽、と
いう考えもある
インクルードガードなら枯れてるから安心して使える、という考えもある
インクルードガードは記述時にヒューマンエラーが起きやすいから嫌だ、という考えも
ある
#pragma onceはコードではなくファイルに依存するので、シンボリックリンクなどで
別のパスからインクルードされた時の問題などがあって嫌だ、という考えもある

まぁ色々それぞれだな
#pragma onceにユニークな識別名を付けられるようなのが最初からあれば最強だった
んだろうが
ちなみに#pragma onceは対応している処理系は結構多い
842デフォルトの名無しさん:2009/08/25(火) 17:31:40
出来るだけ多くの環境でも使えるようにしたいもののヘッダは
インクルードガードをかけるしかない。
たとえ#pragma once の利点を十分承知し、対応する処理系が増えているとしても。

そして、その利点を生かすためには、#ifdefで切り分けて#pragma onceも併用するという
一見アホらしいコードを書くしかない。

例えば、MSのWin32処理系では、全て#pragma onceが使用可能だが
PSDK等のヘッダファイルは、他の処理系でも利用可能にするために
インクルードガードも併用されている。
843デフォルトの名無しさん:2009/08/25(火) 18:18:21
仮にビルドが通らない処理系があったとして、
それがpragma onceのせいってのは、ありえないと思うけどな。
それ以前のクリティカルな要因で止まるだろ常考。
844デフォルトの名無しさん:2009/08/25(火) 22:10:39
インクルードガードと#pragma onceが両方とも有効な状態って問題ある?
845デフォルトの名無しさん:2009/08/25(火) 22:26:39
インクルードガードはインクルードを読み込む順番が固定できるから、循環参照を防げるメリットがあるね。
846デフォルトの名無しさん:2009/08/25(火) 22:27:08
インクルードガードを矛、#pragma onceを盾だとして、
両方有効な状態だと、両手が砕けて紫龍が負ける
そんぐらいです。
847デフォルトの名無しさん:2009/08/25(火) 22:31:11
別に両方書いても、片方が仕事してもう片方が潰されるだけのこと
ライブラリ屋は「VC++なら#pragma onceが先に掛かるようにした方が軽いな」とか
有効な順番を意識するが、別にしなくてもコンパイルが僅かに遅いとかその程度
848デフォルトの名無しさん:2009/08/25(火) 22:35:54
>>844
問題ない。実際Boostの一部のヘッダではVCの場合に併用している。
>>842によるとWin32 APIのヘッダでも同様のことをやってるようだし。
849デフォルトの名無しさん:2009/08/25(火) 22:42:13
仕様として #include と書けば何度でもファイルを開いて展開するんだろうけど
その仕様が役に立つことってあるの?
850デフォルトの名無しさん:2009/08/25(火) 22:50:48
>>849 assert.h を #define NDEBUG して #include したり #under NDEBUG して #include したり。
851デフォルトの名無しさん:2009/08/25(火) 22:51:29
Boost.Preprocessorを使った再帰#includeでVariadic Template
みたいなことをするテクニックとか…
852デフォルトの名無しさん:2009/08/25(火) 23:01:04
#ifndef HOGE_H
#define HOGE_H
#if defined(_MSC_VER) && defined(__GNUC__) && ...
#pragma once
#endif

本文

#endif

結局こうするのがベストなのか
めんどくせーな
853デフォルトの名無しさん:2009/08/25(火) 23:04:36
>>852
それじゃどんなコンパイラでも#pragma onceが使われないぞw
854デフォルトの名無しさん:2009/08/25(火) 23:17:23
いや、
VC++でコンパイルする時に -D__GNUC__ -D__BORLANDC__ をオプションにつける
GCCでコンパイルする時に -D_MSC_VER -D__BORLANDC__ をオプションにつける
という技を駆使しろ、という>>852のお告げ。
855デフォルトの名無しさん:2009/08/25(火) 23:30:44
>>852
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
これだけでいい。併用は単にコンパイル時間の高速化の意味しか無いから、違いの出る
VC++だけ書けば十分。

>>853
この書き方でちゃんと使われる。
ちなみに>>847は半分間違い。>>852で両方とも有効に働く。
856デフォルトの名無しさん:2009/08/25(火) 23:31:13
凄いな神の技だ・・
857デフォルトの名無しさん:2009/08/25(火) 23:38:44
>>855
> この書き方でちゃんと使われる。
アホ? &&の意味も分からないのか?
858デフォルトの名無しさん:2009/08/26(水) 00:43:12
>>855
使われねぇよw
859デフォルトの名無しさん:2009/08/26(水) 05:24:50
>>855
#pragma once は、VC++4.2(_MSC_VER=1020)からサポートされたと考えていい?
860デフォルトの名無しさん:2009/08/26(水) 05:47:27
1000にしてるライブラリもある
1020にしてるライブラリもある
861デフォルトの名無しさん:2009/08/26(水) 21:36:23
STL でつまづいています。

http://codepad.org/KNe3UsXV

lst1.merge(lst2) でマージだけでなくソートされてしまうのはどうしてでしょうか?
862デフォルトの名無しさん:2009/08/26(水) 21:41:10
なぜならmergeというのはマージソートでいうところのマージを行う関数だからです
863デフォルトの名無しさん:2009/08/26(水) 22:12:32
こじつけ気味に言うとjoinでなくmergeだから。プログラム関連ではだいたい以下のニュアンス。
join:二つのものをつなげて一つにする。繋ぎ目で切り離せば元の二つに戻る。
merge:二つのものを混ぜて一つにする。元の二つに戻すには構成要素を一つずつより分ける必要がある。
864デフォルトの名無しさん:2009/08/26(水) 23:01:23
>>861
しっかりドキュメント読め。
lst1.merge(lst2)はソートする。O(n)
lst1.splice(lst2)はソートしない。O(1)

>>863も書いているけど、mergeはどちらかと言うと順序関係を保存して結合する
という意味合いが強いね。順序関係を作るためにソートが必要になるということ
だと思う。
865861:2009/08/26(水) 23:11:55
ご教唆ありがとうございました。まだひとり立ちしてドキュメントが読めるような者ではありませんが、すこしずつ学んで生きたいと思います。
866デフォルトの名無しさん:2009/08/26(水) 23:12:32
教唆
867デフォルトの名無しさん:2009/08/26(水) 23:17:00
これは斬新だ…
868デフォルトの名無しさん:2009/08/26(水) 23:22:50
この犯罪者どもが。
869デフォルトの名無しさん:2009/08/26(水) 23:25:02
なんつーかさ、
背伸びして、あたかも難しいことを知っているかのように振舞いたいんだろうね。
日本語にしても、プログラミング言語にしても。
870デフォルトの名無しさん:2009/08/26(水) 23:28:29
難しいことを難しく言うことは誰でもできる
難しいことをわかりやすく言うことは非常に難しい
871デフォルトの名無しさん:2009/08/27(木) 00:23:56
mergeは事前にsortされてないと鼻から悪魔じゃないかい
872デフォルトの名無しさん:2009/08/27(木) 04:40:44
親方ー鼻から女子中学生が
873デフォルトの名無しさん:2009/08/27(木) 05:14:25
23.2.2.4 list operations p22
> void merge(list<T,Allocator>& x);
> template <class Compare> void merge(list<T,Allocator>& x, Compare comp);
> Requires: comp defines a strict weak ordering (25.3), and the list and the argument list
> are both sorted according to this ordering.
両方ソート済みじゃないと未定義動作になるね。

>>864 はどのドキュメントを読んだんだろう?
874デフォルトの名無しさん:2009/08/27(木) 06:16:42
>>873
それは当然。リストがソート済みじゃなけりゃO(N)でmergeできんぞ。

別に>>864は間違ったこと言ってないだろ。そもそもcodepadのコードでは
lst1, lst2ともにソート済みなんだから。
875デフォルトの名無しさん:2009/08/27(木) 16:04:25
     /: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ    ___
     /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、  /     ヽ
    /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/  リ!: ::/ノ  l`ヽl !: : |: : : :l: :l: リ / そ そ お \
   /: : ヽヾ/: : l/::l |/|||llllヾ,、  / |: :/ , -==、 l\:::|: : : :|i: | /   う う  前  |
.   /: : : //ヾ ; :|!: イ、||ll|||||::||    ノノ  イ|||||||ヾ、 |: ::|!: : イ: ::|/   な 思 が
   /: : ://: : :ヽソ::ヽl |{ i||ll"ン    ´   i| l|||l"l `|: /|: : /'!/l     ん う
 ∠: : : ~: : : : : : : :丶ゝ-―-      ,  ー=z_ソ   |/ ハメ;, :: ::|.   だ ん
   i|::ハ: : : : : : : : : : : 、ヘヘヘヘ     、  ヘヘヘヘヘ /: : : : : \,|.   ろ な
   |!l |: : : : : : : : :、: ::\    、-―-,      / : : :丶;,,;,:ミヽ   う  ら
     丶: :ハ、lヽ: :ヽ: : ::\__  `~ "      /: : ト; lヽ)   ゝ
       レ `| `、l`、>=ニ´        ,  _´ : :} `   /
         ,,、r"^~´"''''"t-`r、 _  -、 ´ヽノ \ノ   /    お ・
       ,;'~  _r-- 、__     ~f、_>'、_         |  で  前 ・
      f~  ,;"     ~"t___    ミ、 ^'t         |  は  ん ・
      ,"  ,~         ヾ~'-、__ ミ_ξ丶     |  な  中 ・
     ;'  ,イ ..          ヽ_   ヾ、0ヽ丶    l         /
     ( ;":: |: :: ..          .`,   ヾ 丶 !    \____/
     ;;;; :: 入:: :: ::      l`ー-、   )l   ヾ 丶
     "~、ソ:: :い:: :     \_  ノ ,    ヾ 丶
876デフォルトの名無しさん:2009/08/27(木) 17:05:18
超低レベルな質問ですが、
unsigned char x=2;
std::cout << x << std::endl;

とすると、2という数字ではなく、文字化けした文字が表示されるのですが、
これはなぜですか?
どうすれば回避できるのでしょうか。
877デフォルトの名無しさん:2009/08/27(木) 17:12:20
std::cout << (int)x << std::endl;
878デフォルトの名無しさん:2009/08/27(木) 17:12:39
charは文字型なので、文字コード2の文字を表示した結果であろう
2という文字を表示したいのなら 2 ではなく '2' と書くべき
文字ではなく数値として扱いたいのなら char ではなく int を使うべき
879デフォルトの名無しさん:2009/08/27(木) 17:18:20
std::cout << (int)x << std::endl;
880デフォルトの名無しさん:2009/08/27(木) 17:36:46
int(x)
881デフォルトの名無しさん:2009/08/27(木) 19:17:57
コード書いて確かめたわけでもなんでもないんだけどこのスレ的には
static_cast<int>(x)じゃないの?
882デフォルトの名無しさん:2009/08/27(木) 19:31:40
int(x)はstatic_cast<int>(x)と等価。よってint(x)が良い。
883デフォルトの名無しさん:2009/08/27(木) 20:11:52
int(x)はstatic_cast<int>(x)と等価。よってどちらが良いかは宗教論争。
884デフォルトの名無しさん:2009/08/27(木) 20:16:36
また基地外か
885デフォルトの名無しさん:2009/08/27(木) 20:18:34
xがint*やconst intだとstatic_cast<int>(x)の方が安全
だがそんなことよりタイプ量が少ないことの方が大事なのでint(x)を使うべき
886デフォルトの名無しさん:2009/08/27(木) 20:39:03
何のためのキャストかを明示するためにstatic_cast<int>が良い。
さらに言えば、boost::numeric_cast<int>が萌える。
887881:2009/08/27(木) 20:52:56
別に宗教戦争引き起こすために書いたんじゃないんだ
C++スレ的にはそうなんじゃないかなぁと思っただけ

俺はsatatic_castを使う派だけど、タイプ量少ないしint()で十分だと思う
888デフォルトの名無しさん:2009/08/27(木) 20:55:55
>>885
> xがint*やconst intだとstatic_cast<int>(x)の方が安全
両者は等価なんだが、どこがどう安全なんだ?

>>886
> 何のためのキャストかを明示するためにstatic_cast<int>が良い。
勘違いするなよ。何のためのキャストか分からないのは(int)xであって
int(x)は明示している。
889デフォルトの名無しさん:2009/08/27(木) 20:59:07
885は(int)xとの区別が出来ないんだよきっと
890デフォルトの名無しさん:2009/08/27(木) 21:09:00
>>888
static_castはポインタ-整数間の変換やconst外しは出来ない
(int)xとint(x)はできる
891デフォルトの名無しさん:2009/08/27(木) 21:10:59
>>889
(int)xとint(x)はまったく同じだぞ
892デフォルトの名無しさん:2009/08/27(木) 21:16:14
自分ならboost::implicit_cast、次点でstatic_castだな。
893デフォルトの名無しさん:2009/08/27(木) 21:18:34
>>890
const外しってどうやるの?
894デフォルトの名無しさん:2009/08/27(木) 21:18:56
>>890
嘘乙。

> static_castはポインタ-整数間の変換やconst外しは出来ない
> (int)xとint(x)はできる
両者ともconst外しは出来るし、ポインタからの変換はどちらも無理。
895デフォルトの名無しさん:2009/08/27(木) 21:39:14
const外しはconst_castだろ

>>894
(int)xはstatic_castができない状況ではreinterpret_castとして働くことになってるからできるよ
嘘乙
896デフォルトの名無しさん:2009/08/27(木) 21:43:46
>>895
両者ってのはint(x)とstatic_cast<int>(x)のことな。
897デフォルトの名無しさん:2009/08/27(木) 22:01:38
(int)xとint(x)はまったく同じだってば
898デフォルトの名無しさん:2009/08/27(木) 22:06:26
まず見た目からして違う
899デフォルトの名無しさん:2009/08/27(木) 22:14:29
さすがIT土方ばかりなのか、馬鹿ばっかだなw
禿本の6.2.8にint(x)とstatic_cast<int>(x)が等価であることが書いてあるから
しっかり読んでおけ
900デフォルトの名無しさん:2009/08/27(木) 22:14:54
はい規格読もうね
5.2.3 Explicit type conversion (functional notation)
1 A simple-type-specifier followed by a parenthesized expression-list
constructs a value of the specified type given the expression list.
If the expression list is a single expression, the type conversion expression
is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).
(後略)

int(x)は(int)xとequivalentです
901デフォルトの名無しさん:2009/08/27(木) 22:20:18
>>899
君こそ規格書の5.4読んどきたまえ
902デフォルトの名無しさん:2009/08/27(木) 22:49:44
そして忘れ去られる>>876
903デフォルトの名無しさん:2009/08/27(木) 22:52:36
ところでint(x)でどうやってconst外しやるんだ?
誰か教えてくれ
904デフォルトの名無しさん:2009/08/27(木) 22:53:51
const intで渡された値がintになるぜー、とか頭悪いこと考えてる可能性も
905デフォルトの名無しさん:2009/08/27(木) 23:00:03
結局何が正しいんだ
906デフォルトの名無しさん:2009/08/27(木) 23:02:10
C++スレなんだからstatic_cast,const_castを使うのがいいと思うよん個人的にはね
907デフォルトの名無しさん:2009/08/27(木) 23:13:18
とはいえconst_cast<int*>(static_cast<const int*>(hoge))なんて書くのは冗長だし読みにくいし
コンパイルや実行速度遅くなりかねんし安全性が上がるわけでもない
C形式の方が多くの場面で優れている
908デフォルトの名無しさん:2009/08/27(木) 23:14:24
いいからもう寝ろよ
909デフォルトの名無しさん:2009/08/27(木) 23:14:37
そんな書き方が必要になるコードを書く奴ならCの方がそりゃ合ってるだろうな
910デフォルトの名無しさん:2009/08/27(木) 23:16:30
const char*をint*にしたいってくらいならC++だって普通にあるだろ
911デフォルトの名無しさん:2009/08/27(木) 23:21:17
>>907
実行速度が遅くされるのは dynamic_cast だけでしょう。
912デフォルトの名無しさん:2009/08/27(木) 23:25:33
最適化が糞だったらstatic_castとconst_castが別々の命令になっちゃうかもしれない
大した差ではないかもしれないがC形式で一気に変換して防げるならその方がいい
913デフォルトの名無しさん:2009/08/27(木) 23:28:18
>>910
まああるな。
でも、どうせクラスで封じ込めるから、
たった1度だけだし907みたいに書いてやるかという気分になる。
普段使っているのも、VCとかg++とか最適化もそんなにヘボじゃないコンパイラばかりだし。
914デフォルトの名無しさん:2009/08/27(木) 23:47:45
C++みたいに道具が揃ってるのに、そんな変換を頻繁に書かなきゃならないのは
問題があるだろ
915デフォルトの名無しさん:2009/08/28(金) 01:10:26
>>910
これってエイリアシングの問題は発生しないの?
916デフォルトの名無しさん:2009/08/28(金) 02:02:19
発生しない条件下で使うんじゃね?
普通に糞設計としか思えないけど、コードを見ないと何とも
917デフォルトの名無しさん:2009/08/28(金) 03:27:43
直接ポインタ変換はstrict-aliasingなんちゃらって警告されるから使いたくないなあ
918デフォルトの名無しさん:2009/08/28(金) 04:05:57
警告されてしかるべきだしな
そもそも、どういう条件だと問題が起きないんだ?
919デフォルトの名無しさん:2009/08/28(金) 05:02:54
Boost 1.40.0 age
http://www.boost.org/users/download/version_1_40_0

Boost スレ無くなった?
なぜか Sandbox スレだけ残ってるけど。
920デフォルトの名無しさん:2009/08/28(金) 07:06:01
ここねw
ttp://pc12.2ch.net/test/read.cgi/tech/1250396380/

本スレは無くなったっぽいな。
誰か立ててくれるひといる?
921デフォルトの名無しさん:2009/08/28(金) 08:03:26
小さな数だけ扱いたかったので、charを選択していたのですが、
intにした方が良いのですね。
short等もまた、数字を扱うべきではないのでしょうか?
922デフォルトの名無しさん:2009/08/28(金) 08:21:12
そういうレベルの疑問が出るならC言語初心者スレとかに行くべきなのではなかろうか
923デフォルトの名無しさん:2009/08/28(金) 09:11:23
>>899
>禿本の6.2.8にint(x)とstatic_cast<int>(x)が等価であることが書いてあるから

ここだと(T)eと等価だと書かれているね。
http://www.research.att.com/~bs/3rd_printing12.html
でもこれってClarificationなのか?

日本語版は原著第9刷まで修正済みらしい。(http://www.longtail.co.jp/errata/)
924デフォルトの名無しさん:2009/08/28(金) 09:37:46
>>923
11th ed.までは
For a built-in type T, T(e) is equivalent to static_cast<T>(e).
と書いてあるが、これは明らかにerrorの訂正であってclarificationではない。
禿も往生際が悪いな。
925デフォルトの名無しさん:2009/08/28(金) 13:03:55
AAAとBBBというクラスがあるとして、継承をせずにBBBでAAAのインスタンスを作り、BBB内のAAAのインスタンスを使ってAAA内に宣言した関数(BBB内の変数の値を変える)にアクセスすると、BBBクラス内の変数が全て変な数になりました。
どうしてこんなことが起こるのかわかりません。わかる方がいたら回答お願いします
926デフォルトの名無しさん:2009/08/28(金) 13:25:38
>>925追記
関数内の処理の途中ではなく、関数にアクセスした時にBBB内の変数が壊れます
927デフォルトの名無しさん:2009/08/28(金) 13:29:01
>>925-926
おちょくってるんじゃないなら、ソースと、何を見て「変数が全て変な数に」なったと思ったのか
書いてもらわないとわからん。
928デフォルトの名無しさん:2009/08/28(金) 16:08:57
わからない人は書き込まないでください。
最近のゆとりはソースコードをみないと回答もできないんですか?
想像力が欠如している証拠です。ラノベばかりじゃなく、文学を読んでください。
929デフォルトの名無しさん:2009/08/28(金) 16:10:59
それは想像力や読解力というものではなく、ESPというものです
930デフォルトの名無しさん:2009/08/28(金) 16:50:21
想像で回答してもいいが、それがお前さんの状況と一致するとは限らんぞ
役に立たない回答をもらってどうするつもり?
931デフォルトの名無しさん:2009/08/28(金) 16:51:09
>>928
まともな質問も出来ないでキレてる方がよほどゆとりw
932デフォルトの名無しさん:2009/08/28(金) 17:06:38
>>920
立てた
Boost総合スレ part8
http://pc12.2ch.net/test/read.cgi/tech/1251446016/
933デフォルトの名無しさん:2009/08/28(金) 17:09:45
ソースが出せない時点で問題があるな。

まず、単に恥ずかしいから出せないケース。
これは一番悪い。そのままでは先々伸びる見込み無し。↓などを参照して考え直せ。
ttp://www.kojima-cci.or.jp/fuji/mybooks/cdiag/cdiag.0.6.html

次に、本当に出しにくいケース。
この場合、同等のコードを簡略化して示せばいい。その程度の作業はデバッグの初歩
なので、これができないということならデバッグがまともに出来ないことを意味する。
これも先々伸びる見込み無し。
934デフォルトの名無しさん:2009/08/28(金) 17:49:15
>>932
GJ
935デフォルトの名無しさん:2009/08/28(金) 18:23:18
質問に答えられないくせに偉そうな人ばかりですね^^
936デフォルトの名無しさん:2009/08/28(金) 18:49:33
質問がデタラメなので回答不能、という明確な答が
即座に返されたじゃないかw
937デフォルトの名無しさん:2009/08/28(金) 19:11:35
まずソースをさらさないことには、なんとも。
938デフォルトの名無しさん:2009/08/28(金) 19:27:47
>>925-926,928,935
晒しアンカ
939デフォルトの名無しさん:2009/08/28(金) 19:30:47
>>931
ここまでコピペでいいんだっけ
940920:2009/08/28(金) 23:41:24
>>932
ありがとう。
愛してるよ。
941デフォルトの名無しさん:2009/08/29(土) 12:17:08
"hogehoge"
というような文字列リテラルの型はなんですか?
char*
char* const
const char*
const char* const
のうちどれだと考えればよろしいでしょうか?
942デフォルトの名無しさん:2009/08/29(土) 12:35:41
>>941
char [9]
943デフォルトの名無しさん:2009/08/29(土) 12:36:44
>>942
申しわけありませんが
標準C++でお願いいたします。
944デフォルトの名無しさん:2009/08/29(土) 12:54:03
>>943
const char[9] っぽい

#include <typeinfo>
#include <stdio.h>
int main() {
if (typeid("hogehoge") == typeid(const char[9])) {
printf("It's true!\n");
} else {
printf("It's false...\n");
}
}
945デフォルトの名無しさん:2009/08/29(土) 13:01:11
>>943
BohYoh.com−C/C++ FAQ 文字列リテラルの型は何ですか。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00035.html

 文字列リテラルの型は、要素型がconst charで、末尾に付加されるナル文字と、マルチバイトエンコーディングのためのバイトを含めて、その文字列リテラルを格納するのにちょうど十分の要素数をもつ配列です。
946デフォルトの名無しさん:2009/08/29(土) 13:02:39
型にconstは含まれないよ
947デフォルトの名無しさん:2009/08/29(土) 13:05:31
いや、念のためVC++で試したら、typeid(char[9]) と typeid(const char[9]) が別だったもので・・・
948デフォルトの名無しさん:2009/08/29(土) 13:10:14
アレっ? g++だと同じ
949デフォルトの名無しさん:2009/08/29(土) 13:19:01
gcc 4.2.1では同じだったよ。
950941:2009/08/29(土) 13:20:33
>>944-945
typeidで自分で調べる方法もあったんですね。
ありがとうございました。
951デフォルトの名無しさん:2009/08/29(土) 13:21:54
C++ code - 14 lines - codepad
ttp://codepad.org/Af5eErTr

だれか、コンパイル時アサートを使って
コンパイルエラーとして検出できるコード書いてくれない?

Test Drive Comeau C/C++ Online
ttp://www.comeaucomputing.com/tryitout/
ここで試してみたいから。
952デフォルトの名無しさん:2009/08/29(土) 13:26:13
>>951ttp://codepad.org/Af5eErTrを実行してみると

g++では
typeid("hogehoge") == typeid(char[9]) is true!
typeid("hogehoge") == typeid(const char[9]) is true!

VC++では
typeid("hogehoge") == typeid(char[9]) is false!
typeid("hogehoge") == typeid(const char[9]) is true!

Borland C++ 5.5.1では
typeid("hogehoge") == typeid(char[9]) is true!
typeid("hogehoge") == typeid(const char[9]) is true!

だな。
953デフォルトの名無しさん:2009/08/29(土) 13:35:59
ISO/IEC 14882:2003の2.13.4 1だな
普通の文字列リテラル(ordinaly/narrow string literal)ではconst char[n]
Lプレフィックス付き(wide string literal)ならばconst wchar_t[n]
その長さnについては2.13.4 5で定義されてる
954デフォルトの名無しさん:2009/08/29(土) 13:36:27
C++ code - 11 lines - codepad
ttp://codepad.org/rEbLk20d

これで誰も文句ないだろ。

 終 了
955941:2009/08/29(土) 13:37:59
皆様ここまでお調べくださり
ありがとうございました。

とても助かりました。
956デフォルトの名無しさん:2009/08/29(土) 18:07:28
#include <stdio.h>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/remove_pointer.hpp>

template <typename T>
bool is_const_type(T)
{
return boost::is_const< boost::remove_pointer<T>::type >::value;
}

int main ()
{
printf( "%d", static_cast<int>(is_const_type("")) );
}

こういうコードだとどうなる?
厳密には、関数の値渡し引数として与えた場合にテンプレートでどう解決されるか、の
テストだから、const int a = 0;とか変数作ってis_const_type(a)すると0が返って
きちゃうが。
957デフォルトの名無しさん:2009/08/29(土) 19:20:43
>>956 VC8だと1が返るね。
リテラルはconst char* だけど、Cとの互換性のためにリテラルはchar*に代入できる事になってるって昔聞いたことある。

template<class T>
T test(T a)
{
return a;
}
int main ()
{
const char* a=test("hoge"); //ok
char* b=test("fuga"); //error

const char* c="piyo"; //ok
char* d="hanya"; //ok
}
958デフォルトの名無しさん:2009/08/29(土) 19:29:20
リテラルをchar*に代入して書き換えるのって合法なんだっけ?
959デフォルトの名無しさん:2009/08/29(土) 19:35:45
>>958 規格は知らないけど禁止でしょう。
Windows上では書込み禁止のエリアにリテラルは配置されているので書き換えようとするとメモリ違反の例外が出る。
960デフォルトの名無しさん:2009/08/29(土) 20:09:37
BCCだともっと困る事態が起きる

-d オプションを付けてコンパイルすると同一の並びの文字列リテラルは
マージされて全て同じアドレスを指すようになる(Javaみたいな感じ)

この状態で文字列リテラルを書き換えると同一の並びの文字列リテラル
が全て書き換わってしまう事になる
961デフォルトの名無しさん:2009/08/29(土) 20:14:20
おおこわいこわい
962デフォルトの名無しさん:2009/08/29(土) 20:19:13
>>960
文字列の比較にstrcmpじゃなくてポインタの比較使ってる初歩的なバグが
たまたまテストに文字列リテラルばっかり使ってたせいで発覚しなかったのを思い出した
963デフォルトの名無しさん:2009/08/29(土) 20:23:31
>>962
strcmp()はCの初心者の時から苦労したなあ
文字列を比較できない言語ってのに何しろ初めて遭遇したもんだから
964デフォルトの名無しさん:2009/08/29(土) 21:21:44
>>960
VC++にも文字列プールオプションはあるし、他のコンパイラにもあるんじゃね
965デフォルトの名無しさん:2009/08/29(土) 21:28:09
安価ミスか
966デフォルトの名無しさん:2009/08/29(土) 21:30:08
ミスっぽいの見当たらないけど
967デフォルトの名無しさん:2009/08/30(日) 00:09:36
>>956

g++では
ttp://codepad.org/BMF3b32n
この様にエラーになるね。

VC++は1が返った。
bccは信用ならないので調べていない。
968名無しさん@そうだ選挙に行こう:2009/08/30(日) 03:40:35
>>967
そのエラー内容だと、g++だとどっかでis_const_typeが既に使われてるのかも
969名無しさん@そうだ選挙に行こう:2009/08/30(日) 04:33:12
占拠にいこう
970デフォルトの名無しさん:2009/08/30(日) 11:08:50
.netで グローバル変数のように複数のクラスで参照したくて
クラスの外で変数を定義しても
グローバルまたは静的変数は、マネージ型 'hoge' を含むことはできません
というエラーが出てしまいます。

グローバル変数を定義できないということで
下のようにmain 関数内でクラスhogeのインスタンスを作成しても
他のクラスで参照する方法がわかりません。
どうしたらよいでしょう?

int main(array<System::String ^> ^args)
{
hoge^ ho = gcnew hoge;

// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);


// メイン ウィンドウを作成して、実行します
Application::Run(gcnew Form1());



return 0;
}
971名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:53:36
972名無しさん@そうだ選挙に行こう:2009/08/30(日) 13:26:08
英数字だけでなく日本語等の2バイト文字を含む文字列に対して、先頭から1文字ずつ調べていくにはどうしたらよいのでしょうか?
1バイト文字か2バイト文字の一部であるかの判定なども自分で作らないといけないのでしょうか?
973名無しさん@そうだ選挙に行こう:2009/08/30(日) 13:39:27
うん。C++に限った話しじゃないけどね
974名無しさん@そうだ選挙に行こう:2009/08/30(日) 13:41:18
>>972
wchar_tやlocale使ってもだめだからね
大抵のC++処理系には独自の関数が装備されているのだが
975972:2009/08/30(日) 14:15:40
ありがとうございます。やはりそうでしたか・・・。
wchar_tを使っても駄目なのはなぜなのでしょうか?
これならうまくいきそうだと思ったところだったのですが・・・。
あと、何か便利な関数とかあったら教えていただけないでしょうか?
976名無しさん@そうだ選挙に行こう:2009/08/30(日) 14:16:50
>>969
その誤字は場合によっては警察沙汰だぞ。
977名無しさん@そうだ選挙に行こう:2009/08/30(日) 14:19:18
>>975
例えばちょっとマイナーになるが
C++Builder2010とかC#だとUnicode文字列が使えて
特別な関数は必要ない
978名無しさん@そうだ選挙に行こう:2009/08/30(日) 14:55:15
>>976
とあるアニメの「通販で小惑星を買った話」というサブタイトルが、
アニメ情報サイトで「通販で小学生を買った話」とtypoされてたのを思い出した。
979972:2009/08/30(日) 15:15:16
>>977
ありがとうございます。
まだいまいち理解できていない部分があるのですが、
Unicode文字列をwchar_tで扱う方法でうまくいきそうです。
980名無しさん@そうだ選挙に行こう:2009/08/30(日) 15:23:01
>>979
unicodeでも、サロゲートペアやら連結文字とかあるから、1char1文字だとうまくいかないことがある。
981名無しさん@そうだ選挙に行こう:2009/08/30(日) 15:27:59
だな
勝手な事を言い出す国があって結局65536文字に全文字を
収める事ができなかったので2〜4バイトで可変長だしな
982名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:07:11
よくできたライブラリを使うんでない限り文字列関係で楽をしようとは考えない方がいいよ
983名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:49:05
>>981
そもそも世界のありとあらゆる文字を65536個の中におしこめる発想がどうかしている。
984名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:51:19
だが52個しか文字を持たない国の人たちは本気でそれで十分と考えてた
985名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:55:53
欧州ですら52個じゃ収まらないのに^^
986名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:02:36
7ビット圏の発想がそもそも原因でしょ

C/C++を英語以外のキーボードで使っても知らないよって
言ってる人達だもん

1ビット余るのでそれでpackedしようなんて発想だし

wchar_tだってgccにまともにインプリメントされるまでどれだけ
時間がかかったか
987名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:53:11
まぁ何度も何度も何度も何度もメモリ空間の壁とかHDD容量の壁とかと戦ってるのと
ある意味同じ
988名無しさん@そうだ選挙に行こう:2009/08/30(日) 19:11:18
大東亜共栄圏が樹立されていれば話も違っただろうに。
989デフォルトの名無しさん:2009/08/30(日) 21:00:39
C#(.net)ならStringInfoを使えばいいけど、win32のCharNextは連結文字には対応してるのに、
サロゲートぺアには対応してないって中途半端さ。
990デフォルトの名無しさん:2009/08/31(月) 20:22:34
operator voidって出来ないんですか?
991デフォルトの名無しさん:2009/08/31(月) 20:24:47
できたとして何もできないじゃないすか
992デフォルトの名無しさん:2009/08/31(月) 20:30:55
引数列を2つ取る関数オブジェクトを作りたかったので、
例えばhoge(a,b)(c,d);みたいに書くと、hoge(a,b)が中間的な関数オブジェクトを返して
それに(c,d)を適用するようにしました
しかしhoge(a,b);みたいに引数列一つだけのものは意図してないのでエラーにしたいんです
そこで中間オブジェクトのoperator voidにassertを張っておけば検出できると思ったんです

ダメ?
993デフォルトの名無しさん:2009/08/31(月) 20:36:42
中間オブジェクトにフラグを設けて、operator()が呼ばれずにデストラクタが
呼び出されたらassertすればいい。
994デフォルトの名無しさん:2009/08/31(月) 20:46:36
それでもいいんですけどフラグ変数を#ifndef NDEBUGで囲むのが嫌だったんです

式の最終結果が特定の型になったかどうかを検出する方法ってないんですかね?
995デフォルトの名無しさん:2009/08/31(月) 21:02:33
100;がエラーにならない言語に無茶言わないで!!
996デフォルトの名無しさん:2009/08/31(月) 21:03:37
>>990
出来るけど、明示的に呼び出したとき以外、呼ばれないはず。
997デフォルトの名無しさん:2009/08/31(月) 21:04:40
素直に引数列の方をオブジェクトにすりゃいいんじゃね
998デフォルトの名無しさん:2009/08/31(月) 21:10:33
いい方法あったら知りたいな
hoge[i][j]とかにも使えそうだし
999デフォルトの名無しさん:2009/08/31(月) 21:15:46
正直、hackっぽくていまいちな方法だと思うな
1000デフォルトの名無しさん:2009/08/31(月) 21:28:31
中継関数オブジェクト::operator 左辺値() にassertion仕掛けるとか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。