C++相談室 part55

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

テンプレその他 >>2-15 付近参照

前スレ
C++相談室 part54
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
2デフォルトの名無しさん:2006/12/01(金) 14:33:01
■基本■
[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/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
3デフォルトの名無しさん:2006/12/01(金) 14:33:35
4デフォルトの名無しさん:2006/12/01(金) 14:34:39
5デフォルトの名無しさん:2006/12/01(金) 14:35:17
6デフォルトの名無しさん:2006/12/01(金) 14:44:49
7デフォルトの名無しさん:2006/12/01(金) 14:45:23
8デフォルトの名無しさん:2006/12/01(金) 14:47:20
9デフォルトの名無しさん:2006/12/01(金) 14:49:36
10デフォルトの名無しさん:2006/12/01(金) 15:11:28
C++学ぶと、一気に頭髪が後退に?
11デフォルトの名無しさん:2006/12/01(金) 15:17:00
以下、啓蒙文Ver3.0
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
12デフォルトの名無しさん:2006/12/01(金) 15:19:52
>>10
人によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10cmほどしか後退してない。
13デフォルトの名無しさん:2006/12/01(金) 15:25:23
すげえ。ボーランドのコンパイラ使っといてC++とかいってるよ。この人。
14デフォルトの名無しさん:2006/12/01(金) 15:30:01
C1010: プリコンパイル済みヘッダーの検索中に予期しない HAGE を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
15デフォルトの名無しさん:2006/12/01(金) 15:31:11
キチガイ啓蒙文は無視な。
好きなようにやれ。
16デフォルトの名無しさん:2006/12/01(金) 15:37:39
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
17デフォルトの名無しさん:2006/12/01(金) 15:46:49
11 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
16 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
18デフォルトの名無しさん:2006/12/01(金) 15:47:37
#include <stdaderance.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁ付け毛ぐらいにはなったな。
うむごくろう。
19デフォルトの名無しさん:2006/12/01(金) 15:48:18
Boostつかうと一気に実行ファイルサイズが100倍に?!

環境によるだろ。
俺はVC++に /Yc オプションを指定して、極力
プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを
使っても使わない時と比べ10秒ほどしか増えない。
20デフォルトの名無しさん:2006/12/01(金) 15:51:08
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。
CreateFileとかCopyFile等の動作チェック用です。
自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。
VisualStudioパッケージあるかもしれんがようわからん。
誰か知らないか?
21デフォルトの名無しさん:2006/12/01(金) 15:52:43
>>12
std恐るべし((((;゜Д゜)))
22デフォルトの名無しさん:2006/12/01(金) 15:56:33
>>20は自らエスパーを呼び寄せることにした…
23デフォルトの名無しさん:2006/12/01(金) 16:19:04
>>20
スレ違い
24デフォルトの名無しさん:2006/12/01(金) 16:37:04
>>20
これって前スレの頭の方にあった質問だね。
テンプレに入れる事にしたのか。
25デフォルトの名無しさん:2006/12/01(金) 16:51:04
もうテンプレ増やさなくてもいいじゃないかと思うんだけどなぁ。
前スレ後半から新スレへくるようなお客さんが引いちゃうし、なにより飽きた。
26デフォルトの名無しさん:2006/12/01(金) 17:02:08
テンプレートを使ったコードを、ヘッダとソースに分離したいと考え、
http://docs.sun.com/source/806-4838/Ch2.src.html
の最後にある、「テンプレート定義分離型の構成」のサンプルを
VC7.1にてビルドしてみたのですが、以下のようなエラーが出てしまいます。

error LNK2019: 未解決の外部シンボル "int __cdecl twice<int>(int)"
(??$twice@H@@YAHH@Z) が関数 _main で参照されました。

これは何が問題なのでしょうか?
もしや、VCの仕様でしょうか?
27デフォルトの名無しさん:2006/12/01(金) 17:07:15
>>26
exportキーワードがサポートされてないなら全部ヘッダに書くしかない
28デフォルトの名無しさん:2006/12/01(金) 17:49:29
どこまでがテンプレなのか
もうわからん
29デフォルトの名無しさん:2006/12/01(金) 19:48:26
Q
NGにしてるヤツが「番号が飛び飛び」「〜が見えない」とやたらNGにしてることを強調したがるのはどうしてか

A
統合失調症の恐れがあります。
何をされるかわかったもんじゃないので関わらないほうがいいです。
30デフォルトの名無しさん:2006/12/01(金) 20:12:41
「番号が飛び飛び」というのは一種の揶揄でもある。
書き込んだやつからの反応がほしいんじゃなくて、
自分と同様にあぼ〜んしたやつからの反応がほしいんだろう。

「〜が見えない」の意味が理解できないのは2ちゃん初心者。
SGにでも登録してください。
31デフォルトの名無しさん:2006/12/01(金) 21:36:14
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
32デフォルトの名無しさん:2006/12/01(金) 21:40:23
__(●)(●)((●)((●))(●)(●)(●)ii● l(●)(●)(●)__
 /  (●)(●)(●)(●)(●))(●)(●)(●゙'‐='"(●)(●)(●)   \
   _ (●)(●)(●)(●)(●)(●)(●)(●)))(●)(●)(●)(●)_
 /  (●)(●)(●)(●)(●))(●)(◎)(●))(●)(●)(●)(●)  \
    _(●)(●,,r==、(●))(●)(◎)(●))(●)(●)(●)(●)_
      (●)((ii ,●l)(●))(●)(●)(●)(●)(●)(●)(●)
   __(●)(●゙'‐='"((●))(●)(●)(●))(●)(●)(●)(●)__
 /  (●)(●)(●)(●)(●))(●)(●,,r==、(●)(●)(●)(●)   \
   _ (●)(●)(●)(●)(●)(●)(●)ii ● ))(●)(●)(●)(●)_
 /  (●)(●)(丿"~"i i(●)(●)(●)゙'‐='"(●)(●)(●)(●)  \
    _(●)(●)(",, )(X)ヽヽ(●))(●)(●))(●)(●)(●)(●)_
      (●)(●)\ ヽXヽヽ(●))(●)(●)(≡)(≡)(●)(●)
   __(●)(●)((●\ヽ Xヽヽ(●)((●))(●)(●)(ミ)(●)__
 /  (●)(●),,r==、)( \,",",ソ●(●))(●),,r==、●)(●)   \
   _ (●)(●)ii ,●l)(●)(●)(●)(●)))(●ii● ;)(●)(●)_
 /  (●)(●)゙'‐='"(●)(●))(●)(●)(●))((゙'‐='"(●)(●)  \
    _(●)(●)●)(●)(●))(●)(●)(●))(●)(●)(●)(●)_
  /  (l●)(●)(●),,r==、)(●)(●)(●)(,,r==、)(●)(●l;)  \
  | .  (l;●)(●)(● ,● ))(●))(●)(●)ii ● l)(●)(●)    |
  |  . (0●)(●)(●゙'‐='"●))(●)(●)(゙'‐='"(●))(●)O)    |
  ,;;    (:●)●)(●)(●)(●)(●)(●)(●))(●))(●;)      。
       (о●)(●))(●)(●))(●)(●)(●)(●)●》)
         ( ;●ξ巛:)( ;●ξ(●)(●,--'""ヽ●:( ;)
           巛巛ミ巛ミミミ//二二ノ""^ソ彡
             巛((ミミ((巛ヘ`\┼┼┼ ,!ヽ
                 巛王 \"ヽ-;:,,,,,,ノ /'
                       \,,,,,__,,,ノ
33デフォルトの名無しさん:2006/12/01(金) 23:18:17
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
34デフォルトの名無しさん:2006/12/02(土) 03:18:46
31 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
33 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
35デフォルトの名無しさん:2006/12/02(土) 05:12:40
皆さん単体テストは何を使っているのですか?
36デフォルトの名無しさん:2006/12/02(土) 08:59:21
37デフォルトの名無しさん:2006/12/02(土) 09:14:37
え、俺は体だけど?
38デフォルトの名無しさん:2006/12/02(土) 11:09:48
単体テストなど頭も手も使わずベロだけでこなしてみせよう
39デフォルトの名無しさん:2006/12/02(土) 11:55:05
boost::test
40デフォルトの名無しさん:2006/12/02(土) 15:14:11
::test tobj(/*今日の日付*/20060212);
41デフォルトの名無しさん:2006/12/02(土) 18:16:27
テンプレートクラスでtemplate<class T>のT型の返り血(値)を返す関数を、インターフェイスを書いたファイルとは別のファイルに記述したいんですが、
どうすれば良いんでしょうか。
42デフォルトの名無しさん:2006/12/02(土) 18:33:58
//MyFunc.h
template < typename T>
T func() ;

#include "MyFunc.cpp"



export? 何それ食えるの?
43デフォルトの名無しさん:2006/12/02(土) 19:02:56
テンプレートクラスのフレンド関数も扱い難しいよなあ。
まあフレンドなんて使うなってことだろうが
44デフォルトの名無しさん:2006/12/02(土) 19:23:42
C++のテンプレートで質問があります。下記のコードをGCC3.4でコンパイルする
とa = 1;、y(); のところでエラーとなってしまいます。this->a = 1;、
this->y();のようにすれば問題ないのです。出来ればthisをつけないようにし
たいのですが、どうすれば良いでしょうか?


template<class T1, class T2>
class A
{
int a;
void y();
};

template<class T1, class T2>
class B
{
void x();
};

template<class T1, class T2>
void B<T1, T2>::x()
{
a = 1;
y();
}
45デフォルトの名無しさん:2006/12/02(土) 19:26:01
>>44
何これ
BはAを継承してるのか?
46デフォルトの名無しさん:2006/12/02(土) 19:29:07
>>44のコードはよくわからないけど
privateメンバはサブクラスからはいじれないとかそのへんのことじゃね?
47デフォルトの名無しさん:2006/12/02(土) 19:31:26
サブクラスに公開するにはprotectedにするあたりはJavaと一緒?
4844:2006/12/02(土) 19:33:59
すみません、いろいろと書き忘れていました。BはAを継承していて、Aのメンバは全てpublicです。

template<class T1, class T2>
class A
{
public:
int a;
void y();
};

template<class T1, class T2>
class B: public A<T1, T2>
{
void x();
};

template<class T1, class T2>
void B<T1, T2>::x()
{
a = 1;
}
49デフォルトの名無しさん:2006/12/02(土) 19:35:15
いろいろいらない物をつけたけど、基本的にデフォルトテンプレートパラメータ
がない時は明示しなければならない

template <class T1, class T2>
class A
{
protected:
int a;
void y() { std::cout << a << std::endl; }
};

template <class T1, class T2>
class B : public A<T1, T2>
{
public:
void x();
};

template <class T1, class T2>
void B<T1, T2>::x()
{
A<T1, T2>::a = 1;
A<T1, T2>::y();
}
5044:2006/12/02(土) 19:36:56
>>49
丁寧なレス有り難うございます。
5144:2006/12/02(土) 19:41:51
ちょっと興味があるんですが、多重継承でもないのに明示的にA<T1, T2>::のよ
うなものをつける必要があるのはどういった理由からでしょうか?ポインタだ
けでも教えていただけるとうれしいです。
52デフォルトの名無しさん:2006/12/02(土) 19:47:55
VCならスーパークラスのメソッドはA<T1,T2>::つけなくても呼べたような気がする。
気のせいかな
53デフォルトの名無しさん:2006/12/02(土) 19:57:31
VS.NET2003だと明示的に書かなくても通った。
54デフォルトの名無しさん:2006/12/02(土) 19:58:20
>>43
扱いを難しくしてるのは、gccだけだけどなw
55デフォルトの名無しさん:2006/12/02(土) 20:06:28
残念。それはgccのせいではなく規格のせいであり、つまるところ禿とかのせいなわけで。
56デフォルトの名無しさん:2006/12/02(土) 20:08:14
VCだと本来typenameがあるべき所に無くても通ったりするな。
プログラマをへたらせるだけだと思うんだが
57デフォルトの名無しさん:2006/12/02(土) 20:13:17
VC++ 8でtypenameを付けないとコンパイルできなくなったように思う。
58デフォルトの名無しさん:2006/12/02(土) 20:15:30
直されたんか。それはよかった
規格の不可解な点には必ず理由があると思ってた。
>>49のように書かなければいけないのも(typedefすればすっきりするが)
何か理由があるのだろう。基底クラスが一意に決定できるのにわざわざ
修飾しなければならないのは。
59デフォルトの名無しさん:2006/12/02(土) 20:30:22
>>58
Aが特殊化されてるかもしれない。
60デフォルトの名無しさん:2006/12/02(土) 21:28:59
プログラマがへたるっていうより一個一個typenameついてたら美しくない希ガス。
もちっとましな規格にならんもんかしら
61デフォルトの名無しさん:2006/12/02(土) 21:34:27
0xになると少しは要らなくなるかもしれないらしい。
ttp://d.hatena.ne.jp/mb2sync/20061123#p1
62デフォルトの名無しさん:2006/12/02(土) 21:42:05
>>61
そこで書かれているのは typename が要らなくなる,ではなくて
現在の仕様だと typename を書くことが禁止されていた場所に
typename を書いても許されるようになる,ということだけだと思います.
この規格の変更で 60 さんの不満が解消することは恐らくないかと.
63デフォルトの名無しさん:2006/12/03(日) 10:30:18
>>51
two stage lookup ってやつだろ。
B<T1, T2>::x() の定義の前にグローバルな int a; なんて宣言があった場合、
>>48 だとテンプレートのインスタンス化前に行われる名前解決で ::a = 1 と
決定されてしまう。

ここでは a がテンプレートのインスタンス化を行うまで確定しないことを
コンパイラに伝える必要がある。 >>49 はその方法のうちの一つ。
this->a のほうがお勧めだけど。
64デフォルトの名無しさん:2006/12/03(日) 11:22:12
初心者ですみません

メンバ関数の中でstatic変数使ってるんですけど、これは他のオブジェクトとも共有されるんですかね
65デフォルトの名無しさん:2006/12/03(日) 11:31:48
class foo{
void func() {
static int a = 0;
printf("a = %d\n", ++a);
}
}

int main(int argc, char*argv[])
{
foo f1, f2;
f1.func();
f2.func();
return 0;
}
66デフォルトの名無しさん:2006/12/03(日) 11:51:36
スマソ
メンバ変数にすることにします
静的変数ってグローバル変数とほとんど変わらないんですね
67デフォルトの名無しさん:2006/12/03(日) 20:28:33
C++というより、Cの質問になるのかもしれませんが、
C++組込型において、格上げの規格について教えてください。

signed short s = 0xFFFF;
unsigned long ul = static_cast<unsigned long>(s);

cout << hex << ul << endl;

とした場合、結果は
ffffffff
となりました。

符号有り型から、符号無し型へ格上げした場合、変換後の値は変換先の型に入るだけのビット数を変換前から抜き出したものになる。とプログラミング言語C++第3版 p945には書いてあるのですが、これは違った結果になりました。

最上位bitが1なら、上位ビットは1で埋まるというのは、規格で決まっているのでしょうか?

コンパイラは、Visual C++ 2005 Express edition です。
68デフォルトの名無しさん:2006/12/03(日) 20:43:40
まあ、あれだな。
cout << (ul==s) << endl;
とやってみてから考えれば?
69デフォルトの名無しさん:2006/12/03(日) 20:47:00
ああしまった。これじゃ暗黙の型変換で意味がない。
cout << ul << endl;
cout << s << endl;
7067:2006/12/03(日) 20:58:25
>>69

4294967295
-1

となりました。うーん、ちょっとまだよく分からないのですが。
何かプログラミング言語C++を読み違えてるんでしょうね・・もう少しジックリ読んでみます。
ありがとう。
71デフォルトの名無しさん:2006/12/03(日) 21:12:08
符合拡張でぐぐれ。
それからビット数が多い整数から少ない整数に変換する話であって本は間違ってない。
72デフォルトの名無しさん:2006/12/03(日) 21:15:24
>>67
> signed short s = 0xFFFF;

signed short の最大値が 0xFFFF 以上じゃないと、この時点で値は実装依存だよ。
7367:2006/12/03(日) 21:22:56
>>71
符号拡張というんですね。
さっそくググってみます。

>>72
あ、すいません。-1とするべきでしたね。

ご丁寧に、ありがとうございました。
74デフォルトの名無しさん:2006/12/03(日) 21:24:44
>>71
それを書くなら符号拡張だろ。

だが、ここで関係するのは汎整数拡張だ。int/unsigned intより小さい型の値は、
演算前にintか、intで表すことができなければunsigned intへ拡張されることになっている。
75デフォルトの名無しさん:2006/12/03(日) 21:39:39
モンテカルロ法でいろいろ計算するプログラムを作っています。

モンテカルロクラスのコンストラクタに、計算対象の純粋仮想クラスへの参照を渡して
計算させたいのですが、下記のようにするとコンパイルエラーとなってしまいます。

class MonteCalro
{
    public:
        explicit MonteCalro(Calculatable& c){cp=c;};
        double calc(const int count);
        
    private:
        MonteCalro();
        Calculatable& cp;
        double getRandomValue(const double range) const;
};

上記の&を*にするとうまくいきますが、
オブジェクトの内容を書き換えられるのがいやなので
なるべくでしたら参照型で渡したいのですが。。
どうしたらよいのでしょうか?
76デフォルトの名無しさん:2006/12/03(日) 21:43:29
別に参照にしたからといって内容を書き換えられなくなりはしないけど。
-?explicit?MonteCalro(Calculatable&?c){cp=c;};
+?explicit?MonteCalro(Calculatable&?c):cp(c){};
77デフォルトの名無しさん:2006/12/03(日) 21:47:04
explicitに引っかかってるとか?とりあえず書き換えられたくなかったらconstつけとけ
78デフォルトの名無しさん:2006/12/03(日) 21:57:22
>>76 うまくいきました。ありがとうございました。正直びびりました
>>77 「参照メンバー 'MonteCalro::cp' は初期化されていない」とエラーになっていました・・
それと、どこにconstをつけたらいいか良く分かりません。
        const Calculatable& cp;
とすると、警告 W8037 montecarlo.cpp 9: const オブジェクトに対して 非 const 関数 'Calculata
ble::getYrange()' が呼ばれた(関数 MonteCalro::calc(const int) ) とでます。。

C++ むずかしい・・・
79デフォルトの名無しさん:2006/12/03(日) 22:12:16
>>78
Calculatable::getYrange()っていう関数でメンバ変数を書き換えるコードがかかれてない?
constつけるとそういうのはコンパイルエラーになる
80デフォルトの名無しさん:2006/12/03(日) 22:22:29
>>79 レスありがとうございます

Caluculatableクラスに下記のようにconstつけてみたのですが、
まだ、警告 W8037 montecarlo.cpp 13: const オブジェクトに対して 非 const 関数 'Calculat
able::isInside(const double,const double)' が呼ばれた(関数 MonteCalro::calc(cons
t int) )
とエラーが出ます。isInsideにconstをつけると、継承したクラスで
エラー E2353 main.cpp 17: クラス 'Circle' は抽象クラス('Calculatable::isInside(
const double,const double) = 0' のため)(関数 main(int,char * *) )
とエラーが出ます。がびーん

class Calculatable
{
    public:
        virtual bool isInside (const double x,const double y)=0;
        double getXrange() const{return xrange;} 
        double getYrange() const{return yrange;} 
    protected:
        double xrange;
        double yrange;
};
81デフォルトの名無しさん:2006/12/03(日) 22:24:00
>>78
getYrange() に const 付け忘れてんだろ。
82デフォルトの名無しさん:2006/12/03(日) 22:25:31
>>80
isInside() と、それをオーバーライドするクラスでの宣言全部に const が必要。
片方だけ付けるとオーバーライドとみなされない。
83デフォルトの名無しさん:2006/12/03(日) 22:34:42
>>82
ありがとうございます。うまくいきました。

各クラス1個1個const付けつつコンパイルしてたので失敗していました。。。
84デフォルトの名無しさん:2006/12/03(日) 23:22:00
いかにも学校の宿題っぽいソース見せられるとなんか和むな
85デフォルトの名無しさん:2006/12/04(月) 10:56:18
旦~
86デフォルトの名無しさん:2006/12/04(月) 10:56:54
すまぬ、誤爆したorz
87デフォルトの名無しさん:2006/12/04(月) 20:00:54
1つのクラスで10Kラインてのは、
やっぱ詰め込みすぎですかね?

ソース整理してくれって言われてて
とりあえずライン数集計したんだけど。
88デフォルトの名無しさん:2006/12/04(月) 20:16:42
よっぽど低レベルな処理でもしてるんでなければ多すぎだろ、それは。
89デフォルトの名無しさん:2006/12/04(月) 20:48:38
マ板の「この会社やめようと思ったソースコード」に出てくる領域じゃないかな・・・。
9087:2006/12/04(月) 21:32:55
>>88、89

うーん、詳しくはいえないんだけど、
数値計算系の業務用プログラムなんだ。
入ったばっかで何やってるかわからないから、
10Kが妥当かどうかも判断つかないよ。
91デフォルトの名無しさん:2006/12/04(月) 21:41:50
数値計算系ならあり得るかも・・・
92デフォルトの名無しさん:2006/12/04(月) 21:43:01
まぁソース分割だけじゃなく色んな方面から考えないとなぁ
93デフォルトの名無しさん:2006/12/04(月) 21:51:36
メンバ変数とか1つのクラスに数十個あるよ
クラス同士の結合も相当強いし。。
しかし、数値計算に必要といわれればそれまでwww
94デフォルトの名無しさん:2006/12/04(月) 23:38:50
そればっかりはアルゴリズム勉強するとかしないと判断不能だからなぁ……。
困るねそういうの。
95デフォルトの名無しさん:2006/12/05(火) 00:15:35
あと、時々メモリリークを起こすって言うから調べてるんだけど
(どうもconst変数の値がいつのまにか変わっちゃうらしい)
全クラスでコピーコンストラクタとコピー代入演算子が書かれてないんだ。
(デストラクタも宣言しただけ)
このあたりって、関係あるかな???
96デフォルトの名無しさん:2006/12/05(火) 00:23:58
単にconst_castしちゃってるとかじゃないよね?
97デフォルトの名無しさん:2006/12/05(火) 00:32:42
>>96
あ、それもありうるかも
なんせソースが長いからどっかでやってるかな。。
明日調べてみます。ありがd!!!
98デフォルトの名無しさん:2006/12/05(火) 00:39:58
getter/setterについての質問です。

多くのgetter/setterはmember変数に対しての操作になると思います。
例えば、int GetX() constとvoid SetX(int)です。

で、逆に、member変数に対して操作しないような関数は、
GetやSetっていう名前をつけるのは避けたほうがいいんでしょうか。

今制御のprogram書いてるんですけど、
制御する機器の状態(シリアル接続)を問い合わせるのに、
GetMode()とかやってどういうモードで稼働しているかとか、
そういう関数にGetを使うのは慣習違反ではないですか?
99デフォルトの名無しさん:2006/12/05(火) 00:46:11
俺はなんかの状態を取り出すものは全部getってつけてる。
むしろメンバ変数かそうでないかでgetってつけるかつけないか
決めちゃったらカプセル化という意味でも変だと思う
100デフォルトの名無しさん:2006/12/05(火) 02:40:39
>>98
そのクラスが
 外からみてどう振舞って欲しいか、どんな操作があればよいか
というのと、
 メンバ変数としてどう持つか
というのは分けて考える。
そうすれば疑問は沸かない。

広い意味でのインターフェースと実装の分離、だよ。
101デフォルトの名無しさん:2006/12/05(火) 07:14:01
class A{
public:
  A(){};
  void F(){ ... };
};
というクラスを作り、
A a1;
A a2();
とインスタンス化したのですが、
a2の方は「プロトタイプされている関数が呼び出されませんでした」と警告が出ました
続けて、
A a2();
a2.F();
とやると、Fが定義されてないとなってコンパイルエラーがでました。
以前、コンストラクタで()をつけても、つけなくても同じと聞いたのですが、やはり違うんですか?
VisualStudio.2003を使ってます
102デフォルトの名無しさん:2006/12/05(火) 07:18:47
>>101
それだと「引数を受け取らず、Aを返す関数の宣言」と解釈されてしまってる。
103デフォルトの名無しさん:2006/12/05(火) 10:17:03
>>98
標準ライブラリに習って、メンバの状態取得には何もつけない。

[オブジェクト].名詞();    // げった
[オブジェクト].動詞(値) // せった。 若しくは [オブジェクト].set_名詞(値)

でアクセス。たとえば mode なら

int md = object.mode();
object.change_mode(md);

サイズなら、

size_t sz = object.size();
object.resize(sz);

みたいな。
104デフォルトの名無しさん:2006/12/05(火) 10:20:26
type member() const;
void member(type value);
でいいじゃん。
105デフォルトの名無しさん:2006/12/05(火) 13:49:47
>>104
bind に渡すときとか面倒なうえに可読性もガタ落ちするんで、やめてください。
10698:2006/12/05(火) 14:47:40
レスありがとうございます。
特にこれといった流儀はなさそうですが、
>>99-100
そのclassを使う側からしてみれば、
member変数なのかも分からないですもんね。
そうすると、member変数が持つ状態のか、
制御する装置自身が持っている状態なのか、
気にする必要はないような気がします。

>>103
こっちでも確かにそうだなーと思ってしまう。

どっちにするか未定ですが、参考になりました。

>>104
きもす。
107デフォルトの名無しさん:2006/12/05(火) 16:16:10
new/deleteに関する質問です。

newで動的に領域を確保しているのですが、
この領域をいくつものクラス間で利用しているため、
どのクラスでdeleteすればいいかが分かりません。
最後に使用しているクラスを判断するみたいな関数とか
ありませんでしょうか?
108デフォルトの名無しさん:2006/12/05(火) 16:19:23
>>107
その領域を使用しているクラスを表すカウンタを作る
109デフォルトの名無しさん:2006/12/05(火) 16:21:03
クラスとインスタンスの区別はつけよーぜ。
ってのはともかく、スマートポインタとかリファレンスカウントとかって言葉で調べろ。
110デフォルトの名無しさん:2006/12/05(火) 16:21:30
>>108
その手があったか!!
サンクス
111デフォルトの名無しさん:2006/12/05(火) 16:25:41
>>109
すみません、まだC++始めたばっかりで
理解できていない部分が多くて(´Д⊂グスン
精進しますm(_ _)m
112デフォルトの名無しさん:2006/12/05(火) 17:40:40
Stroustrupへのインタビュー

ttp://www.techreview.com/InfoTech/17831/
113デフォルトの名無しさん:2006/12/05(火) 17:46:23
そのネタもう秋田
114デフォルトの名無しさん:2006/12/05(火) 17:57:00
毎年いるなー
「このネタ面白いでしょでしょ?」なバカが。
氏ねばいいのに
115デフォルトの名無しさん:2006/12/05(火) 18:38:42
細かくあちこち覗いてると、毎月ペースで出会うw
116デフォルトの名無しさん:2006/12/05(火) 19:45:17
io.h, stdio.h, fstream
とありますが、ファイル入出力で一番処理効率がいいのって
fopen系ですよね?
fstream系のオブジェクトで数メガのファイルを開くとどうもモッサリします…

普通にこんな感じなんですが。

ifstream in("file", ios::binary);
in.seekg(ios::end);
int size = in.tellg();
in.seekg(ios::beg);
char pbuf = new char[size];
in.read(pbuf, size);
in.close();
delete []pbuf;
117デフォルトの名無しさん:2006/12/05(火) 20:04:10
>>116
実装による
118デフォルトの名無しさん:2006/12/05(火) 20:07:31
>>117
そうですよねぇ…
VC++6.0なんですけど、>>116コードがかなりモッサリしてたんで…
119デフォルトの名無しさん:2006/12/05(火) 20:24:10
1MB以上1GBぐらいまでのファイルの読み込みなら素直にAPI使ってメモリマップトファイルで。
120デフォルトの名無しさん:2006/12/05(火) 22:41:13
>>113-114
>>112はいつものネタじゃないぞw
ttp://slashdot.jp/~El-ahrairah/journal/384164
日本語訳
121デフォルトの名無しさん:2006/12/05(火) 22:57:06
昔Cの読んだ本で、
「プログラミング言語C」 難しい、分からない
「初めてのC」 全然分からない
「新・詳説C言語」 分かりやすくてサイコー
こんな感じだったんだけど。

「新・詳説C言語」のようなC++の解説サイト(日本語限定)、なかなか見つからない。
色々ぐぐってみて、javaでは今のところ、
Javaの道(Java入門・リファレンス)
ttp://www.javaroad.jp/
が一番イメージに近いんだけど。
122デフォルトの名無しさん:2006/12/05(火) 22:59:56
>>121
〜だけど。〜だけど。
何が言いたいのか分からない。
123デフォルトの名無しさん:2006/12/05(火) 23:22:44
とりあえず英語勉強しろと言っとこう。
絶対必要になるし。
124デフォルトの名無しさん:2006/12/06(水) 04:13:20
2次元配列を使った3×3行列の転置行列って、どうやったらいいですかねぇ?
125デフォルトの名無しさん:2006/12/06(水) 04:16:00
行と列を入れ替えればいいと思うよ
126デフォルトの名無しさん:2006/12/06(水) 13:37:44
関数の引数として一時オブジェクトを渡すとなぜコピーが発生しないのでしょうか?
例えば、これ。
class A;
void Func(A obj);
int main() {
Func( A() ); //コンストラクタを直接呼んで一時オブジェクトを生成
return 0;
}
後、一時オブジェクトはスタックに作られるんでしょうか?
127デフォルトの名無しさん:2006/12/06(水) 13:45:08
>>126
必ずコピーが発生しないわけではない。
詳細は覚えてないけど、ダイレクトで渡してもいいよっていうルールがあるだけ。
場合によってはレジスタ上にしか存在しないなんて例外もあるかもしれんが、
基本的に一時オブジェクトはスタック上に作られる。
128デフォルトの名無しさん:2006/12/06(水) 13:59:28
最適化とかが進むと、クラスの実体自体が機械語レベルでは消えてたりとかな。
129126:2006/12/06(水) 14:18:24
一時オブジェクトは、スタックに作られるというのは分かりました。
>必ずコピーが発生しないわけではない。
ということは、一時オブジェクトからさらに引数のために
スタックにコピーされることもあるってことですよね。
そうなると、引数にするものが存在するのにコピーして無駄
な作業してるじゃないですか。
130デフォルトの名無しさん:2006/12/06(水) 15:54:14
>>129
そして>>127へ戻る。
最適化で無駄なコピーを除去してよいという規則がある。
131126:2006/12/06(水) 16:32:33
なんかもやもや感がありますが、そういう規則が適用される場合があると考えることにします。
回答ありがとうございました。
132デフォルトの名無しさん:2006/12/06(水) 21:18:33
一時オブジェクトの省略はしても良いし、しなくても良い。
どちらにするかの判断はコンパイラに任されている。
133デフォルトの名無しさん:2006/12/06(水) 21:45:30
引数も戻り値も一時変数もローカル変数も全部スタックの上の話ってことさ
134126:2006/12/06(水) 22:30:35
なるほど、コンパイラによるんですね。結構すっきりしてきました。
でも、テストコードを作るために直接コンストラクタを呼んで一時オブジェクト使えばコードを書く量が減るから
いいなぁ〜って思ったけど、あまりやらない方がいいですね。
135デフォルトの名無しさん:2006/12/06(水) 22:51:45
コードの量は減らせるなら減らしたほうがいい
わかりやすさを損ねない限り
136デフォルトの名無しさん:2006/12/06(水) 23:04:11
そもそもクラスを引数にするなら普通const参照にするだろ。
137デフォルトの名無しさん:2006/12/07(木) 10:16:50
>>134
その辺は次の標準ではやり方が変わる可能性が高い。
rvalue reference, move semantics辺りで。
138デフォルトの名無しさん:2006/12/07(木) 11:04:59
聞いてない
139デフォルトの名無しさん:2006/12/10(日) 13:37:08
拡張子 cppは見直すべきじゃないか
http://www002.upp.so-net.ne.jp/mif/cpp/
140デフォルトの名無しさん:2006/12/10(日) 14:14:28
>>139
それでなくても C PreProcessor との曖昧さが問題だろ。
141デフォルトの名無しさん:2006/12/10(日) 17:29:51
namespace A
{
int a()
{
retrun 0;
}
}
using A::a();
int main()
{
a();
retrun 0;
}

こう書いてるノートがあるんですが、
これって間違いですよね。
正しくは
using A::a;
じゃないんですか?
142デフォルトの名無しさん:2006/12/10(日) 17:42:27
>>141 コンパイルしてから聞け。
143デフォルトの名無しさん:2006/12/10(日) 17:47:50
>>142
using A::a();
でコンパイルできなくて
A::a;
だとできたので聞いたんです。
144デフォルトの名無しさん:2006/12/10(日) 17:52:30
そこまでやって自分で結論出せないなら首吊って氏ね
145デフォルトの名無しさん:2006/12/10(日) 17:54:32
>>143
オマエのコンパイラは retrun がコンパイルできるんだな。それ C++ じゃないよ。
146デフォルトの名無しさん:2006/12/10(日) 17:58:52
>>145
return の間違いだろ。スルーしとけばよくね?
147デフォルトの名無しさん:2006/12/10(日) 18:00:02
>>145
return の間違いです。
148デフォルトの名無しさん:2006/12/10(日) 18:12:06
>>144
いや、誉めてもらいたいんだよきっと
149デフォルトの名無しさん:2006/12/10(日) 18:34:12
すみません、C++がほとんど分からないバカですが、
分からないにも関わらず、C++の仕事やんなきゃいけなくって、
困ってます。助けてください。(ほんとにわけわかってません)

[質問]
  MFCでつくったDLLって、MFCでつくったEXEからしか
  呼べないんでしょうか? MFC以外のC++のEXEから呼ぶ
  方法があれば、教えて下さい。
150デフォルトの名無しさん:2006/12/10(日) 18:39:40
>>149
スレ違い。

バカはプログラムするな。分からないと自覚してるんなら仕事は断れ。
151デフォルトの名無しさん:2006/12/10(日) 18:41:09
152デフォルトの名無しさん:2006/12/10(日) 18:49:01
質問です。
#include <iostream>
using namespace std;

namespace x
{
a(int,int);
int i;
int j;
int k;
}

int x::a(int k, int j)
{
cout << k+j << endl;
return 0;
}

int main()
{
return 0;
}

これがコンパイルできるのですが、
関数宣言したとき、戻り値書かなかった場合、自動的にintになるんですか。
153デフォルトの名無しさん:2006/12/10(日) 18:54:58
>>152
暗黙の宣言でググれ。
Cやその前身のBの頃の名残り。
154デフォルトの名無しさん:2006/12/10(日) 18:56:50
質問です
シーはネトゲに向いてますか?
どんなネトゲに使われてますか?

将来ネトゲ作るために、少しふれておきたいです
どれがいいのか悩んでます
155デフォルトの名無しさん:2006/12/10(日) 18:57:04
>>149
もしお客だったとして、こんな奴の作ったもの使いたくない
156デフォルトの名無しさん:2006/12/10(日) 18:57:44
>>153 ありがとうございました。
157デフォルトの名無しさん:2006/12/10(日) 19:11:00
C言語の構造体

typedef struct tree{
int value;
..any
struct tree *next;
struct tree *child;
struct tree *parent;
struct tree *prev;
}Tree;

このようなデータ構造をC++側でラップする場合みんなどうやってラップしますか?
158デフォルトの名無しさん:2006/12/10(日) 19:17:57
>>152
コンパイラ何使ってる? C++ では暗黙の型指定は無くなってるはず。
159デフォルトの名無しさん:2006/12/10(日) 19:18:43
>>157
ラップする目的がわからないと、何も決まらない。
160デフォルトの名無しさん:2006/12/10(日) 19:29:03
>>159
AIXとHPでほぼ同じ構造体を持つライブラリがあります。
わざわざ呼び出すのに、ライブラリに依存して呼び出したくないので
ラップして、隠蔽したいなぁと考えています。
161デフォルトの名無しさん:2006/12/10(日) 19:45:57
>>160
共通のインターフェースを純粋仮想関数としたクラスを書いて、
それぞれの実装(派生クラス)にラップする構造体を持たせる
って感じが基本かなぁ。
162デフォルトの名無しさん:2006/12/10(日) 19:46:05
>>158
Borland C++ 5.5.1
拡張子で判断してくれてるんだと思ってたけど、
なんかオプション必要?
163デフォルトの名無しさん:2006/12/10(日) 19:48:39
>>162
namespace でエラーが出ないなら、 C++ としてコンパイルしてるはず。
どうせ C の実装をそのまま使いまわしちゃってるんだろう。
ここはソースを直すべき。
164デフォルトの名無しさん:2006/12/10(日) 20:16:52
>>163
どうも。
165デフォルトの名無しさん:2006/12/10(日) 21:40:38
Exceptional C++ Style で、コピーの生成を省略できる(RVO)理由として
「標準準拠のプログラムと区別がつかない限り、コンパイラは標準の
技術的要求と異なることをしても良い」
とあるのですが、意味がよく分かりません。
例えばコンストラクタで画面に文字を出力しているときなどでは、
コピーが省略されると結果が変わってくると思うのですが
166デフォルトの名無しさん:2006/12/10(日) 21:53:46
RVOは規格にやってよいと書かれているはず。
167デフォルトの名無しさん:2006/12/10(日) 22:01:27
>165
第何項の話?
168デフォルトの名無しさん:2006/12/10(日) 22:02:57
>>166
http://cpptips.hyperformix.com/cpptips/ret_val_opt.txt

>>165
その辺りの非効率改善と意味論的錯綜は、
RVOで何とか誤魔化そうとしたけど、誤魔化しきれなかったので、
次の規格で、move semantics, rvalue referenceってのを入れようとしてます。

A Brief Introduction to Rvalue References
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html
169デフォルトの名無しさん:2006/12/10(日) 22:03:57
>>167
書籍のことを言っているのなら187P
170デフォルトの名無しさん:2006/12/10(日) 22:06:32
>>167
12.8.15じゃん。
12.8 Copying Class Objects
171デフォルトの名無しさん:2006/12/10(日) 22:07:37
>>168
要するにいい加減になってるということですか?
(rvalue referenceは是非とも入ってほしいですね)
172170:2006/12/10(日) 22:07:44
ぐは!>>167を読み違えてるよ、俺。
173デフォルトの名無しさん:2006/12/10(日) 22:10:39
>>171
まああなたの>>165の疑問は正しい感覚であるということになると思います。
良く考えて読んでいる証拠かと。
12.8.15も読んどいてください。JIS規格はただで読めるので。
174デフォルトの名無しさん:2006/12/10(日) 22:25:20
>169
ごめんなさい.英語版しか持ってないんです…….

>172
曖昧な質問ですいません.書籍の項目番号を聞いてるつもりでした.

>165
上のレスで挙げられた規格の項目 12.8/15 にありますけれど
"even if the copy constructor and/or destructor for the object have side effects."
でも [N]RVO は許されていて
>例えばコンストラクタで画面に文字を出力しているとき
では RVO が機能しているかどうかで画面出力が変化します.
逆に,画面出力の回数で RVO が効いているかどうかを確認することができます.

ただし constructor/destructor に副作用があるかどうかで,コンパイラの
RVO に関する判断が変わる可能性も否定できませんけれど.
175デフォルトの名無しさん:2006/12/10(日) 22:30:33
>>174
私も書いた後でそんな気がしてましたw
「最適化と効率」の「24.constによる最適化」という項の、
Guru質問3の解説にあります
176デフォルトの名無しさん:2006/12/10(日) 22:38:42
>175
今,該当の項目読みましたけれど,ここは RVO とは直接の関係が無いと思います.
なので書いてあるとおり, z のコピーコンストラクタで副作用が発生するなら
copy を省略することはできないです (ここが RVO との差異).
177デフォルトの名無しさん:2006/12/11(月) 12:41:05
質問です。
関数の引数に渡されたインスタンスが、
ある複数のクラスを継承しているかをRTTIも用いずに判別する方法はあるでしょうか?

その判別が可能であれば、その後に各クラスのインタフェースでメソッドを呼びたいのです。
今のところ、苦肉の策として
class Hoge : public A , B;というクラスの場合、
void Func(A a,B b) のように含まれる型分の引数を増やした関数を作り、
全てに同じインスタンスオブジェクトを指定してもらうようにしています。
178デフォルトの名無しさん:2006/12/11(月) 13:11:54
コンパイル時ならtemplateでどうにでもなるんだけどなぁ。
MFCだとRUNTIME_CLASSなんてのがあったね。
179デフォルトの名無しさん:2006/12/11(月) 13:13:32
>>177
「複数のクラス」が全部空のインターフェースクラスなら、
単純にまとめたインターフェースクラスを取ればいいんだろうなぁ。
現状で実装が混ざってるんなら、そいつら切り離したら良いんじゃない?

あるいは、
class AB
{
virtual A& A() = 0;
virtual B& B() = 0;
};

class Hoge : public A, B, AB
にして
void Func(AB&);
とか。
180デフォルトの名無しさん:2006/12/11(月) 13:42:36
class A{
B b;
};

class B{
A a;
};

としたいんですが、やはりコンパイルエラーです。
どうすれば良いんでしょうか。
181デフォルトの名無しさん:2006/12/11(月) 13:57:31
>>180
それ無限入れ子になるから無理
182デフォルトの名無しさん:2006/12/11(月) 14:01:42
class A{
B*b;
};

class B{
A*a;
};

実はこれがしたいのを適当に省略してしまいました。
voidで我慢しないといけないんでしょうか。
183デフォルトの名無しさん:2006/12/11(月) 14:04:29
class B;
class A{
B*b;
};

class B{
A*a;
};
184デフォルトの名無しさん:2006/12/11(月) 14:05:01
arigatougozaimasita;
185デフォルトの名無しさん:2006/12/11(月) 21:29:28
>>177

class Q { public: virtual bool QueryClass( uintptr_t cid, void * & pSelf ) = 0; }

template<typename T> uintptr_t CLSID()
{
 static T * dummy = 0;
 return reinterpret_cast<uintptr_t>(&dummy);
}

class A { public: static uintptr_t CID() { return CLSID<A>() } ... };
class B { public: static uintptr_t CID() { return CLSID<B>(); } ... };

class AB : public A, public B, public Q {
 public:
  static int CID() { return CLSID<AB>(); }
  bool QueryClass( uintptr_t cid, void * & pSelf ){
   pSelf = 0;
   if( cid == A::CID() || cid == B::CID() || cid == AB::CID() )
    pSelf = this;
   return pSelf != 0;
  }
};
186デフォルトの名無しさん:2006/12/11(月) 22:47:22
感動した
流石template
187デフォルトの名無しさん:2006/12/12(火) 01:21:12
プログラムの事じゃないからここで聞いちゃいけないかもしれないけど・・・

小さい頃からプログラマーになりたくて中学校のときに中学生なりに勉強はしてたけど
普通の勉強が嫌いでプログラムの勉強ばっかりしてたら工業高校にいけなくて結局普通高に行った
学校は普通の授業ばかりでやる気も出ずに中退
プログラマーの夢も諦めてしばらくNEETやってたけどやっぱり親に頼りっきりってのも問題だと思って
もう一度プログラムの勉強始めてみた

でも中卒でプログラマーやPC関連の職に就けるとは思えない・・・
もし望みがまったく無いなら今のうちに諦めて別の職業を探そうかなと・・・

今から勉強をがんばったとして望みはありますか?
大検も一応受けようと思ってます
188デフォルトの名無しさん:2006/12/12(火) 01:26:26
プログラムの勉強ばっかりしてたら
数学も英語も必要になるのでどうにかなっただろう

君はバカなのだ
逆説的だが君はプログラマに向いている
望みはある
189デフォルトの名無しさん:2006/12/12(火) 01:52:26
>>188
数学も英語も一応使う部分は勉強して理解してたけど
その時の授業で使われないから意味が無かった・・・
好きなことに関しては勉強意欲もあるし長時間できるけど
国語や社会などの勉強は10分も出来ない・・・やる気が出ない・・・極端すぎた

就職する望みがあるならこのまま勉強続けたいと思います
とりあえずCとJavaかな・・・

ありがとうございましたw
190デフォルトの名無しさん:2006/12/12(火) 02:14:22
一気にスレのレベルが上がったなw
191デフォルトの名無しさん:2006/12/12(火) 02:27:08
大学入試でも私立なら国社はいらないし気にすることないんじゃないの
192デフォルトの名無しさん:2006/12/12(火) 02:35:30
>>187
正攻法で行っても、実力を評価される前に「足切り」されるのがオチ。
就職希望なら自分の実力を相手にはっきり示せる武器をまずは用意しろ、話はそれからだ。
あと、なにも就職することだけが職業プログラマへの道ではない。
193デフォルトの名無しさん:2006/12/12(火) 02:46:57
>>185
QueryClass の結果は戻り値使えばいいんじゃないの?
CLSID にある dummy の型は char const で十分だね。
uintptr_t を使ってる意味が分からない。 void const* を typedef すれば十分じゃないの?

とか、いろいろ突っ込みどころがあって気になったけど、面倒になったからあとはいいや。

>>186
これ、たぶん無駄な記述が多いから真似しないほうがいいよ。
194デフォルトの名無しさん:2006/12/12(火) 07:32:29
auto_ptr<>についての質問です。

動的に3次元配列のメモリをauto_ptr<>を使って確保したんですけど、
どうしたらいいのか、わかりません。
どうしたらいいんでしょうか?
195デフォルトの名無しさん:2006/12/12(火) 07:44:40
>>194
確保したんだったら、利用すれば?
利用するために確保したんでしょ?
196デフォルトの名無しさん:2006/12/12(火) 07:51:22
そもそも配列の保持にauto_ptrを使ってはいけない。
197デフォルトの名無しさん:2006/12/12(火) 09:32:34
>>194
boostにmulti_arrayというのがある
boost::multi_array<int, 3> ary(boost::extents[10][20][30]);
ary[0][1][2] = 123;
こんな感じで使える
198デフォルトの名無しさん:2006/12/12(火) 11:47:04
クラスのメンバに参照を持ちたいんですけど、ポインタで我慢しないといけないんでしょうか。
199デフォルトの名無しさん:2006/12/12(火) 11:52:38
>>199
我慢せずにどうぞ
200デフォルトの名無しさん:2006/12/12(火) 12:23:14
template<typename _Ty>みたいな使い方の利点はわかるんだけど
template<int _I>とかって存在理由がよくわからない。
テンプレートクラスなんかでもメンバ変数かなんかに保持してちゃだめなのかな。
201デフォルトの名無しさん:2006/12/12(火) 12:58:32
存在理由というか、そもそも使い方が分かってないので、
boost::lambdaでも読んで勉強してはどうか?
202デフォルトの名無しさん:2006/12/12(火) 13:05:48
>>200
配列の要素数のような定数式が要求される部分でもパラメータ化できる。
203デフォルトの名無しさん:2006/12/12(火) 16:43:17
>>200
引数に渡された配列の要素数がゲットできる。
204デフォルトの名無しさん:2006/12/12(火) 17:18:16
フィボナッチ数を計算できるw
205デフォルトの名無しさん:2006/12/12(火) 18:15:24
>>193
めんどくさがらずに書いていただきたい。
206デフォルトの名無しさん:2006/12/12(火) 18:16:05
上げてすまん。
207デフォルトの名無しさん:2006/12/12(火) 18:26:00
>>200
コンパイラに無茶な仕事をさせ、コンパイル時間を大幅に引き伸ばすことができる。
208デフォルトの名無しさん:2006/12/12(火) 21:30:15
>>200
C++学習者に意味のわからない奇妙な構文を浴びせ、
混乱に陥れる事が出来る。
209デフォルトの名無しさん:2006/12/13(水) 00:44:04
>>205 (>>185)
じゃ、書いてみる。

定型になっている CID() の定義を繰り返すのは無駄だろ。
QueryClass() の実装と継承関係に関連が無いのでまったく信用できない。

というわけで、そもそも >>177 への回答になっていなかったわけだ。
どうでもいいぜ。
210デフォルトの名無しさん:2006/12/13(水) 02:15:49
ここで質問に答えてる人に聞きたいんだけど、
何か問題解くためのソースをゼロから書きたいって思ったとき
完成するまでどのくらいの時間かかってんの?
たとえば、どんな問題でもいいけど、ソートとか。

やっぱり頭の中で簡単にアルゴリズムからソース生成できるのかな。
211194:2006/12/13(水) 02:59:06
保持するのにuato_ptr<>を使うのは間違いなんですか。
わかりました!
ありがとうございました!

boostですか。初めて見ましたw
これからそれについて勉強してみます。
ありがとうございました!
212デフォルトの名無しさん:2006/12/13(水) 10:50:10
テンプレートによるスマートポインタを作っているのですが、
void型をサポート可能にしてしまうと、operator*()が実装出来ずに困っています。
error C2182: '*' : 'void' 型が不適切に使用されています。
どのように解決すればよいでしょうか?ご教授下さい。
213デフォルトの名無しさん:2006/12/13(水) 11:11:53
特殊化
214デフォルトの名無しさん:2006/12/13(水) 12:14:07
>>213
なるほと、こんなときの特殊化でしたね。
ありがとうございました。
215デフォルトの名無しさん:2006/12/13(水) 15:50:23
>>210
ソートだと、STLとかのライブラリに頼り切ってるから
全部自分で書こうとすると悩むかも。クイックソートってどうやるんだっけ?とか。

簡単な問題なら、大まかなアルゴリズムがパッと思い浮かぶ。
で、もっとスマートにできないかとか、これで合ってるのかとかちょっと考える。
アルゴリズムが固まればコードに落とすのは簡単。その通りに書けばいいだけだし。
216デフォルトの名無しさん:2006/12/13(水) 17:10:32
>>210
スレ違いです。
217デフォルトの名無しさん:2006/12/13(水) 17:54:54
すみません。テンプレートで分からないことがあるのですが、

template<typename T> int function(vector<T> vec)
{
 ・・・
 return 0;
}
int main(){
 vector<int> vec;
 function<int>(vec);
 return 0;
}
このような感じだと
「function(class vector<int,alloc<int>>)が定義されていない」
といった感じのエラーが出てしまいます。

型がまだわからないvectorを引数に取る関数を定義するには
どうすればいいのでしょうか?
218デフォルトの名無しさん:2006/12/13(水) 18:15:02
>>217
コンパイルできたけど?
includeかnamespace忘れてない?
219デフォルトの名無しさん:2006/12/13(水) 19:11:37
あれ、、。
ちなみにコンパイラは何でしょう?

#include <vector>
using namespace std;
と冒頭で打ってるので大丈夫だと思うのですが。
220デフォルトの名無しさん:2006/12/13(水) 19:16:43
質問です
LinuxでC++を使う場合、開発環境はEcrips一択でしょうか?
他に便利なものがあれば教えてください
221デフォルトの名無しさん:2006/12/13(水) 19:17:05
>>219
gcc,vc,bcc
エラーがでる最小限のソース晒してくれ
222219:2006/12/13(水) 19:19:58
>>221
ちょっと時間ください。
大学が閉まりそうなので時間かかってしまうかもしれませぬ。
223219:2006/12/13(水) 20:11:00
思っていたソースとだいぶ違っていました。。
#include <vector>
using namespace std;
// default
template<typename T>
int func(T data);
// int
template<>
int func<int*>(int* data);
// vector
template<typename A>
int func<vector<A>*>(vector<A>* data);

// int
int func<int*>(int* data){
return 0;
}
// vector
template<typename A>
int func(vector<A>* data){
return 0;
}

int main(){
vector<int> ivec;
func(&ivec);
vector<float> fvec;
func(&fvec);
int i;
func(&i);
return 0;
}
224219:2006/12/13(水) 20:12:01
これだと、
test.cpp(12) : error C2768: 'func' : 明示的なテンプレート引数を使用することはできません。
となってしまいます。
型未定ベクタの特殊化をしたいのでが、うまい方法が分からないです。
何かいい方法はありませんでしょうか?
225デフォルトの名無しさん:2006/12/13(水) 20:21:41
関数の特殊化は無理
226デフォルトの名無しさん:2006/12/13(水) 20:28:38
227デフォルトの名無しさん:2006/12/13(水) 20:35:57
>>224
templateの特殊化はよく知らないのだけど、コンパイルできるように変えてみた
ただコンパイル通るようにしただけで、たぶん求めてるものと違うと思う

#include <vector>
using namespace std;
// default
template<typename T>
int func(T data);
// int
template<>
int func<int*>(int* data){
return 0;
}
// vector
template<typename A>
int func(vector<A>* data){
return 0;
}

int main(){
vector<int> ivec;
func(&ivec);
vector<float> fvec;
func(&fvec);
int i;
func(&i);
return 0;
}
228219:2006/12/13(水) 20:57:12
特殊化できないのですか…むしろする必要がない?きがしてきました。

それでコンパイル通りました。そんな感じで色々試してみます。
携帯からなのでアンカー省略しますが、みなさんありがとうございました。
229デフォルトの名無しさん:2006/12/13(水) 21:08:56
人格プログラムって作れるんですか?
230デフォルトの名無しさん:2006/12/13(水) 21:11:14
C++で?
231デフォルトの名無しさん:2006/12/13(水) 21:14:51
難しいことはよくわかんないです。プログラム自体どんなものかよく分からないし・・・・
ここの話題とは外れているんですけど・・・
232デフォルトの名無しさん:2006/12/13(水) 21:21:21
233デフォルトの名無しさん:2006/12/13(水) 21:23:57
教えていただいてありがとうございます
234デフォルトの名無しさん:2006/12/13(水) 21:53:36
1GBくらいのメモリを一気に必要とするプログラムを作ってるんですが。。。
物理メモリ1GBのマシンで走らせると、
スワップで死ぬほど遅くなります。。
スワップ走らせないで、物理メモリのみを確保するにはどうしたらいいんですか?
WinXPです
235デフォルトの名無しさん:2006/12/13(水) 21:55:44
>>234
XPは、カーネルが、100MB以上のメモリを必要とするが、どこから1GBのメモリは湧き出てくるのかね?
236デフォルトの名無しさん:2006/12/13(水) 21:56:52
>>234
仮想メモリを切っておく

ってのは冗談としてWin32API使わないと出来ないかも
237デフォルトの名無しさん:2006/12/13(水) 22:30:02
>>235
会社の共有スペースにメモリが落ちてます

>>236
そうですか。。。すれ違いですみません
238デフォルトの名無しさん:2006/12/13(水) 22:54:13
絶対にスワップしないと保障できるメモリはAWEで確保できるが、
AWEはあまり使いやすいとは思えない。
大抵の用途ではオーバースペックだし。


そもそもAWEを有効にするには、BOOT.INIを変更する必要があるし。
239デフォルトの名無しさん:2006/12/13(水) 22:55:08
スレ違いも程ほどに
240デフォルトの名無しさん:2006/12/13(水) 23:15:58
>>234みたいな糞はともかくとして
PCの知識が不足気味な奴って結構いるよな
241デフォルトの名無しさん:2006/12/13(水) 23:25:41
むっかーーーーー!!!!!!!!!!!!!!!
ぷりぷり
242デフォルトの名無しさん:2006/12/13(水) 23:28:12
>>240
クズは死になさい
243デフォルトの名無しさん:2006/12/13(水) 23:32:01
>>238さん
ありがとうございます。
AWE調べてみます。

>>240さん
糞に糞と言われたくありません。
244デフォルトの名無しさん:2006/12/13(水) 23:37:19
>>243
うんこ
245デフォルトの名無しさん:2006/12/13(水) 23:41:08
>>243
( ・∀・)つ三三三三三● ウンコクラエ!!
246デフォルトの名無しさん:2006/12/13(水) 23:51:10
>>243がウンコもらした
247デフォルトの名無しさん:2006/12/13(水) 23:51:41
おい、なんか>>243のほうから臭うんだが・・・
248デフォルトの名無しさん:2006/12/13(水) 23:52:33
>>243
いちいち構うな。
249デフォルトの名無しさん:2006/12/13(水) 23:57:58
>>243
250デフォルトの名無しさん:2006/12/13(水) 23:59:00
うんこだけに>>243の人気に嫉妬!(shit)
251デフォルトの名無しさん:2006/12/14(木) 00:00:27
>>250
だれがうまい事ry
252デフォルトの名無しさん:2006/12/14(木) 00:01:30
>>250を無視リストに入れた
253デフォルトの名無しさん:2006/12/14(木) 00:12:41
>>50
責任は取りなさい。
254デフォルトの名無しさん:2006/12/14(木) 00:17:48
急速にスレの質が低下してまいりました
255デフォルトの名無しさん:2006/12/14(木) 00:27:00
ム板ではよくあること
256デフォルトの名無しさん:2006/12/14(木) 01:02:55
>>217
> といった感じのエラーが出てしまいます。

ずばりエラーメッセージそのものを張りなよ。
257220:2006/12/14(木) 01:21:30
>>226
ありがとうございます
258デフォルトの名無しさん:2006/12/14(木) 14:49:25
拡張子の問題なんだけど

*.hpp, *.cpp
のファイルはboostと同じ命名方法でclassを書いた

.hxx, cxx
適当な命名規則でむちゃくちゃ

が混在していて

A.hxx
A.hpp
A.cpp
で2つのヘッダーに分けるか2重に名前定義するか迷ってるんだけど
なにかいい解決方法ない?
259デフォルトの名無しさん:2006/12/14(木) 19:52:11
>>258
よくわからんが、「適当な命名規則でむちゃくちゃ」を捨てればいいんじゃね?
260sage:2006/12/14(木) 22:46:09
すみません、低レベルで申し訳ないのですが、
int* num;
はポインタですよね、
int& num;
の意味は何でしょうか?
261デフォルトの名無しさん:2006/12/14(木) 22:50:05
リファレンス
262デフォルトの名無しさん:2006/12/14(木) 22:55:08
参照
263デフォルトの名無しさん:2006/12/14(木) 23:03:30
ありがとうございます。
あと、クラスのconstメンバや参照メンバ
の初期化ってどうすればいいのでしょうか?
264デフォルトの名無しさん:2006/12/14(木) 23:07:39
きりがないから、まず本なりで一通り勉強しろ。
265デフォルトの名無しさん:2006/12/14(木) 23:14:20
すみません。質問禁止とは知りませんでした。
申し訳ないです。
明日図書館に行ってみます。
266デフォルトの名無しさん:2006/12/14(木) 23:19:35
禁止ではないが、入門レベルの本を見ればずばりの方法が書いてあることは、本を見ろよと思う。
お前以外にも山ほど同じような疑問を抱くやつは出てくるから答えるほうだって飽きてくる。
267デフォルトの名無しさん:2006/12/14(木) 23:24:40
>>263
コンストラクタの初期化リストで行う
というか行わないとエラーになるだろ
268デフォルトの名無しさん:2006/12/14(木) 23:37:26
参照はともかくconstなメンバはコンストラクタで代入しても、実は平気。
コンストラクタ・デストラクタの中ではconstがないものとして扱われるはず。
勿論なるべく初期化リスト使うべきだろうが。
269デフォルトの名無しさん:2006/12/14(木) 23:47:22
気持ち悪い仕様だな
270263:2006/12/14(木) 23:55:24
みなさん本当に申し訳ありません。
明日図書館で調べてみます。
迷惑かけてしまって本当にすみませんでした。
271デフォルトの名無しさん:2006/12/14(木) 23:58:00
>>268
おい、嘘付くな。
コンストラクタ内でconstに代入しようとしたら当然のごとく
コンパイルエラーになったぞ。

staticでないconstは初期化リスト、staticの場合は外部で
定義するか、static const intだけは直接書いてもいいけど、
コンストラクタ内ではだめだろ。
272268:2006/12/15(金) 00:21:48
本当だ、すまん。
オブジェクト自身にconstが付いている場合とごっちゃにしていた。○| ̄|_
273デフォルトの名無しさん:2006/12/15(金) 00:38:44
>>272
>オブジェクト自身にconstが付いている場合とごっちゃにしていた。○| ̄|_

どういうこと?
274デフォルトの名無しさん:2006/12/15(金) 03:23:43
1418544個のデータをint型の配列に格納しようとしたんですけど、
異常終了っていうんでしょうか?強制的に終了しました。
int data[1418544]も一気に確保する事ってできないようになってるんでしょうか?
275デフォルトの名無しさん:2006/12/15(金) 03:42:04
>>274
お前がMS-Windowsを使っているなら、デフォルトのスタックは1MBだ。
後は分かるな?
276デフォルトの名無しさん:2006/12/15(金) 04:14:41
>>275
?! そうだったんですか!

分けなくてはならないって事でしょうか?
どうしたらいいんでしょうか?
277デフォルトの名無しさん:2006/12/15(金) 05:00:38
つnew
278デフォルトの名無しさん:2006/12/15(金) 05:19:20
あっ!
ありがとうございました!
279デフォルトの名無しさん:2006/12/15(金) 13:16:01
Cの基礎勉強しなおしたいんですけど、
基礎とその基礎を使った問題が載ってる本てあるんでしょうか?
何かお勧めの本あったら教えてください
280デフォルトの名無しさん:2006/12/15(金) 13:25:15
独習C
281デフォルトの名無しさん:2006/12/15(金) 13:42:56
独習シリーズは簡単すぎると思うのはオレだけ?
282デフォルトの名無しさん:2006/12/15(金) 15:45:02
というより独習C++から初めても簡単だからね。
283デフォルトの名無しさん:2006/12/15(金) 16:02:30
boostのシリアライズって、
ポインタを渡しても自動的にポインタが指すインスタンスが
シリアライズされますよね?
あれってどうやって、ポインタか否か判別してるんですか?
284デフォルトの名無しさん:2006/12/15(金) 16:43:37
んー、俺のスキルでは簡単にまとめられん。
ソース嫁。
285デフォルトの名無しさん:2006/12/15(金) 17:03:29
type_traints
286デフォルトの名無しさん:2006/12/15(金) 17:23:59
ポインタで特殊化してるとか?
287デフォルトの名無しさん:2006/12/15(金) 18:12:56
>>284
読んでみました。
extended_type_infoとかあやしいんですが、
ややこしいですね…

>>285
ブースト内検索してみましたが
出てこなかったです。

>>286
う〜ん。見た感じserialize関数はテンプレート使ってないです。
最初それでやってたんですが、記述量が無駄に増えてスマートにならなかったので、
boostはどうしてるのか気になったんです。
288デフォルトの名無しさん:2006/12/15(金) 18:14:18
289デフォルトの名無しさん:2006/12/15(金) 18:19:13
あ、type_traitsですね。
ありがとです。
調べてみます。
290デフォルトの名無しさん:2006/12/15(金) 20:05:18
↓のソースコードみたいにyやnを入力してループを終了するのではなく、

 画面に
  continue finish
 のようなのを用意しておき、方向キーの「←」「→」で、
 選択した方されたほうを、括弧([ ])で
  continue [finish]
 のように表示させて、enterキーを押すと
 決定される(上の場合はループを抜ける)ようにしたいのですが、
 どうしたらいいのでしょうか?

#include <iostream>
using namespace std;

void main()
{
char cInput = 'n';
do {
cout << "終了する場合は y を入力\n";
cin >> cInput;
} while ( cInput != 'y' );
return 0;
}
291デフォルトの名無しさん:2006/12/15(金) 20:13:09
環境依存。他所でどうぞ。
292デフォルトの名無しさん:2006/12/15(金) 20:16:16
>>291

はい。
293デフォルトの名無しさん:2006/12/15(金) 20:16:40
ブロッキングせずに入力状態にするのってスレッド使わなきゃ無理?
294デフォルトの名無しさん:2006/12/15(金) 20:35:38
環境依存。
295デフォルトの名無しさん:2006/12/15(金) 22:27:38
gcc 3.4.5使ってます

template< class T, class T2 > class Hoge {
public:
 map< T, T2 > _map;
 map< T, T2 >::iterator GetBegin(){ return _map.begin(); }
};

と書くと、"expected ';' before GetBeginとエラーになります。
map< T, T2 >::iteratorって文法違反なのでしょうか?
296デフォルトの名無しさん:2006/12/15(金) 22:29:26
typename map<T, T2>::iterator
297デフォルトの名無しさん:2006/12/15(金) 22:31:40
ありがとうございます。
出来ました。typename必要だったのですね・・
VSだとiterator前にtypename無くてもOKだったので気づきませんでした
298デフォルトの名無しさん:2006/12/16(土) 05:22:59
VC++じゃない方のC++で
分かりやすくMakefileの書き方が載ってるサイトがあれば教えてください
299デフォルトの名無しさん:2006/12/16(土) 06:25:55
>>298
スレ違い……いや、鼬害だ。
Makefileは言語に関係なく書式が決まっている。先ずはmakeのマニュアルページでも見たまえ。
300デフォルトの名無しさん:2006/12/16(土) 10:56:12
>>298
UNIXプログラミングスレで答えておきました。
301デフォルトの名無しさん:2006/12/16(土) 14:09:31
>>299
鼬害(?)失礼しました。

>>300
ありがとうございました。
302デフォルトの名無しさん:2006/12/16(土) 17:01:21
一応この板にもmakeスレはあるけどな。
ttp://pc8.2ch.net/test/read.cgi/tech/1029599472/

俺はmakeわけわかめだったからもうビルドツール自作した。
303マリー:2006/12/17(日) 12:08:55
antにすればいいじゃない
304デフォルトの名無しさん:2006/12/17(日) 12:36:02
C++だったらboost jamだろ
305デフォルトの名無しさん:2006/12/18(月) 12:51:27
#define max
が使ってるライブラリのどこかにあるみたいなんだけど
(max)って書くと避けられるとも聞いたのだが
(max) = #define max のこと?
306デフォルトの名無しさん:2006/12/18(月) 12:53:57
環境依存スレへ
307デフォルトの名無しさん:2006/12/18(月) 13:33:03
言語仕様の話だろ

#undef max
でいいんじゃないか?
308デフォルトの名無しさん:2006/12/18(月) 14:42:47
>>305
()をつけるとマクロ展開が抑制される。
309デフォルトの名無しさん:2006/12/18(月) 15:02:05
maxを定義しているのが<windows.h>の中からなら#define NOMINMAX
310デフォルトの名無しさん:2006/12/19(火) 01:56:19
>>308
引数つきの奴だけ、な。
311デフォルトの名無しさん:2006/12/19(火) 09:02:06
stringstreamの内部バッファをクリアするには
どうすればいいのでしょうか?



312デフォルトの名無しさん:2006/12/19(火) 09:17:42
>>311 str(string())
313311:2006/12/19(火) 09:27:19
>>312
本当にありがとうございました。

pubsetbuf、clearとかそれらしいものみてたけど
str()で取得できるのは知ってたんで
まさかstrで設定もできるとは...orz

io関係の命名則、意地悪すぎ...
314デフォルトの名無しさん:2006/12/19(火) 18:15:31
stringstreamの内部バッファのサイズを変更する方法を教えてください。
315デフォルトの名無しさん:2006/12/19(火) 18:20:46
数値計算系のプログラムつくってると
デバックのために、計算の途中結果を図でみたくなることがよくある

例えば
std::vector<double> a(100)
のヒストグラムを図でみたくなったりする

こういう場合に図示するのに使えるライブラリーとかないのでしょうか?

例えばこんな感じです

std::vector<double> a(100)
....
plot_hist(a);
wait_key(0);

316デフォルトの名無しさん:2006/12/19(火) 18:36:07
>>315
C++を使わずにRを使いましょう。
317デフォルトの名無しさん:2006/12/19(火) 20:04:25
静的なstd::mapを作成する方法ってないですかね
enum{id_0,id_1,id_2};
static const std::map<int,char*> m ={
{id_0,"val0"},{id_1,"val1"},{id_2,"val2"}
};
キーと値のマッピング情報はコンパイル時に確定しているので、
わざわざ動的にmapを生成するのは無駄の様な
気がします・・
318デフォルトの名無しさん:2006/12/19(火) 21:05:38
普通にchar*の配列じゃだめなのか・・・?
319デフォルトの名無しさん:2006/12/19(火) 21:11:33
>>318
vectorじゃなくてmapなんだから、きっとこんなenumなんだよ。たぶん。
enum ID {id_1= 10001, id_2 = 10001} ;
320317:2006/12/19(火) 21:21:58
>>318まさに>>319の通りです。keyが0オリジンとは限らないし、stringの場合もあります
今までは
struct foo{ int key,char* val };
foo[]={ {1,"one"},{3,"tree"},{5,"five"}};
してループでサーチしたりしてたんですが
せっかく標準で用意されてるんだからmap(set)を使えばサーチが楽じゃね?

と思ったわけです
321デフォルトの名無しさん:2006/12/19(火) 21:36:06
binary_searchでも使っとけ
322デフォルトの名無しさん:2006/12/19(火) 23:19:32
1つのクラスにメンバが100個(含むポインタ)くらいあるんですが、
コピーコンストラクタとコピー代入演算子はどう書けばいいんでしょう。。。
323デフォルトの名無しさん:2006/12/19(火) 23:27:16
>>322
俺ならそのクラスをrm
324デフォルトの名無しさん:2006/12/19(火) 23:40:10
>>322
設計からやりなおせ
325デフォルトの名無しさん:2006/12/19(火) 23:45:56
ソース書き直しとか
設計やり直しって、
本当に効果あったことあります?
326デフォルトの名無しさん:2006/12/19(火) 23:46:18
重量級だなオイ
327デフォルトの名無しさん:2006/12/19(火) 23:49:16
>>322
先ずそのクラスの100個のメンバを4個に分けてそれぞれクラスとする。
次にその4個のクラスの平均25個のメンバを5個に分けてそれぞれクラスとする。
更に、20個+4個+1個のクラスについてコピーコンストラクタを用意すればいい。
328デフォルトの名無しさん:2006/12/19(火) 23:52:22
>>327
えーまじーー???
100個書くのは変わんないじゃんwww
329デフォルトの名無しさん:2006/12/20(水) 00:01:31
いっそのことコピー不可にしちゃえ
330デフォルトの名無しさん:2006/12/20(水) 00:03:57
>>325
当然ある。
331デフォルトの名無しさん:2006/12/20(水) 00:06:28
クラスの「仕様の継承」について質問なのですが
メソッドは virtual void func() = 0; の様に宣言するとしても
コンストラクタはどうすればいいのでしょうか?
特定の型を引き受けるコンストラクタ、というのを用意しようとしたとき
その実装をサブクラスに要求するにはどうすればいいか、という事なんですが・・・
332デフォルトの名無しさん:2006/12/20(水) 00:07:44
>>331
コンストラクタは継承されないから、
変わりにgetInstanceとかを用意するとかかね
333デフォルトの名無しさん:2006/12/20(水) 00:08:18
>>325
全く同じ知識経験の人間がもう一度設計しても同じものになるのは当たり前。
問題点を把握してればそれなりに意味はある。
334デフォルトの名無しさん:2006/12/20(水) 00:13:32
>>332
C++の機能とか予約語の事じゃなくて
「欲しい型のデータを取るメソッドを用意しろ」ってことですよね、
要するにコンストラクタは使わないと

やっぱりそれしかないですか・・・
335デフォルトの名無しさん:2006/12/20(水) 00:30:08
class Hoge {
public:
Hoge(int foo) {}

private:
Hoge(); //no implement
};

じゃダメ? >>334
336デフォルトの名無しさん:2006/12/20(水) 01:09:59
>>331
どうせ template で使うんだろ?なら concept を定義するんだ。
今のところ言語は何も助けちゃくれないけどな。
337デフォルトの名無しさん:2006/12/20(水) 01:54:16
VC++6.0でこうやっても大丈夫なんですけど。
これって規格ではどうなんですか?安全が保障されてます?
void *p = NULL;
delete p;
free(p);
338デフォルトの名無しさん:2006/12/20(水) 01:55:21
>>337 何にも起こらない。安全。
339デフォルトの名無しさん:2006/12/20(水) 02:02:12
>>338
じゃあNULL判定しなくてもいいな。どうも。
340デフォルトの名無しさん:2006/12/20(水) 02:10:01
free(NULL)はどうだっけ?
341デフォルトの名無しさん:2006/12/20(水) 02:16:50
free(NULL); は問題ナシ。
delete NULL; はコンパイルエラーになりましたよ。
(VC++6.0 Pro SP6)
342デフォルトの名無しさん:2006/12/20(水) 07:32:28
>341
よーくかんがえろ。C++では
#define NULL 0
なので、文脈によってはポインタとして扱われない。キャストが要る。
343デフォルトの名無しさん:2006/12/20(水) 08:49:48
そこでnullptrですよ
344デフォルトの名無しさん:2006/12/20(水) 09:09:20
そこでnullpoですよ
345デフォルトの名無しさん:2006/12/20(水) 09:16:01
ゲッ
346デフォルトの名無しさん:2006/12/20(水) 18:02:50
STLのsetを使っていて、だいたい

set<X> a;
a.insert(b);

のようなことをやると、

Core was generated by `XYZXYZ'.
Program terminated with signal 11, Segmentation fault.
#0  0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique ()
(gdb) backtrace
#0  0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique ()
#1  0x4000000000002aa0 in main??unw ()

のような感じでエラーになってしまうようです。
(完全に再現性のある小さいコードを用意することが
出来ませんでした。すみません。)

コンパイラはicc9.0で、gccだと問題なく動作します。
個人的にはsetのinsertでcoreを吐くというのは、
あまりないような気がするのですが、どういうことを
念頭におきながらデバッグすればよいでしょうか?
347デフォルトの名無しさん:2006/12/20(水) 18:26:22
346です。
すみません、どうやらスレ違いみたいですね。
ttp://pc8.2ch.net/test/read.cgi/tech/1160821240/l50
で質問させていただきます。
348デフォルトの名無しさん:2006/12/20(水) 19:45:45
すごく初歩的な質問なんですけど、
CMyClassというクラスのcppファイル内で

#define FILEPATH L"C:\Test\File"
(中略)
void CMyClass::test
{
CString ss = FILEPATH;
}

というコードを記述してコンパイルすると
error C2065: 'INIFILEPATH' : 定義されていない識別子です。
というエラーが出てきてしまいます。#defineの使い方を
間違っているのでしょうか?であるならば正しい使い方を教えてください。
よろしくお願いします。

349デフォルトの名無しさん:2006/12/20(水) 20:04:00
エラー嫁。
350348:2006/12/20(水) 20:07:40
>>349
すみません、名前間違っていたのを直しました。
ですがそれでも同じエラーが出てきてしまったんですけど
根本的になにか間違っているんでしょうか?
351デフォルトの名無しさん:2006/12/20(水) 20:23:22
ソース晴れ
352デフォルトの名無しさん:2006/12/20(水) 20:24:28
バックスラッシュ絡み?
353348:2006/12/20(水) 20:42:47
みなさんすみません
ソースではなくヘッダーに記述したところ
コンパイル通りました。
お騒がせいたしましたm(_ _)m
354デフォルトの名無しさん:2006/12/20(水) 20:46:32
しかし\は\\にしないといかんと思うが
355デフォルトの名無しさん :2006/12/21(木) 01:16:59
>>348
C++で定数つかうならconstで
あとVC++みたいなので
const WCHAR *const FILEPATH = L"C:\Test\File";
356デフォルトの名無しさん:2006/12/21(木) 01:21:19
>>355
const WCHAR *const FILEPATH = L"C:\\Test\\File";
だろう
357デフォルトの名無しさん:2006/12/21(木) 02:08:59
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
358デフォルトの名無しさん:2006/12/21(木) 02:35:30
257 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
359デフォルトの名無しさん:2006/12/21(木) 03:09:20
257?
360デフォルトの名無しさん:2006/12/21(木) 07:52:21
>>356
const WCHAR FILEPATH[] = L"C:\\Test\\File";
だろう
361デフォルトの名無しさん:2006/12/21(木) 15:15:07
注.:.私.の.有.意.義.な.発.言.に.対.し.、.自.分.の.理.解.不.足.を.棚.に.上.げ.煽.り.、.1.行.レ.ス
で.返.す.方.が.多.い.よ.う.で.す.が.、.そ.の.よ.う.な.方.は.ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く
ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い.の.で.お.黙.り.下.さ.い.。
ま.た.質.問.者.は.回.答.者.に.知.識.を.披.露.す.る.場.を.与.え.る.貴.重.な.存.在.な.の.で.、
質.問.者.を.見.下.し.た.回.答.、.あ.ま.り.に.も.儀.礼.を.欠.い.た.回.答.も.厳.重.に.禁.止.い.た.し.ま.す.。
忙.し.い.中.、.少.な.い.時.間.の.合.間.を.縫.っ.て.質.問.し.に.来.て.る.わ.け.で.す.の.で.、
そ.の.辺.ご.承.知.下.さ.い.。.な.お.、.当.方.が.質.問.に.対.し.て.有.意.義.な.答.え.で.あ.る.と
判.断.し.た.方.に.は.評.価.い.た.し.ま.す.の.で.各.自.よ.く.調.べ.、.よ.く.考.え.正.確.な.回.答.を.す.る.よ.う.に.。
362デフォルトの名無しさん:2006/12/21(木) 18:57:23
テンプレートの部分的特殊化で

template<class T> class Hoge{ /* ... */ };
template<class T, class U> class Hoge<T(U)>{ /* ... */ };

というコードを見たんですが、
T(U)という書き方はC++標準に適合しているのですか?
363デフォルトの名無しさん:2006/12/21(木) 20:12:01
クラスへのポインタがNULLでも
とりあえずメソッド呼べるんだねー
(もちろんメンバにアクセスしないメソッドだけだけど)

364デフォルトの名無しさん:2006/12/21(木) 20:22:59
>>363
鼻から悪魔が出てるぞ
365デフォルトの名無しさん:2006/12/21(木) 20:24:13
>>362
T(U)は、U型を引数に取りT型を返す関数型。

>>363
静的メンバがなかった頃には、それで代用していたらしい。
今の規格では、たぶんそれをやるとどうなるかは未定義にしていると思う。
366362:2006/12/21(木) 20:33:23
>>365
ありがとうございます
ところで規格書のどのセクションにあるかわかりますか?
367デフォルトの名無しさん:2006/12/21(木) 20:34:46
質問です

newで確保したメモリに対して、
2回delete走らせると死ぬのはなぜですか?
368デフォルトの名無しさん:2006/12/21(木) 20:40:24
平気と思うその感覚がわからん。
369デフォルトの名無しさん:2006/12/21(木) 20:42:03
Linux上でg++を使ってプログラムを書きたいと思っています。
標準ライブラリのオンラインマニュアルはどのようにしたらみれるのでしょうか?
(日本語でも英語でも構いません)
370デフォルトの名無しさん:2006/12/21(木) 20:45:10
>>366
強いて言えば8.3.5@JIS X 3014:2003

>>365
deleteされても、deleteしたポインタを指す変数は、そこを指していると言う状態のままである。
そこで、2度目のdeleteを行うと、deleteされたはずの場所をdeleteしようとして、あらぬことになる。

原理的には1度目のdeleteの後で、そこを指す変数に0を代入しておけば2度目のdeleteでは、
ヌルポインタをdeleteすることになって落ちない(ヌルポインタのdeleteは何も起きないと定められている)。
勿論実際には、2度もdeleteするなと言う話になるが。
371デフォルトの名無しさん:2006/12/21(木) 20:53:59
>>370
丁寧なご説明
ありがとうございました。
372デフォルトの名無しさん:2006/12/21(木) 20:55:27
const変数の値が書き換わってしまうのってどんな場合がありますか?
(メモリ直接上書きとconst_cast以外で)
373デフォルトの名無しさん:2006/12/21(木) 20:57:03
放射線
374デフォルトの名無しさん:2006/12/21(木) 20:59:45
375デフォルトの名無しさん:2006/12/21(木) 21:16:35
const変数の値が書き換わるかどうかは未定義では?
const_castは実際にはconstでないオブジェクトへのconstポインタのconstを外すのに使われるだけ
つまり、
int a = 0;
void f(const int* a){
*const_cast<int*>(a) = 1;
}
これはおk
const int a = 0;
void f(const int* a){
*const_cast<int*>(a) = 1;
}
未定義
376デフォルトの名無しさん:2006/12/21(木) 21:20:19
>>370
そこで auto_ptr ですよ。
377デフォルトの名無しさん:2006/12/21(木) 23:56:10
質問です。

WinXP Pro
VC2005 SP1

RaiseException にて発生させたエラーを、ただの try でキャッチしたいのですが、
try {
378377:2006/12/21(木) 23:59:20
質問です。

RaiseException にて発生させたエラーを、ただの try でキャッチしたいのですが、
catch (...)
だとキャッチ出来ます。さらに詳しい情報が欲しいため、catch の () の中に書くべき
コードがわかりません。そもそも、仕様上無理なものなのでしょうか?

ちなみに、__except では成功しました。

WinXP Pro
VC2005 SP1
コンパイルオプションで、「SEH の例外あり (/EHa)」を指定しています。
379デフォルトの名無しさん:2006/12/22(金) 00:27:36
そもそも標準にRaiseExceptionなんてものは無いわけで
380369:2006/12/22(金) 00:37:13
>>374
ありがとうございました。
381デフォルトの名無しさん:2006/12/22(金) 00:39:23
>377
Windowsの構造化例外をC++例外に変換する方法があるが
環境依存なのでスレ違い
382377:2006/12/22(金) 04:49:07
>>381
ありがとうございます。
381さんの書き込みで解決しました。
383デフォルトの名無しさん:2006/12/23(土) 14:57:35
MFCスレで聞いたら、スレ違いといわれたので、こちらに来ました。

VC++6.0 WinXPProで開発を行っております。
ダイアログアプリの開発を行っており、そのアプリ上で、XPログオン用のユーザ名とパスワード
を利用者に打ち込ませています。このパスワードが正しいかどうかを、開発したプログラム上で
確認したいと思っているのですが、どのようにすればよろしいでしょうか。
384デフォルトの名無しさん:2006/12/23(土) 15:06:20
>>383
strcmp() でいいんじゃね?

っていうか、まずは自分で書け。
それで困ったことがあったら相談してもいいから。
385デフォルトの名無しさん:2006/12/23(土) 15:12:02
いや、>>383は、そのユーザ名とパスワードが、
正しいアカウントとパスワードであるかどうかを確認したいんじゃないのか。

しかし、そんなAPIはエクスポートされているのかね。
386デフォルトの名無しさん:2006/12/23(土) 15:13:13
>>384
strcmpだと、Windowsパスワードとの比較ができません。
そもそも、Windowsパスワード自体知らないわけで、知らない文字列との比較は……
387デフォルトの名無しさん:2006/12/23(土) 15:15:21
APIスレのが適切だと思うけどな
APIで、パスワードが「必ずある」ならLogonUserあたりかもしらん
自PCパスワードつきのアカウント1個もないからわからんけど
388デフォルトの名無しさん:2006/12/23(土) 15:19:43
あまり環境依存な話は持ち出すべきじゃないと思うが、
ぐぐったら一発でヒットしたぞ。
面倒そうではあるが。
ttp://support.microsoft.com/kb/180548


というわけで終了。
389383:2006/12/23(土) 15:52:22
ありがとうございます。
390デフォルトの名無しさん:2006/12/25(月) 00:02:49
イブだけど、とりあえずtemplateがキモすぎて俺は失禁しそうです><
391デフォルトの名無しさん:2006/12/25(月) 00:55:50
>>390
クリスマスに失禁とはとんだ茶番だな
392デフォルトの名無しさん:2006/12/25(月) 01:00:54
fstreamのバイナリモードで数メガのファイルを数バイトずつシークし読み取って変数に格納してるんですが、
なんだかHDに優しくないような気がしてきました。
もっと外道でないやり方はありますか?
393デフォルトの名無しさん:2006/12/25(月) 01:03:13
>>392
シークする必要はどうしてあるの?どういう格納方法になってるんだ?
394デフォルトの名無しさん:2006/12/25(月) 01:03:50
環境依存だがデカいファイルの読み書きにはmemory mapped fileを使うべし。
395デフォルトの名無しさん:2006/12/25(月) 01:11:30
>>392
バッファリングされているから問題ない
396デフォルトの名無しさん:2006/12/25(月) 01:13:33
>>392
std::getline()でstd::stringにファイルを一括して読み込み、それを元に
std::stringstreamを作成し、そこから変数を読み取る。

シークの部分はstd::stringstreamではseekpとseekgの意味が異なるので
移植に注意。
397デフォルトの名無しさん:2006/12/25(月) 01:15:20
うわっやべえ
ベンチマーク取って遊びたくなってきた。

どちらが速いのか?あーでもファイルはディスクキャッシュを無効に
したりいろいろしないといけないので面倒だな。
398デフォルトの名無しさん:2006/12/25(月) 02:59:35
extern "C" void register_callback(void* object, void (*callback)(void* object));

C で作ったライブラリにこんな関数あるんだけど、こいつにクラスの
インスタンスを食わせたいとき、

class C {
public: void foo() { register_callback(this, callback); }
private: static void callback(void* this_);
};

こんなふうに書いてたんだ。コンパイルも通るし、動作にも問題ない。
でも実は extern "C" の中にある関数の型と C++ で普通に宣言した
関数じゃ型が違うらしいんだ。つまり register_callback() に渡す
関数は extern "C" で宣言しないとダメってことね。

それじゃぁってことで、

extern "C" void callback(void* this_);
class C {
public: void foo() { register_callback(this, callback); }
private: friend void callback(void* this_);
};

としたんだけど、これだと callback() が外部シンボルになってしまう。
じゃぁ static つければ内部リンケージになるだろうと思ったけど、

static extern "C" void callback(void* this_);

はコンパイル通らなかった。

どうすればいいと思う?
399デフォルトの名無しさん:2006/12/25(月) 03:01:18
>>>398
extern "C" の関数にthisポインタを渡さないようにする。これで解決。
400デフォルトの名無しさん:2006/12/25(月) 08:34:12
コンパイルもとおって動作に問題もなくて
何がダメだったのかが分からない
401デフォルトの名無しさん:2006/12/25(月) 09:29:55
extern "C"の意味を理解してないのがダメ。
C++側で、Cの流儀に合わせる願望がダメ。
402デフォルトの名無しさん:2006/12/25(月) 10:08:48
extern "C" の関数を別につくり、クラスへのアクセスはそこ経由のみ、とか
403デフォルトの名無しさん:2006/12/25(月) 11:54:03
>>400
規格の 7.5p1 より
"Two function types with different language linkages are distinct types even if they are otherwise identical."
ということで C++ language linkage を持つ C のメンバ関数 callback() は
C language linkage を持つ register_callback() の引数 callback とは型が違うことになる。

型が違えばエラーになるはずなんだが、コンパイルが通る。ってことは
暗黙の変換か何か行われるのかと思うけど、規格にそんな記述は無い。

型を合わせるために extern "C" をつければいい( >>402 の方法ね)んだけど、
そうすると外部リンケージを持つことになるんで名前付けが面倒。そもそも
別のソースから呼び出したいわけじゃない。
404デフォルトの名無しさん:2006/12/25(月) 12:14:14
Linkage from C++ to objects defined in other languages
and to objects defined in C++ from other languages is
implementation-defined and language-dependent. Only
where the object layout strategies of two language
implementations are similar enough can such linkage
be archived.
405デフォルトの名無しさん:2006/12/25(月) 12:35:49
これだな。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316

規格に沿って修正するとえらいことになってしまう罠。
pthread_create() に C++ の関数渡してるコードなんて
山ほどある。 qsort() や bsearch() もヤバイ。
406デフォルトの名無しさん:2006/12/25(月) 12:47:15
>>405
それとは違うでしょ。
同じ名前使ってるんじゃなくて、
リンケージの違うものを渡して型は大丈夫なのかって話だから。
大丈夫でしょ。

callbackにstatic修飾は必要なの?
407デフォルトの名無しさん:2006/12/25(月) 12:51:09
>>406
extern "C" と extern "C++" で関数の型を区別するかどうかってことで、
関連はあるだろう。

static つけないとプログラム全体で完全にユニークな名前をつける必要が
あるんで、面倒になる。
408デフォルトの名無しさん:2006/12/25(月) 13:09:06
static付けると void (C::*)(void*) ではなくて、
void (*)(void*) と見做されているみたいだが。> g++
409デフォルトの名無しさん:2006/12/25(月) 13:23:01
>>408
そんなことはみんな知ってて話してる。
410デフォルトの名無しさん:2006/12/25(月) 14:15:33
>>408
当たり前だろwwwwボケはすっこんでろwwwwwwww
411デフォルトの名無しさん:2006/12/25(月) 14:17:04
410は初めて知ったようだ
412フォルトの名無しさん:2006/12/25(月) 15:12:44
どうみてもC++の基礎知識の欠如です
本当にメリークリスマスでした
413デフォルトの名無しさん:2006/12/25(月) 15:40:26
>>403
規格でも認められてる。よく読め。
414デフォルトの名無しさん:2006/12/25(月) 17:59:57
初歩的な質問で恐縮ですが教えてください。

int n=10;
int & nRef = n;

上記のような宣言が行われているとして、あるタイミングで
変数nRefに別の参照を設定したいのですが、

int i=8;
nRef = i;

としてみても変わらず変数nを参照してしまいます。
どうしたらよいのでしょうか?

415デフォルトの名無しさん:2006/12/25(月) 18:03:15
ポインタにする。
416デフォルトの名無しさん:2006/12/25(月) 18:06:52
ポインタを使えばいいという理由で、参照先は後から変えられない。
417413:2006/12/25(月) 18:17:13
>>415-416
レスどうもです。
ポインタですか・・・。まだあまりポインタ理解できていないので
使いたくはなかったのですが、これもいい機会だと思って勉強します。
ありがとうございました。
418デフォルトの名無しさん:2006/12/25(月) 18:18:34
ポインタが理解できないうちは参照使わない方が良いよ
419414:2006/12/25(月) 18:18:34
間違えました。>417は私です。
420デフォルトの名無しさん:2006/12/25(月) 18:29:56
つーか、参照先を変えたい理由如何によってはポインタ云々以前かも試練。
421デフォルトの名無しさん:2006/12/25(月) 23:53:51
こういうのってOKなの?

#define WORKPATH "c:\\temp\\aaa"
const string g_WORKPATH = WORKPATH;

422デフォルトの名無しさん:2006/12/26(火) 00:02:56
何か懸念でも?
423デフォルトの名無しさん:2006/12/26(火) 02:23:00
>>413 規格のどこで何が認められてるの?
424デフォルトの名無しさん:2006/12/26(火) 02:25:42
>>421
なぜそんなことをしたいのかわからないが、問題ないと思う。
425デフォルトの名無しさん:2006/12/26(火) 06:19:24
もしかしたらCからの移行かもな・・・
426デフォルトの名無しさん:2006/12/26(火) 06:59:02
クラスのprivateメンバが例え一つしかなくても
Pimplイディオムを使う意義はありますか?
427デフォルトの名無しさん:2006/12/26(火) 08:37:42
変数名が置き換わらないのかなと思って
428デフォルトの名無しさん:2006/12/26(火) 08:41:52
>>426 あるよ
429426:2006/12/26(火) 09:17:09
レスdです

気にせず常にPimpl使おうと思います
430デフォルトの名無しさん:2006/12/26(火) 09:47:45
常に…?
431デフォルトの名無しさん:2006/12/26(火) 09:57:08
いや、使えそうな場面では常に、ですorz
今まではprivateなメンバが一つの時とかはどうしようか迷ってたんで
432デフォルトの名無しさん:2006/12/26(火) 15:10:15
二つに増えるかも知れないから、Pimplを使うと考えろ
ゼロになるかも(ry
433デフォルトの名無しさん:2006/12/26(火) 23:23:17
いろんなスレッドから参照されるクラス(インスタンス)
に適用できるデザインパターンて何かな
まあ、普通に全メソッドにクリティカルセクションかけりゃいいけど
なんかいいの無いかな
434デフォルトの名無しさん:2006/12/26(火) 23:25:29
Immutable, Read write lockとか?
つかそんなんじゃワカラン
435デフォルトの名無しさん:2006/12/26(火) 23:43:13
>>434
ありがトンございます
ともあれデザパタ本買います
436デフォルトの名無しさん:2006/12/26(火) 23:45:23
C++ マルチスレッド関連のデザパタ本無いですか?
アマゾンで検索したのですがJAVAしか出てきません
437デフォルトの名無しさん:2006/12/26(火) 23:51:59
Javaは言語規格にスレッドがあるからな
素直にJava勉強してその本読んだ方が良いかと
438デフォルトの名無しさん:2006/12/26(火) 23:56:38
ACE本はフレームワークの存在が前提だし
デザパタを前面に押し出しているわけじゃないし

POSAの第2巻とか?あれはC++に限ってないけれど

あとはJavaな本をC++の言葉に噛み砕いて読むくらいかな
437に書かれているような言語機能の違いからC++特有の苦労が必要になるけれど
439デフォルトの名無しさん:2006/12/27(水) 00:25:14
>>437,438
そうですね。とりあえず基本的なクラスの設計は
Javaと共通の部分があると思うのでJava本買おうと思います。
レスありがとうございました。
440デフォルトの名無しさん:2006/12/27(水) 02:29:29
>>439
thread local specifier, __threadってのが多くのベンダのコンパイラで使えて、
標準になりそうなので、調べてといて。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1966.html
441デフォルトの名無しさん:2006/12/27(水) 02:54:25
TLSはもう普通に使われてるんじゃね

>>C++でデザパタ
「プログラムデザインのためのパターン言語」って本はサンプルがC++だったよん
すこしsmalltalkもあったけど。
あとネット上なら
http://www002.upp.so-net.ne.jp/ys_oota/mdp/index.htm
とか
http://www.01-tec.com/document/cpp_design_pattern.html
とか。
ハテナダイアリでちょこっと検索するとブログで書かれてるのが出てきたりもする
442デフォルトの名無しさん:2006/12/27(水) 15:35:56
質問です
#defineにとっての#undefに相当することを
usingに対してやりたいんだけど、
namespaceを一個作成してその中でusingするしかないんでしょうか
443デフォルトの名無しさん:2006/12/28(木) 12:38:58
{
 using ...;
}
444デフォルトの名無しさん:2006/12/28(木) 15:57:57
サブルーチンの中にサブルーチンを書くのはどうでしょうか?
というのも指導教官に「それはよくない。美しくない」と指摘されたのですが、
実用性を重視するなら、ありといえばありですよね?
みなさんが直面された重要な困難があれば教えて欲しいです。
445デフォルトの名無しさん:2006/12/28(木) 16:06:30
>>444
スレ違い
446デフォルトの名無しさん:2006/12/28(木) 16:16:55
すいませんでした。初心者スレで聞いてきます。
447デフォルトの名無しさん:2006/12/28(木) 20:19:28
>>444
案外C++な話題かも?

void foo(void)
{
 struct local {
  static void func(void) {
   // do something
  };
 };
 local::func();
 local::func();
}

ある関数内でのみ可視な関数を使いたいときに便利。
448デフォルトの名無しさん:2006/12/28(木) 20:41:38
>>444
別に美しくないとは思わない
その教官のセンスがおかしいだけ
449デフォルトの名無しさん:2006/12/28(木) 20:56:51
>>448
じゃあお前もおかしいな、センスとか
450デフォルトの名無しさん:2006/12/28(木) 21:01:06
>>449==教官
>センスがおかしいだけ
451デフォルトの名無しさん:2006/12/28(木) 22:15:31
>>443
これ、いいですね。ありがとん
452デフォルトの名無しさん:2006/12/29(金) 10:22:22
lambdaを否定された気がする
453デフォルトの名無しさん:2006/12/29(金) 17:19:04
質問です。
C++で、ファイルの内容を一度にstd::stringに読み込む方法は
ないでしょうか?

いろいろ調べてみたのですが、std::getline()では改行文字まで
しか読み取らないし、他にはread()で何バイトかずつ読み込んで
stringに足すか、get()で一文字ずつ読み込んで足す、位の方法
しか思いつきません。

rdbuf()を使ってstd::stringstreamに読み込もうとしたら、fstreamとは
違ってコンストラクタがないんですね。
454デフォルトの名無しさん:2006/12/29(金) 17:45:04
std::string str;
std::ifstream fin;

std::copy(std::istreambuf_iterator<char>(fin),std::istreambuf_iterator<char>(),std::inserter(str,str.begin()));
455デフォルトの名無しさん:2006/12/29(金) 17:54:24
>>454
ありがとうございます。これならスマートになりますね。
速度的には1文字ずつ読んでいるのであまり変化ないかもしれませんが、
一行で書けるという点が魅力です。

istreambuf_iteratorを使うという所が私には盲点でした。

さっそく使わせていただきます!
456デフォルトの名無しさん:2006/12/29(金) 17:55:30
std::ifstream file;
std::istreambuf_iterator<char> first(file);
std::istreambuf_iterator<char> last;
std::string fileData(first, last);
457デフォルトの名無しさん:2006/12/29(金) 17:58:29
1行で書きたいのなら
std::string fileData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
しかし分かりにくいので>>456のように書いた方がよい
>>455-456のやり方は>>454のように1文字ずつの代入ではなく初期化なので効率は少しはマシになるはず
458デフォルトの名無しさん:2006/12/29(金) 18:03:47
>>455-457
度々ありがとうございます。
私も書いてみました。これでも行けるようです。
s.insert(s.begin(), std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
459デフォルトの名無しさん:2006/12/29(金) 18:09:42
>>457
あと、stringのコンストラクタにistreambuf_iteratorを取る形式ですと、
遅延評価を行っているのかよくわかりませんが、私の環境では直後の

std::istringstream strstr(s);

で "istreambuf_iterator *を取るコンストラクタが見つからない"という
エラーが出てしまいます。ちょっと謎です。

環境はBCC5.8.2、Dinkumwareです。
460デフォルトの名無しさん:2006/12/29(金) 18:13:38
コンストラクタやinsertを使わずにinserter使う奴大杉
461デフォルトの名無しさん:2006/12/29(金) 18:16:10
世間に?職場に?
462デフォルトの名無しさん:2006/12/29(金) 18:18:40
>458
文字列が空の場合この方がよいと思う。
(空で無い場合意味が異なる)
s.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
463デフォルトの名無しさん:2006/12/29(金) 18:21:59
>>462
それはコンパイルエラーになりました。
C++標準ライブラリという本にも、assignメンバ関数にはイテレータを
取る形式は書いてありませんでした。
464デフォルトの名無しさん:2006/12/29(金) 18:23:09
空なんだったらassignなどせずに初期化した方が良かろう
465デフォルトの名無しさん:2006/12/29(金) 18:24:39
>>464
>>459でも書いたように、コンストラクタにイテレータを使う形式ですと、
そのstringでistringstreamを構築するとエラーが出てしまうので、
今回は使えないのです。
466デフォルトの名無しさん:2006/12/29(金) 18:35:48
>463
そんな本とコンパイラなんて窓から投げ捨ててしまえ。
467デフォルトの名無しさん:2006/12/29(金) 18:49:39
助けてください
結構凄いことなってる。助言とかお願いします
http://ex17.2ch.net/test/read.cgi/news4vip/1167379476/
468デフォルトの名無しさん:2006/12/29(金) 19:00:55
>>459
なんかそれ変だな
以下のソースでどんなコンパイルエラーが出る?
#include <fstream>
#include <iterator>
#include <string>
#include <sstream>
using namespace std;
int main () {
ifstream ifs ("hoge");
string s ((istreambuf_iterator <char> (ifs)), istreambuf_iterator <char> ());
istringstream strstr (s);
return 0;
}
469デフォルトの名無しさん:2006/12/29(金) 19:41:53
Effective STLでいうところの「C++で最も奇妙な解析」が絡んでるな、この会話。
なんか一言あったほうがいいかもしれないけど、説明が面倒だな。
470デフォルトの名無しさん:2006/12/29(金) 19:43:49
>>468
いえ、これは通りました。
どうもstringを定義している位置で出たり出なかったりするようです。
間違いなくコンパイラのバグだと思います。
471デフォルトの名無しさん:2006/12/29(金) 19:45:04
>>469
その本持ってます。確か「関数と見なせるものは関数とみなす」
という意味で、防止法は、括弧で囲む事でしたね。それでちょっと
試してみます。
472デフォルトの名無しさん:2006/12/29(金) 19:47:42
>>469
済みません、本当にありがとうございました。
Effective STLの第6項、P32そのままの問題でした。
コンパイラのバグではありませんでした。

本は読んでいましたが、実際に遭遇したのは初めてです。
覚えておきます。
473デフォルトの名無しさん:2006/12/29(金) 19:49:26
だから>>456のように書いた方が良いわけだ・・・・
474469:2006/12/29(金) 20:28:40
>>457-458ペアと>>462-463ペアのコード&反応の違いを見て
急に気になって書いたんだが、書いてよかったな。
475デフォルトの名無しさん:2006/12/29(金) 20:31:00
>>474
実は>>457の第一パラメータに括弧が付いているのを見落として
いたんです。申し訳ありません。
476デフォルトの名無しさん:2006/12/29(金) 21:34:12
実際にこれに引っ掛かってるのを初めて見た
477デフォルトの名無しさん:2006/12/29(金) 22:03:00
真の通過儀礼か。
478デフォルトの名無しさん:2006/12/29(金) 22:43:04
ここでC++糞と思うかC++面白いと思うかが今後を分ける
かも。
479デフォルトの名無しさん:2006/12/29(金) 23:57:00
Effective STL持ってないんだけど、どういう問題なのかサラっとでいいから教えてくれないかな。
480デフォルトの名無しさん:2006/12/30(土) 00:03:02
>>479
string s(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());

が s という名前の関数宣言と見なされてしまうという問題で、これを
回避するために

string s((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());

これで ifs のファイル内容で初期化された string型の変数 s が出来る。
481デフォルトの名無しさん:2006/12/30(土) 00:12:03
string s(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());
が何で関数宣言にみなされるの?
482デフォルトの名無しさん:2006/12/30(土) 00:16:08
>>481
string s(istreambuf_iterator<char> ifs, istreambuf_iterator<char>);

とみなされるから。これで分からなければ是非本を読んでね。
483デフォルトの名無しさん:2006/12/30(土) 00:20:04
なんとなく予想してたので合ってたわ
484デフォルトの名無しさん:2006/12/30(土) 00:26:01
sはstring型を返す関数で、引数を2つとる。
最初の引数はistreambuf_iterator<char>型で、名前はifs。
2番目の引数は、「引数をとらずistreambuf_iterator<char>型を返す関数」へのポインタ。

・・・とコンパイラは解釈する。
485デフォルトの名無しさん:2006/12/30(土) 00:34:34
>>484
あ、そうだった。

string s(istreambuf_iterator<char> ifs, istreambuf_iterator<char>());

こうですね。本を持っててもちゃんと読んでいないとこんなもんです。
486デフォルトの名無しさん:2006/12/30(土) 00:39:16
あーくそ。C++ Primer Plus fifthを書店で見かけたと思ったら、
何と"C Primer Plus fifth"だった。まあ内容的にはC99の事も
取り上げられていていいのだが。

注文せんと入れてくれんかなぁ。
487デフォルトの名無しさん:2007/01/01(月) 02:25:28
これって邪道すぎ?

class mystrfnc{
  std::string str;
  mystrfnc(const std::string &str):str(str){}
public:
  friend mystrfnc operator--(const std::string &str,int i){return mystrfnc(str);}
  mystrfnc *operator--(int i){return this;}
  std::string func(){return "["+str+"]";}
};
int main(){
  std::string str="STRING";
  std::cout<<str----->func()<<std::endl;
  return 0;
}

もちろん、個人で組んでる趣味のコードですが
488デフォルトの名無しさん:2007/01/01(月) 02:39:02
>>487
何がしたいのかわからん。
邪道だと思うんならやめればいい。
個人だ趣味だと予防線を張るくらいなら好きにすればいい。
489487:2007/01/01(月) 03:10:54
>>488
本当にしたいこと:stringにsubstr系のメソッドを追加したい

std::stringを継承するのは大変そうなのでやりたくない
関数にするよりメソッドっぽくしたい(元のstringの部分が長いのでを()で囲みたくない)

こうゆう状況で、
「んなことするよりこうする方が見やすくてええやん」
「それはこうゆうときにこんなことがおこるから素直にこうしとけ!」
の様な意見あるかを聞きたいわけです
490デフォルトの名無しさん:2007/01/01(月) 03:13:31
演算子を本来の意味意外に使うのはなんちゃってプログラミング専用。
491デフォルトの名無しさん:2007/01/01(月) 03:35:30
>>487
何じゃこりゃ!新年早々気持ち悪いプログラムを見てしもた。
後置演算子として解釈されているのか。

((str.operator--(str, int)).operator--(int))->func() と読めばいいのか。
492デフォルトの名無しさん:2007/01/01(月) 04:19:40
修行が足らんな。iocccの美しいコードたちを眺めて目を養うことだ
493デフォルトの名無しさん:2007/01/01(月) 04:24:34
>>492
鍛えられるが養えない。
昔VAX11用のコードでスゲェ、キタコレーなのがあったなぁ(遠い目

494デフォルトの名無しさん:2007/01/01(月) 04:44:43
int main() { return E--++----++----++------++------->result; }

なぜか無限の可能性を感じずにはいられない。
495デフォルトの名無しさん:2007/01/01(月) 05:00:52
brainf*ckかとオモタ
496487:2007/01/01(月) 05:15:09
追伸
mystrfnc *operator->(){return this;}

str--->func()
に減らせたーー!
497デフォルトの名無しさん:2007/01/01(月) 11:23:55
operator ->*のほうがスマートでは、と思ったが、いざやってみたらBoostが要るわ(TR1でもいいが)。
まあ趣味ならBoostも気兼ねなく使えるだろう。
#include <iostream>
#include <string>
#include <cassert>
#include <boost/function.hpp>
#include <boost/bind.hpp>
std::string do_func(const std::string& str) {return "[" + str + "]";}
enum func_type {
  func
};
boost::function<std::string ()> operator->*(const std::string& str, func_type fn) {
  switch (fn) {
  case func:
    return boost::bind(do_func, str);
  default:
    assert(0);
    return boost::function<std::string ()>();
  }
}
int main() {
  std::string str = "STRING";
  std::cout << (str->*func)() << std::endl;
}
498デフォルトの名無しさん:2007/01/01(月) 13:55:35
どちらにしても呼び出し部分から意図が汲み取れない酷いコードにはちがいないね
499デフォルトの名無しさん:2007/01/01(月) 14:32:29
>>489
> 本当にしたいこと:stringにsubstr系のメソッドを追加したい

std::string::substr() は既にあるわけだが。
500487:2007/01/01(月) 16:01:39
>>497
すごく面白そうですが、最終的に()で括ってるのが悲しいです。
boostよく知らないんでちょっとした修正で()外せたりするのかもしれませんが

>>499
本当にしたいこと:stringに元の文字列の部分文字列を返すメソッドを何種類か追加したい
こう言えば解ってもらえますかね
501デフォルトの名無しさん:2007/01/01(月) 16:09:20
外部関数じゃ何か不満?
502487:2007/01/01(月) 16:31:54
>>501
関数だと
=func1(func2(func1(func1(str1))+func1(str2)));
こんな使い方をされる物を想定しているわけですよ
これを単純に左から右へ処理される順番に並べて読みやすくできないかという思惑です
503デフォルトの名無しさん:2007/01/01(月) 19:03:23
>>502
もっと具体的な最終目的をちゃんと書いてくれると
それが最適なやり方かどうかも含めて議論できるんだが
504デフォルトの名無しさん:2007/01/01(月) 19:14:50
Win32APIのプログラムを練習していますCで書かれたプログラムで_stprintfというのが
あるのですが、C++でコンパイルすると未定義の関数と表示されてしまいます(CならOK)
C++で_stprintfに対応する関数は何になるのでしょうか教えてください。
コンパイラはbcc32です。
505487:2007/01/01(月) 20:06:50
>>503
ファイルのパスを管理したい。

フルパスからファイルの親の親ディレクトリ部分のみを取り出したり
パスなしのファイル名から拡張子部分のみを取り替えたりとかしたい

下手にパスを分解してクラスのメンバに入れたりとかするより、
stringそのままを切り貼りした方が扱いやすいんじゃないか

切り貼りの貼りは+でいいとして
切りの部分はstringにメソッドを追加したいなー

せめてメソッドっぽく見えればなー


こんな感じです
506デフォルトの名無しさん:2007/01/01(月) 20:31:59
boost::filesystem
507デフォルトの名無しさん:2007/01/01(月) 20:47:47
>>504
_stprintfはsprintfのtchar版
これでわからないなら最初にsprintfについて調べて動作を理解してから自分のコード読み直してみるといい。
508!dama !omikuji 株価【35】 :2007/01/02(火) 10:15:15
>>500
->*演算子は関数呼出の()演算子よりも優先順位が低いからどうしようもない。

>>501
そういうことなら、Oven Range Libraryなんてどうだろう。
ttp://p-stade.sourceforge.net/oven/
こいつは|演算子でパイプ処理のように書くことができるライブラリ。そしてstd::stringに限らず幅広いオブジェクトを対象にしている。
これを使わないとしても、|演算子で並べていくというアイデアは参考になると思う。
と、思ったんだけど、505なら506の言うとおりBoost.Filesystemを推すなあ。

>>504
<tchar.h>をインクルードしているか。
509デフォルトの名無しさん:2007/01/02(火) 19:17:39
>>489
>std::stringを継承するのは大変そうなのでやりたくない

http://tricklib.com/cxx/dagger/xstring.h

こいつでもベースに使えば楽だよ。
510デフォルトの名無しさん:2007/01/04(木) 11:03:36
>>487
ライブラリとして使うつもりなら、
メンバ関数でなければいけない特別な理由がない限り、
メンバ関数にするのはやめたほうがいい。
(C++ Coding Standards 項目44)

名前が長いなら、参照を使えばいいわけで、メンバにする理由もないし。

template< typename StrT > inline StrT & remove_filespec( StrT & in ) {
 in.substr( ... ).swap(in);
 return in;
}
string & ref = remove_filespec( my_application_filepath );
511デフォルトの名無しさん:2007/01/04(木) 11:14:59
512デフォルトの名無しさん:2007/01/04(木) 11:44:46
>>511
行分けちゃアカンの?
513デフォルトの名無しさん:2007/01/04(木) 16:12:38
C++のコードでstdio.hを使うと何か問題発生する?
514デフォルトの名無しさん:2007/01/04(木) 16:42:44
NULLの代わりに0を使わないと、代入でエラーが出る事が
あるんじゃなかったっけ。
515487:2007/01/04(木) 23:51:25
>>510
まぁ、邪道なのは百も承知しているのですが、

それでも
「本当のスパゲティコードを書いたことがなければ構造化のありがたみは解らない」
という自説の延長線上で
「意外に便利なものが見つかったらめっけもの」
という勢いですので、生暖かい目で見守ってやってください。
516デフォルトの名無しさん:2007/01/05(金) 00:09:45
>>514
そうならないようC++のNULLは0と定義されている。
517デフォルトの名無しさん:2007/01/05(金) 12:05:47
ぬるぽ
518デフォルトの名無しさん:2007/01/05(金) 15:25:19
ガッ
519デフォルトの名無しさん:2007/01/05(金) 15:38:50
throw;
520デフォルトの名無しさん:2007/01/09(火) 18:10:41
でもNULLの代わりに0使っちゃダメだぜーフハハハ。
521デフォルトの名無しさん:2007/01/09(火) 22:47:29
ADLには弊害があるそうなんですが、
どういう時によろしくない挙動を示すんでしょうか
522デフォルトの名無しさん:2007/01/10(水) 00:34:13
ISDNと干渉する
523デフォルトの名無しさん:2007/01/10(水) 21:03:13
ADSLかよwwww
524デフォルトの名無しさん:2007/01/10(水) 22:02:34
Yahoo!BBはピンポン方式を一切考慮してなかったからISDNの干渉がひどかった。
525デフォルトの名無しさん:2007/01/10(水) 22:47:36
526デフォルトの名無しさん:2007/01/10(水) 23:19:22
C++は奥が深いな
527デフォルトの名無しさん:2007/01/10(水) 23:20:31
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の社員の意見にはたとえ間違っていても反対しない
□派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ派遣先に常駐したい
528デフォルトの名無しさん:2007/01/11(木) 21:17:37
C++用のライブラリで、perlにおけるbioPerlのような分子生物学用ライブラリは
ないでしょうか?コドンからアミノ酸変換、疎水性インデックスのような簡単な
ものでいいのですが。
529デフォルトの名無しさん:2007/01/11(木) 21:47:16
開発環境が整わない。
もうマジうぜー、javaの100倍うぜえわ
コンパイルの仕方がわからん。リンクくらい貼っとけ
530デフォルトの名無しさん:2007/01/11(木) 21:50:44
低脳
531デフォルトの名無しさん:2007/01/11(木) 23:16:09
>>529
開発環境とかはスレ違いだから
532デフォルトの名無しさん:2007/01/12(金) 05:02:42
>>453
遅レスだが.

> rdbuf()を使ってstd::stringstreamに読み込もうとしたら、fstreamとは
> 違ってコンストラクタがないんですね。

ふつーに
std::stringstream ss;
ss << std::cin.rdbuf();
とかできんか?
533デフォルトの名無しさん:2007/01/12(金) 15:12:11
>>528
boost ML にbio infomatics のやつは投稿されてたけど
534デフォルトの名無しさん:2007/01/12(金) 17:15:40
>>532
std::istringstreamではなくてstd::stringstreamを使って
入出力両用にすればそれはできますね。
535デフォルトの名無しさん:2007/01/13(土) 10:46:50
g++ 4.0.1 で↓がスルっと動くのは、仕様どおりで安全ってことですか?

std::string s("abc");
s = s.substr(3);
assert(s == "");
536デフォルトの名無しさん:2007/01/13(土) 13:24:24
substr(size_type pos = 0, size_type n = npos) const;
は、もしpos > size()ならout_of_rangeを投げるはず・・・。
537デフォルトの名無しさん:2007/01/13(土) 13:25:32
endからendまでをコピーできるからいいんじゃないの
538デフォルトの名無しさん:2007/01/13(土) 15:27:48
>もしpos > size()ならout_of_rangeを投げるはず・・・。
pos == sizeだから問題ないね。
539デフォルトの名無しさん:2007/01/13(土) 15:36:56
お pos >= size()のときじゃないのか... > out_of_range
540デフォルトの名無しさん:2007/01/13(土) 16:04:58
21.3.6.7
2 Throws: out_of_range if pos > size().

って書いてあるな。
541535:2007/01/13(土) 16:19:14
>>536-540
ありがとうございます。安心して使えます。
542デフォルトの名無しさん:2007/01/14(日) 02:06:46
http://www.open-std.org/jtc1/sc22/wg21/
News 2007-01-13: The C++ Standard Library Issues List (Revision 46) is available
543デフォルトの名無しさん:2007/01/14(日) 22:33:24
クラスの、privateな変数でも、外から読み書きができちゃうことはあるんですか?
例えばこんな感じで

class Hoge {
private:
  int num;
} hoge;

main() {
  int *i = reinterpret_cast<int *>(&hoge);
  *i = 123;
}
544デフォルトの名無しさん:2007/01/14(日) 22:37:48
そりゃー無理やりやれば、書き換えられるだろ。
545デフォルトの名無しさん:2007/01/14(日) 22:40:00
鼻から悪魔が出てくる〜
546デフォルトの名無しさん:2007/01/14(日) 23:35:45
#define private public
547デフォルトの名無しさん:2007/01/14(日) 23:42:51
>543
そこまでして自分の足を撃たなくても……
reinterpret_castは実装依存だよ。
548デフォルトの名無しさん:2007/01/15(月) 00:34:26
#define class struct
549デフォルトの名無しさん:2007/01/15(月) 00:36:42
>>548
こうすれば確かにいちいち
#define private public
とかしなくてもOKだよな。目からウロコだぜ
550デフォルトの名無しさん:2007/01/15(月) 00:41:05
デフォルトのアクセス指定が変わるだけで、>>543には無意味。
もっとも、キーワードを置き換えてる時点で鼻からスパゲッティだが
551デフォルトの名無しさん:2007/01/15(月) 10:33:15
VC上で、他のプロジェクトでも使いまわせるような
API的関数(それぞれが無関係な関数)を何個か作ってるんですけど、
こういうのって、やはり「API的関数群」のような名前のクラスを作って、
すべてをstaticなメンバ関数にするべきなのでしょうか?
それとも、Cのようなグローバル関数群にしてしまうべきなのでしょうか?
552デフォルトの名無しさん:2007/01/15(月) 10:39:40
>>551
namespace使うとか
553デフォルトの名無しさん:2007/01/15(月) 10:51:19
>>551
まずAPIの意味調べような?
漏れは便利系メソッドは全部namespace utilityに突っ込んでる。
しかしほとんどの便利系メソッドはよく探せばWin32APIとか
使えるならboostとかにほとんど揃ってるんで
utility名前空間が膨れ上がる事はまずない。
554デフォルトの名無しさん:2007/01/15(月) 11:07:33
>>552-553
即レスありがとうございます。
namespaceを使うということは、基本的には
「staticメンバ関数クラス」ではなく「グローバル関数群」のほうになるのですよね。
555デフォルトの名無しさん:2007/01/15(月) 11:20:04
GNUリンカが「Undefined Symbols」になっているもので
__Z11とか__M11とかが頭にあるものが出てくるのですが、
これはどんな種類のシンボルなのですか。
556デフォルトの名無しさん:2007/01/15(月) 11:23:01
デバッグのやり方教えてクレー
ソースを一行ずつ動くようなやつ
visual c++ とかボーランドで出来る?
557デフォルトの名無しさん:2007/01/15(月) 11:35:48
>>556
普通にできるから。
558デフォルトの名無しさん:2007/01/15(月) 11:46:08
>>557
教えてクレー
559デフォルトの名無しさん:2007/01/15(月) 12:12:31
スレ違い
560デフォルトの名無しさん:2007/01/15(月) 14:43:14
>>555
つ[c++filt]
561デフォルトの名無しさん:2007/01/15(月) 16:46:24
>>555
っデマングル
っextern "C"
562デフォルトの名無しさん:2007/01/15(月) 21:14:34
よく鼻からうんことか言ってる人がいますが、
なんか意味があるのでしょうか?
563デフォルトの名無しさん:2007/01/15(月) 21:23:21
ウンコの力
564デフォルトの名無しさん:2007/01/15(月) 21:39:48
>>554
まず名前空間の意味調べような?
>基本的には「staticメンバ関数クラス」ではなく「グローバル関数群」のほう
意味わからん。基本的って何や。基本でない場合どうなるんや。
しいて言うなら「utility関数群」。グローバル名前空間は汚染されない。

565デフォルトの名無しさん:2007/01/15(月) 21:40:10
>554
・classは閉じていてnamespaceは開いている
・classはアクセス制御できる
という違いがあるから、そこを良く考えて選ぶと良いよ。
566デフォルトの名無しさん:2007/01/16(火) 18:55:44
ちょっと教えてほしいのですが、数値計算の結果をfor構文の中でファイルに記述するようにしているのですが
なんとなく実行速度が遅いような気がして、小耳に挟んだ話だと逐一HDDにアクセスしていることが起因しているそうなのですが、
計算結果を貯めておいて、最後に一度に書き出すにはどうすればいいのでしょうか?
C++暦は1ヶ月程度ですが、参考サイト等教えていただければ幸いです。
どうかよろしくお願いいたします。
567デフォルトの名無しさん:2007/01/16(火) 18:57:51
>>566
とりあえずファイルにどう出力しているか書いて。
568デフォルトの名無しさん:2007/01/16(火) 19:39:41
最近はOSのライトバックキャッシュに埋まるんでないの?
569デフォルトの名無しさん:2007/01/16(火) 20:00:02
>>566
std::ostreamやらstdioやらを使ってるんならライブラリでバッファリングされるし
それでなくとも今時のOSならOSレベルでバッファリングされる
実際に逐一ディスクI/Oが発生することは無いはずよ
570デフォルトの名無しさん:2007/01/16(火) 20:08:40
>567
int _tmain(){
ofstream fout("data1.txt");
for(int c=0 ; c<100 ; c++){
fout<<c<<"回目です。"<<endl;}
fout.close();}

のような感じです。見やすさを考慮して実際の数値計算式は省いています。

>568
OSはXPProです。申し訳ありません、私にはわかりません。

>569
なるほど。だとすると私程度のレベルでは特に意識する必要はなさそうですね。

レスありがとうございます。
571デフォルトの名無しさん:2007/01/16(火) 20:09:36
#include "stdafx.h"
#include <math.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <complex>
#using <mscorlib.dll>
using namespace System;
using namespace std;

書き忘れました。すいません。
572デフォルトの名無しさん:2007/01/16(火) 20:15:31
endlは'\n'とかにすると多少変わるかもね
573デフォルトの名無しさん:2007/01/16(火) 20:15:42
>>570
必要がなければcloseなんて自分で呼ぶ必要はないぞ。
デストラクタで勝手にcloseされる。
574デフォルトの名無しさん:2007/01/16(火) 20:40:46
>572
早速試してみます。

>573
それは初耳でした。以降そのように記述します。

アドバイスありがとう。
575デフォルトの名無しさん:2007/01/16(火) 20:44:19
endlってファイルストリームでもフラッシュするんだっけか
だとしたら'\n'に変えて動作速くなる可能性は高そう
576デフォルトの名無しさん:2007/01/16(火) 21:02:29
>>571
どーでもいいがなんだってmscorlib.dllなんて使ってるんだ
managed C++か?

そのコードなら別に.NET非依存で完全にnativeだから、そんなものは要らないぞ
577デフォルトの名無しさん:2007/01/16(火) 21:15:54
endlを'\n'に変更してみましたが私の環境において短時間の計算では優位な差は確認できませんでした。
次は長時間の計算で比較してみたいと思います。

>576
C++の基本事項を参考にしたサイトが使用していたため、そのままコピペで使っていました。
省略しても問題なく動き、コンパイル時間が短縮できました。ありがとうございます。
578デフォルトの名無しさん:2007/01/16(火) 21:23:45
逐次出力の処理速度とか細かいことはあまり気にしないほうがええで。
始めたばかりならC++の言語仕様やその他にも学ぶべき有意義なことが沢山あるはず。
579デフォルトの名無しさん:2007/01/16(火) 21:35:04
>>566
そもそもファイルに書き込まないと速くなるのかね?
君のへちょい数値計算が遅い可能性は皆無?
580デフォルトの名無しさん:2007/01/16(火) 21:49:56
>578
そうですね。仰るとおりです。一通り扱えるよう勉強します。

>579
すいませんが、わかりません。
もちろん私の書いたものが遅い可能性もあります。

みなさんありがとうございました。これほど親身になってアドバイスいただけるとは思っても見ませんでした。
私の知識不足もあり、質問には答えられないところもありましたがどうか容赦下さい。
当面は幅広くC++を学んでいきたいと思います。また機会がありましたらよろしくお願いいたします。
581デフォルトの名無しさん:2007/01/16(火) 21:57:33
そもそもiostreamが重いという話がある。
582デフォルトの名無しさん:2007/01/16(火) 21:59:31
まぁ、性能を云々するんなら、脳内だけで想像せずに
プロファイルを取るべきだな
583デフォルトの名無しさん:2007/01/16(火) 22:26:27
初めて1ヶ月ぐらいならば、
まだ他に学ぶべきことがいっぱいあるだろうから気にすることも無いと思うけどね。
584デフォルトの名無しさん:2007/01/16(火) 22:50:42
なにこのループするバッファ
585デフォルトの名無しさん:2007/01/16(火) 23:25:16
>>580
>すいませんが、わかりません。
えええ… ファイルの書き込みしてる部分コメントアウトすればいいじゃない…
586デフォルトの名無しさん:2007/01/16(火) 23:30:53
std::stringstream ss にまとめて出力しておき、最後に
fout << ss.rdbuf(); すると少しは速くなるかもしれない。
実験してないけど。
587デフォルトの名無しさん:2007/01/16(火) 23:31:28
あ、foutはバイナリで開いておいてね。
588デフォルトの名無しさん:2007/01/16(火) 23:33:51
589デフォルトの名無しさん:2007/01/17(水) 00:02:08
>585
あぁそういう意味でしたか。よくわかっていませんでした。確かにそれで差を見るのが一番根本的だなと
気がつきました。夜は電力来ないのでまた明日詳しく試してみます。ありがとう。

ファイルに記述するにしてもいろいろな方法があるのだなとただただ驚くばかりです。
ただ、折角英知を頂いても私があまり理解できないのが残念です。
頂いたコメントは全て保存しておき後日理解が深まってから再度確認させていただきます。
皆様ありがとうございました。
590デフォルトの名無しさん:2007/01/17(水) 01:21:10
>>588
やってみな。
#include <iostream>
#include <fstream>
#include <sstream>
#include <windows.h>

int main()
{
std::stringstream ss;
const int N = 100000;
DWORD d;

std::ofstream ofs("1.txt");
d = timeGetTime();
for (int i = 0; i < N; i++)
ofs << i << "回目です。" << std::endl;
std::cout << (timeGetTime() - d) << "ms." << std::endl;
ofs.close();

ofs.open("2.txt", std::ios::out | std::ios::binary);
d = timeGetTime();
for (int i = 0; i < N; i++)
ss << i << "回目です。" << std::endl;
ofs << ss.rdbuf();
std::cout << (timeGetTime() - d) << "ms." << std::endl;
}
591デフォルトの名無しさん:2007/01/17(水) 01:23:27
>>588
おっとっと。バイナリモードで開くと、0x0d0aにならずに0x0aにしか
ならないのでテキストモードで開く必要があるな。
#include <iostream>
#include <fstream>
#include <sstream>
#include <windows.h>

int main()
{
std::stringstream ss;
const int N = 100000;
DWORD d;

std::ofstream ofs("1.txt");
d = timeGetTime();
for (int i = 0; i < N; i++)
ofs << i << "回目です。" << std::endl;
std::cout << (timeGetTime() - d) << "ms." << std::endl;
ofs.close();

ofs.open("2.txt");
d = timeGetTime();
for (int i = 0; i < N; i++)
ss << i << "回目です。" << std::endl;
ofs << ss.rdbuf();
std::cout << (timeGetTime() - d) << "ms." << std::endl;
}
592デフォルトの名無しさん:2007/01/18(木) 07:02:21
http://www.open-std.org/jtc1/sc22/wg21/
News 2007-01-16: C++ Standard Core Language Issues List (Revision 45) is available
593デフォルトの名無しさん:2007/01/18(木) 14:24:08
namespace impl
namespace detail
ってどう使い分けるのが普通なのでしょうか?
594デフォルトの名無しさん:2007/01/18(木) 14:30:58
Koenig Lookupに気を付ければどのように使ってもよい。
595デフォルトの名無しさん:2007/01/18(木) 22:23:59
596デフォルトの名無しさん:2007/01/18(木) 22:48:35
有名な joke だね。本人もいたくお気に入りらしいぜ。
597デフォルトの名無しさん:2007/01/19(金) 19:10:17
それのK&R版もあったはず。こいつの下の方か。
http://www.genpaku.org/realprogrammerj.html
598デフォルトの名無しさん:2007/01/19(金) 21:20:57
>>597
これを読んでビールが飲みたくなった。
599デフォルトの名無しさん:2007/01/19(金) 23:53:03
ほげ
 ふが
  もげ
 ぱも
  むも
   ぴよよ
こんな感じでインデントされたテキストを
インデントごとに構造体に読み込みたいんですが
さっぱりわかりません
struct text{
 char* str;//行のデータ
 text* childs;//自分よりも一つだけインデントされているデータ
};
読み込みは
while(ifs.getline(buf,_MAX_PATH)){}
みたいなループなのに、データ構造は再帰的なので
もしかしてスタックとか使わないといけないんでしょうか
何か方針でもいいので教えていただけませんか
お願いします
600デフォルトの名無しさん:2007/01/19(金) 23:59:43
>>599
そう思うんならスタック使って書けよ。
601デフォルトの名無しさん:2007/01/20(土) 00:23:03
自分と同じ深さのやつは?
602デフォルトの名無しさん:2007/01/20(土) 00:54:06
>>599
どう見てもツリーになるんだから、その構造ではダメだろ、考え直せ
603デフォルトの名無しさん:2007/01/20(土) 01:49:20
.注.:.私.の.有.意.義.な.発.言.に.対.し.、.自.分.の.理.解.不.足.を.棚.に.上.げ.煽.り.、.1.行.レ.ス
.で.返.す.方.が.多.い.よ.う.で.す.が.、.そ.の.よ.う.な.方.は.ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く
.ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い.の.で.お.黙.り.下.さ.い.。
.ま.た.質.問.者.は.回.答.者.に.知.識.を.披.露.す.る.場.を.与.え.る.貴.重.な.存.在.な.の.で.、
.質.問.者.を.見.下.し.た.回.答.、.あ.ま.り.に.も.儀.礼.を.欠.い.た.回.答.も.厳.重.に.禁.止.い.た.し.ま.す.。
.忙.し.い.中.、.少.な.い.時.間.の.合.間.を.縫.っ.て.質.問.し.に.来.て.る.わ.け.で.す.の.で.、
.そ.の.辺.ご.承.知.下.さ.い.。.な.お.、.当.方.が.質.問.に.対.し.て.有.意.義.な.答.え.で.あ.る.と
.判.断.し.た.方.に.は.評.価.い.た.し.ま.す.の.で.各.自.よ.く.調.べ.、.よ.く.考.え.正.確.な.回.答.を.す.る.よ.う.に.。
604デフォルトの名無しさん:2007/01/20(土) 01:52:32
>ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く
>.ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い

>>603
まさにお前のことだなw
605デフォルトの名無しさん:2007/01/20(土) 02:05:32
どう見てもツリ
606デフォルトの名無しさん:2007/01/21(日) 16:28:10
どうみてもツリー
607デフォルトの名無しさん:2007/01/21(日) 16:35:59
608デフォルトの名無しさん:2007/01/21(日) 16:38:43
603 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
609デフォルトの名無しさん:2007/01/21(日) 22:19:58
C++ 5.5.1なんですが
ファイルの途中の行を編集する関数ってありますか?
例えば10行あるうちの3行目だけを置換できるもの

やっぱり入力ファイルを読みながら出力ファイルに書き込むしか
方法はないんですか?
教えて下さい
610デフォルトの名無しさん:2007/01/21(日) 22:29:48
>>609
C++ 5.5.1 ってなんだ?
とりあえず答えは、全部書くしかない。10行のテキストぐらいならまったく問題ないだろう。
611デフォルトの名無しさん:2007/01/21(日) 22:47:24
>>609
1行ずつリストに突っ込んで3行目のを消して別の突っ込めば
612デフォルトの名無しさん:2007/01/21(日) 23:04:12
>>609です
レスどうもです
残念ですが頭からやります
613デフォルトの名無しさん:2007/01/21(日) 23:43:48
環境依存だけどメモリマップトファイル使えば出来るんじゃないかな。
614デフォルトの名無しさん:2007/01/22(月) 02:12:51
>>613
サイズが変わらないならね
615デフォルトの名無しさん:2007/01/22(月) 03:12:06
グローバルなinline関数を作りました。
(.hに定義して、.cppで処理を書いてます).
この関数が定義された、同じソースファイル内では使えますが、
他のファイルで使うと、コンパイルは成功しますが、リンクに失敗します(外部参照が未解決
inlineを使わないと成功します。
inlineを使った場合、同じソース内のみで使用可能ということですか?
それとも、定義等の仕方が悪いのでしょうか。
616デフォルトの名無しさん:2007/01/22(月) 03:15:56
.h de teigi
617デフォルトの名無しさん:2007/01/22(月) 04:41:14
>>615
ヘッダに関数の処理がないとだめですお。
618デフォルトの名無しさん:2007/01/22(月) 08:39:45
ヘッダに関数定義するのってなんか嫌くね?
619デフォルトの名無しさん:2007/01/22(月) 08:50:05
>>618
そう思うんなら inline にしなければいい。
620デフォルトの名無しさん:2007/01/22(月) 08:50:13
別に
621デフォルトの名無しさん:2007/01/22(月) 09:03:42
>>615
ファイル間最適化能力のあるコンパイラを使え。
#詳細は該当スレにて。
622デフォルトの名無しさん:2007/01/23(火) 23:16:39
例外処理のコーディングしてるんだけど、
C++だと例外クラスとか作ったりするのが一般的なのかな?
623デフォルトの名無しさん:2007/01/24(水) 03:30:11
>>622
はい。 std::exception を継承して作ってください。
よくある例外は標準ヘッダ stdexcept で定義されていますので、
そちらを使われるのがよいかもしれません。
624デフォルトの名無しさん:2007/01/24(水) 20:52:47
stlのを継承するってのは、
stlからの例外も一緒に取得で便利ってことですか?
625デフォルトの名無しさん:2007/01/24(水) 21:07:44
>>624
大本のところで全ての例外をcatchしたようなとき、
どんな例外が投げられるかわかっていないと、
例外が投げられたかとしか情報が得られないけど、
std::exceptionから派生していれば何がしかのメッセージは得られるから。

つまり、>>622の作ったライブラリを使う人にとって都合がいいから。
626デフォルトの名無しさん:2007/01/24(水) 21:15:09
ふぅん。ありがトン!
627デフォルトの名無しさん:2007/01/24(水) 21:40:17
std::exceptionの派生にすると、what()の実装に困るのがよくあるパターン。
628デフォルトの名無しさん:2007/01/24(水) 21:44:14
せめてwchar_t*を返したくなる
629デフォルトの名無しさん:2007/01/24(水) 21:59:18
std::exceptionを継承して、引数付きコンストラクタを作るのはOKですか?
630デフォルトの名無しさん:2007/01/24(水) 22:30:13
可能ならstd::runtime_errorかstd::logic_errorから継承したほうが
柔軟性が増して良いと思う。

>>629
例外発生時に別の例外を発生させ得ない操作だけを行うなら問題ない。
631デフォルトの名無しさん:2007/01/24(水) 23:10:51
すごく勉強になりましたありがとうーー
632デフォルトの名無しさん:2007/01/24(水) 23:19:41
マルチスレッドプログラムで、
どっかのスレッドで起きた例外を
別のスレッドで取得することってできるの?
例外が発生したスレッドを殺したいのだが。。。
633デフォルトの名無しさん:2007/01/24(水) 23:22:16
>>632
できない。
スレッド関数の根っこで catch(...) して終了させとけばいいだけじゃないの?
634デフォルトの名無しさん:2007/01/24(水) 23:27:44
>>633
やっぱりできないですか。
既にあるシステムで、スレッド関数たくさんあるから
そいつら全部に例外処理いれんの面倒だなーーーーとか
思ってたんで的外れとは思いましたけど質問させていただきました。
635デフォルトの名無しさん:2007/01/24(水) 23:29:24
>>634
スレッドの起動に使ってる関数を、最悪マクロで置き換えて、
実際に起動する関数は引数で渡された関数をラップするようにすれば
いいんじゃないか?
636デフォルトの名無しさん:2007/01/24(水) 23:40:02
>>632
なんか今、えらい人たちがそれについて
いろいろ考えてるみたいだ。俺には分からんがな
637デフォルトの名無しさん:2007/01/24(水) 23:43:39
>>635
それは頭良いですね。
ちょっとトリッキーだけど。。検討してみます
638デフォルトの名無しさん:2007/01/24(水) 23:45:23
マクロって……やめとけよ
王道はスレッドをラップするクラスを作ることだろ
ThreadとかRunnableとかさ
639デフォルトの名無しさん:2007/01/24(水) 23:48:23
>>638
Windowsだと
thisポインタが問題にならない?
_beginthreadでクラスのメンバ関数呼べるんだっけ?
ってスレ違いかな
640デフォルトの名無しさん:2007/01/24(水) 23:49:33
>>639
staticメンバ関数も知らないのか
C++を一から勉強しなおせよ
641デフォルトの名無しさん:2007/01/24(水) 23:52:37
>>640
いや、staticメンバ関数は知ってるけど。

>>638のいうThreadクラスを継承すんのかなと思ったから
Javaみたいに。
642デフォルトの名無しさん:2007/01/24(水) 23:55:19
static thunk(void*ptr){
static_cast<Thread*>(ptr)->run();
}
_beginthreadex( ...,thunk, static_cast<void*>(this),... );

定石だぜ?
643デフォルトの名無しさん:2007/01/24(水) 23:57:38
>>642
おおーーーすげーーーー
定石なのかー
何の本に載ってんの?
恥ずかしながら初めて見ました
644デフォルトの名無しさん:2007/01/25(木) 00:00:36
今時スレッドラップしてるC++のライブラリなんて腐るほどあるんだから
コード嫁よ
645デフォルトの名無しさん:2007/01/25(木) 00:00:44
スレッドに限らずウィンドウプロシージャをラップするときにも使ったりするね
646デフォルトの名無しさん:2007/01/25(木) 00:05:54
すげーー勉強になるなー
ライブラリはあんま読んだことないけど
自分よりスキルある人が作ってんだから勉強になるだろうな
今度読んでみます
647デフォルトの名無しさん:2007/01/25(木) 00:07:20
何のライブラリが参考になるかお母さんみたいに教えてくれ
648デフォルトの名無しさん:2007/01/25(木) 00:12:38
それって、run()の中からメンバ変数にもアクセスできるのですか?
ちょー便利そうなんだけど
649デフォルトの名無しさん:2007/01/25(木) 00:38:35
不確かな知識でスレッド使ってどつぼにはまれ
650デフォルトの名無しさん:2007/01/25(木) 00:42:39
>>648
C++ でスレッドやるときは大抵皆そういうことしてると思うんだけど。
Windows だったら各種のコールバック(lpParamとかとる奴)でも同じ
技法を使うことが多いと思う。
651デフォルトの名無しさん:2007/01/25(木) 01:28:12
なるほど目から鱗です
652デフォルトの名無しさん:2007/01/25(木) 06:06:59
僕は鱗がはがれました
653デフォルトの名無しさん:2007/01/25(木) 08:20:52
必然的に思いつくようなパターンだと思うが
654デフォルトの名無しさん:2007/01/25(木) 13:01:36
>>652
ドライアイですか?
655デフォルトの名無しさん:2007/01/25(木) 14:22:03
いいえ、ドライスキンです
656デフォルトの名無しさん:2007/01/25(木) 19:31:33
わたしは鮫肌です
657デフォルトの名無しさん:2007/01/25(木) 21:27:33
クラス内のスタティック関数を
ポリモルフィズムしたいのですが
どうすればいいですか?
658デフォルトの名無しさん:2007/01/25(木) 21:34:23
static のかわりに virtual つけれ。
659デフォルトの名無しさん:2007/01/25(木) 21:40:51
いえ、スタティック関数がいいのです
660デフォルトの名無しさん:2007/01/25(木) 21:42:42

ポリモルするクラスAを作って、仮想関数内でstatic関数を呼ぶ
661デフォルトの名無しさん:2007/01/25(木) 21:59:53
ええーー
662デフォルトの名無しさん:2007/01/25(木) 22:14:42
CRTPとかシングルトンパターンの応用とかどうだろう。
663デフォルトの名無しさん:2007/01/25(木) 22:44:14
自分のクラスのスタティックメソッドへのポインタを返す仮想関数を作るとか?
664デフォルトの名無しさん:2007/01/25(木) 23:32:34
>>660
ありがとうございました。解決しました
665デフォルトの名無しさん:2007/01/25(木) 23:36:10
ポリモルって何かかわいい
666デフォルトの名無しさん:2007/01/25(木) 23:39:54
魔法少女ポリモル
667デフォルトの名無しさん:2007/01/26(金) 01:51:17
ポリモルフィズム  ポ  ピ  パ
668デフォルトの名無しさん:2007/01/26(金) 03:12:14
マジカルクラス インヘリット!
669デフォルトの名無しさん:2007/01/26(金) 05:28:23
使い魔「スタチック=キャスト」
670デフォルトの名無しさん:2007/01/26(金) 10:19:44
猫でもわかるCを読み終わり、
C++についてや、中級者向けの踏み込んだ知識が欲しいと思ってます。
レビューなどを調べまわった結果、EffectiveC++がいいかなと思っているのですが
よろしければ助言を頂けないでしょうか
671デフォルトの名無しさん:2007/01/26(金) 10:50:43
>>670
とりあえず「憂鬱なプログラマのためのオブジェクト指向開発講座」でも読んどけ。
つか、Effective C++はある程度C++知ってる人間が読まんと意味ない本だぞ。
672デフォルトの名無しさん:2007/01/26(金) 12:52:52
>>671
遅レスすみません
先にオブジェクト指向勉強しないと駄目なんですね
それを読んだ後に独習C++を読んでみることにします
ありがとうございます<(_ _)>
673デフォルトの名無しさん:2007/01/26(金) 13:01:17
あと書けよ。ひたすら書け。絵と同じだ。
デッサンした数が実力にモロに影響する。
674デフォルトの名無しさん:2007/01/26(金) 13:04:38
ありがとうございます。
ではさっそく裸体をデッサンしてみます。
675デフォルトの名無しさん:2007/01/26(金) 13:21:08
うはwテラマングりんぐww 


ごめん言ってみたかっただけ
676デフォルトの名無しさん:2007/01/26(金) 14:27:45
魔法少女C++
ポリモル   横山智佐
インヘリット 丹下桜
コンスト    折笠愛
ハゲ      若本規夫

677デフォルトの名無しさん:2007/01/26(金) 16:00:10
声優の選び方が渋いってか、一世代古いな。

双子キャラのバインド・ファースト、バインド・セカンドは田中理恵で。
678デフォルトの名無しさん:2007/01/26(金) 16:30:26
キャラクター紹介

ポリモル

OOの国から偽装派遣されてきた魔法少女。
OO厨を増やそうと悪事に励むが失敗ばかり。

インヘリット

真のOOの継承者。
OOの国とは敵対関係にありながら
ポリモルを改心させようとOOの真実を説く。

コンスト

OOの国の創造主。
崩壊の進むOOの国を救うため
指揮命令系統を無視してOO厨の獲得をポリモルに命じる。
679デフォルトの名無しさん:2007/01/26(金) 16:45:47
お騒がせロリキャラのミュータブル(愛称は"みゅー")もな
680デフォルトの名無しさん:2007/01/26(金) 17:04:04
この番組は
株式会社すとらうすとらっぷ
の提供でお送りします。
681デフォルトの名無しさん:2007/01/26(金) 17:05:10
第1話 ポリモル大地に立つ
682デフォルトの名無しさん:2007/01/26(金) 17:26:37
おまえら二次裏あたりでやれ。
683デフォルトの名無しさん:2007/01/26(金) 18:14:52
同意。
684デフォルトの名無しさん:2007/01/26(金) 19:09:47
使い魔

スタチック=キャスト
厳格でお節介な禿キャラ

リ・インタープリット=キャスト
乱暴者でトラブルメイカーな禿キャラ

コンスト=キャスト
殺意の波動に目覚めた禿キャラ

ダイナミック=キャスト
物知りな禿キャラ
685デフォルトの名無しさん:2007/01/26(金) 20:33:44
>>684
ワロタ
686デフォルトの名無しさん:2007/01/26(金) 20:38:23
ポリモルするポインタをvectorに格納すると不具合が起きますか?
shared_ptrを使うか迷っているのですが。
687デフォルトの名無しさん:2007/01/26(金) 20:45:24
お前が心配しているようなことはデストラクタが仮想関数になっていれば問題ない。
でも、例外安全を考えるとstd::vector<boost::shared_ptr<> >か、boost::ptr_vector<>がお勧め。
688デフォルトの名無しさん:2007/01/26(金) 20:52:09
689デフォルトの名無しさん:2007/01/26(金) 21:11:57
>>687
C++ Coding Standardsという本にshared_ptrが良いと書いてあったものでお聞きしました。
何の不具合がおきるかは書いていなかったのですが。
boostにしてみます
690デフォルトの名無しさん:2007/01/26(金) 22:30:45
protected 非仮想ってどういうこと?
継承したクラスから呼べないんじゃリークするじゃん??
ポリモルタン教えて?
691デフォルトの名無しさん:2007/01/26(金) 22:31:34
すみません。基本クラスのデストラクタの話です。
692デフォルトの名無しさん:2007/01/26(金) 22:39:32
継承したクラスから呼べないってのは、どういうことだ?
693デフォルトの名無しさん:2007/01/26(金) 22:42:00
アップキャストして使うな、ってことだろ。
694デフォルトの名無しさん:2007/01/26(金) 22:45:30
デストラクタを仮想関数にする理由は、主に派生クラスのオブジェクトを基底クラスのポインタを通じてdeleteされる場合のため。
protected/private継承にしておけば、基底クラスへの変換は封じられるので問題ない。
695デフォルトの名無しさん:2007/01/26(金) 22:46:13
デストラクタをprivate仮想にするのは分かりますが、
どんなときにprotected非仮想にするのか分かりません。
使い方も分からない。
696デフォルトの名無しさん:2007/01/26(金) 22:47:36
たとえば、unary_functionそのものとか?
697デフォルトの名無しさん:2007/01/26(金) 23:10:37
忘れてください
698デフォルトの名無しさん:2007/01/26(金) 23:39:39
>695
protected: 継承することが前提
非仮想: 多態して使わない。仮想テーブルを使用しない。

と言う事で、protected非仮想destructorは
 そのクラスから派生して使用する(基本クラスにする)けれども、
 そのクラスのポインタとしては(多態的には)deleteしない
つうことですな。

さらに言うと、仮想関数を使用しない場合は仮想関数テーブルをまったく使用しないため
インスタンスのサイズがコンパクト&メソッドが高速というメリットもありんす
699デフォルトの名無しさん:2007/01/26(金) 23:50:10
別に言語仕様上そんなこともできるとだけ思っておいてもいいと思うよ。
俺もprotected非仮想なデストラクタを持つクラスなんて、
作ったこともないし見たこともない(と思っているだけで気付いていないだけかもしれないが)。
700デフォルトの名無しさん:2007/01/27(土) 00:10:09
>699
確かにポリシー的な使い方がほとんどですな。
使う時はprotected非仮想コンストラクタとセットかな。
701デフォルトの名無しさん:2007/01/27(土) 00:56:10
スマートポインタとペアで使えばいいんじゃないの?
protected非仮想デストラクタなインスタンス。
702デフォルトの名無しさん:2007/01/27(土) 01:22:31
>>698
基本クラスから継承させるけど、
Base* b=new Derived();
じゃなくて、
Derived* d=new Derived();
って使えということですか。なるほど。ややこしいですね

>>701
意味がよく分かりません....
703デフォルトの名無しさん:2007/01/27(土) 01:39:19
>702
いや、それはOK……というよりもそうしなきゃ基本クラス使う意味無いじゃない。

Base* b=new Derived();
delete b;
がNGなだけ。
704デフォルトの名無しさん:2007/01/27(土) 02:16:58
>>703
レスありがとうございます
となると、bはどうやって解放したらよいのですか?
705デフォルトの名無しさん:2007/01/27(土) 02:28:26
単純にいけるのかなーと思ってstatic_cast<Derived*>してみたけど規格としてもOK?
まあ俺はそういうクラスに触る機会ないからわかんないけど
706デフォルトの名無しさん:2007/01/27(土) 02:35:54
>>702
ttp://cppemb.blog17.fc2.com/blog-entry-23.html
ここの後半あたり読むといいかも
707デフォルトの名無しさん:2007/01/27(土) 02:41:15
>>702
ttp://www.zeroscape.org/cgi-bin/wiki/wiki.cgi?page=shared_ptr+minor+features
あとこことか
まさに>>703の状態をsmartポインタで回避できるのはなぜかがかかれてる.

708デフォルトの名無しさん:2007/01/27(土) 03:02:07
>>706=707さん
ありがとうございました。よく分かりました。
shared_ptr deleterのテンプレートの使い方にびびりました
すごい
709デフォルトの名無しさん:2007/01/27(土) 05:34:56
int **a[100][100];
この宣言があってるのか、疑問なんですが、
4次元配列を動的に確保したのですが、どうしたらいいのかわかりません。
どうしたらいいのでしょうか?

言語はC++です。
710デフォルトの名無しさん:2007/01/27(土) 05:44:57
(int**)つまりint型のポインタのポインタが10000個。

・a[num]もしくはa[num][num]が指すのは(int**)型。
・*a[num]が指すのは(int*)型。
・**a[num]はint型。
711デフォルトの名無しさん:2007/01/27(土) 05:55:31
偉そうな事書いてみたけど実はそんなに詳しくなかったり。

int ****a,i;
const static int
_0=20,
_1=50,
_2=90,
_3=12;

a=new int***[_0];
for(i=0;i<_0;++i){
*a=new int**[_1];
}
for(i=0;i<_1;++i){
**a=new int*[_2];
}
for(i=0;i<_2;++i){
***a=new int[_3];
}
712デフォルトの名無しさん:2007/01/27(土) 07:38:41
>>710 >> 711
ありがとうございます!わかりました〜
713デフォルトの名無しさん:2007/01/27(土) 08:59:06
もはやCじゃん
714デフォルトの名無しさん:2007/01/27(土) 09:46:26
715デフォルトの名無しさん:2007/01/27(土) 10:16:32
もはやCoremadekaじゃん
716デフォルトの名無しさん:2007/01/27(土) 11:27:15
そして712はメモリリークに悩まされるのであった...
717デフォルトの名無しさん:2007/01/27(土) 11:38:10
>>711
むちゃくちゃやな、これ。
718デフォルトの名無しさん:2007/01/27(土) 13:00:06
普通にvector使えばいいんじゃない? >709
vector<vector<vector<vector<int> > > >

サイズはresizeで確保するのが簡単ですな。
719デフォルトの名無しさん:2007/01/27(土) 13:05:03
>>711
これはひどい
720デフォルトの名無しさん:2007/01/27(土) 13:15:01
>>711
IOCCCでやれ
721デフォルトの名無しさん:2007/01/27(土) 14:33:44
Cをちゃんとやれと勧めるべきか、
Cは忘れてC++やれと勧めるべきか…。
722デフォルトの名無しさん:2007/01/27(土) 15:03:28
こんな感じ?
再帰を使えばもっときれいになるのか?

#include <iostream>
using namespace std;

int main()
{
    int n1=5,n2=10,n3=15,n4=20;  
    int v=0;
    int**** a;
    a=new int***[n1];
    for(int i=0;i<n1;i++){
        a[i]=new int**[n2];
        for(int j=0;j<n2;j++){
            a[i][j]=new int*[n3];
            for(int k=0;k<n3;k++){
                a[i][j][k]=new int[n4];
                for(int l=0;l<n4;l++){
                    a[i][j][k][l]=v++;
                }
            }
        }
    }
    return 0;
}
723デフォルトの名無しさん:2007/01/27(土) 15:12:00
PHPの超便利配列(?)をするにはどうしたらよいですか?
こんなの
a['takahashi'][id]=n
a['takahashi'][age]=50
724デフォルトの名無しさん:2007/01/27(土) 15:12:55
>>723
PHPを使えばおk
725デフォルトの名無しさん:2007/01/27(土) 15:19:12
>>723
std::map
726デフォルトの名無しさん:2007/01/27(土) 15:21:17
C++からphp.exeを呼ぶことにしました
727デフォルトの名無しさん:2007/01/27(土) 15:31:22
あ、ありえん
728wankuma:2007/01/27(土) 15:35:58
729ららら:2007/01/27(土) 17:28:50
メンバ関数ポインタのオーバーロードを解決するには、
どうしたらいいでしょうねぇ。

SomeClass some;
MethodCaller<SomeClass>::Class(some, &SomeClass::Func);

SomeClass::Func がオーバーロードされている場合、
コンパイルエラーになってしまうんです。
730ららら:2007/01/27(土) 17:30:19
>>729
ごめんなさい。関数名が分かりにくいので訂正。

× MethodCaller<SomeClass>::Class(some, &SomeClass::Func);
○ MethodCaller<SomeClass>::Call(some, &SomeClass::Func);
731デフォルトの名無しさん:2007/01/27(土) 18:03:31
これって何するものですか?
732デフォルトの名無しさん:2007/01/27(土) 18:09:15
明示的にキャストするとか
733ららら:2007/01/27(土) 18:11:07
>>731
た・と・え・ば、の話。
役に立つコードかどうかは別の話ということで。
734デフォルトの名無しさん:2007/01/27(土) 18:12:56
オーバーライドした子クラスの関数から、同名の親クラスの関数を呼ぶには、
void ChildClass::Method() {
  this->ParentClass::Method();
}
ですか?
735デフォルトの名無しさん:2007/01/27(土) 18:16:06
>>734
ParentClass::Method()
inherited::Method()とか書けたら良かったのに
736デフォルトの名無しさん:2007/01/27(土) 18:24:44
>>734
そうだよ
737ららら、むじんくん♪ :2007/01/27(土) 18:25:57
 
738デフォルトの名無しさん:2007/01/27(土) 18:27:18
偉そうな奴だな
739デフォルトの名無しさん:2007/01/27(土) 19:07:33
会話が飛んでる? とおもったらコテかよ
740デフォルトの名無しさん:2007/01/27(土) 20:22:32
コーディングの暗黙の了解的な事に関して質問です。

単なるデータ構造を定義する場合は構造体を用いると思いますが、
構造体内に簡単なデータチェックやユーティリティー関数を定義する場合、クラスとするべきなのでしょうか?

例えば、

struct Date {
int nMonth;
SetMonth( int nParamMonth ) {
if ( nParamMonth < 0 || nParamMonth > 12 ) {
nMonth = DEFAULT_MONTH;
} else {
nMonth = nParamMonth;
}
};
int nDay; //以下略。。。
};

みたいな場合は、クラスと「すべき」なんでしょうか。
741デフォルトの名無しさん:2007/01/27(土) 20:33:24
会社なりプロジェクトなりでコーディングスタンダードがあれば別だが、
基本的には好きにしろボケの一言。

メンバ変数が0でoperator()しかないファンクタの類をstructにするとか普通だし。
742デフォルトの名無しさん:2007/01/27(土) 20:33:29
あくまでもデータ構造に主眼がおかれているのであれば
構造体で良いのではないだろうか。
743デフォルトの名無しさん:2007/01/27(土) 20:34:31
>>741
それはいちいちpublic書きたく無いからじゃないかね>ファンクタ
744デフォルトの名無しさん:2007/01/27(土) 20:39:35
ありがとうございます。
好きにさせて頂きます。
745デフォルトの名無しさん:2007/01/27(土) 20:52:20
結論が出ちゃった後だが
俺もclass+publicとstructが同じって概念があれば構わないと思う。
だからインタフェースをstructで定義するもありだと思ってる。
746デフォルトの名無しさん:2007/01/27(土) 21:12:36
漏れは、内部を隠蔽するものをclassに、全部公開するものをstructにしている。
747デフォルトの名無しさん:2007/01/27(土) 21:20:39
template<class T, class U = typename remove_const<T>::type>
struct hoge
{ };

つまり one keyword, one functionalityということだ

まあ正直どうでもいいと思う
748デフォルトの名無しさん:2007/01/27(土) 21:56:40
新これならわかるC++挫折しないプログラミング入門というのを見ながら

#include <iostream>

int main()

{

std::cout << "Hello!" << std::endl;

}

ていうのを書いてあるとおりにしたらエラーなんですけど何が違うのでしょうか?
いきなり挫折しそうです(汗)
749デフォルトの名無しさん:2007/01/27(土) 22:05:31
エラーの中身を書かない人には(掲示板を使うのは)難しい
750デフォルトの名無しさん:2007/01/27(土) 22:21:23
エラー E2209 hello.cpp 1:インクルードファイル'iostream'をオープンできない
エラー E2290 hello.cpp 7:型限定子'std'がクラス名または名前空間ではない(関数
 main())
エラー E2379 hello.cpp 7:ステートメントにセミコロン(;)がない(関数 main())

これが中身なんですけど・・・
751デフォルトの名無しさん:2007/01/27(土) 22:24:55
>インクルードファイル'iostream'をオープンできない
が全ての原因。
開発環境が絡んでくるので環境依存スレへ
752デフォルトの名無しさん:2007/01/27(土) 22:25:29
>>750
インクルードパスが通ってない
753デフォルトの名無しさん:2007/01/27(土) 22:33:10
環境依存スレとは何ですか?
754デフォルトの名無しさん:2007/01/27(土) 22:49:22
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/
755デフォルトの名無しさん:2007/01/27(土) 22:51:18
#include <ostream>
がないな。

いや、出ているエラーの原因とは関係ないが。
756デフォルトの名無しさん:2007/01/27(土) 23:04:29
754>紹介ありがとうございます。
755>
'bcc32hello.cpp'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されてません。

・・・というのがきました
757デフォルトの名無しさん:2007/01/27(土) 23:23:43
bcc 使ってるんであれば
それ用の入門者用ページを最初から100回ぐらい見直した方がいいよ。
758デフォルトの名無しさん:2007/01/27(土) 23:27:08
まさかとは思うが、

bcc32 と hello.cpp の間にスペースを入れてないとか?
759デフォルトの名無しさん:2007/01/27(土) 23:30:58
>>735
多重継承したときどうするかということ、そして何より自分でtypedefすればすむ(言語仕様に手を加えずにすむ)ということで、
そのような機能は入れなかったとD&Eには書いてある。
760デフォルトの名無しさん:2007/01/28(日) 00:56:38
>>747
意味が分かりません
761デフォルトの名無しさん:2007/01/28(日) 01:08:52
>>759
VC++には、__superなる独自仕様があるんだよな。
しかし、個人的にはいらない。明示的にベースクラスを修飾するほうが分かりやすい。
曖昧にもならないし。
MSのVC開発チームもなぜこんな仕様を盛り込んだのか。
762デフォルトの名無しさん:2007/01/28(日) 02:10:46
__int64って普通に使ってもおk?
763デフォルトの名無しさん:2007/01/28(日) 02:36:18
>>762
適当な名前にtypedefしてからならOK
764デフォルトの名無しさん:2007/01/28(日) 09:30:25
>>762
boost::int64_t
765デフォルトの名無しさん:2007/01/28(日) 10:31:47
>>762
VC++ 7.1 (.NET 2003)以降ならlong longが使える。
その他のコンパイラで、Boostが嫌なら、<windows.h>のLONGLONGもしくはINT64がある。
766デフォルトの名無しさん:2007/01/28(日) 10:40:03
クラスにoperator()(operator+()などではない)定義って具体的にどういうことができるの?
767デフォルトの名無しさん:2007/01/28(日) 10:44:12
>>766 std::less みたいなこと。
768デフォルトの名無しさん:2007/01/28(日) 10:51:22
C++ってあそこまで難しくややこしくある必要性ってなんですか?
769デフォルトの名無しさん:2007/01/28(日) 10:54:06
>>768
実行時コストを最小にして高レベルプログラミングを実現する目的があったからです。
770デフォルトの名無しさん:2007/01/28(日) 10:55:46
>>766
関数と同じことが出来る。
ただコールバックとして呼び出すような場合
関数ポインタを渡すのと違いインライン化できるので
関数呼び出しのオーバーヘッドが無くて高速化できる。
典型的な例がqsortとstd::sortの違い。

あとは関数内にインナー関数のように定義できるとかそんなところか。
771デフォルトの名無しさん:2007/01/28(日) 11:30:34
>>768
Cとの互換性をできるだけ確保する必要があったということも多分あると思う。
772デフォルトの名無しさん:2007/01/28(日) 12:24:44
wchar_t
の_tってどんな意味ですか?
773デフォルトの名無しさん:2007/01/28(日) 12:29:21
>>772
禿に聞いてくれ。
といっても、ワイド文字あたりの仕様を考えたのは、禿じゃないだろうけど。
たしか禿も、7bit文字圏の人だし。

Wide Character Typeってところじゃないの。せいぜい。
774デフォルトの名無しさん:2007/01/28(日) 12:34:19
禿って誰ジャーーー??
775デフォルトの名無しさん:2007/01/28(日) 12:48:07
776デフォルトの名無しさん:2007/01/28(日) 13:01:12
_を入力するのがめんどい
777デフォルトの名無しさん:2007/01/28(日) 13:03:52
>>776
Shift+-が面倒なの?
778デフォルトの名無しさん:2007/01/28(日) 13:08:50
確かにめんどい
779デフォルトの名無しさん:2007/01/28(日) 13:09:17
#typedef wchar_t wt
780デフォルトの名無しさん:2007/01/28(日) 13:16:07
Cの伝統的な習慣に typedef された型に _t と付けるというものがあり
Cで wchar_t は確かにtypedefed typeだったが
C++では予約語になった

という歴史的経緯
781デフォルトの名無しさん:2007/01/28(日) 15:34:24
>>779
#はいらないだろ
782デフォルトの名無しさん:2007/01/28(日) 15:46:21
>>782はいらないだろ
783デフォルトの名無しさん:2007/01/28(日) 15:48:04
>>782はいるよ
784デフォルトの名無しさん:2007/01/28(日) 15:52:25
いらねーよw
785デフォルトの名無しさん:2007/01/28(日) 15:54:14
いるのに(´・ω・`)
786デフォルトの名無しさん:2007/01/28(日) 16:06:40
いれるぞ、うっ
787デフォルトの名無しさん:2007/01/28(日) 16:14:06
>>782はいないよ
788デフォルトの名無しさん:2007/01/28(日) 16:32:33
30分も経たないうちに死んでしまったのか...。
789デフォルトの名無しさん:2007/01/28(日) 16:36:18
↓こういう関数は定義できませんよね。
foo( const Bar & object, int arg = object.Something() );
できたらいいなあと思うんですが。
790デフォルトの名無しさん:2007/01/28(日) 16:48:55
>>789
戻り値の型がありません。
791デフォルトの名無しさん:2007/01/28(日) 16:51:05
>>789
T foo( const Bar & object, int arg );
inline T foo( const Bar & object ) { return foo(object, object.Something()); }
792デフォルトの名無しさん:2007/01/28(日) 16:55:23
オーバーロードしたら終わりですやん。
793デフォルトの名無しさん:2007/01/28(日) 16:57:34
>>790
すみません。忘れていました。

>>791
ありがとうございます。
でもデフォルト引数が増えていくと定義も増えるので
それで少し面倒かなと思いまして。
T foo( const Bar & object, int arg1 = object.get1(), int arg2 = object.get2(), int arg3 = (以下略
面倒がらずに書いていきたいと思っております…。
794デフォルトの名無しさん:2007/01/28(日) 17:07:14
クラスの継承について質問させていただきます。

[問題]
class A
{
a;
aa;
};

class B
{
b;
bb;
};

class B1 : public B{};
class B2 : public B{};
class B3 : public B{};
...

ここで、A, B, B1, B2, B3,...のメンバ
a, aa, B1.b, B1.bb, B2.b, B2.bb,...
を全て継承しているクラスSumを定義したい。
このとき、Sumはどのように書けばよいのでしょうか?
非常に低次元な内容で申し訳ありません。
795デフォルトの名無しさん:2007/01/28(日) 17:09:57
設計見直して振る舞い分けた方がよくないか?
796デフォルトの名無しさん:2007/01/28(日) 17:10:36
すまん795は793宛
797デフォルトの名無しさん:2007/01/28(日) 17:20:12
>>794 class Sum : public A, B1, B2, B3 {}; でいいかな?
798デフォルトの名無しさん:2007/01/28(日) 17:29:26
>>795
そうですね、一つにまとめる振る舞いは良くないかもしれません…。
設計も見直してみたいと思います。
799デフォルトの名無しさん:2007/01/28(日) 17:29:36
>>797
仮想継承しないと曖昧エラーが出るような希ガス
800デフォルトの名無しさん:2007/01/28(日) 17:37:21
>>797
その場合、Sumのインスタンスに対して、例えばB1.bとB2.bを区別するにはどうすればいいですか?
Sum obj;
Sum.B1.b
などではうまくいかないようですが
>>799
詳しく教えてくれませんか?
801デフォルトの名無しさん:2007/01/28(日) 17:37:36
Sumで b と bb を使おうとすると曖昧ですって言われるね。
802794=800:2007/01/28(日) 17:39:09
書き忘れましたが、794=800です。
あと、細かいことですが>>800
Sum obj;
obj.B1.b;
でした。どっちにせよあてずっぽうで書いたものなのでどうでもよいですが。
803デフォルトの名無しさん:2007/01/28(日) 17:41:36
>>800
class B1 : virtual public B {}
........
のように書けば、Bの実体は一つに絞られ曖昧エラーは出ない。

また、仮想継承を使いたくない時は

Sum::B1::b のように限定すれば、B1、B2、B3毎にBの実体が
作られているので、曖昧を回避する事ができる。
804デフォルトの名無しさん:2007/01/28(日) 17:42:48
sum.B1::b
805デフォルトの名無しさん:2007/01/28(日) 17:43:28
菱形継承コワイコワイ
806デフォルトの名無しさん:2007/01/28(日) 17:46:55
あと当然だが、class Sum ではデフォルトがprivateになって
いるため、
public:
using B::b;
などとしてpublicに引っ張り出さないと、クラス外からアクセス
できない。
807デフォルトの名無しさん:2007/01/28(日) 18:13:43
おっとっとごめん
class Sum : public A, public B1, public B2, public B3
とやれば using は不要だわな
それにしてもこの多重継承のパズルはいつ見ても嫌だ
808デフォルトの名無しさん:2007/01/28(日) 18:17:41
class B { int b; };
class C : public B {};
class D : public B, public C {};

とやってしまうと、Dの基底クラスBに曖昧さなしでアクセスする
事は不可能になってしまうね。大抵のコンパイラでは警告が
出るようだけど。
809794:2007/01/28(日) 18:24:39
お教えいただいたことを自分なりに解釈して、次のようなコードを書くことで
B1.bをメンバとして持つクラスSumを定義し、かつB1.bにSumのメンバ関数からアクセスできるようになりました。
(get、set関数はソース省略、コンパイルして動作確認済み)
これを基本形としてコードを書いてゆくことに、特に問題はなさそうでしょうか?

class A
{
a;
public:
get_a();
set_a();
};

class B
{
b;
public:
get_b();
set_b();
};

class B1 : public B{};
class B2 : public B{};
...

class Sum : public A, public B1, public B2,...{};

obj.B1::set_b();
obj.B1::get_b();
810794:2007/01/28(日) 18:26:39
>>806
obj.B1::set_b();
のところで、
error C2247: 'B::b' はアクセスできません。'Sum' は 'private' で 'B1' からの継承で使われています。
とのエラーが出ます。
>>807
>それにしてもこの多重継承のパズルはいつ見ても嫌だ
多重継承の方法はあまりよいやり方ではないということでしょうか?
811デフォルトの名無しさん:2007/01/28(日) 18:31:37
>>810
class Sum : public B1
のようにpublic継承したら問題はないはず。

多重継承はJavaのような言語にはないのは設計ミスを生じやすい
から取り消されたと聞いているけど、多重継承を使わないと解決
できない問題も存在するのは事実。

ただ他の方法でもできるのに無理に多重継承を使うのはお勧めしない。
訳のわからないエラーに悩まされる事になる。
812デフォルトの名無しさん:2007/01/28(日) 18:43:31
Bがクラスの場合、

class A : B{

はprivate継承でしたっけ?
813デフォルトの名無しさん:2007/01/28(日) 19:14:32
まあ、多重継承が面倒な問題を抱えることになるのも事実だが、かといって多重継承がなければ
スマートに解決できない問題というのも確実に存在する。

だからjava系にはinterfaceに限って多重継承を認めてるし、Rubyには限定されたMix-inがあるわけだ。
814デフォルトの名無しさん:2007/01/28(日) 19:34:14
javaのインターフェース多重継承できないと、
threadを継承した時点で終わるw
815デフォルトの名無しさん:2007/01/28(日) 21:07:44
>>812
その通り
816デフォルトの名無しさん:2007/01/28(日) 21:11:09
下記のコードVC2003ならコンパイルできるけど、
2005はできない。i のスコープの解釈の違いによるものだけど、
どっちが正しいんですか?

for(int i=0; i<100;i++)
{
  //do something
}

cout << i ;
817デフォルトの名無しさん:2007/01/28(日) 21:21:31
>>816
2003でコンパイル出来るとは初耳だ。
VC6でしょ?
2003は何かオプションを付けないとエラーになるだろ。
818デフォルトの名無しさん:2007/01/28(日) 21:22:25
規格ではコンパイル出来ないのが正しい。
VCは伝統的にそれを破ってたのだが、
VC2005からはデフォルトで規格通りに
振る舞うようになった
819デフォルトの名無しさん:2007/01/28(日) 21:29:03
>>817
VC6で作ったものをVC2003でそのままコンパイルしたら通りました
で、VC2003でコンパイルしたものを2005でコンパイルしたら×でした。

820デフォルトの名無しさん:2007/01/28(日) 21:30:34
>>818
ありがとうございます。分かりました。
821デフォルトの名無しさん:2007/01/28(日) 21:43:03
>817
VC6:コンパイルできる。/Zcでエラーにできるが、Windows.hとかがエラーだしまくるので使えない
VC7:コンパイルできる(規定)。エラーにするオプションもある。
VC8:コンパイルできない(規定)。/Zc:forScope-でコンパイルできる
だったかなたしか。
822デフォルトの名無しさん:2007/01/28(日) 21:59:05
>>821
なるほど、歴史的な経緯がかいまみれますね。
ありがとうございました。
823デフォルトの名無しさん:2007/01/28(日) 21:59:30
そうなのか。2003はアンインストールしてるから関係ないけど。
気持ち悪いな。標準C++以前の文法じゃん。
824デフォルトの名無しさん:2007/01/28(日) 22:23:43
環境依存ネタを続けるのは良くないと思うが一言だけ
VC6でコンパイルするときは
#define for if(0);else for
を宣言しておけ。

825デフォルトの名無しさん:2007/01/28(日) 23:26:47
>>824
使う機会はまずないと思うが、何故?
826デフォルトの名無しさん:2007/01/28(日) 23:30:11
いまだVC6使ってる俺
827デフォルトの名無しさん:2007/01/28(日) 23:40:23
>>825
string使ってるなら気をつけなよ
マルチプロセッサマシンで死ぬから
828デフォルトの名無しさん:2007/01/28(日) 23:45:03
>>825
C++標準に合わせてfor文の中の変数のスコープを制限するため。
そもそも>>816みたいなことが出来ちゃうこと自体が変。

http://www.fides.dti.ne.jp/~oka-t/vc-mfc.html#quirks
829デフォルトの名無しさん:2007/01/29(月) 00:26:49
別に変じゃないだろ。
830デフォルトの名無しさん:2007/01/29(月) 01:07:39
変。標準C++ではできないはずなんだもん。
831デフォルトの名無しさん:2007/01/29(月) 01:11:55
>>763
何でtypedefするひつようがありますか?
832デフォルトの名無しさん:2007/01/29(月) 01:12:06
よくわかりませんが、VC6だと

{
  MyClass c;
  c.DoSomething();
}

のように、敢えてブロックで囲って、デストラクタを呼び出させることはできないということですか?
833デフォルトの名無しさん:2007/01/29(月) 01:15:11
>>832
は?何言ってんの?馬鹿?
834デフォルトの名無しさん:2007/01/29(月) 01:17:25
馬鹿です
835デフォルトの名無しさん:2007/01/29(月) 01:23:52
>>831
環境依存依存の型名なので、他の環境に移植した場合最小限の修正で済むように。
836デフォルトの名無しさん:2007/01/29(月) 01:36:22
>>832

VC6,2003だと
for(int i=0 ....)
{ }
のiがforループのブロックの外にもスコープを持つ

2005だと持たない。

あくまでfor文の話
837デフォルトの名無しさん:2007/01/29(月) 06:40:03
>>830
変じゃない。VC6の頃は標準C++自体が策定段階で、仕様が過渡期だった。
838デフォルトの名無しさん:2007/01/29(月) 06:42:15
>>837
その頃の話をしてるんじゃない。今の話をしている。
839デフォルトの名無しさん:2007/01/29(月) 07:50:34
元質は、VC6は変か? じゃないの?

まぁいいや。
・VC6は当時の事情によりそうなっていたが、今となっては変。
・VC6を使うなら、>824のような対策をとることお勧め。
ってことで。
840デフォルトの名無しさん:2007/01/29(月) 09:00:08
VC6が変なのではなく、VC6を使い続けているのにその仕様に文句を言うやつの方が変なんだろ。
841デフォルトの名無しさん:2007/01/29(月) 10:02:05
つまりVC2005買えと言ってんの?
842デフォルトの名無しさん:2007/01/29(月) 10:02:33
つ Express
843デフォルトの名無しさん:2007/01/29(月) 10:07:27
>>842
MFCなくてもGUI作れる?
844デフォルトの名無しさん:2007/01/29(月) 10:13:45
最近はMFCがないとGUIのアプリ作れないと思ってる人がいるんだね
845デフォルトの名無しさん:2007/01/29(月) 11:03:54
VC6を持っているなら、2005で6のMFCを使えばいいんでないの?
つーか、スレ違いだがね。
846デフォルトの名無しさん:2007/01/29(月) 11:04:37
ライセンス的にどーなのよ、それ。
847デフォルトの名無しさん:2007/01/29(月) 12:37:09
>>846
なんか問題あるか?
848デフォルトの名無しさん:2007/01/29(月) 12:43:38
質問者に質問者と同じ質問をぶつけるなよ
849デフォルトの名無しさん:2007/01/29(月) 14:25:53
>>843
MFC使うくらいなら、↓使えよ。

http://www.torjo.com/win32gui/
850デフォルトの名無しさん:2007/01/29(月) 14:31:38
>>848
いや、スマン、疑問に思う根底の部分に何か思い当たる部分があるのか聞きたかっただけ。
851デフォルトの名無しさん:2007/01/29(月) 17:43:58
adobeが汎用のGUIライブラリー作ってなかった?
852デフォルトの名無しさん:2007/01/29(月) 17:47:57
kwsk
853デフォルトの名無しさん:2007/01/29(月) 17:55:36
854デフォルトの名無しさん:2007/01/29(月) 19:12:00
wxWidgetsのことも思い出してやって下さい
855デフォルトの名無しさん:2007/01/29(月) 19:15:27
>>853
期待ageなライブラリだな
856デフォルトの名無しさん:2007/01/29(月) 20:32:16
Qtもあるでよ
857デフォルトの名無しさん:2007/01/29(月) 21:06:03
GUIリソースをマウスでチョイチョイっと作れるのはVCじゃないと無理じゃね?
858デフォルトの名無しさん:2007/01/29(月) 21:24:43
あのお、低レベルな質問ですいません。
クラスXの入力イテレータを受け取りたいんですが
どう書いたらよいでしょうか。

int Uketorimasu(InputIterator<X> kokokara,InputIterator<X> kokomade)
コンパイラがエラーになってます??
859デフォルトの名無しさん:2007/01/29(月) 21:31:25
intとかの数値をstringに変換してそのまま関数の引数に渡してやりたいのですが、
一番簡単なやりかたってなんですか? 
stringstreamも_ltoa_sも2,3行必要なので、なんかやりづらい
自分で変換関数を作るのが良いですか?
860デフォルトの名無しさん:2007/01/29(月) 21:33:20
boost::lexical_cast
861デフォルトの名無しさん:2007/01/29(月) 21:41:20
boostおいらも使いたいんだけど、
メンバーで知ってる人いないから使いづらい。。
共有のソースだし
862デフォルトの名無しさん:2007/01/29(月) 21:46:57
と思ったけど、ちょっと提案してみますboost
863デフォルトの名無しさん:2007/01/29(月) 21:52:12
おいらはstd::stringを返すstrprintfとか作った。
FILE *fp=fopen( stdprintf("%d.txt",i).c_str(), "rb");
とか書けて幸せだが、実装に要したコストを考えると微妙。
864デフォルトの名無しさん:2007/01/29(月) 22:02:47
>>858
template<typename InputIterator>
int Uketorimasu(InputIterator kokokara, InputIterator kokomade)

>>863
文字列の長さを知る方法があれば、それを元にvsnrpintfを呼ぶだけだから、大したことはないと思うのだが。
もっとも、boost::formatが似たようなことをやっている。
http://www.kmonos.net/alang/boost/classes/format.html
865デフォルトの名無しさん:2007/01/29(月) 22:05:18
>>859
その2,3行の関数をinlineでヘッダに書いてやれば
マクロみたいに使えるが
866デフォルトの名無しさん:2007/01/29(月) 22:09:33
>864
確かに...を使うなら、vsnprintfを呼ぶだけだからたいしたことはない。
%sに10とかstd::stringオブジェクトを突っ込んだりすると即死なのが
我慢できればそれでも良かったかもね。
867デフォルトの名無しさん:2007/01/29(月) 22:13:41
>>863
俺は思い切ってstd::stringをラップして http://tricklib.com/cxx/dagger/xstring.h を作った。
FILE *fp=fopen(xstring().format("%d.txt",i), "rb"); // .c_str() は不要。
とか書けて幸せ。std::stringの全メンバをオーバーライドしてるんで実装には結構手間がかかった。
868デフォルトの名無しさん:2007/01/29(月) 22:19:17
メンバ関数に__stdcall等の規約が指定されている関数とかがあるとして、
それを継承して再定義した関数も、implicitな感じで__stdcallになるんですか?
869デフォルトの名無しさん:2007/01/29(月) 22:24:21
>>868
C++の設計思想的にそれはないハズ。
870デフォルトの名無しさん:2007/01/29(月) 22:29:13
>>868
それはわからないが、Platform SDKのCOM関係のヘッダでは
全てにいちいちSTDMETHODCALLTYPE(__stdcallと定義されている)を付けている。
871デフォルトの名無しさん:2007/01/29(月) 22:32:45
少なくともベースクラスでvirtualなメソッドがSTDCALLなら、
その派生もSTDCALLにならざるを得ない。
872デフォルトの名無しさん:2007/01/29(月) 22:39:39
>>871
いやだから、C++の設計思想的にそれはないだろ。
継承階層が深くなったりしてるときに深い階層にある継承元クラスの定義で
継承先のクラスが影響を受ける訳にはいかない。
仮想関数としてオーバーライドさせたい場合は自分でSTDCALLを
定義せにゃならんハズ。
873デフォルトの名無しさん:2007/01/29(月) 22:54:55
そのばあい、STDCALLを指定しなければコンパイルエラーとなると思うがどうか。
そうでなければ、その仮想メソッドをどうやって呼び出すというのか。
874デフォルトの名無しさん:2007/01/29(月) 22:57:42
>>873
継承元クラスのポインタにキャストすりゃ一発だろ。
875デフォルトの名無しさん:2007/01/29(月) 23:00:54
ほー。へー。で、キャストしてからSTDCALL形式で叩くの?ふーん。
876デフォルトの名無しさん:2007/01/29(月) 23:12:18
得意気な奴が反論できなくなって敗れ去る瞬間はいつ見てもおかしいが、
その段階で尚、涙目で「何かあるフリ」だけしておこうっていう間違った根性はさらに笑えるかも。
877デフォルトの名無しさん:2007/01/29(月) 23:15:49
そういう言葉は
class b{
virtual int __stdcall f(){ return 0;}
};
class c : b{
virtual int f(){ return 0;}
}
をコンパイルしてから云ってもらおうか(w
878デフォルトの名無しさん:2007/01/29(月) 23:22:56
これだとエラーになったけど、こういうことじゃなくて???
エラー E2113 test.cpp 17: 仮想関数 'derived::whoami()' は基本クラス 'base' と矛盾する

#include <iostream>
using namespace std;

class base
{
public:
    virtual void __stdcall whoami()
    {
        cout << "I am base" << endl;
    }
};
class derived : public base
{
public:
    virtual void whoami()
    {
        cout << "I am derived" << endl;
    }
};
int main()
{
    base* b= new derived();
    
    b->whoami();
    
    delete b;
    return 0;
}
    
879デフォルトの名無しさん:2007/01/29(月) 23:23:47
と、さもまっとうに言い返してるかのような顔で
話とまったく違うコードを出してくる奴w
880デフォルトの名無しさん:2007/01/29(月) 23:25:10
は???意味が分からん
881デフォルトの名無しさん:2007/01/29(月) 23:25:19
まさに↓だな
>得意気な奴が反論できなくなって敗れ去る瞬間はいつ見てもおかしいが、
>その段階で尚、涙目で「何かあるフリ」だけしておこうっていう間違った根性はさらに笑えるかも。
882デフォルトの名無しさん:2007/01/29(月) 23:28:25
どうでもいいけどクラスを宣言したとき
必ず最後の ; を忘れてしまうのは私だけ?
883デフォルトの名無しさん:2007/01/29(月) 23:30:30
とりあえず、871, 873, 875の勝利。
872,874はいわば負け犬(ルーザー)。
876からの展開は向きが曖昧なので不明
884デフォルトの名無しさん:2007/01/29(月) 23:32:44
>>872
も最後の2行はあってると思うけど
最初の3行は意味が分からんが

>>874は変だと思うけど
885デフォルトの名無しさん:2007/01/29(月) 23:34:00
何か珍しく変な人が多いな
いつもはビシッと正解が出るのに
886デフォルトの名無しさん:2007/01/29(月) 23:34:45
>>負け犬(ルーザー)。 

わざわざ括弧書きで書くとこがかわいい
887デフォルトの名無しさん:2007/01/29(月) 23:34:46
>>872-874 は同じようなことを違う言葉でいってるようしにか見えんのだが、
そこからなぜ、>>875-876 のような流れになるん?
888デフォルトの名無しさん:2007/01/29(月) 23:36:22
元は>>871の書き方に問題があるんじゃないかね。
STDCALLにならざるを得ないって、STDCALLを宣言しなくて良いのか
しないといけないのか、どっちにもとれる
889デフォルトの名無しさん:2007/01/29(月) 23:37:16
>>884
>>>872
>も最後の2行はあってると思うけど
>最初の3行は意味が分からんが

お前、まさか、class 定義内で使う using の理由(←これが
まさにその「最初の3行」)を知らんのか?
890デフォルトの名無しさん:2007/01/29(月) 23:37:23
どっちかというと、>>871
__stdcallを宣言しなくてもいいって言ってるように見えるけど
891デフォルトの名無しさん:2007/01/29(月) 23:39:06
>>889
お前、日本語勉強したほうが良いぞ
892889:2007/01/29(月) 23:40:40
>>891
読み返してみて、俺もそう思った。ゴミレスすまん。
893デフォルトの名無しさん:2007/01/29(月) 23:44:16
素直な奴!!!!ワロタ
894デフォルトの名無しさん:2007/01/29(月) 23:50:47
>>885
正解もなにも、喧嘩してる両者の主張が同じなんですが。
895デフォルトの名無しさん:2007/01/29(月) 23:53:57
あいまいすぎ
896デフォルトの名無しさん:2007/01/30(火) 00:11:25
871だけど、>>868からの話(implicitがどうこう)の流れとしては言葉が
足りてなかったかもね。
言いたかったのは要するに>>873で、「STDCALLにせずに呼べるなら
呼んだ時死ぬ」というだけで、explicit/implicitについては言及してない。

>継承階層が深くなったりしてるときに深い階層にある継承元クラスの定義で
>継承先のクラスが影響を受ける訳にはいかない。
について「影響」の範囲にも拠るんだろうけど、virtualな以上影響なしなわけ
ねーということが言いたかった。ついカッとなって書いた。反省している。
897デフォルトの名無しさん:2007/01/30(火) 00:50:19
うむ。わかればよいのじゃ、わかれば。ハッ、ハッ、ハッ。(何故か偉そう
898デフォルトの名無しさん:2007/01/30(火) 01:20:34
ついカッとなるようなぼけは
回線切って一酸化炭素を胸一杯吸い込んでこい
899デフォルトの名無しさん:2007/01/30(火) 04:58:43
>>857
QtにVC用ポトペタプラグインあるでよ
900デフォルトの名無しさん:2007/01/30(火) 05:45:37
typedefしてintを別名で利用しているのですが、

大量の型名を宣言しているものの、全てintの別名でしかないので、
コンパイラで型チェックされなくてバグの温床になりそうです。

どのように対応するのが一般的なのでしょうか?
901デフォルトの名無しさん:2007/01/30(火) 06:25:54
>>900
その型をclassにする。enumにするだけでも違うかもしらん。
902デフォルトの名無しさん:2007/01/30(火) 09:13:18
VC8だとtypedefしたものでも型が違うもの同士と代入したりすると警告が出るyo
903デフォルトの名無しさん:2007/01/30(火) 10:02:29
>>867
僕は更にトチ狂って、文字列版 boost.bind をコンセプトに
http://naiv.info/werk/kalas_alpha.zip とか作ってたぜ!

FILE * fp = wfopen( sprint(wstring(),_d%L".txt",10).c_str(), "rb" );

spirit 見たいに式を保存できるようにする予定が途中で飽きて、そのままだけど…
しかも、stream のラッパーだから遅いし。

904デフォルトの名無しさん:2007/01/30(火) 10:11:00
>>900
boostに強いtypedefというか、別の型にしてくれるやつがあった気がするんだが思い出せん。
905デフォルトの名無しさん:2007/01/30(火) 10:23:54
906デフォルトの名無しさん:2007/01/30(火) 10:26:56
まんまでワロタ
907901:2007/01/30(火) 10:56:24
おお、こんな方法が!

.net2003の環境でint以外の変数もtypedefしているので、
boostを使ってみます、ありがとうございました。
908デフォルトの名無しさん:2007/01/30(火) 12:05:40
>strong_typedef
RTTIの関係でサイズが肥大化したりしないのかな
最適化の段階で消える?
909デフォルトの名無しさん:2007/01/30(火) 12:17:04
C++の場合、vtblのないクラスにはRTTIをつける必要はなかったと思うんだが。
910デフォルトの名無しさん:2007/01/30(火) 14:13:42
auto_ptr を list に入れるとまずいですか?
911デフォルトの名無しさん:2007/01/30(火) 14:31:02
まずい。
912910:2007/01/30(火) 14:36:30
気をつけて使えばまずくないのでは?
913デフォルトの名無しさん:2007/01/30(火) 14:37:58
もう一杯。
914デフォルトの名無しさん:2007/01/30(火) 14:59:30
>>912
普通の人が思うようには動作しない、と思って使う分にはいいんじゃないの。
なんの役に立つかは知らないけど。
915デフォルトの名無しさん:2007/01/30(火) 15:05:26
もうちょいまともに動作する別のクラスを作って使った方がいいと思う。
916910:2007/01/30(火) 15:18:06
>>915
ありがとう、やっぱりそうする。
917デフォルトの名無しさん:2007/01/30(火) 15:28:58
COAPはコンパイルできない。
918デフォルトの名無しさん:2007/01/30(火) 15:32:12
コンテナの挿入操作はconstオブジェクトを受け入れる。
auto_ptrのコピーコンストラクタは非constオブジェクトを要求。
919デフォルトの名無しさん:2007/01/30(火) 16:34:14
wgではauto_ptrを廃止せよという提案もあるそうですね。
920デフォルトの名無しさん:2007/01/30(火) 16:36:45
auto_ptr は低コストだから、あったほうがいいなぁ。
921デフォルトの名無しさん:2007/01/30(火) 17:25:59
release()出来るのも地味にありがたい
922デフォルトの名無しさん:2007/01/30(火) 21:20:47
template <template <class> class T>

すみませんこれの意味が分からないのですが、
誰か教えてください
923デフォルトの名無しさん:2007/01/30(火) 21:38:52
>>922
規格書の14.3.3 Template template arguments
924デフォルトの名無しさん:2007/01/30(火) 21:44:02
>>923
ありがたまきん
ググって見ます
925デフォルトの名無しさん:2007/01/30(火) 22:46:51
テンプレートテンプレートパラメータに便乗した、前からの疑問なんだけど。

template < class T > struct Foo ; //OK
template < typename T > struct Bar ; //OK
template < template<typename> class T> struct Hoge ; //OK
template < template<typename> typename T>struct Moke ; //Error


なんでテンプレートテンプレートパラメータの、この部分は、
classじゃ無ければならないんだろう。なぜここはtypenameにできないのだろう。
926デフォルトの名無しさん:2007/01/30(火) 22:51:53
組み込み型ってことがありえないからだろ
927デフォルトの名無しさん:2007/01/30(火) 23:16:21
そういうものなのかな。
個人的には、typenameの方がすきなのだけれど。

でも、C++ template Metaprogrammingに書いてあるように、
これはちょっと分かりにくい。

template < typename T, typename T::type N>
class Foo ;
928デフォルトの名無しさん:2007/01/30(火) 23:22:58
typenameとclassに違いがあったなんて!!!
929デフォルトの名無しさん:2007/01/30(火) 23:23:38
ってかな::typeとか::valueみたいなのが絡んでくるのは不慣れな場合総じて意味不明
おもしろいんだけどな
930デフォルトの名無しさん:2007/01/30(火) 23:36:16
今更だけど、more effective c++が品切れ(絶版?)
だったんで原著を買うことにした。amazonで20000円とかで売ってるヤシいたけど
さすがにそんな値段では買いたくない
931デフォルトの名無しさん:2007/01/31(水) 19:51:45
using namespace std;
wcout.imbue(locale("japanese"));
wcout << 12345 << std::endl;
cout << 12345 << std::endl;

このプログラムを実行すると、実行結果は
12,345
12345
となります
カンマはいらないんだけど、これを消すにはどうしたらいいんでしょうか
932デフォルトの名無しさん:2007/01/31(水) 20:09:35
locale(locale("japanese"), "C", locale::numeric)
933デフォルトの名無しさん:2007/01/31(水) 20:24:26
1〜4999までの整数をローマ記法に変換するプログラムを作成して
1,2,4,8,32,64,128,4096を変換したいのですが

#include<stdio.h>
int main (void)
{
iny i,j,n;
char roman[7]={'M','D','C','L','X','V','I'};
int num[7]={1000,500,100,50,10,5,1};
scanf("%d"<&n);
for(i=0;n;i++);
{
for(j=0;j<n/num[i];j++)
putchar(roman[i]);
n%=num[i]
}
return 0;
}
でやってみると1回しか変換できないのですが、
いくつもの値を一度に変換するにはどうすればいいのでしょうか
934931:2007/01/31(水) 20:24:50
>>932
ありがとうございます
出力は出来たのですが、ロケールを元に戻すにはどうすればいいんでしょうか

locale(locale("japanese"), "C", locale::numeric);
wcout << 12345 << std::endl;//12345と出力。期待の動作
wcout.imbue(locale("japanese"));
wcout << 12345 << L"あいうえお" << std::endl;//12,345あいうえおと出力。期待の動作
locale(locale("japanese"), "C", locale::numeric);
wcout << 12345 << std::endl;//12,345と出力。ここも12345と出力したい
cout << 12345 << std::endl;//12345と出力。期待の動作
935デフォルトの名無しさん:2007/01/31(水) 20:39:54
>>933
好きな方を選べ。2度と来るんじゃねえぞ。

くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/
C/C++の宿題を片付けます 82代目
http://pc10.2ch.net/test/read.cgi/tech/1169575464/
936デフォルトの名無しさん:2007/01/31(水) 20:47:04
すいませんでした
937デフォルトの名無しさん:2007/01/31(水) 20:57:49
>>935
そういじめるな
>>936
もっと大きくなってからもどっておいで。
938デフォルトの名無しさん:2007/01/31(水) 23:01:37
>>933
iny という型をどこかで宣言する必要がある。
939デフォルトの名無しさん:2007/01/31(水) 23:11:04
>>930
日本語版は訳がみょうちきりんだから原著読んだほうが多分いい。
がんばって買いなされ
940デフォルトの名無しさん:2007/01/31(水) 23:16:23
みょうちきりんでも、たぶん日本語読んだほうが速い〜
941デフォルトの名無しさん:2007/01/31(水) 23:17:30
配列の最大サイズが規定されているのか、教えて頂けますか。
newする場合と通常の固定長で宣言する場合に違いはありますか。
コンパイラの実装による、が答えなのかもしれませんがよろしくお願いします。
942デフォルトの名無しさん:2007/01/31(水) 23:17:31
>>938
ワロタ
943デフォルトの名無しさん:2007/01/31(水) 23:31:23
>>941
最大サイズは規定されていませんが、処理系が保証すべき最小サイズは
規定されているので、移植性を考えるとそれが最大サイズと言えます。
944デフォルトの名無しさん:2007/01/31(水) 23:32:27
>>934
imbue() すればいいんじゃないの?
945デフォルトの名無しさん:2007/01/31(水) 23:39:09
Effective C++ 3版の日本語訳はよかったな。moreの方も誰か訳しなおしてくれないだろうか…
946デフォルトの名無しさん:2007/01/31(水) 23:46:11
>>943
C++は知らないけど、Cだと32Kくらいだよな。
小さすぎ。
947デフォルトの名無しさん:2007/01/31(水) 23:47:32
静的なメモリ確保の限界が小さいのはしかたないだろ
948デフォルトの名無しさん:2007/02/01(木) 00:08:10
ifstream infile("hoge.c");
string word;
while (infile >> word) {
cout << word << endl;
}
以上のプログラムを改良してコメント行を表示させない仕様にしたい。
コメントの種類は下記の2種とする。
1) //から文末or
2) /*から*/
なにかスマートな方法はないでしょうか?
949デフォルトの名無しさん:2007/02/01(木) 00:14:44
>>948
改良って言うか、一からつくるのとかわらんじゃん。。。
950デフォルトの名無しさん:2007/02/01(木) 00:19:02
boost::spirit::comment_p
951デフォルトの名無しさん:2007/02/01(木) 00:19:03
//の方は簡単だが/* */の方はセルオートマトンを使わないと
頭がゴチャゴチャするぞ。
952デフォルトの名無しさん:2007/02/01(木) 00:29:03
構造体とクラスって何が違うんでしょうか。
デフォルトでprivateがクラス、publicが構造体くらいしか思いつきません...
953デフォルトの名無しさん:2007/02/01(木) 00:31:07
現状ではそれぐらいの違いしかなかったはず
954デフォルトの名無しさん:2007/02/01(木) 00:35:58
構造体への値の代入をコンパイルタイムで行いたいのだけど
こんなかんじのことをすることはできないでしょうか?

struct a{ float v;}

mpl::map<
pair <char, a.v=8>,
pair <unsigned char, a.v=9>,
pair <int char, a.v=10>,
> type2valuedStr;

at<char,type2valuedStr>::type a_char;

955デフォルトの名無しさん:2007/02/01(木) 00:40:02
c++のコードを貼り付けたホームページを作るのに
いいツールがないでしょうか?
956デフォルトの名無しさん:2007/02/01(木) 00:41:25
<pre></pre>
957デフォルトの名無しさん:2007/02/01(木) 00:42:33
<code> </code>
958デフォルトの名無しさん:2007/02/01(木) 00:46:16
Global…はやりすぎか。
959デフォルトの名無しさん:2007/02/01(木) 00:51:57
>>955
bison と flex を使って、文字への色付けツール作るといいよ。
いい練習になる。
960デフォルトの名無しさん:2007/02/01(木) 01:42:47
それはいったい何の練習だ?
961デフォルトの名無しさん:2007/02/01(木) 01:45:23
すいません、初心者なのですが、
可変長のバイト列のバッファを作りたくて、とりあえず vector<unsigned char> buffer;
としました。
で、ここに unsigned int の変数のデータや unsigned char の配列のデータを
追加したい場合、どうすべきでしょうか?

今はデータを1バイトずつ push_back() とかしてるんですが、あまりにベタだと思うんで、
もしかして STL の範囲でもっと楽にできたりしますか?
buffer をメンバに持つ、複数の型を push_back できるようなクラスを作るというのは
おおげさですかね?
962デフォルトの名無しさん:2007/02/01(木) 01:47:55
とりあえずキャストしてback_inserterにcopyすれば通らない?
963デフォルトの名無しさん:2007/02/01(木) 01:55:25
memcopyしちゃえよYOU!
964デフォルトの名無しさん:2007/02/01(木) 02:06:49
>>961 insert()
965デフォルトの名無しさん:2007/02/01(木) 02:15:35
vector<T>::insertはvector<T>::iteratorあるいはconstT&しか引数に取らないと思っていたが。
966デフォルトの名無しさん:2007/02/01(木) 02:17:57
>>965 VC6 ユーザー乙
967デフォルトの名無しさん:2007/02/01(木) 03:02:20
アレッ? insertでどうやって入れるの?
968デフォルトの名無しさん:2007/02/01(木) 03:09:18
テキストファイル全行を、std::vector<std::string>またはstd::vector<char *>またはchar **等に1行ずつ格納したいのですが、
どうするのがいいのでしょう。
改行コードが現れるまで1文字ずつfgetcで読んでいって長さを測り、
メモリに格納していくという感じになるのでしょうか。
istream等を使うと楽に書けますか?
BCBのVCLでいう、TStringListと、そのLoadFromFileみたいなのを書きたいのですが。
969デフォルトの名無しさん:2007/02/01(木) 03:11:20
>>968
std::getline
970デフォルトの名無しさん:2007/02/01(木) 08:54:22
>>967
unsigned int uint;
unsigned char uchar[N];

vec.insert(vec.end(), reinterpret_cast<unsigned char*>(&uint), reinterpret_cast<unsigned char*>(&uint) + sizeof(uint));
vec.insert(vec.end(), uchar, uchar + LEN);
971デフォルトの名無しさん:2007/02/01(木) 09:50:24
vectorの要素への参照(ポインタ、イテレータ)を取得した後にpush_backなどが起こりうるので悩んでいるんですが、
思いつく対処法は以下しかなく、どれも困難です。定石などがありましたら是非ご教授下さい。

・要素への参照を取得する前にresave()、
 push_backされる要素が幾つあるかが分からないので困難。

・思い切って参照ではなく添え字を記録しちゃう、
 でも何か違うような気がする。
972961:2007/02/01(木) 10:04:44
なるほど、insert でできるんですね。

>>970
ついでにお聞きしてしまうんですが、このように vector の insert やコンストラクタの
引数に2つのポインタを渡して動くのが、ちょっと理解できてないんですが...

vector のメンバにには、普通のポインタの引数を取る型のものってないですよね?
で、デバッガで追うとどうも2つのイテレータの値をもつタイプの関数が呼ばれている
ようなんですが、テンプレートに渡した型のポインタはイテレータと同一視できる
という事なんでしょうか?
かなりアホなことを聞いているかもしれませんが...
973デフォルトの名無しさん:2007/02/01(木) 10:27:23
>>971
・思い切って list にしちゃう
974デフォルトの名無しさん:2007/02/01(木) 10:29:14
>>972
ポインタはイテレータとしての要件をすべて満たす。
イテレータというコンセプトのモデルであるとも言う。
975デフォルトの名無しさん:2007/02/01(木) 14:32:44
ポインタを模倣するようにイテレータが設計された
ってこれ歴史常識じゃないのか…
976デフォルトの名無しさん:2007/02/01(木) 17:29:23
>>955
source highlight
977デフォルトの名無しさん:2007/02/01(木) 20:01:55
継承関係にある2つのクラスがあるとして
 class base {};
 class derived : public base {};
派生クラスのコンテナのイテレータを
 vector<derived*> v;
 vector<base*>::iterator i = v.begin();
のように基底クラスのコンテナのイテレータに自動的に変換して欲しいと
感覚的には思うんですが、なぜそうなっていないのでしょうか???
978デフォルトの名無しさん:2007/02/01(木) 20:14:58
思わねーよそんな行為
979デフォルトの名無しさん:2007/02/01(木) 20:20:07
>>977
それができたら、コンテナにいろんな型を混在
させることが出来ちゃうからじゃないか?
980デフォルトの名無しさん:2007/02/01(木) 20:37:27
>>977
それは駄目だろう。
例えば、こういうのもあったときに
class derived2 : public base{};

vector<derived*>v;
vector<base*>::iterator i = v.begin();
が出来たら

*i = new derived2;
と書けてvector内の型安全性が損なわれる。
981977:2007/02/01(木) 20:51:53
 *i = new derived2;
で型安全性が損なわれるという理由がよく分からないです。
 base* p = new derived1;
 p->func();
 delete p;
 p = new derived2;
 p->func();
 delete p;
↑これは普通ですよね。
↓これも
 void func(base* p) {}
 derived1* p = new derived1;
 func(p);
駄目な例があると分かり易いんですが…。
982977:2007/02/01(木) 20:54:55
>>980
すみません。示していただいた例を誤解していました。
>>981はなしで。もう少し考えます。
983977:2007/02/01(木) 21:04:00
>>979-980
理解しました。
 derived* array[10];
 base* p = array[0];
 p = new derived2;
こういうことをしようとしていたんですね(でもこれはコンパイル通るんですね…)
どうもでした〜。
984デフォルトの名無しさん:2007/02/01(木) 21:16:23
結局、ポインタのポインタには、「ポインタの自動変換規則」は適用されない、ってはなしでそ。
985デフォルトの名無しさん:2007/02/01(木) 21:19:07
いわば、イテレータはショボイポインタ
ポインタならDerivedT*にはBaseT*が代入できるが
イテレータはショボイからできない
 例:--相当のことがができるイテレータは
 5種類のSTLイテレータのうち2種類しかない
986デフォルトの名無しさん:2007/02/01(木) 21:26:09
>983
間違ってる。
 derived* array[10];
 base** p = &array[0];
 *p = new derived2;
まだこっちの方が正確。
987977:2007/02/01(木) 21:52:06
>>986
あ!そうですね。
その場合はコンパイル通らないのですね(>>984に書かれているように)。
整合性あるんですね。
988985:2007/02/01(木) 21:52:38
勘違い。977の言っていることが実行できるとすると
derived1,derived2がbaseを継承しているとして
vec<derived1*> v1;
vec<derived2*> v2;
for(vector<derived1*>::iterator it = v2.begin();it!=v2.end();++it){
 //v2のイテレータでv1を処理。これはおかしい
}
989デフォルトの名無しさん:2007/02/01(木) 22:04:14
vc2005EEを使っているのですが、質問があります。

デバッグモードではCPU使用率が20〜35%に押さえられているのですが、
リリースモードにすると使用率が常時100%に跳ね上がってしまいます。

これの原因分かる方いませんか?
もしくは原因究明の方法が分かる方いませんか?
(プロファイラは使えません^^)
990デフォルトの名無しさん:2007/02/01(木) 23:43:42
C++のマクロで引数を省略することはできますか?

下記のマクロをLOG(msg)のように使いたいのですが。。。

#define LOG(msg,level) writeLog(__FILE__,__LINE__,msg,level)

void writeLog(char* f,int line,char* msg,int level=0)
991デフォルトの名無しさん:2007/02/01(木) 23:47:39
>>989
とりあえず環境依存なのでスレ違い。
992デフォルトの名無しさん:2007/02/02(金) 00:07:31
__VA_ARGS__ でググレ

ば多少は使える情報があるかもしんない
ところで次スレは
993デフォルトの名無しさん:2007/02/02(金) 00:22:25
次スレのタイトルはアカデミックなものにして欲しい
994デフォルトの名無しさん:2007/02/02(金) 00:24:49
【アカデミックな】C++相談室 part56++
995デフォルトの名無しさん:2007/02/02(金) 00:25:38

これはひどい
996デフォルトの名無しさん:2007/02/02(金) 00:26:45
tempalte<template<class> class T>C++相談室<part56>
997デフォルトの名無しさん:2007/02/02(金) 00:28:04
#define C++相談室 part56
998デフォルトの名無しさん:2007/02/02(金) 00:31:21
998!!!!
999デフォルトの名無しさん:2007/02/02(金) 00:32:27
999!
1000デフォルトの名無しさん:2007/02/02(金) 00:32:36
5年間2chにいるけど、今まで一度も1000をとったことがないんだよな。
初めての1000、取れますように。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。