C++相談室 part37

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

前スレ part36
http://pc5.2ch.net/test/read.cgi/tech/1096304546/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
2v(^・^)v:04/10/24 00:00:17
3v(^・^)v:04/10/24 00:00:31
4v(^・^)v:04/10/24 00:01:22
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 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

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
5v(^・^)v:04/10/24 00:01:49
6v(^・^)v:04/10/24 00:03:04
7デフォルトの名無しさん:04/10/24 00:04:42
>>1乙!
8v(^・^)v:04/10/24 00:05:03
9デフォルトの名無しさん:04/10/24 00:05:39
age
10v(^・^)v:04/10/24 00:06:29
STLつかうと一気に実行ファイルサイズが10倍に?!
11v(^・^)v:04/10/24 00:06:52
>>10
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
12v(^・^)v:04/10/24 00:07:19
>>11
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
13v(^・^)v:04/10/24 00:08:31
■関連スレ■
【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/
ダディクールがC/C++の宿題を片づけます 32代目
http://pc5.2ch.net/test/read.cgi/tech/1097592876/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
14デフォルトの名無しさん:04/10/24 00:08:34
実行ファイルなんていくら大きくなっても気にしない
15v(^・^)v:04/10/24 00:08:49
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
16v(^・^)v:04/10/24 00:09:04
■コンパイラスレ■
フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/
GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/
"Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/
17v(^・^)v:04/10/24 00:09:43
>>15
#include <stdafx.h>

後死ね。
18v(^・^)v:04/10/24 00:09:48
■開発環境スレ■
★初心者にVisual C++を教えるスレ★ Part15
http://pc5.2ch.net/test/read.cgi/tech/1097880265/
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
C++Builder相談室 Part11
http://pc5.2ch.net/test/read.cgi/tech/1094749339/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
19v(^・^)v:04/10/24 00:10:13
>>17
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
20デフォルトの名無しさん:04/10/24 00:10:18
>>17
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
21デフォルトの名無しさん:04/10/24 00:10:41
行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば
紹介していただけないでしょうか?
22v(^・^)v:04/10/24 00:12:10
テンプレ終了。
待ってろって言ったのに埋めやがって、
前スレに次スレへのリンク貼れなかったじゃないか愚か者ども。
23デフォルトの名無しさん:04/10/24 00:12:44
>>21 >8
24デフォルトの名無しさん:04/10/24 00:12:49
>>10,11,12,15,17,19,20
テンプレ乙!
>>14
テンプレにマジレス乙!
>>21
Blitz++ http://www.oonumerics.org/blitz/ていうかテンプレくらい見ろ
25デフォルトの名無しさん:04/10/24 00:14:13
>21
あとは ublas とか?
26デフォルトの名無しさん:04/10/24 00:16:56
4x4 行列, 単精度浮動小数点数限定なら DirectX でも良いけど。
27デフォルトの名無しさん:04/10/24 00:18:24
>>21
liboctave

28全スレ>>998:04/10/24 00:18:28
やっと分かった
va_list 版ってのは関数名に v の prefix つけて、va_end をしないのが基本なの?
29前スレ>>998:04/10/24 00:32:50
typeid みてみると va_list って char* なのか…
てことはポインタを進ませながら無理矢理キャストするって実装なのか……?
もしそうなら参照で渡さない限り va_end しても意味ないのか
30デフォルトの名無しさん:04/10/24 00:37:11
どう実装されているかはstdarg.hを見れば分かる。
31デフォルトの名無しさん:04/10/24 01:52:48
>>28
すまん、さっきのコードは間違いだらけだった。
↓正しくはこんな感じ。
ore_printf(const char *format,...) {
static int count = 0;
printf("[%08.8d]", count++);
va_list arg_list;
va_start(arg_list, format);
vprintf(format, arg_list);
va_end(arg_list);
print("\n");
}

関数名云々は趣味の問題だけど標準関数の命名規則に従っておいたほうが第三者が見た時に分かりやすいかと。
va_list まわりの処理は慣れるまでは他人の書いたコードを猿真似するのがいいと思うよ。
あと、va_list の実装は環境や処理系によって極端に異なるから基本的には気にしちゃダメ。
32デフォルトの名無しさん:04/10/24 01:53:52
>>28
vprintf とかは、可変長引数をダラダラ渡す代わりに
va_list を1個だけ渡すのよ。そんだけ。

別の言い方をすれば、可変長引数はそのまま渡せないから
va_list として渡すと言うこと。でも、普通の printf では va_list を
単なる値として受け取っちゃうから、va_list を va_list として
受け取って使ってくれる関数が必要になるわけさ。
それが v******** っつー関数群。

そんで、va_end するのは va_start した関数と同じ関数であるべきだから、
va_list を渡された関数が va_end しないのは当然のこと。
33デフォルトの名無しさん:04/10/24 01:56:59
>>31
ウホッ。リロードせずに書いたらかぶっちまったスマソ。

>>28
具体例で説明するなら下みたいな感じ。

nurupo(const char* ga, ...) {
va_list arg_list;
va_start(arg_list, ga);
vnurupo(ga, arg_list);
va_end(arg_list);
}

vnurupo(const char* ga, va_list arg_list) {
実装
vprintf(ga, arg_list); みたいな事も出来る。
}
34デフォルトの名無しさん:04/10/24 02:09:10
>>33
>ウホッ。リロードせずに書いたらかぶっちまったスマソ。
まぁ気にするな。

  ∧_∧
  ( ・∀・) | | ガッ
 と    ) | |
   Y /ノ 人
    / ) <  >__∧∩
  _/し'  . V`Д´)/
 (_フ彡      /  ←>>33
35デフォルトの名無しさん:04/10/24 16:50:48
C++のライブラリを集めるスレッドとか無いの?
36デフォルトの名無しさん:04/10/24 16:54:55
計算…uBLAS,blitz++
ネット…ACE
正規表現…boost
スレッド…boost
その他…boost
暗号…Crypto++
GUI…gtkmm,QT
37デフォルトの名無しさん:04/10/24 16:57:40
XML…Xalan-C++,Xerces C++,ICU
38デフォルトの名無しさん:04/10/24 19:01:47
#include <vector>
#include <deque>

main()
{
std::vector<int> vec(20);
for(int i=0;i<20;++i)
 vec[i] = i;
std::deque<int> deq(vec.begin(), vec.end());
}

main()
{
std::deque<int> deq(20);
for(int i=0;i<20;++i)
 deq[i] = i;
std::vector<int> vec(deq.begin(), deq.end());
}

上のmainが通るのに
下のmainが

[C++エラー] Could not find a match for
'std::vector<int,std::allocator<int> >::vector(std::deque<int,std::allocator<int> >::iterator,
std::deque<int,std::allocator<int> >::iterator)'.

で通らないのは、どうしてですか?
39デフォルトの名無しさん:04/10/24 19:13:00
トオルよ
40デフォルトの名無しさん:04/10/24 19:35:58
通らないとおかしい
環境書け
41デフォルトの名無しさん:04/10/24 19:41:16
BCB3です。
Borland C++ 5.3 for Win32 Copyright (c) 1993, 1998 Borland International
これコンパイラ部分だけフリーの新しいのに入れ替えられないのかな…
42デフォルトの名無しさん:04/10/25 17:10:05
>>38はどういうエラーなの?
BCB3ではイテレータ用のコンストラクタが実装されていないということ?
43デフォルトの名無しさん:04/10/25 18:48:07
Copyright の年から考えてISO C++には対応してないと考えるほうが自然かと
44デフォルトの名無しさん:04/10/25 19:08:51
newで作成されたTestクラスのインスタンスをdeleteする場合、
下記のように作成したインスタンスを参照に代入してdeleteしても問題ないのでしょうか?

class Test{};

int main()
{
Test* test = new Test();

Test& rTest = *test;

delete &rTest;
}
45デフォルトの名無しさん:04/10/25 19:13:24
>>44
保障はされてないんじゃないかな・・・。
46デフォルトの名無しさん:04/10/25 19:23:02
>>45
自身なさげなので敢えて聞くのも申し訳ないですけど
根拠とかあります?
47デフォルトの名無しさん:04/10/25 19:51:18
>>46
いや、全然ない。
48デフォルトの名無しさん:04/10/25 19:58:53
>>44
参照変数のアドレスは参照元のアドレスだから大丈夫でしょ。
つーかなんだその怪しげなコードは。
49デフォルトの名無しさん:04/10/25 20:01:55
>>44
printf("%p %p", test, &rTest);

同じ値が出ればおkって事で。
50デフォルトの名無しさん:04/10/25 20:05:27
あの偉大なヒトラー総統も一兵士だったときには見張りをなさっていたのでしょうか?
51デフォルトの名無しさん:04/10/25 20:13:42
>>50
歩哨はされてないんじゃないかな・・・。
52デフォルトの名無しさん:04/10/25 20:19:15
正しく入力すればこれもOK?
int main ()
{
int* p = new int();
int address;

std::cout << "p = " << int(p) << std::endl << "p2 = ";
std::cin >> address;

delete reinterpret_cast<int*>(address);
}
53デフォルトの名無しさん:04/10/25 20:22:44
>>44
環境によってはポインタから参照になったときに情報が欠落する可能性もあるんじゃないかなぁ。
54859:04/10/25 21:11:29
>>44
多くの処理系でこのプログラムは実行できるのは事実
だけど、インスタンスへのリファレンスの先が
なくなってしまうのだから、限りなくおすすめできない。

もし Test がメンバ変数を持っていて new Test で割当て
られた領域が delete されたあと、再利用されたとしたら
その後の rTest 経由のこの領域に対するアクセスは期待
しない動作を生むことになる。

メンバー変数さえなければ下みたいなプログラムも
可能な処理系が多いんだけど、限りなく裏技だなぁ。
struct Test { void M() { cout << 1; } };
int main() { ((Test*)0)->M(); }
55デフォルトの名無しさん:04/10/25 21:13:41
>>54
それはぽいんたでもおなじではないか
56デフォルトの名無しさん:04/10/25 21:14:37
>>55
そう、それを言わんがために、最後の例を書いた。
57デフォルトの名無しさん:04/10/25 21:18:12
>>56
それはにゅうをつかうなということではないか
58デフォルトの名無しさん:04/10/25 23:04:21
>>44 は全く問題ないでしょ。
要はリファレンスのアドレスとは何か? という事になる。
参照先オブジェクトのアドレスでしかありえない。
他に何のアドレスがあるというの?
59デフォルトの名無しさん:04/10/25 23:42:56
friendクラスと被friendクラスの関係を、UMLで表現する場合ってどうすればいいでしょうか?

あと、あるクラスのメンバとして、TemplateHoge<int> m_hogelist;というメンバが定義されていた場合、
これをUMLで表現するにはどうすればいいでしょうか?

できれば、AAで表現していただけるとありがたいです。
もし、無理だったら、エクセルでつくっていただいて、アプロダにアップしてくれるだけでいいです。
60デフォルトの名無しさん:04/10/25 23:44:28
>>58
const参照の場合複製される可能性があるっけ?
61デフォルトの名無しさん:04/10/26 00:01:52
>>60
ないでしょう。もしあったとしたらconst参照は(特に関数呼び出しにおいて)
その意義の大半を失いませんか?
62デフォルトの名無しさん:04/10/26 00:04:50
>>59
> あと、あるクラスのメンバとして、TemplateHoge<int> m_hogelist;というメンバが定義されていた場合、
bind

あるいはクラステンプレートとは別に TemplateHoge<int> という「クラス」を用意してしまう。
63デフォルトの名無しさん:04/10/26 00:08:08
>>62
AAでかいてくれるとウレシイです^^
64デフォルトの名無しさん:04/10/26 00:10:35
>>60
そんな仕様だったらコピー禁止オブジェクトへのリファレンスが作れなくなる
65デフォルトの名無しさん:04/10/26 00:34:17
>>59
禿しくスレ違いの悪寒。
66デフォルトの名無しさん:04/10/26 17:46:35
ただの依存にしといて friendとか注釈つけとけ
67マイク ◆yrBrqfF1Ew :04/10/26 17:50:41
>環境によってはポインタから参照になったときに情報が欠落する可能性もあるんじゃないかなぁ。

ポインタからリファレンスになって欠落する情報ってなんだ?
聞いたことねえな
68デフォルトの名無しさん:04/10/26 20:03:13
>>67
ガッ じゃないか?w
69デフォルトの名無しさん:04/10/26 20:42:08
int a = 99;
int c( a );
が VC7.1 でコンパイル通るんですが、このような
コンストラクタ的な初期化は C++ の規格で許されてるんですか?
70デフォルトの名無しさん:04/10/26 20:45:00
普段どーやってコピーコンストラクタ書いてるんだろう…
71デフォルトの名無しさん:04/10/26 20:51:54
>>69
許されています。
72マイク ◆yrBrqfF1Ew :04/10/26 21:07:04
>>68
NULLを逆参照してリファレンスにしてよかったか?
int &ref_to_null(*reinterpret_cast<int*>(NULL));
73デフォルトの名無しさん:04/10/26 21:25:15
>>72
NULL に対して * 演算子を適用した時点で、すでに未定義。鼻から悪魔が
出てくるとか、いきなり PC が暴走しても文句言えない。
74マイク ◆yrBrqfF1Ew :04/10/26 21:29:03
あそう。
75デフォルトの名無しさん:04/10/26 21:51:31
>>67
たとえばポインタの指している先のブロックサイズとか。
一般的な実装ではメモリブロックの前に埋め込んでおくとか別の場所に隠しておくが、
ポインタ自体が保持してはいけないという規則は無い。
仮にそういう実装があれば参照になったときに欠落する可能性はある。
76デフォルトの名無しさん:04/10/26 21:53:52
C++で∫_1^10 (cos x - 0.87) * cos x dxの数値解を求めたいのですが、
どうやってコーディングすればよいか解かりません。
どなたか教えていただけませんか?
77デフォルトの名無しさん:04/10/26 21:54:56
>>76はHSPスレにすら投げる無差別マルチ
78デフォルトの名無しさん:04/10/26 21:55:20
>>76
単純に不定積分してから
その数式で計算すればいいのでは?
79デフォルトの名無しさん:04/10/26 22:00:03
∫て言いたかっただけだろ (プ
8078:04/10/26 22:03:55
>>76
台形公式とかシンプソンの公式とかで
x の範囲を分割して計算するとか、
そういうの期待しているの?
(HSP のスレで 78 の回答がダメそうに言われたんだけど)
81デフォルトの名無しさん:04/10/26 22:13:28
>>76
おとなしく Mathematica か Maple でも買っとけ。
82デフォルトの名無しさん:04/10/26 22:28:57
>>76
#include <stdio.h>
#include <math.h>
double func(double x) {
return (cos(x) - 0.87) * cos(x);
}
double integrate(double x1, double x2, int n) {
int i;
double sum;
double x;
double h;
h = (x2 - x1) / n;
x = x1;
for(sum = 0, i = 0; i < n; i += 2) {
sum += func(x) + 4 * func(x + h) + func(x + 2 * h);
x += 2 * h;
}
return sum * h / 3.0;
}
int main() {
printf("%lf\n", integrate(1.0, 10.0, 100));
}
83マイク ◆yrBrqfF1Ew :04/10/26 22:39:47
>>75
あそう
84デフォルトの名無しさん:04/10/26 23:15:59
>>75
いや、そんな実装はありえないだろ。
大体ブロックサイズってなんなんだよ。
new したものだけがポインタじゃないんだから
ブロックサイズなど保持する意味はない。
85デフォルトの名無しさん:04/10/26 23:26:35
2chの弱点発見!!!

2chでは、UMLがかけない!

ひろゆきさん、UML描画機能つきのギコナビつくって・・・おねがい。
86デフォルトの名無しさん:04/10/26 23:28:15
>>85
TeXの書式を認識してくれたら結構便利だよね
87デフォルトの名無しさん:04/10/26 23:29:01
User Mode Linux
88デフォルトの名無しさん:04/10/27 16:10:41
FILE *FP = fopen( "Hoge.txt", "wt");
char S[ 256];
sprintf( S, "TEST MESSAGE"),   // ;じゃない
fputs( S, fp),            // ;じゃない
fputs( "\n", fp);
fclose( FP);

これってコンパイラ通っちゃうんですけど、C++はいいんでしたっけ?
89デフォルトの名無しさん:04/10/27 16:26:59
はい
90デフォルトの名無しさん:04/10/27 16:29:53
そういえば昔学校で習ったきり、unionって使ったこと無いんだけど
皆々様はどう?
91デフォルトの名無しさん:04/10/27 16:40:39
>>90
使用例:組込みの入出力周り, インタプリタ, etc..
92デフォルトの名無しさん:04/10/27 16:52:59
>>91
縁がない分野ばかりだ、ちゃんと使い道あるのねん
サンクス
93デフォルトの名無しさん:04/10/27 21:32:41
>>88
んなもん、Cでも問題なく通るぞ。
#コメント(//)以外は。
94デフォルトの名無しさん:04/10/27 21:46:53
>>88
入門書を一から読み直せ
(C++って言ってるけど内容は100%Cのような…ヌルポ)
95デフォルトの名無しさん:04/10/27 21:59:56
  ∧_∧  \\
  ( ・∀・)   | |  /〃_/_〃
 と    )   | | .∧   / / / / /
   Y /ノ    人 ./   / /   ノ
    / )    <  >__∧∩
  _/し'_//. V`Д´)/ ←>>94
 |     /       /
 | 100t 彡
96デフォルトの名無しさん:04/10/28 06:32:56
いきなりですみませんが質問させて下さい。
コンパイラの最適化は考慮に入れないとして、
int func(int i);
class X {
  int mfunc(int);
}
void main(){
  X x;
  int (*pfunc)(int) = func;

  int a = func(1); // 行a
  int b = pfunc(2); // 行b
  int c = x.mfunc(3); // 行c
}
の場合行aとbの実行速度に違いはないと思ってますがcはa,bと
比べて呼び出しにコストがかかるんでしたっけ?
それともコストがかかるのは仮想関数呼び出しの時でしたっけ?

参考文献等ありましたら教えていただけないでしょうか。

ただし素人はひっこんでろ。
97デフォルトの名無しさん:04/10/28 06:33:59
>ただし素人はひっこんでろ。
この一行がネタ回答を欲しがってるようにしか見えない
98デフォルトの名無しさん:04/10/28 06:36:10
自分で最適化無しでコンパイルしてベンチとればすぐ分かるような。
9996:04/10/28 06:46:26
>>98
いや、結果が知りたいんじゃなくって
どうしてそうなるのかがしりたいんだよ。
100デフォルトの名無しさん:04/10/28 06:53:26
まずaとbに違いが無いわけねーだろカス素人が
101デフォルトの名無しさん:04/10/28 06:58:33
aとbは機械語レベルでは一緒
仮想関数はVTBLを介するからcより遅い
cがどうなるかはワカンネ
102デフォルトの名無しさん:04/10/28 07:04:54
機械語が分かるならthiscallでぐぐれば分かる
103デフォルトの名無しさん:04/10/28 07:16:49
オブジェクトの参照(const Object &) に NULL を入れたら暴走しますた。
仕様ですか?
104デフォルトの名無しさん:04/10/28 07:18:22
ポインタと違って参照にNULLは入れられません。
105デフォルトの名無しさん:04/10/28 07:20:04
ありがとうございまつ。理解しますた。
106デフォルトの名無しさん:04/10/28 07:45:00
catch( const std::exception& e ) みたいに、
catch に const 入れるのって冗長ですか?

文字列リテラル投げるときは必要なんでしょうけど…
107デフォルトの名無しさん:04/10/28 07:47:43
どうせコピーされた物が渡されるので付けても付けなくても一緒
108デフォルトの名無しさん:04/10/28 09:10:40
cは最適化の前提が無いならthisポインタ積む分遅いだろ。
109デフォルトの名無しさん:04/10/28 10:24:08
>>107
そりゃそうですけど…
やっぱり冗長ですかねぇ
110デフォルトの名無しさん:04/10/28 14:21:30
>>108
96じゃない素人ですけど
mfunc(X*,int)
という形になってpush,popする分遅いということですか?
111デフォルトの名無しさん:04/10/28 14:21:54
そもそも const は冗長な場合の方が多い。
冗長だから付けないっていう理由はおかしい。
112デフォルトの名無しさん:04/10/28 14:51:50
>>111
「冗長」の意味を調べ直されたし
113デフォルトの名無しさん:04/10/28 21:41:48
>>110
積むといってもレジスタかも知れんが、そういうこと。
114デフォルトの名無しさん:04/10/28 22:12:49
>>112
別に111の言い方も問題ないだろ。
115デフォルトの名無しさん:04/10/28 23:08:00
>>107,109
参照で受けてるから、コピーされないよ。
const 付けるかどうかの判断は、
その後 e の内容を改変するようなオペレーションが
あるかどうかを、コンパイル時に見つける必要があるか
どうかによって決める。
116デフォルトの名無しさん:04/10/28 23:48:33
参照で無くてもつけたほうが良い。
パラメータを変更するような関数は設計的によろしくないから
117デフォルトの名無しさん:04/10/29 00:02:31
>>115
コピーしたオブジェクトへの参照を受け取るんだと思うんだが…
118デフォルトの名無しさん:04/10/29 01:25:37
>>117
struct A {
A() { std::cout << "A::A()" << std::endl; }
A(const A&) { std::cout << "A::A(const A&)" << std::endl; }
A& operator=(const A&) { std::cout << "A::operator=(const A&)" << std::endl; }
};

try
{
try
{
throw A();
}
catch(const A& a)
{
std::cout << "catch 1" << std::endl;
throw;
}
}
catch(const A& a)
{
std::cout << "catch 2" << std::endl;
}

VC6だとコピーが一切起きないんだけど
119デフォルトの名無しさん:04/10/29 02:01:51
15.1 -5-
"If the use of the temporary object can be eliminated
without changing the meaning of the program
except for the execution of constructors and destructors
associated with the use of the temporary object,
then the exception in the handler can be initialized directly
with the argument of the throw expression."
120デフォルトの名無しさん:04/10/29 02:14:29
いい加減VC6見たいなまだC++の仕様が固まってない頃ので検証すんの辞めろよ。
121デフォルトの名無しさん:04/10/29 02:51:34
>>120
g++ でもコピー起きないよ。

structE {
~E() { cout << "~E()" << endl; }
E() { cout << "E()" << endl; }
E( E const& ) { cout << "E( E const& p )" << endl; }
};

int
main() {
try { throw E(); } catch ( E& e ) {}
}
122デフォルトの名無しさん:04/10/29 03:01:29
>>116
それは思い込みだな
例外時のトレース情報をとりたいと思ったらどうする?
123デフォルトの名無しさん:04/10/29 03:27:15
インスタンスを直接throwすると、コピーが起きないのだろうか…。
適当な場所で A a; と作ってから、throw a; とすると、VC6でもVC7.1でもコピーコンストラクタが走った。

ちなみに、bcc32では、直接でも一旦作ってからでも、コピーコンストラクタが走った。
124デフォルトの名無しさん:04/10/29 03:39:50
125デフォルトの名無しさん:04/10/29 08:45:40
執拗にVC6に拘る厨房
・アンチマイクロソフト厨
・VisualStudioを買えない貧乏人
・新しいPCすら買えない乞食
・古いアプリケーションの機能追加にC++の厳密な使用を持ち込む阿呆
・.NETを一切認めない狂信的Win32信者
126デフォルトの名無しさん:04/10/29 09:30:26
More Effective C++ 項目13: 参照で例外を捕まえる

を参照のこと
127デフォルトの名無しさん:04/10/29 10:27:27
VC6どうのこうのは他所でやってくれ
128デフォルトの名無しさん:04/10/29 12:14:31
typenameって直後に書いてあるものが型名であることを表すと思ってたんだけど、
gcc version 3.3.1 (cygming special)で以下ようにするとエラーになります。
$ cat test.cpp && g++ test.cpp
#include<iostream>
#include<string>
using namespace std;
template< typename Foo > void func( typename Foo val ) {
  typename Foo res;
  res = val + val;
  cout<< res<< endl;
}
int main(void) {
  func<int>(774);
  func<string>( string( "String" ) );
  return 0;
}
test.cpp:4: error: syntax error before `)' token
test.cpp: In function `void func(...)':
test.cpp:5: error: syntax error before `;' token
test.cpp: In function `void func(...) [with Foo = int]':
test.cpp:10: instantiated from here
test.cpp:6: error: `val' undeclared (first use this function)
test.cpp:6: error: (Each undeclared identifier is reported only once for each
function it appears in.)
test.cpp:6: error: `res' undeclared (first use this function)
test.cpp: In function `int main()':
test.cpp:11: warning: cannot pass objects of non-POD type `struct std::string'
through `...'; call will abort at runtime
129デフォルトの名無しさん:04/10/29 12:20:13
>>128
-template< typename Foo > void func( typename Foo val ) {
- typename Foo res;
+template< typename Foo > void func( Foo val ) {
+ Foo res;
130128:04/10/29 12:30:56
>129
dクス。コンパイルとおりました。typenameがtemplate<>の中にしか書けないのは
C++の規格?それともgccの制限?
131デフォルトの名無しさん:04/10/29 12:33:43
typenameはそれが型名だと確定できないとき以外はつけてはいけない
132128:04/10/29 12:40:34
>131
あー、なるほど。その説明でスッキリしました。
ありがd。

// intやdoubleとかにもtypename付けられるようになってると
// 文法の対象性が良くなる気がする。
133デフォルトの名無しさん:04/10/29 12:53:10
>>132
たぶん誤解してる
typenameは以下のように使う
Fooの前のtypenameを外してコンパイルした結果と比較してみて
環境によってはtypenameはいらないようだけどg++(3系)だと必要
#include<iostream>
#include<string>
using namespace std;
template< typename Foo > void func( Foo val ) {
typename Foo::value_type res;
res = val.size () + val.size ();
cout<< res<< endl;
}
int main(void) {
func<string>( string( "String" ) );
return 0;
}
134デフォルトの名無しさん:04/10/29 13:22:58
templateの引数にtypenameとclassの両方、
なんの違いも無く使えるのって、なんのため?
意思の表示?歴史的経緯?
135128:04/10/29 13:30:05
えーと、typenameを使う主な場所は
・template< >の中
・ template<typename Foo>の有効範囲内で
  Foo::value_type のような型を使うとき
の2つで、
・型であることが明確なものにtypenameつけたらダメ
という理解で良いかな?
136デフォルトの名無しさん:04/10/29 13:52:02
>>135
そんなとこかなぁ
137デフォルトの名無しさん:04/10/29 16:14:42
>>135
・template<typename Foo>の有効範囲内で、
 std::vector<Foo>::iteratorのような型を使うとき
もだな。念のため。
138デフォルトの名無しさん:04/10/29 20:00:42
>>134
歴史的経緯じゃないかと思っている
禿の予知能力がもう少し強ければ
初めから typename だっただろうさ
139デフォルトの名無しさん:04/10/29 20:41:43
vectorやlist等を基本クラスで宣言したものに
派生クラスのオブジェクトを格納して
派生クラスでオーバーライドした関数呼び出すことってできないですか?


140デフォルトの名無しさん:04/10/29 20:44:32
>>139
奇妙なテンプレートとかなんとか言うやつでやるかな、たぶん。
141デフォルトの名無しさん:04/10/29 20:47:34
>>139
つまり、クラスに新たなメソッドが追加されたように振る舞わせるっていうこと?
142139:04/10/29 21:01:41
様々な派生クラスのオブジェクトを格納して一括して処理できないかな
と思ったんですけど

派生クラスで格納するから、派生クラスのコンストラクタは呼び出されるんですけど
関数はオーバーライドしても基本クラスのものが呼び出されるんです

143デフォルトの名無しさん:04/10/29 21:15:16
>>142
えーと、コンテナは基底クラスのポインタを格納していて、
んで、オーバーライドした関数を呼び出してるのに、基底クラスのものが実行される、
ってこと?
144デフォルトの名無しさん:04/10/29 21:16:11
そのメンバ関数をvirtual指定してる?

とりあえず簡略化したソースでも見せて。
145デフォルトの名無しさん:04/10/29 22:04:24
class A{
public:
 int x,y;
 A() {};~A() {};
 void Move() { x+=1; y+=1;};
};

class B:public A{
public:
 B() { x=0; y=0;} ~B(){};
 virtual void Move() { x+=2; y+=2; }
};

int main()
{
 vector<A> vec;  
 vec.push_back(B());
 vec[0].Move();
 cout << vec[0].x << vec[0].y;
 return 0;
} //結果11

簡略化というか別のソースなんですけど、こんな感じです

あと初心者スレ別にあったんですね。スマソ
146デフォルトの名無しさん:04/10/29 22:12:14
>>145
とりあえずこんな感じ
deleteはちゃんとしてね
class A{
public:
int x,y;
A() {}; virtual ~A() {};
virtual void Move() { x+=1; y+=1;};
};

class B:public A{
public:
B() { x=0; y=0;} ~B(){};
virtual void Move() { x+=2; y+=2; }
};

int main()
{
vector<A *> vec;
vec.push_back(new B());
vec[0]->Move();
cout << vec[0]->x << vec[0]->y;
return 0;
} //結果11
147デフォルトの名無しさん:04/10/29 22:27:54
>>145
出来ました ありがとうございます

ポインタを格納すればよかったんだ
148147:04/10/29 22:28:58
間違えました>>146です
うう、すみません
149デフォルトの名無しさん:04/10/29 22:31:14
>>145
派生クラスの方にvirtual付けてどうする。
仮想関数について勉強しなおすと吉。
150デフォルトの名無しさん:04/10/30 12:34:31
会社で下のソースようなクラスの使い方している人がいて「一般的な使い方だよ」って言われたんですが
そうなんでしょうか?

かなり簡略したが、大体こんな感じ。
ttp://up.isp.2ch.net/up/68bafad0fbe0.lzh

年配の方に聞くと「ま、そういう人もいるよ。」って言ってましたが…
151デフォルトの名無しさん:04/10/30 13:10:05
>>150
別に普通だと思うけどなにがマズイと思うの?
152デフォルトの名無しさん:04/10/30 13:11:51
本当に一般的では無いと思ってるなら
TemplateMethodパターンでくぐって納得した後にデザパタの勉強しなさい。
153デフォルトの名無しさん:04/10/30 13:13:20
なんなんだろ、この"見て損した"感は…
154デフォルトの名無しさん:04/10/30 13:14:01
Template Method ってデザパタなんか微塵も知らなくても知ってて当たり前だと思うのだが
155デフォルトの名無しさん:04/10/30 14:45:21
>>154
君は何で学んだの?
156デフォルトの名無しさん:04/10/30 14:46:51
>>155
現場の知恵ってやつじゃないの?
157デフォルトの名無しさん:04/10/30 14:53:35
そもそもデザインパターンは知ってて当たり前のものやよく使われてるものをカタログ化したものだからな。
158デフォルトの名無しさん:04/10/30 21:18:40
>>154はデザパタをまったく理解してないに100香田
159デフォルトの名無しさん:04/10/30 21:40:29
>>158
萎えそう思ったのか192文字以内で答えよ
160デフォルトの名無しさん:04/10/30 21:59:06
>>159
2のべきにしろ
161デフォルトの名無しさん:04/10/30 22:00:15
文字列の終端も数に入れてね
162デフォルトの名無しさん:04/10/30 23:39:14
では終端のナル文字を含めて1024文字以内のC文字列で説明せよ
163デフォルトの名無しさん:04/10/30 23:47:13
ロケールは?
164デフォルトの名無しさん:04/10/30 23:48:37
C++なら終端なんか含むなよ。
165デフォルトの名無しさん:04/10/30 23:52:30
説明をstd::stringに格納せよ。字数制限:メモリを使い果たすまで
166150:04/10/31 00:52:52
>>151
いや、使い方はそうなんだが、ソース見て違和感しか思えなくて…
なんかあまりマネしたくない手法と言うか…「へー」としか感想無くて…
一般的かどうか聞いてみた。(気にするだけ無駄だったかのかな?)


他のレスもサンクス。
167デフォルトの名無しさん:04/10/31 00:55:32
>>165
4GB 超のメモリを積んでるマシンでも size_t が 32bit だったりして
困るわけだが。
168デフォルトの名無しさん:04/10/31 00:59:26
ちょっと見てみたが、何の変哲もないただのオーバーライドじゃん。
どんな解説書にも一回は載ってるような。
TemplateMethodでもないし。
169デフォルトの名無しさん:04/10/31 01:02:29
170デフォルトの名無しさん:04/10/31 01:03:30
TemplateMethodだから
171デフォルトの名無しさん:04/10/31 01:36:20
TemplateMethodですから!!残念!!

GoF26パターン斬るぃ〜!
172デフォルトの名無しさん:04/10/31 04:16:14
( ´д)ヒソ(´д`)ヒソ(д` ) GoF本は23パターンしかないぞ
173デフォルトの名無しさん:04/10/31 07:23:03
>>150
ac_BaseStrがclassBaseとclassExtの両方に書いてある事だけは唯一気になる。
174デフォルトの名無しさん:04/10/31 07:54:08
これのプログラムに問題はありますか?
#include <iostream>
struct base
{
  template<class T>bool _(T)
  {
    return false;
  }
};
struct derived: base
{
  bool _(char c)
  {
    return true;
  }

  bool _(int i)
  {
    return true;
  }

};
int main()
{
  derived d;
  std::cout << std::boolalpha;
  std::cout << d._(1.0f)<< std::endl;
  std::cout << d._('a') << std::endl;
  std::cout << d._(1) << std::endl;
  return 0;
}
175デフォルトの名無しさん:04/10/31 08:37:37
>174
派生クラスで、同じ関数名でシグニチャが違う関数を宣言すると
基底クラスの関数は隠される。
derivedに using _;とでも書いておけ。

あとアンダースコアから始まる識別子を使うな。
176デフォルトの名無しさん:04/10/31 19:53:27
C++ で
入力した文字を逆転表示して表示させるにはどうしればいいのでしょうか・・・?


こんにちは

はちにんこ

と言った具合です。
177デフォルトの名無しさん:04/10/31 19:54:34
>>176はマルチなのでスルーしてください。
178デフォルトの名無しさん:04/10/31 19:59:23
回答もらってるのにマルチとは言い度胸だな
179デフォルトの名無しさん:04/10/31 20:08:12
>>176
自分で考えろヴォケ
180デフォルトの名無しさん:04/10/31 21:57:15
C++Builderのスレがありません。・゚・(ノд`)・゚・。
181デフォルトの名無しさん:04/10/31 22:22:43
wstring を出力させたくて
std::locale::global( std::locale( "japanese" ) );
std::wstring s;
std::getline( std::wcin, s );
std::copy( s.begin(), s.end(), std::ostream_iterator<wchar_t>( std::wcin ) );
としたのですが、copy のところで
error C2440: '型キャスト' : 'std::wostream' から 'std::ostream_iterator<wchar_t>' に変換できません。

となってしまいます。
std::wcout << s とするしかないでしょうか?
182181:04/10/31 22:23:37
- std::copy( s.begin(), s.end(), std::ostream_iterator<wchar_t>( std::wcin ) );
+ std::copy( s.begin(), s.end(), std::ostream_iterator<wchar_t>( std::wcout ) );
183デフォルトの名無しさん:04/10/31 23:29:57
std::ostream_iteratorの二番目のテンプレート引数をwchar_tにすればコンパイルは通るよ
184デフォルトの名無しさん:04/10/31 23:42:46
>>181
マルチは帰れ
っていうかそれは宿題スレで私が答えた奴の再質問か?
185デフォルトの名無しさん:04/10/31 23:45:41
標準入出力とロケールって関係あるの?
186デフォルトの名無しさん:04/10/31 23:58:38
うん。
187デフォルトの名無しさん:04/11/01 00:15:18
>>186
どんなの?
188デフォルトの名無しさん:04/11/01 00:18:27
フォーマット付き出入力
189デフォルトの名無しさん:04/11/01 00:26:09
>>188
そりゃそうだな
190デフォルトの名無しさん:04/11/01 00:54:03
>>184
何だこいつ
191デフォルトの名無しさん:04/11/01 09:49:31
>>190
なんだおまえ
192デフォルトの名無しさん:04/11/01 12:28:45
>>192
なんだおまえ
193vc++6.0:04/11/01 17:32:51
boostいれてみたんですが
Let's boost(ttp://www.kmonos.net/alang/boost/
のサンプルintrusive_ptr以下のサンプルがうまくいきません

intrusive_ptr
c:\〜\intrusive_ptr.cpp(23) : error C2065: 'CountableObject' : 定義されていない識別子です。
c:\〜\intrusive_ptr.cpp(23) : error C2065: 'ptr' : 定義されていない識別子です。
c:\〜\intrusive_ptr.cpp(24) : error C2448: '<Unknown>' : 関数の定義が間違っています。
c:\〜\intrusive_ptr.cpp(29) : error C2448: '<Unknown>' : 関数の定義が間違っています。

lexical_cast
c:\〜\lexical_cast.cpp(12) : error C2062: 型 'int' は不要です。
c:\〜\lexical_cast.cpp(13) : error C2275: 'string' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\xstring(612) : 'string' の宣言を確認してください。
cl.exe の実行エラー

というようになってしまいます。
c:\lib\boostの下にc++boost.gif等が来るようにして
インクルードファイルにc:\lib\boostを追加したんですが
194デフォルトの名無しさん:04/11/01 18:24:03
std::multimapで重複するキーをinsertした時についてなんですが
例えば
std::multimap<int, int> m;
m.insert(std::pair<int, int>(1, 1));
m.insert(std::pair<int, int>(1, 3));
m.insert(std::pair<int, int>(1, 2));
m.insert(std::pair<int, int>(1, 4));
とし、イテレータで最初からアクセスした場合
キーが重複した部分がどういう順番で出てくるか
とかそういうのは決まっているんでしょうか?
195デフォルトの名無しさん:04/11/01 18:26:26
>>193
intrusive_ptrはそのコードが間違ってる。
lexical_castはコンパイラが間違ってる。
196vc++6.0:04/11/01 22:39:58
>>195
さんくす
197デフォルトの名無しさん:04/11/02 00:35:07
>>194 決まってない。
198デフォルトの名無しさん:04/11/02 00:56:44
fstreamで読み書きするとfopenで読み書きするよりだいぶ遅くなるのですが、
どうやったら解決しますか?
199デフォルトの名無しさん:04/11/02 01:03:33
>>198
しゃーない。fstreamは継承しまくりの怪物だし、CのFILE構造体のような
機械語に近いライブラリには速度でどうやってもかなわんよ。

マシンを新しくするか、FILEを使い続けるかどちらかだな。
200デフォルトの名無しさん:04/11/02 01:07:15
>>198
コード晒してもらえる?
201デフォルトの名無しさん:04/11/02 01:07:19
>>198
自分でクラスを書く
202デフォルトの名無しさん:04/11/02 02:07:00
>>200
長いのでちょっと難しいですが、

基本的には
fp = fopen(path , "rb")

ifstream ifs(path, ios::in | ios::binary);

fread(&data, sizeof(Data), 1, fp);

ifs.read((char*)&data, sizeof(Data));

fgets

getline
と置き換えただけです。
203デフォルトの名無しさん:04/11/02 02:11:02
速度の方ですがifstreamの方が4〜5割遅くなってしまっています。

readとfgetsはたくさんあってループもしています。
具体的には約10万程度のクラスインスタンスのシリアライズとデシリアライズを行っています。
それと、読込中に正しく読めてるか確認するための\0もあり、
fgetc
ifs.get
で確認しています。
204デフォルトの名無しさん:04/11/02 02:11:55
>>202 最適化の影響は確認した?
205デフォルトの名無しさん:04/11/02 02:14:46
>>204
最適化の影響の意味がよく分かりません。
最適化はon(-O2)にしています。
206デフォルトの名無しさん:04/11/02 02:17:22
全部同じ値のテストデータとかでは無く
実運用データでテストしていてその後実際に読んだデータを元に処理を行っているので、
実際に読み込まないとかの最適化がかかることは無いと思います。
207デフォルトの名無しさん:04/11/02 02:26:17
やっぱり>>199って事なんでしょうかね…
それにしても実際のIOにかかる時間の方が
iostreamの複雑さなんかよりずっとオーダーが大きそうなのに5割も違うのはなあ…
208デフォルトの名無しさん:04/11/02 08:41:29
現在実行しているディレクトリのパスを取得する方法を教えてください。
OSはLinuxです。
209デフォルトの名無しさん:04/11/02 08:58:29
>>208
ここって環境依存ありだっけ?
そうでないなら以後気をつけるようにってことで、getcwd()。
210デフォルトの名無しさん:04/11/02 11:24:42
>>208
環境依存なしならboost/filesystem
211デフォルトの名無しさん:04/11/02 14:03:11
すみません、神様教えてください。
下のソース、Mac の OSX 10.3.5 上で実行すると
::pthread_join で止まってしまいます。
CallProc の中身を while ( true ) ::pthread_testcancel();
のようにすると、ちゃんと join できるのですが・・
他の環境では動くのでしょうか?

#include<pthread.h>
#include<sys/socket.h>

#include<iostream>
using namespace std;
static void*
CallProc( void* p ) {
int wSS = ::socket( AF_INET, SOCK_STREAM, 0 );
::listen( wSS, SOMAXCONN );
::accept( wSS, NULL, NULL );
return 0;
}

int
main() {
pthread_t m;
::pthread_create( &m, NULL, CallProc, 0 );
::sleep( 1 );
::pthread_cancel( m );
void* v;
cout << "Calling join." << endl;
::pthread_join( m, &v );
cout << "Joined." << endl;
}
212デフォルトの名無しさん:04/11/02 14:26:48
FILE*との同期を取るためのコストがでかくて性能が出ないって話がどこかにあった。
同期を行わないパラメタをifstreamに渡せばよかったはずだけど、覚えてない。
213デフォルトの名無しさん:04/11/02 16:26:39
>>212
std::ios::sync_with_stdio()だろ。それにfalseを与えてパフォーマンスの
変化があるかどうか調べてみ。
214デフォルトの名無しさん:04/11/03 13:50:07
C++ ではポインタに代入するとき NULL と 0 のどちらを使った方がいいのでしょうか?
215デフォルトの名無しさん:04/11/03 13:55:48
>>214
0です。そういうことになってます。
216デフォルトの名無しさん:04/11/03 15:23:38
漏れの手元の本には
プラットフォームに応じてNULLの定義方法が異なっていたことにより
プログラムが暴走する危険があった、と書かれてる

例えば
#define NULL ((char *)0)
#define NULL ((void *)0)
など。で、これを代入するとエラーがでる可能性がある
C *cp = NULL; //エラー?
ちなみにC++では数値の0は任意の型のポインタ値に変換できることが保証されている
よって、0が一般的に使われている

けど、現在のC++の標準には(void *)0のような定義は許可されていないので
その標準にのっとった環境であればNULLを使用しても問題ない

ただ、やっぱり今のC++プログラマはNULLではなく、0を利用するのが一般的、らしい

自分の言葉じゃなくてスマソ
今漏れも勉強中なんだわ
217デフォルトの名無しさん:04/11/03 17:46:38
>>216
昔の話だから忘れて良い。

ANSI C++ の規格では NULL は「整数型で値は 0 と等しい」(回りくどい言い方に
なってるのは int, long, ... どれになるかは処理系に任してるから) と定義されてる。

C* cp = NULL;

これが通らないコンパイラは、現実にはそろそろゴミ箱行き。
218デフォルトの名無しさん:04/11/03 17:56:39
NULLより0の方がタイプ数が少なくてグッド
219デフォルトの名無しさん:04/11/03 18:00:18
C++よりRubyの方がタイプ数が少なくてグッド
220デフォルトの名無しさん:04/11/03 18:00:43
>>219
激しく同意させてもらう。
221デフォルトの名無しさん:04/11/03 18:01:05
>>217
> 回りくどい言い方になってるのは int, long, ... どれになるかは処理系に任してるから

君はぬるぽを知っているのか?
Cのぬるぽをわかっているか?
222デフォルトの名無しさん:04/11/03 18:13:41
C++における、Cの負の遺産の一覧、みたいなのありますか?
223デフォルトの名無しさん:04/11/03 18:21:22
>>222
ISO/IEC 14882 の Annex C から以後は読んだか?
英語が辛ければ JIS に日本語版もあるぞ
224デフォルトの名無しさん:04/11/03 18:21:25
>>222 みたことない。
225デフォルトの名無しさん:04/11/03 18:26:53
えー?ANSI版みたいに1980円くらいでしかも日本語の香具師キボンヌ
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1
226デフォルトの名無しさん:04/11/03 18:34:56
>>225
まあ投資額は目的・目標で決めることだからな
なくていいんならそれまでだ
227デフォルトの名無しさん:04/11/03 19:32:55
int hoge = 0;
int* hoge = 0x0;

じゃだめですか?
228デフォルトの名無しさん:04/11/03 20:36:08
>>227 だめです。
229デフォルトの名無しさん:04/11/03 20:45:47
>>227
OKです。
230デフォルトの名無しさん:04/11/03 20:46:23
じゅうぶんです
231デフォルトの名無しさん:04/11/03 20:47:04
はんぶんです
232デフォルトの名無しさん:04/11/03 20:47:14
>>227
('∀`)<あなたを、犯人です
233デフォルトの名無しさん:04/11/03 21:58:31
ていうかコンパイルが通らない。
234おながいしまつ:04/11/04 00:46:52
342 :VC++ですが・・・ :04/11/04 00:32:25 ID:hMyxAB0U
-----------------------------------------
pDocTemplate = new CMultiDocTemplate(
IDR_TEST11TYPE,
RUNTIME_CLASS(CTest1103Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CTest1103View));
AddDocTemplate(pDocTemplate);
-----------------------------------------
↓↓↓

RUNTIME_CLASS(); ←この呪文は、ひとことで言うと何ですか?

C言語の初心者ですいません。
javaは一生懸命勉強したのですが、
VC++の呪文に不慣れです。
そこで諸先生がたに伺いました。難しければ結構です。。。

346 :cen ◆Pm9xOTJuM. :04/11/04 00:34:06 ID:???
>>342
ここを。
プログラム
http://pc5.2ch.net/tech/


↑↑↑
というわけで御座います。
基本的な呪文を10個くらい意味と一緒に覚えておきたいと思います。
235デフォルトの名無しさん:04/11/04 00:50:08
>>234
ひとことで言うと、MFCのマクロ。
236デフォルトの名無しさん:04/11/04 01:07:38
C++の新バージョンって、いつごろ出るの?
237デフォルトの名無しさん:04/11/04 01:09:51
>>236
hageに訊いてください。
238bjarne:04/11/04 01:14:35
シラネ
239デフォルトの名無しさん:04/11/04 01:25:39
すいません。質問なんですが、
C言語には無くてC++にだけは存在する
プリプロセッサへの命令(ディレクティブ)って何かありますか?

CとC++ってこの部分は同じでしたよね?
240デフォルトの名無しさん:04/11/04 01:26:55
プリプロセッサディレクティブなんて激しく環境依存じゃねぇの?
241デフォルトの名無しさん:04/11/04 01:28:43
>>240 いいかげんなこというなよ。
242デフォルトの名無しさん:04/11/04 01:30:20
ソースって一つのクラスごとに一つ作るのがいいんですか?
243デフォルトの名無しさん:04/11/04 01:34:51
>>242
一般的には。
ただ、数行〜十数行程度の小さいクラスがぽこぽこ出来るときはある程度まとめる。
244デフォルトの名無しさん:04/11/04 01:35:35
>>242
基本的にはそれが一番。
245デフォルトの名無しさん:04/11/04 01:41:38
質問者より回答者の方がレベルが低いスレはここでつか?
246デフォルトの名無しさん:04/11/04 01:42:58
全部ひとつのヘッダに書くべき
247デフォルトの名無しさん:04/11/04 01:51:46
>>246
それじゃ再利用しにくくない?
248デフォルトの名無しさん:04/11/04 01:53:08
>>242
間違っても一つのクラスでファイルを分けたりするなよ。
ソースを追いにくくなるから。
定義と宣言は一カ所でしろ。
Javaから入った漏れには当たり前のことなんだが、
世の中には訳分からん無駄な作業をする奴もいるな。
249デフォルトの名無しさん:04/11/04 01:55:43
>定義と宣言は一カ所でしろ。
この行を読んだ瞬間ネタだと分かった
250デフォルトの名無しさん:04/11/04 01:56:38
>>249
遅すぎ。1行目で気づけよ。
251デフォルトの名無しさん:04/11/04 01:56:46
>>247
どうせしないって
252デフォルトの名無しさん:04/11/04 01:56:50
>>248
> 定義と宣言は一カ所でしろ。

ハァ? 実装を修正するたびにインクルードされてるファイルも毎回コンパイルするんかい。
253デフォルトの名無しさん:04/11/04 01:57:12
メール欄みただけで釣りだと分かった
254デフォルトの名無しさん:04/11/04 01:57:26
ネタかよw
255デフォルトの名無しさん:04/11/04 01:57:35
>>250
遅すぎ。読む前に感覚的に見てJavaという4字があった瞬間にネタだと分かれよ。
256デフォルトの名無しさん:04/11/04 01:58:20
大したことない設計しかしていない初心者は、1ソ−スに複数記述してもいいでしょう。
でも複数人でプロジェクト組むなら、1ソース1クラスが良いでしょう。
お遊びじゃないんだから。
257デフォルトの名無しさん:04/11/04 02:01:26
>>242
間違っても一つのクラスで一つのファイルなんて制限するなよ。
ソースを追いにくくなるから。
同じクラスでもグループごとに別ファイルにしたり、ユーザーが読むべき部分と読むべきでない部分は別ファイルにしろ。
C#から入った漏れには当たり前のことなんだが、
世の中には訳分からん無駄な作業をする奴もいるな。
258デフォルトの名無しさん:04/11/04 02:03:17
>>242
間違っても一つのクラスで一つのファイルなんて制限するなよ。
ソースを追いにくくなるから。
一つのプログラムは全部一つのファイルにまとめて書け。
ハンドアセンブルから入った漏れには当たり前のことなんだが、
世の中には訳分からん無駄な作業をする奴もいるな。
259デフォルトの名無しさん:04/11/04 02:14:29
もうネタはいいよ。本当に知りたい人が読んだら勘違いするだろ。
260デフォルトの名無しさん:04/11/04 02:15:31
マジかよ
261デフォルトの名無しさん:04/11/04 02:23:45
じゃぁまとめよう
一つのプログラムは全部一つのファイルに…



ゲフンゲフン
262デフォルトの名無しさん:04/11/04 02:31:13
>>261
ちゃうがな
263デフォルトの名無しさん:04/11/04 02:36:09
1クラス1ファイルとかってファンクタの類でも貫いてたらある意味尊敬するな。
264デフォルトの名無しさん:04/11/04 02:36:55
>>263
それはさすがにやらんな。
265デフォルトの名無しさん:04/11/04 04:04:53
>>263
もちろんインナークラスも別ファイルに分けて #include します。
266デフォルトの名無しさん:04/11/04 06:17:49
>>242
>ソースって一つのクラスごとに一つ作るのがいいんですか?

Cの頃はstaticやexternでシコシコ書くしかなくて
ファイルの分割が即スコープの分割を意味してたから
C++になっていまだにそういう迷信を信じている人も多い
267デフォルトの名無しさん:04/11/04 11:28:15
1ファイル1クラスにしたらどのクラスを探すのが楽やん
268デフォルトの名無しさん:04/11/04 11:42:14
俺も興味あるんだけど、結局どっちがいいんだ…「適度に」って言う曖昧なのが一番なのか。
今のところ建設的っぽい意見

・一般的には1クラス1ソースだが、小さいクラスが多いときはある程度まとめる
・再利用しにくいから1クラス1ソース
・実装を修正するたびにインクルードされてるファイルを毎回コンパイルしないために1クラス1ソース
・1クラス1ソースは、ファイルの分割が即スコープの分割を意味していたCの頃の迷信
269デフォルトの名無しさん:04/11/04 11:56:13
>>268
というか、関連が比較的強いクラスはまとめる。
長くなるようなら分割する。
コンパイルの際のファイル依存は極力減らす(PImplイディオムまではいかなくても)

でいいんじゃないの
270デフォルトの名無しさん:04/11/04 12:42:40
>>269
うーん、サンクス。となると例えば手元にある「コンポジットのクラスが
まとめられてる長いソース」は分割対象かなぁ。

実用で言ったら依存関係だけ考慮すれば良さそうだけど、
そうもいかないだろうしねぇ。
271デフォルトの名無しさん:04/11/04 22:42:05
原則論的な話をするとキリがないけど、モノを作り上げる効率性
を考えたら、1ソース1クラスで作ると決めたほうが、はるかに
効率が良い場合がほとんどですね。プロジェクトの分担がし易い
し、誰かが改良をしている時に、ほかの人が手を入れられない、
ということがなくなるし。

そもそも、ソース長すぎて分割しなくてはならない、
ってのは、ソフト業界で生きていくレベルにないね。。。
設計がなってないにもホドがある、ゾ・・・
272デフォルトの名無しさん:04/11/05 00:01:39
記念マキコ
273デフォルトの名無しさん:04/11/05 01:00:34
大阪(西梅田)、新宿(JR駅前)のそれぞれ一等地に
拠点を構え、業績急上昇中!未経験者大募集中!の
ソフトウェア開発会社
グリーンシステムを応援するHPです。
http://www.geocities.jp/grs_hp/

応援するスレはこちら!
http://school4.2ch.net/test/read.cgi/job/1077432387/

最高の会社にするため、みんな頑張ってます!

274デフォルトの名無しさん:04/11/05 12:46:52
とあるクラスのメンバ関数の振る舞いについて質問です

int &Hoge(){
int mage = 0;
return mage;
}

とするとやはり危険なんですよね?
これを解決するために
1.mage を static int にする
2.メンバ変数として int mage を作っておく

Hoge を呼び出す側に変数を用意しておいて
Hoge に参照渡しするのが無難だと思いますが
上記の1,2の方法が問題ないのであれば、どちらがいいのでしょうか?
275デフォルトの名無しさん:04/11/05 12:50:56
コピーコンストラクタがあれば問題なし
276デフォルトの名無しさん:04/11/05 13:01:49
>>274
1 と 2 では意味が全然違うが?
277デフォルトの名無しさん:04/11/05 14:44:02
>>275
コピーコンストラクタをどのように用いればよいのでしょうか?

>>276
揮発性という観点で1,2を挙げたのですが
その違いというのも教えていただけないでしょうか
278デフォルトの名無しさん:04/11/05 15:18:20
int Hoge() { ... }
279デフォルトの名無しさん:04/11/05 15:21:53
>>277
#include <iostream>
using namespace std;
class foo {
  int mage;
public:
  foo() : mage(0) {}
  int& Hoge() {return ++mage;}
};
class bar {
public:
  int& Hoge() {
    static int mage = 0;
    return ++mage;
  }
};

int main () {
  foo f[2];
  bar b[2];
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
      cout << f[i].Hoge() << ' ';
  cout << endl;
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
      cout << b[i].Hoge() << ' ';
  cout << endl;
  return 0;
}
280デフォルトの名無しさん:04/11/05 17:54:12
>Cスレの方でも書き込んだのですが、一応こっちも
あるクラスにbuf[4][128]という配列があり、これを単なる外部関数
で使いたいのですが、このアドレスをメンバ関数で取得するには
どう書けばよいのでしょうか?とりあえずこうしてみたのですが 駄
目でした。
class A
{
buf[4][128];
char** getBuf(void) { return (char**)buf; };
}
int main(void)
{
char **ptr;
ptr = classA->getBuf();
ptr[3][100]=100;//ここでハングアップ
}
281デフォルトの名無しさん:04/11/05 18:13:32
>>280
とりあえずコンパイルできる形にしてから載せろよ…
282デフォルトの名無しさん:04/11/05 18:17:24
これでどうでしょう?
class AAA
{
private:
char buf[4][128];
public:
char** getBuf(void) { return (char**)buf; };
};
int main(void)
{
AAA aaa;
char **ptr;
ptr = aaa.getBuf();
ptr[3][100]=100;//ここでハングアップ
}
283デフォルトの名無しさん:04/11/05 18:18:25
メモリレイアウトを考えろ
[0,0]...[0,127][1,0]...[1,127][2,0]...[2,127][3,0]...[3,127]
#include <iostream>
class A
{
public:
  char buf[4][128];
  char* getBuf(void){return (char*)buf;};
  void print(){std::cout << (buf[3][100] & 0xff) << std::endl;}
} classA;
int main()
{
  char *ptr;
  ptr = classA.getBuf();
  *(ptr + 3 * 128 + 100) = 100; // ここでハングアップ
  classA.print();
}
}
284283:04/11/05 18:19:04
あ、ごめん、最後の}が余計
285デフォルトの名無しさん:04/11/05 18:25:11
返答有難うございます。
*(ptr + 3 * 128 + 100) = 100; // ここでハングアップ
これはこの形でないと駄目ということでしょうか?ptr[][]の
形でアクセスする方法はないのでしょうか?
286デフォルトの名無しさん:04/11/05 18:28:52
>>285
char* ptr; を char (*ptr)[128];に替えればいいだろ。
287デフォルトの名無しさん:04/11/05 18:37:22
あ、なるほど!ポインタ変数を変えるのですね。関数の戻り値を
変えることばかり考えて、そっちは気づきませんでした。
これで解決できそうです。ちょっとやってみます。
288デフォルトの名無しさん:04/11/05 19:24:46
>>287
関数の戻り値も変えられるけど?
286とまったく同じ構文で。
289デフォルトの名無しさん:04/11/05 19:57:01
>>280
> Cスレの方でも書き込んだのですが

いやそれマルチだから
お前ら親切ですね
290デフォルトの名無しさん:04/11/05 20:21:58
マルチすみません。

>関数の戻り値も変えられるけど?
はい、それを最初に試して、こんな感じにしてみたんですが
コンパイルエラーになります。
char(*)[128] getBuf(void){ return (char*)buf; };
(char(*)[128]) getBuf(void){ return (char*)buf; };

どういう風に書けばよいのでしょうか?
291デフォルトの名無しさん:04/11/05 20:39:35
>>290
char (*getBuf(void))[128];
あるいは
typedef char (*BUF)[128];
BUF getBuf(void);
292デフォルトの名無しさん:04/11/05 20:49:50
char (&getBuf(void))[4][128]{ return buf;}
のほうが良いとおもゆ
293デフォルトの名無しさん:04/11/05 20:55:55
>>291
>>292
試してみました。上手くいきました。

これで完全に解決しました。マルチに最後にまで付き合って
もらってすみません。勉強になりました。
294デフォルトの名無しさん:04/11/06 01:07:25
class A {
protected: void a() {}
};

class B : public A {
public: void b(A& a) { a.a(); }
};

というコードが vc7.1 で
error C2248: 'A::a' : protected メンバ (クラス 'A' で宣言されている)にアクセスできません。
というエラーになるのですが、これは c++ 標準の仕様なのでしょうか?
295デフォルトの名無しさん:04/11/06 01:13:41
yes
296デフォルトの名無しさん:04/11/06 01:38:37
>>294
this->a()しか呼び出せないよ。
297デフォルトの名無しさん:04/11/06 01:39:14
>>294
やってることを理解してない模様。
298デフォルトの名無しさん:04/11/06 01:56:40
基本的な事で素朴な質問なんですが、
test.h で、
struct test {
int a;
int b; };
class test2 {
int c;
int d;
SetC(int i);
SetD(int i);
GetC(void);
GetD(void); };
という宣言がなされていて、
test.cpp で、
#include "test.h"
int main(void) {
int sum;
struct test t;
t.a = 0;
t.b = 0;
sum = t.a + t.b;
printf("%d\n", sum)
return 0; }

というような(あまり意味のない)コードを作ったとします。
これをコンパイルした時、test.hのclass test2の方の
内部実装が未定義のSetC,SetD,GetC,GetDやclass test2
自体はどうなっちゃうのでしょうか?test.cの方でclass test2
を使ってなければコンパイルエラーにはならないですが、
実際に出来上がった実行形式ではclass test2の部分の定義
はコンパイラが削除してしまうのでしょうか?
299デフォルトの名無しさん:04/11/06 02:04:17
>>298
そもそも無いのだから削除する必要も無いのでは?
300デフォルトの名無しさん:04/11/06 02:33:28
>>296
class B : public A {
public: void b(B& b) { b.a(); }
};
これなら呼び出せるんだよ〜ん。
protectedメンバはthisを含め自分自身と同じ型のポインタ/参照ならアクセス可能。
301デフォルトの名無しさん:04/11/06 05:31:59
プログラミング言語C++第三版P108の上から二行目の
「しかし、正の整数を表現するためのビット数を一つ増やしたいために
int の代わりに unsigned を使うのは、ほぼ確実によくない」
のところが良く分かりません…これってどういうことなのでしょうか…?
302デフォルトの名無しさん:04/11/06 06:11:23
「C/C++で unsigned (int以上)を使うのは、ほぼ確実によくない」
に読み替えてかまわないと思うよ。
303デフォルトの名無しさん:04/11/06 06:23:21
でも理由が自分には良く理解出来ないので気持ち悪いです。
「値を正に保つために unsigned を宣言しても、暗黙の型変換
ルールがあるので、目的を達成出来ない」
ってあるけどこれ読んでも、値は正に保たれてるから別にいいのでは?
と思ってしまうのですが…
304デフォルトの名無しさん:04/11/06 06:44:09
>>303
前半は、たかが1ビット稼ぐために、unsignedを導入することによって発生する多大なデメリットは割に合わない。
後半は、文脈が分からんので知らん。
305デフォルトの名無しさん:04/11/06 07:53:03
>>301
そんなん用途によるがな。
いろんな型の欠点ばっかり言い出したら
それこそ使てええのん残らんで。

ただsignedとunsignedの不注意な混用は
ハメられて痛い目見るケースがよくあるから
くれぐれも気をつける癖をつけれちゅうんなら
俺もそう思う。
306デフォルトの名無しさん:04/11/06 07:53:27
でかいクラス(Form等)を1つのクラスで
複数のソースファイルに分割するというのは一般的に良く行われる事なのですか?
form.hでFormクラスを宣言して、
formcontrols.cppとformevents.cppとforminit.cppで定義を行うというような事です。
307デフォルトの名無しさん:04/11/06 08:05:12
>>306
一般的、とあるんでイヤだと答えるが・・・
そのケースの事情を見ずに言ってることなんで
声のトーンはごく控えめにしとく

ヘッダとソースとインラインに分けてるのはときどき見かけるなあ

それから「でかい」って何を基準に言ってるのかな?
数千行程度なら全然「でかい」うちに入らんぞ
たとえ数百行程度でも「でかい」と感じることもあるが
わかるか? ライン数やバイト数じゃねえってことだ
308デフォルトの名無しさん:04/11/06 08:21:05
普通1メソッド1ファイル
309デフォルトの名無しさん:04/11/06 08:25:52
1プログラム1ソースという結論が他の全てを論破したはずだが?
310デフォルトの名無しさん:04/11/06 08:31:52
おぞましい結論だな
311デフォルトの名無しさん:04/11/06 09:13:15
・1つのプロシージャの行数、
・ローカル変数のスコープ範囲、
・命名規則の一貫性の程度
で体感的なファイルの大きさは変わるな。
312デフォルトの名無しさん:04/11/06 09:17:05
下記のようにコーディングして、テキストファイルを読み込むと、
当然読み込んだデータの末端に余計な改行が入るのですけど、
不要な改行を付加することなく、スマートに
テキストファイルを読み込む方法はないでしょうか?

Open TextFilePath For Input As #1
Do Until EOF(1)
Line Input #1, Temp
ReadData = ReadData & Temp & Chr(13) & Chr(10)
Loop
Close #1
Text1.Text = ReadData
313デフォルトの名無しさん:04/11/06 09:19:47
>>312
そんなえさで(ry
314デフォルトの名無しさん:04/11/06 10:19:32
スレ違いだボケ
315デフォルトの名無しさん:04/11/06 10:20:34
316デフォルトの名無しさん:04/11/06 11:23:46
--a.cc--
extern void func1(void);

int main(){
...
func1();
}

--b.cc--
extern func2(void);

void func1(void){
...
func2();
}
--c.cc--
void func2(void){
...
}

という3つのファイルがあって,g++ a.ccをするとundefined reference to func2()
がでるのですが,何がいけないのでしょうか?
317:04/11/06 11:27:06
>>316
g++ -c a.cc
318デフォルトの名無しさん:04/11/06 11:27:07
ゼルダ
319デフォルトの名無しさん:04/11/06 11:29:56
>>317
なるほど,了解しました.ありがとうございました.
リンクする前にとめればいいんですね.
320デフォルトの名無しさん:04/11/07 15:21:49
C++は「なんだって出来る」言語だけれど、
何を作るかによって設計を変えないとやっていけない。
クラス設計が関わるレベルであれば、オブジェクト
指向で設計しないと使えないヤツになってします。
アドレス渡しなんてやっていたら・・・オソロシイィィ
でも組み込み機器の設計や、リアルタイム制御の世界
だったら、まだまだポインタは必要だけどね。
トンカチで釘打つ時にトンカチに釘接着してから
木に打ち込もうとしたら、技術のレベルが知れるわね。
321デフォルトの名無しさん:04/11/07 15:22:19
そこでRubyですよ
322デフォルトの名無しさん:04/11/07 15:31:17
ところでこのRubyのひとって複数いるの?
323デフォルトの名無しさん:04/11/07 15:36:13
漏れも思った
一人であちこち巡回してるのかと思うと、
相当なアンチRubyなんだろうなって思う



明らかにRubyに対し悪いイメージしか残してないからなw
324デフォルトの名無しさん:04/11/07 15:41:20
そこでRubyですよ
325デフォルトの名無しさん:04/11/07 16:13:52
計算機言語には得手不得手があるからなぁ。
なんでもかんでもC++ってわけにもイカンのはたしかだ。

それでもパフォーマンスとOO設計の両方を兼ね備えたのなんざ
C++とEiffelくらいしか無いからね。
326デフォルトの名無しさん:04/11/07 16:14:53
そこでRubyですよ
327デフォルトの名無しさん:04/11/07 16:18:07
Rubyで物理計算やらせると終わらないので却下です
328デフォルトの名無しさん:04/11/07 16:18:45
このスレは監視されているっ……
329デフォルトの名無しさん:04/11/07 16:22:14
誰にだよ〜>>328
330デフォルトの名無しさん:04/11/07 16:26:41
オレオレ、俺だよ、ばあちゃん
331デフォルトの名無しさん:04/11/07 16:32:14
>>325
C++はともかく
- OCaml
- Objective C
- Delphi
を出さずにEiffelを出すのは何で?
Eiffelはパフォーマンスが要求される所で実績あったりするの?
332デフォルトの名無しさん:04/11/07 16:37:05
>>331
別に深い意味はないよ、自分で選んだ結果として書いてるだけ。
あげてもらった言語に対しては
ObjectiveC:嫌いではない、Next使ってた頃はすごく重宝した
Delph:環境がWindowsしかない、すごく良くできているのにもったいない
OCaml:ごめんなさい、評価もしたことないのです

なんだよね、Eiffel入れたのは自分が使ったことがあって速度の問題もそれほどでなかったからなんだよ
でも大意としての機械言語には向き不向きがあるって事は了解してくれているんだよね?
333325:04/11/07 16:38:44
補足:
ClosとかCommonLispが自分は好きだけどチームからは不評なんです。
334デフォルトの名無しさん:04/11/07 17:06:06
>>332
Next は NeXT と書いてくれ
335デフォルトの名無しさん:04/11/07 17:10:46
>>332
DelphはDelphiと書いてくれ
336デフォルトの名無しさん:04/11/07 17:12:36
>>332
レスどうも
いろんな言語の経験がお有りなんですね
Eiffel使いなんて珍しいなと思って聞いてみました
向き不向きの話は同意です
最近R(S言語)の関数をC++に移植してるんですが
S言語はお気楽すぎて作業が大変です
337デフォルトの名無しさん:04/11/07 17:13:40
>>332
つっこみどころが多いな!
338デフォルトの名無しさん:04/11/07 18:00:12
>>337
現につっこめてねえヒヨッ子がはったりかましてんじゃねえw
339デフォルトの名無しさん:04/11/07 18:09:49
Eiffelは、関数の部分型関係が引数に対してcovariantなのが分かりづらい。
340デフォルトの名無しさん:04/11/07 18:27:20
>>339
そんだけ混乱してりゃ解りづらいのは道理だなw
341デフォルトの名無しさん:04/11/07 18:29:47
342デフォルトの名無しさん:04/11/07 18:32:26
>>341
なるほど、そういうことか
343デフォルトの名無しさん:04/11/07 19:35:54
コンストラクタの書き方で悩んでいます。

派生クラスのコンストラクタで受け取った引数を少し加工してから、
基底クラスのコンストラクタに渡してやりたいのですが、
記述方法がわかりません。書く方法あったら教えていただけないでしょうか。
344デフォルトの名無しさん:04/11/07 19:39:36
struct d : b {
d(int a) : b(a + 1) { }
};
345デフォルトの名無しさん:04/11/07 19:59:03
>>344
ありがとうございます。助かりました。
346デフォルトの名無しさん:04/11/08 14:48:20
Objective C は Objective-C と書いてくれ
347デフォルトの名無しさん:04/11/08 21:58:02
ということは Objective-C = Objetive となるの?
348デフォルトの名無しさん:04/11/08 22:02:30
>>347
operator-はオーバーロードされてません!残念!
349デフォルトの名無しさん:04/11/08 22:37:48
'c' - 'C' == ' '
だと思うがどうよ
350デフォルトの名無しさん:04/11/08 23:33:30
質問です。
データ読み込み関連のクラスでデータを拾ってきて使おうとすると
クラスが層みたいになってるので、どうしても

hoge->getHoge()->getHogeHoge(hoge->getHogeNo())->getHogege()->getString(hoge->getHogeHogeNo()).c_str()
とか長くなってしまいます。
こういうときはどう組んだらよいのでしょうか?
351デフォルトの名無しさん:04/11/09 00:07:24
get関数の中でget関数を呼べば?
352デフォルトの名無しさん:04/11/09 00:10:19
>>351
なるほど。
ありがとうございました。
353デフォルトの名無しさん:04/11/09 01:42:39
typedef double (*FUNCTION)(double, double );
は何を意味しているんですか?
初心者です。よろしくお願いします。
354デフォルトの名無しさん:04/11/09 01:45:06
二つのdouble型を引数に持ち、戻り値もdoubke型の関数ポインタを型定義している。
355デフォルトの名無しさん:04/11/09 03:34:36
typedef double (*FUNCTION)(double, double)[20];
は何を意味しているんですか?
356デフォルトの名無しさん:04/11/09 03:36:10
syntax error です。
357デフォルトの名無しさん:04/11/09 05:56:25
コンストラクタの呼び出しについてなんですが、皆さんは
T t(tt); // 髭推奨
T t = tt; // 禿推奨
のどちらがいいと思いますか?
358デフォルトの名無しさん:04/11/09 05:56:53
配列のポインタを返す関数をtypedefするのはどうするの?
359デフォルトの名無しさん:04/11/09 06:12:24
わざわざtypedefする意味あんの?
360デフォルトの名無しさん:04/11/09 06:24:32
>>357
コンストラクタをexplicit宣言しておくと微妙に差が出るな。
361デフォルトの名無しさん:04/11/09 08:36:26
int main()とvoid main()は何がどう違うんですか?
362デフォルトの名無しさん:04/11/09 09:57:56
>>361
バッチファイルなどのスクリプトから子プロセスとして呼び出した時、戻り値を使えるかどうかの違い。
Windowsのシステム環境変数 「errorlevel」とか、Unixのシェル変数 「$?」で戻り値を取得可能。

バッチの例:
hoge.exe
echo %errorlevel%
363デフォルトの名無しさん:04/11/09 11:57:11
>>362
説明不充分。voidだと使えないのではない。不定値になるのだ。
364デフォルトの名無しさん:04/11/09 12:31:10
CUIのプログラムの場合はプログラムの始めと終りが大事なんだけど
GUIの場合ほとんどウインドウ開いて閉じるだけの意味しかない。
Windowsしか知らないでCUIプログラム作ってると意味わかんないだろう。
365デフォルトの名無しさん:04/11/09 13:24:44
>>363
お前はとりあえず、日本語の勉強しろ。

例としてあげるならば、「使えない奴だな。」は、奴が使用不能であることを指すのではない。
使っても物の役に立たないという意味だ。使う自由はあくまでユーザにある。
お前が日頃から言われていることだからすぐに理解できるだろう。な?
366デフォルトの名無しさん:04/11/09 13:32:42
>>365
切れどころがわかんね┐(´〜`)┌
367デフォルトの名無しさん:04/11/09 14:29:19
句読点の使い方をもっと勉強しましょう。
368デフォルトの名無しさん:04/11/09 14:54:40
まぁ363は揚げ足取りに見えるな
文頭が「補足で〜」とかなら頭良い人に見えるのに
369デフォルトの名無しさん:04/11/09 15:53:21
>>358
typedef int (*(*FUNCTION)())[];
370デフォルトの名無しさん:04/11/09 16:30:49
揚げ足の取り合いは醜いポ(´・ω・)y--oO○ エトー・・・
371デフォルトの名無しさん:04/11/09 22:10:23
クラスで使用する定数をVC++6.0で定義しようとしたら
static const int HOGE=0;
ができないらしいので、enumで代用しました。
文字列定数を使う場合はどうやればいいでしょうか

VC++6.0を窓から投げ捨てる以外の方法を教えてください
372デフォルトの名無しさん:04/11/09 22:15:33
古いC++コンパイラは糞ばっかだからなぁ。
買い換えましょう。
373デフォルトの名無しさん:04/11/09 22:19:40
>>371-372
そのクラス宣言内での初期化ができるのはISOでも整数型だけと決まっている。
というわけで普通の静的メンバと同じようにしろ。
//ヘッダ
class Foo
{
  static const char * const HOGE;
};
//cppファイル(1ファイルでだけ)
const char * const Foo::HOGE = "Hoge";
374デフォルトの名無しさん:04/11/09 22:21:57
>>371
ワラタ
お前が飛び降りれば良いだろw
375デフォルトの名無しさん:04/11/09 22:22:29
class foo
{
public:
static const int hoge;
};
const foo::hoge = 0;
376371:04/11/09 22:24:06
>>373
なるほど。そうだったんですか
ありがとうございました
>>372さんも微妙にありがとう
377デフォルトの名無しさん:04/11/09 22:25:44
>>371
VC6はARM仕様、ISO/IEC14882と違うつーて騒ぐ池沼は適正なし
378デフォルトの名無しさん:04/11/09 22:28:32
>>377
GCCこそが標準でありISOは糞である!
そこんとこ間違えないように!
379デフォルトの名無しさん:04/11/09 22:41:51
380デフォルトの名無しさん:04/11/10 01:42:53
>>361
void main() は規格外。
381デフォルトの名無しさん:04/11/10 06:39:49
変数のスコープや使われ方が分かりやすくなるように
いきなりブロックを書いて無理矢理スコープを制限したり
してるんですが、なんだか美しくない気がします。
こういうことは普通にやるものなのでしょうか?

↓こんな感じです
{
    int a1, a2
    if (a1 < a2) return -1;
    if (a1 > a2) return +1;
}
{
    int b1, b2;
    if (b1 < b2) return -1;
    if (b1 > b2) return +1;
}
382デフォルトの名無しさん:04/11/10 07:40:14
swich - case の中でローカル変数使いたいときはよくやる

switch(式){
case 1:
{
 int a = 1;
 printf("%d\n", a);
}
default:
{
 int a = 2;
 printf("%d\n", a);
}
}
383デフォルトの名無しさん:04/11/10 07:42:14
default: の前に break; 忘れてる
384デフォルトの名無しさん:04/11/10 08:10:42
>>381
たまにやる。
古いCではローカル変数をブロック途中で新しく定義するために使う。
C++ではデストラクタのタイミングを調整するために使ったりする。

関数に分けてすっきりした名前が付くなら、分けたほうがいい。
385381:04/11/10 08:11:01
>>382
自分もそれはやるんですが、やっぱ>>381はさすがに
冗長?というか余計なお世話なのかなあ、と。
自分的にはブロックで囲むと
{ // hoge する
     /* ... */
}
みたいな感じでコメントも分かりやすくなるのでは?
と思ってたりするのですが、これがほとんどなされない
ような書き方ならば逆に読みにくくなるかもしれないので
やめた方がいいのかと。
386デフォルトの名無しさん:04/11/10 08:33:06
>>381
普通にやる。むしろ推奨。
最終的にリファクタリングで関数に切り出せることを暗示している。
387デフォルトの名無しさん:04/11/10 08:36:25
388デフォルトの名無しさん:04/11/10 08:55:14
>>385
確かに古い書き方の人は殆どやらないようだが、スコープがはっきりするので私もお奨め。
例えばこういうケースはfunc()を他人が作る場合にしばしばおきるので。
void myFunc()
{
int x, y;
...;
x = ...;
...;
y = ...;
int rtn;
{
struct ForFunc tmp = {x, y};
rtn = func(tmp);
}
switch (rtn) {
case FuncRtnOk:
...;
break;
case FuncRtnError:
default:
...;
}
}
まぁ、C++ならブロック化しなくてもすむんだけどね。
389デフォルトの名無しさん:04/11/10 11:56:09
無名名前空間内の関数って名前空間内で定義しないとダメなんですか?
390デフォルトの名無しさん:04/11/10 14:27:29
map をキーではなく値でソートさせるようには出来ないのでしょうか?
391デフォルトの名無しさん:04/11/10 15:17:55
>>390
キーと値を逆にしたものを持てばいい。
392デフォルトの名無しさん:04/11/10 17:48:51
>>389
その通り。
393デフォルトの名無しさん:04/11/10 19:18:36
>>390
最新版のboostには複数要素を基準にソートできるコンテナが入る。
394デフォルトの名無しさん:04/11/10 23:08:07
int* p_ = 0;
void reg(int* p) { p_ = p; }
void foo() { ++(*p_); }

int i = 0;
reg(&i);
std::cout << i << std::endl;
foo();
std::cout << i << std::endl;

とした場合、iが最適化でfoo()前後で同じ値が使われるということはあるのでしょうか?
395デフォルトの名無しさん:04/11/10 23:12:24
ないんじゃね?もし何か具体的にコンパイラの挙動を疑っているの
ならばそのコンパイラを晒した方がレスが早そうだが。
396394:04/11/10 23:19:52
>>395
ttp://forums.belution.com/ja/cpp/000/009/26.shtml
ここの・ライブラリに関連ってとこでそんなことが書いてあったのですが
もしこういう最適化をされたら面倒だなと思ったのです。
397デフォルトの名無しさん:04/11/10 23:23:29
>>396
エイリアスを使わないと仮定するとか
そういうようなコンパイルオプション使うとそうなります。
398デフォルトの名無しさん:04/11/10 23:26:27
>>394
標準関数でない関数呼び出しの前後で、完全ローカル(*)でない変数が同じであることは期待しないで最適化するはず。
つまり、きちんと違う値が出力されるはず。
#完全ローカルと書いたが、要はアドレス参照されてないローカル変数。
399394:04/11/10 23:40:33
>>397
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_.2f.oa.2c_2f.ow.asp
これのことですね。
>>395, >>397-398
よくわかりました。ありがとうございました。
400デフォルトの名無しさん:04/11/11 00:57:36
class Hige{
};

class Hoge:public Hige{
};

class Mage:public Hoge{
private:
std::vector<Hige> hige;

public:
Mage(){
hige.push_back( /* ここにHogeが持つclass Higeを入れたい */ );
}
};

このようなことが実現可能でしたら、その方法をご教授ください。
よろしくお願いします。
401デフォルトの名無しさん:04/11/11 00:59:09
自分の基底クラスへのポインタがほしいと言うことか?
402デフォルトの名無しさん:04/11/11 01:02:01
>>400
vectorの中身がポインタではないのでコピーになっちゃいますよ?
403デフォルトの名無しさん:04/11/11 01:02:14
たぶんそのことだと思います^^;

Mageに継承したHogeの、さらに継承元のHigeを
higeに格納したいのですが…
404デフォルトの名無しさん:04/11/11 01:05:32
やっぱポインタじゃないと直接アクセスは無理ですか…^^;

つまり
std::vector<Hige*> hige;
にしておき、基底クラスへのポインタを hige に格納というわけですよね?

基底クラスとやらを勉強してきます
即レスありがとうございました
405デフォルトの名無しさん:04/11/11 01:06:36
>>404
勉強するのはそっちじゃないと思う・・・。
406デフォルトの名無しさん:04/11/11 01:07:34
およ…
407デフォルトの名無しさん:04/11/11 01:09:26
って、「基底クラスのポインタの返し方」ですよね?^^;
408デフォルトの名無しさん:04/11/11 01:11:44
thisでいいやん。
409デフォルトの名無しさん:04/11/11 23:37:35
クラスAとクラスBがあって、
クラスAがクラスBのポインタを保持
クラスBがクラスAのポインタを保持
っていうのは可能でしょうか?
相互にクラスポインタを保持すると何故かコンパイルエラーが出るのですが…
410デフォルトの名無しさん:04/11/11 23:48:03
>>409
ポインタならできるはず・・・
ただ先行宣言が必要だけど

class B;

class A {
  B* b_;
};

class B {
  A* a_;
};
411デフォルトの名無しさん:04/11/11 23:53:41
先行宣言というより friend class っぽい悪寒
412デフォルトの名無しさん:04/11/11 23:58:35
>>400
hige.push_back(*static_cast< Hige * >(this));

>>409
class B;

class A {
private:
  B *b;
};

class B {
private:
   A *a;
};
413デフォルトの名無しさん:04/11/12 00:22:18
ちゅーか>>409
Cの自作関数の作り方から勉強し直しの予感
414409:04/11/12 00:43:16
>>410-412
先行宣言じゃなく相互にヘッダをincludeしてたんですがエラーの原因は別でした。
試行錯誤の結果無事できました。レスありがとうございました。

>>413
ちゅーかc++の勉強不足でした…orz
415デフォルトの名無しさん:04/11/12 01:36:06
>>414
> 相互にヘッダをincludeしてたんですが
詳しく
416デフォルトの名無しさん:04/11/12 02:03:36
>>415
あ、すみません。よく見たらちゃんと先行宣言もしてありました。

---a.h---
#include"b.h"
class a{
public:
a(b* bb){pb = bb;}
b* pb;
};

---b.h---
#include"a.h"
class a;
class b{
public:
b(a* aa){pa = aa;}
a *pa;
};
簡略化するとこんな感じのソースでした。では。
417デフォルトの名無しさん:04/11/12 08:43:35
もういっぺん基礎からやり直せ
418デフォルトの名無しさん:04/11/12 09:16:47
int b();
int a() { b(); }
int b() { a(); }
419418:04/11/12 09:17:31
ゴメソ勢いでintっちまった
420デフォルトの名無しさん:04/11/12 15:14:51
code_a.cc
code_b.c
というC++とCの二つのcodeがあります。
code_aで使っている関数のうちb1()はcode_b.cで定義されていて、
code_bで使っている関数のうちa1()はcode_a.ccで定義されています。

Makefileの中に
code_a: code_a.o code_b.o
code_a.o: code_a.cc
code_b.o: code_b.c
という依存関係が書かれており、
make code_a
をすると
g++ -c -o code_a.o code_a.cc
gcc -c -o code_b.o code_b.c
gcc code_a.o code_b.o -o code_a
code_a.o: In function `main':
code_a.o(.text+0xa1a): undefined reference to `b1()'
code_b.o(.text+0x907): undefined reference to `a1()'
collect2: ld returned 1 exit status
make: *** [code_a] Error 1

というlink errorが出ます。
code_a.ccをの中身を書き換えて(constを#defineにしたり)、
code_a.cに変えてしまえば問題なくmakeが通ります。
code_aをC++のままでmakeしたいのですが、
何が問題なんでしょうか。
421デフォルトの名無しさん:04/11/12 15:19:20
>>420
/* code_a.cc */
extern "C" int b1(); // b1がCリンケージの関数であることを示す宣言
extern "C" int a1(){/* ... */} // a1をCリンケージの関数として定義

これでうまくいかないかな。
422420:04/11/12 15:26:47
どうもありがとうございました。
上手くいきました。
これって基本事項かな?
普段、Cのcodeと混在させるってしないもので。
423デフォルトの名無しさん:04/11/12 17:54:59
>>422
基本中の基本。
424デフォルトの名無しさん:04/11/12 17:58:20
C++ FAQくらいよんどこうな
425デフォルトの名無しさん:04/11/12 20:36:45
C++ を使って数値計算 (おもに行列計算) をやりたいのですが、
フリーで質のよいライブラリってあるでしょうか?
よろしくお願いします。
426デフォルトの名無しさん:04/11/12 20:40:50
>>425
まずは本スレ21へのレスをどうぞ
427デフォルトの名無しさん:04/11/12 20:44:17
>>426
ごめんなさい。すでに出ていたのですね。
ご丁寧にありがとうございます。
428デフォルトの名無しさん:04/11/12 21:20:53
本スレがあるのかと考えてしまった
「本店」とかと同じ使い方か
429デフォルトの名無しさん:04/11/12 23:11:27
>>416
溜息…
430デフォルトの名無しさん:04/11/12 23:28:52
>>528
その場合の「本店」自体、イントネーションで二通りの解釈があるな。
431デフォルトの名無しさん:04/11/13 01:39:34
いわゆる「当店」って意味ですか。
432デフォルトの名無しさん:04/11/13 10:44:37
本官を侮辱すると(ry
433デフォルトの名無しさん:04/11/13 12:56:59
javaのdeprecated宣言の様にコンパイル時に該当クラスやメソッドの利用を推奨しない事を警告するような方法はありますでしょうか?
環境に依存しないのが良いのですが特定のコンパイラにはあると言う情報でもかまいません。
434デフォルトの名無しさん:04/11/13 13:02:29
>>433
クラス単位なら、当該ヘッダに #warn 書いておくとか。
435デフォルトの名無しさん:04/11/13 16:05:51
>>434
ヘッダ内に移行すべきクラス書きたい時とかどうしようか悩んでしまってるんです。
やはり事由を記述して新しいヘッダ読めって書くべきなんでしょうかねぇ。

むぅ。
436デフォルトの名無しさん:04/11/13 17:15:25
>>433 doxygen
437デフォルトの名無しさん:04/11/13 17:20:03
438433:04/11/13 17:26:13
みなさんありがとう、
gccっていろいろ拡張されているんですねぇ。

とりあえず現行のソースは@deprecatedを使ってdoxygenで作ったマニュアルを見てくださいと#warnに書いておく事にします。
439デフォルトの名無しさん:04/11/14 11:56:05
コンストラクタのメンバ初期化部って表現力低すぎだよね
440デフォルトの名無しさん:04/11/14 18:57:58
>>439
配列以外で特に不満はないが・・・
441デフォルトの名無しさん:04/11/14 18:59:29
構造体も・・・
442デフォルトの名無しさん:04/11/14 19:02:23
構造体も必要ならコンストラクタ書いちゃうから気にしないなぁ。
443デフォルトの名無しさん:04/11/14 19:14:34
Win32APIだと構造体だらけで
HOGE hoge = { sizeof(HOGE) };
なんて初期化する場面がしょっちゅうあるからな。
444デフォルトの名無しさん:04/11/14 19:25:23
>>443
動作上よく出てくるのはいいが
記述上おなじことを何度も書いてる香具師は低脳
445デフォルトの名無しさん:04/11/14 19:34:59
>>444
それコンストラクタのメンバ初期化と何か関係ある話か
446デフォルトの名無しさん:04/11/14 19:39:08
>>445

442までは関係あったが、443から関係なくなった
447デフォルトの名無しさん:04/11/14 19:41:38
>>446
443も関係あるじゃん。
448デフォルトの名無しさん:04/11/14 19:45:35
>>447
いーや、関係ない
442で終わった話を無理やり続けているだけ
449デフォルトの名無しさん:04/11/14 20:01:49
あげてる奴はなんでそんなに仕切りたがってるんだ。
450デフォルトの名無しさん:04/11/14 20:08:28
>>449
別に続けるなとは言ってない
この点でもまたお前は流れが読めてない
451デフォルトの名無しさん:04/11/14 20:11:42
>>450
屁理屈はいいから。
つか>>444はコンストラクタの話とは関係なかったんだな。
どうりで意味不明だと思った。
452デフォルトの名無しさん:04/11/14 20:57:51
const参照の代入をコンストラクタ内で行えたら便利よくないか?
よくないか。
453デフォルトの名無しさん:04/11/14 20:59:00
>>452
「const参照の代入」ってなんだ?
454デフォルトの名無しさん:04/11/14 21:02:05
int main()
{
unsigned short int a,b,c;// 2 byte
a=40000;
b=30000;

c = (a+b) >> 1;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
}


こいつの出力がちゃんと

a: 40000
b: 30000
c: 35000 // ここがオーバーフローして計算されると予想した

になるのはコンパイラが賢いからでしょうか?文法的に正しいのでしょうか?
それともわたしが勘違いしてるのでしょうか?(環境はVC7.1です)

教えてください。
455デフォルトの名無しさん:04/11/14 21:03:42
希望通りにしたいなら
(unsigned short)(a+b)
456デフォルトの名無しさん:04/11/14 21:07:24
>>454
"integer promotion" または 「整数の格上げ」 とか、そういうの。
457デフォルトの名無しさん:04/11/14 21:17:07
>>453
const参照→const Hoge&なメンバ変数がコンストラクタ内なら代入できる。みたいな
458デフォルトの名無しさん:04/11/14 21:20:52
>>457
初期化で十分だな。そんなの全然便利よくない。
459デフォルトの名無しさん:04/11/14 21:27:42
>屁理屈はいいから。

プ
460デフォルトの名無しさん:04/11/14 21:30:22
>>459 どうでもいいから無駄話でageんな。
461デフォルトの名無しさん:04/11/14 21:45:24
>>458
const変数の初期化をコンストラクタ内でしたいと思うことはかなりある。
参照はなにかとややこしいので出来なくていいと思うが。
JavaもC#も出来るし、次はC++もできるようにして欲しいな。
462デフォルトの名無しさん:04/11/14 21:50:42
VBのソースをC++に変換するにはどうしたらいいの?
463デフォルトの名無しさん:04/11/14 21:53:17
いったん.NETにコンバートしてコンパイル。
実行ファイルを逆アセンブルしてC++.NETのソースに戻す。
dotnet2win32を使って普通のコードに直す。
ただし、完全にうまく行くとは限らない。

はい、次の方どうぞ。
464デフォルトの名無しさん:04/11/14 21:57:33
>>461
初期化したいなら初期化すればいいだろ。
代入できるようにする必要は無い。
465デフォルトの名無しさん:04/11/14 22:02:41
>>463
即レスありがとう。
私が使用してるのはMicrosoft Visual C++ 6.0なんですが
コンバートできますか?
466デフォルトの名無しさん:04/11/14 22:03:18
>>464
>>457は「代入」と書いてるが、書いてる内容はJavaなんかの初期化のことだ。
ある計算結果をconstメンバにしたいときとか。
467454:04/11/14 22:04:22
>>455-456
ありがとうございます。
キーワードをもとに調べてようやくわかりました。

1. 型は常に、必要であれば、精度を失わないように、サイズの大きな型にプロモートされる
2. int型よりもより小さな整数型が含まれた算術式では、評価の前にint型にプロモートされる
(C++ Primerより)

ということはint型より大きな数値で試せばオーバーフローするのかな?と思って試すと無事(?)フローしました。
int main()
{
unsigned short int a,b,c;// 2 byte
a=40000;
b=30000;
c = (a+b) / 2;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;

unsigned long d,e,f,g; // 4 byte
d = 4000000000;
e = 3000000000;
f = (d+e) / 2;
g = (d & e) + ((d ^ e) >> 1);
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
}

ありがとうございました。
468454:04/11/14 22:06:36
--- 467の結果 ---
a: 40000
b: 30000
c: 35000
d: 4000000000
e: 3000000000
f: 1352516352
g: 3500000000
---

_(._.)_
469デフォルトの名無しさん:04/11/14 22:11:56
Foo::Foo(int x) : constmember_(x ? Foo::bar() : Foo::Baz()) {}

何も困らんが、釣り?釣られた?
470デフォルトの名無しさん:04/11/14 22:16:13
>>466
C++で代入と初期化の区別を曖昧にするな。
計算結果をconstメンバにしたけりゃ勝手にしろよ。
471デフォルトの名無しさん:04/11/14 22:16:16
>>469
誰も困ってるなんて話はしてないわけだが。
そうやってメンバ初期化部分がごちゃごちゃするから
コンストラクタ内で書けるといいねってだけの話だ。
472デフォルトの名無しさん:04/11/14 22:17:05
そうですよね
Foo::Foo(int x) : constmember_(x ? (x!=1 ? (x!=2 ? ( x!=3 ? (....) : Foo::bar3() ) : Foo::bar2() ) :Foo::bar1()):Foo::bar()) : Foo::Baz()) {}
473デフォルトの名無しさん:04/11/14 22:17:16
>>470
区別を曖昧にしてるのは俺じゃねーよ。457だ。
474デフォルトの名無しさん:04/11/14 22:17:57
>>471
469のどこがごちゃごちゃ?
コンストラクタ内で書けるとどうなるの?
475462:04/11/14 22:18:21
私はどうしたらいいんでしょう^^:
476デフォルトの名無しさん:04/11/14 22:19:25
>>474
いちいち例を書かんとダメなのか・・・
メンバが複数あったりコメント書きたかったり、適当に想像しろ。
477デフォルトの名無しさん:04/11/14 22:19:50
>>475 出て行けばいいとおもうよ。
478デフォルトの名無しさん:04/11/14 22:20:26
>>475笑えばいいと思うよ。
479462:04/11/14 22:22:13
煽らなくても^^:
480デフォルトの名無しさん:04/11/14 22:26:32
>>460
ああ、ごめんなw
481デフォルトの名無しさん:04/11/14 22:26:40
笑とけ笑とけ。
482デフォルトの名無しさん:04/11/14 22:27:26
>>475
自力でゴリゴリするも良し。1から作り直すのもまた宜し。
483デフォルトの名無しさん:04/11/14 22:29:15
>>475
VBの一関数を書き直すだけとかなら機械的にできなくもないが、
フォームデザインも含めてとなると結局は作り直しになる。
484462:04/11/14 22:32:36
>>483
回答ありがとうございます

>VBの一関数を書き直すだけとかなら機械的にできなくもないが、

そういうソフトとかあるんでしょうか?
フォームやデザインは書き直さなくてもいいので良ければ教えてもらえると
幸いです。
485デフォルトの名無しさん:04/11/14 22:49:54
486デフォルトの名無しさん:04/11/15 02:57:03
bmpファイルのビット数を変換するためのサンプルプログラムなどを置いているサイトなどありませんか?
487デフォルトの名無しさん:04/11/15 05:52:27
>>486
ありますが、純C++の話題じゃないので書けません。
488デフォルトの名無しさん:04/11/15 05:54:29
Rubyなら簡単だよ!!!!!!!!!!!!!!!!!!!!1
489デフォルトの名無しさん:04/11/15 07:17:40
490デフォルトの名無しさん:04/11/15 13:39:12
>>486->>489
スマソ、向こうで聞いてみます。
491デフォルトの名無しさん:04/11/16 22:18:45
仮想継承やってて sizeof したらサイズがでかいんです
g++ だと普通なのに…
492デフォルトの名無しさん:04/11/16 22:27:59
>>491
??わからん??
gcc以外のコンパイラではサイズがでかくなるという意味?
493デフォルトの名無しさん:04/11/16 22:29:33
494デフォルトの名無しさん:04/11/17 17:18:58
っていうか、クラスを使う限り、sizeofを使うケースってある?
もちろん、Cの関数を呼び出すケースは別にして。

コンテナとアルゴリズムを適切に使っていれば、
使うケースは無いような気がするけど、どーよ?
495デフォルトの名無しさん:04/11/17 17:48:26
>>493
基本中の基本
496デフォルトの名無しさん:04/11/17 20:36:19
template<typename T>
とかの T の種類によって処理を変えたりとかできませんかね

switch (T) {
case int:

みたいな
497デフォルトの名無しさん:04/11/17 20:38:48
モダーン嫁
498デフォルトの名無しさん:04/11/17 20:39:58
if (typeid(T) == typid(int) {
     // int の時の処理
} else if (typeid(T) == typid(double) {
     // double の時の処理
} 以下続く

ただし全然オススメ出来ない
特殊化すればいいわけだし
499デフォルトの名無しさん:04/11/17 20:44:17
ありがとうございます。特殊化というのを調べてみます
500デフォルトの名無しさん:04/11/17 20:53:38
RTTI牛刀
501デフォルトの名無しさん:04/11/17 21:46:58
正直、RTTIつかわなきゃならない程追い込まれた事がない
502デフォルトの名無しさん:04/11/17 21:53:12
Extension Object, Role Object パターンとかで使ったりもするけど
503デフォルトの名無しさん:04/11/17 22:14:36
RTTIって言うとdynamic_castも含まれちゃうけど、
typeidに限って言えば俺もほとんど使ったこと無いな。
504デフォルトの名無しさん:04/11/17 22:20:59
dynamic_castも極力使わない
505デフォルトの名無しさん:04/11/18 01:29:55
dynamic_castは使ったら負けだと思う
根性無いからしょっちゅう負けてるけど
506デフォルトの名無しさん:04/11/18 02:45:02
----
struct A
{
  template< typename T > A();
};
struct B : A
{
  B() : A<int>() {}
};
----
↑をコンパイルすると、Bのコンストラクタ内の初期化リストで文法エラーになってしまいます。

テンプレート引数がコンストラクタの引数から推測できないコンストラクタテンプレートは
どうやってテンプレートインスタンスを選択するんでしょうか?
507デフォルトの名無しさん:04/11/18 03:13:23
>>506
よくわからんが、こんな感じではだめなん?

template <typename T>
struct Type2Type {
 typedef T OriginalType;
};

struct A {
 template <typename T> A(Type2Type<T>) {}
};

struct B : A {
 B() : A(Type2Type<int>()) {}
};
508デフォルトの名無しさん:04/11/18 03:48:34
>>507
それは
「テンプレート引数がコンストラクタの引数から推測できるコンストラクタテンプレート」
になってるだろ。
509デフォルトの名無しさん:04/11/18 15:34:59
template <class T>
class C {
    template <class U> friend class C<U>;
};
が VC7.1 でコンパイルしたところ
error C3857: 'C<T1>': 複数テンプレート パラメータ一覧は使用できません。
ってなるんですが、friend には出来ないってことなんですか?
More Effective C++ の auto_ptr に同じコードがあるんですが…
510デフォルトの名無しさん:04/11/18 16:27:00
new関数をコンストラクタを呼び出さずに呼び出す方法ないですかね?
配列テンプレートを作るときに格納するクラスで定義された
メモリ確保方法を使用したいのですか…
511デフォルトの名無しさん:04/11/18 16:45:37
>>510
placement new
512511:04/11/18 16:46:42
あ。ごめん。逆か。
でもやりたいことをするためには、普通 placement new だと思うんだけど……。
513デフォルトの名無しさん:04/11/18 16:48:05
>>510
::operator new()
514デフォルトの名無しさん:04/11/18 17:17:45
>>510
>>513のやり方で領域を確保して、>>511-512のやり方で
インスタンスを生成する。

これにて一件落着。
515デフォルトの名無しさん:04/11/18 19:13:01
>>506
>テンプレート引数がコンストラクタの引数から推測できないコンストラクタテンプレート
って初めて見たんですがありなんでしょうか? >> All
516デフォルトの名無しさん:04/11/18 21:32:34
>>509
これg++でもだめですね
517デフォルトの名無しさん:04/11/19 00:00:39
VC6のサービスパック6を入れようと思ってFULL版をマイクロソフトのサイトからダウンロードしてきたのですが、
setupsp6.exeを起動しても
「16ビット Windows サブシステム
config.nt. システム ファイルは MS-DOS および Microsoft Windows アプリケーションを実行するのに適していません。 アプリケーションを終了するには、[閉じる]を選ん
でください。」
といったダイアログが出てきてインストールできません。ダイアログには「閉じる」と「無視」があるのですが、どちらを
押してもダイアログが閉じるだけです。
どなたか原因が解る方、いませんか?OSは2kです。

Visual Basic 6.0、Visual C++ 6.0、および Visual SourceSafe 6.0d を対象とする Service Pack 6
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=ja
518506:04/11/19 00:18:11
14.5.2 - Member templates [temp.mem]
-2- より引用。
Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name,
there is no way to provide an explicit template argument list for these function templates.

「明示的なテンプレート引数を与えることはできない」ということで、
つまり、暗黙の呼び出しのための手がかりが無い以上、
呼び出す方法が無いってことになるのかな。
519デフォルトの名無しさん:04/11/19 00:34:13
コンパイラから見たらデフォルトコンストラクタが複数あるように見えるだろうし、
どちらにせよそういう使い方はよろしくないな、使用されないダミーのパラメータを持たせるのが良いかと。
520510:04/11/19 03:08:05
>>511-514
ありがd
521510:04/11/19 04:07:23
>>511-514
うーん。でもこの方法だと、new/deleteが宣言されてない型とか
プリミティブ型のnew/deleteを呼び出したときデフォルトの
new/deleteが呼び出せずコンパイラエラーになってしまいますね(VC.NET2003)
ATLのCArrayとかSTLのvectorでもmallocの類つかってるみたいだし
やっぱ無理なのか…
522デフォルトの名無しさん:04/11/19 06:09:37
関数への引数として参照を用いた場合
何byteのデータとして渡されてるんでしょうか?
というより「渡される」という解釈ではないのかな?

あと、構造体を作るときのアライメント(4byte刻みとかのやつ)は
関数に渡すときの引数群にも当てはまるのでしょうか?

例:
void Func( char c1, int i, char c2 );
void Func( int i, char c1, char c2 );

微妙な話題ですみません
関数を作るときとか、どういった順序がいいのかよく迷うので
指標になるようなものはないかなぁと思いまして
523デフォルトの名無しさん:04/11/19 08:43:13
>>522
> 何byteのデータとして渡されてるんでしょうか?

一般的な実装では、ポインタと同じ。

> 関数に渡すときの引数群にも当てはまるのでしょうか?

一般的な実装では、当てはまらない。
順番は呼び出し側コードの読みやすさ、書きやすさで決めれ。
524デフォルトの名無しさん:04/11/19 09:53:02
>>522
構造体でも4バイトアライメントとは限らない。環境(コンパイラオプションを含む)で変わってしまう。
また、関数の引き数は構造体とは違うので(以下>523
525デフォルトの名無しさん:04/11/19 10:10:38
>>522
構造体への参照なら一般的な実装ではポインタ渡しになっており
このときの「隠しポインタ」はポインタとしての境界要求を持っていて
メモリ空間が 32bits の処理系では 4bytes 境界が多い

引数の順序に関しては俺はこうしてる
主要なものほど左、ただし同じ系列の関数と統一性を持たせること

デフォルト引数の仕様に不便を感じることがある
void Func(int hour = 0, int min = 0); //という関数に対して
Func(0); //暗黙の min = 0 はできるが
Func(, 0); //暗黙の hour = 0 ができない
こんなときは素直にオーバーロードするがいまいち釈然としないものが残る
void Func(int hour, int min);
inline void Func(int min) { Func(0, min); }
526デフォルトの名無しさん:04/11/19 10:46:10
>>525
名前付きパラメータですね.もしかしたら次のBoostに入るかも.

Func(0); // min = 0, hour = 0
Func(hour = 1); // min = 0, hour = 1
527デフォルトの名無しさん:04/11/19 11:05:18
>>525
最初の段、ダウト。境界とメモリ空間には強い関連はない。
メンバの型と並びによって、複雑なふるまいをすることが少なくない。
528デフォルトの名無しさん:04/11/19 11:42:13
>>527
ああ、空間が 32bits だから境界があるわけじゃないな
これは失礼した、言い直す

境界は空間ではなくバス幅から出てくること
バス幅が1番地あたりのビット数の2倍なら 2bytes 境界、
4倍なら 4bytes 境界の制限が生じる

とは言うものの
バス幅 64bits なのに非特権状態では奇数番地でいいのがあったり
バス幅 8bits なのに 2bytes 境界のがあったりと
憶えたての人を混乱させるシステムが跋扈しているんで
簡潔な説明がしづらい (言い訳くさくてアレだが・・・
529デフォルトの名無しさん:04/11/19 12:54:01
>>528
素直に、環境依存だから当てにするなって言えばいいじゃん。
実際、sparc compilerなんかだとメンバに一つでもdoubleが入ると8バイト境界になるけど
charしかなければ1バイト境界だし。
530デフォルトの名無しさん:04/11/19 13:09:01
>>529
いや判断材料は持ってないとSF的な妄想で書くわけにもいくまい
522 が訊きたかったのはそのあたりじゃないか

当てにするなというよりマニュアルとアセンブラで確認しろってとこだが
仮にそう言ったとして今現在の 522 にとってどうなのかな
531デフォルトの名無しさん:04/11/19 13:40:15
>>526
Boost?
532デフォルトの名無しさん:04/11/19 13:43:54
int hour;
int min;

void Func(...);

とかじゃねえだろなw
533デフォルトの名無しさん:04/11/19 13:50:58
T* p = new T;
T* p = new T();
の両方見るんですが、差異はあるのでしょうか…?
534デフォルトの名無しさん:04/11/19 13:58:05
>>533
T が POD の場合、前者は中身が初期化されない。
後者はあたかも = {0} したかのように初期化される。
535デフォルトの名無しさん:04/11/19 14:23:50
>>534
ありがとうございます

POD っていうのは
ユーザー定義コンストラクタ、デストラクタ、コピー演算子がない
かつ private, protected に非staticデータメンバがなく、
基底クラスも仮想関数も持たないクラスという理解でいいでしょうか…?
536デフォルトの名無しさん:04/11/19 14:26:43
p->int::~int();
537デフォルトの名無しさん:04/11/19 15:01:44
template <class To, class From>
inline To implicit_cast(From from)
{ return from; }
と static_cast はどのように使い分けたらいいのでしょうか?

あと implicit_cast の引数は const From& from で渡した方が
効率がいいように思うのですが、これでは何か問題があるのでしょうか?
538デフォルトの名無しさん:04/11/19 15:06:04
539デフォルトの名無しさん:04/11/19 15:26:07
>私としては、C++ の委員会が reintepret_cast と static_cast とを相互排他的な
>動作セットに分類してくれていたらと思います。これら 2 つの演算子の動作が
>重複しなければ、プログラマもそれぞれの演算子を使うべき場面を判断しやすかった
>でしょう。
ハゲドウだな。
540デフォルトの名無しさん:04/11/19 15:48:12
俺は別に迷ったこと無いけどな・・・。
541デフォルトの名無しさん:04/11/19 15:50:31
>しかし、たとえ必要のない場合でも、このようにすべての型変換を
>明示的な形にすることにはメリットがあります。

全ての暗黙の型変換を implicit_cast でやるのはマンドクサイ気がするんだが、
これ読む限りやったほうがいいのかな?
542デフォルトの名無しさん:04/11/19 15:53:03
implicitっていう名前がこれまた最悪だ
543デフォルトの名無しさん:04/11/19 16:30:59
>>541
コンパイラの警告をつぶすためには有効じゃないかな。
情報喪失の警告は重要な情報だが常に出るのはうざいので、
implicit_cast でマーキングした上でコンパイラさんには黙ってもらう。
grep すれば後から見つけ出せる。
間違ってもコンパイラオプションで黙らせるようなことはしちゃいけない。
544デフォルトの名無しさん:04/11/19 16:51:27
>>543
long lg = 0;
short st = 0;
st = implicit_cast<short>(lg);

VC7.1 では
warning C4244: 'return' : 'long' から 'short' に変換しました。データが失われているかもしれません
ってなるんだけどどういうこと??
545デフォルトの名無しさん:04/11/19 16:58:55
implicit_castの中で出てるんでしょ?
そこだけ警告切りなよ。そのために関数にしてるんだから。
546デフォルトの名無しさん:04/11/19 17:34:26
暗黙の型変換を全てimplicit_castで書いてる香具師なんているのかね
547デフォルトの名無しさん:04/11/19 19:53:03
>>544
BOOLからboolの変換でうるさいから、
BOOL foo = TRUE;
bool bar = !!foo;
してますがなにか。
548デフォルトの名無しさん:04/11/19 20:03:22
bool bar = foo ? true : false;でいいんじゃないか。
549デフォルトの名無しさん:04/11/19 20:15:08
bool bar = ( foo != 0 );
俺はこれ。
550デフォルトの名無しさん:04/11/19 20:15:47
!Ruby
551デフォルトの名無しさん:04/11/19 20:55:01
スコープ解決演算子でエラーが起こる(VC7.1,GCC3.4.3)のですが、
どうすべきなのでしょうか?
error C2510: 'type' : スコープ解決演算子 '::' の左側の識別子名は、クラス、構造体、共用体のいずれでもありません。

namespace Name
{
struct a
{
typedef int type;
static const int data;
};
}

//const int ::Name::a::data = 100; //OK
//const ::Name::a::type Name::a::data = 100; //OK
//const Name::a::type ::Name::a::data = 100; //NG
//const ::Name::a::type ::Name::a::data = 100;//NG
552デフォルトの名無しさん:04/11/19 20:59:12
新しい演算子を定義できないから嫌い。
553デフォルトの名無しさん:04/11/19 21:18:12
それが関数でありクラスであり・・・
無数の空間を与えられながらそれを否定して
ある特定の文字列に固執する者は遠目に何に見えると思うかね
554551:04/11/19 21:21:19
>>552
どーも
type ::var を type var に変形したら通りました
template <typename T> struct identity
{
typedef T type;
};
const Name::a::type identity<::Name::a>::type::data = 100; //OK
const ::Name::a::type identity<::Name::a>::type::data = 100; //OK
555デフォルトの名無しさん:04/11/19 22:43:08
551にレスしたわけじゃないよ
556デフォルトの名無しさん:04/11/20 03:45:21
>>550
//const Name::a::type ::Name::a::data = 100;
これは
const Name::a::type::Name::a::data = 100;
ということなので、NGで当たり前。
const Name::a::type (::Name::a::data) = 100;
とすればいい。
557デフォルトの名無しさん:04/11/20 09:05:34
おはようございます。
ファイル入出力やディレクトリ操作から始まって
ソケットプログラミングまで扱うような、
C++の用例の載っているおすすめの参考書がありましたら教えて頂けませんか?
趣味でプログラムの勉強をしてまして、
UNIXの基本コマンドを練習用に自分で書いてみたいんです。
558デフォルトの名無しさん:04/11/20 10:07:40
allocaを使いたいのですが、いろいろ調べてみるとallocaは、
プラットフォーム依存になってしまうなど、あまり使うのを推奨されていないようで、
allocaの代わりになるようなものは、ないでしょうか?
以下のコードのように、呼び出し先で明示的に確保されたメモリを
解放しなくても良い方法を知りたいのです。宜しくお願いいたします。

char* ReturnChar(void)
{
char* pRet = new char[5];
strcpy(pRet, "test");
return pRet;
}

int main(void)
{
char* pTest = ReturnChar();

// ここで、delete[] pTest; をしなくても解放されるようにしたい

return 0;
}
559デフォルトの名無しさん:04/11/20 10:09:06
>>558
boost::shared_array
560デフォルトの名無しさん:04/11/20 10:21:50
>>558
オマエの例では、allocaはもともと使用できないぞ。
561デフォルトの名無しさん:04/11/20 11:23:33
>>558
>>559またはstd::auto_ptr
562デフォルトの名無しさん:04/11/20 12:14:14
あの例だと、これが最適じゃないか?

void GetChar(std::string &ret){
ret="test";
}

main(){
std::string test;
Char(ret);
}
563デフォルトの名無しさん:04/11/20 12:45:51
sharted_arrayかstringで受け渡ししる

const std::string GetChar()
{
reutrn "test";
}
int main(void)
{
std::string str = GetChar();
return 0;
}
564デフォルトの名無しさん:04/11/20 13:42:02
>>557です。スレ違いですよね。別のスレで改めて質問しようと思います。
565デフォルトの名無しさん:04/11/20 13:44:43
>>564
あるよ。
UNIXネットワークプログラミング入門
566デフォルトの名無しさん:04/11/20 14:09:21
>>561
new[]で確保したものにauto_ptrはよろしくないかと。
567561:04/11/20 14:12:38
申し訳ない
568デフォルトの名無しさん:04/11/20 14:53:30
どっちかっつーと対応するのはscoped_arrayだと思うが。
allocaの代わりって事は他とshareしないんだろ?
569デフォルトの名無しさん:04/11/20 16:47:51
boost1.32.0キタ━━━━(゚∀゚)━━━━!!
570デフォルトの名無しさん:04/11/20 17:37:39
>>569
boostスレから脱獄しないように
571デフォルトの名無しさん:04/11/20 17:41:34
>>556
納得したいけどなんか腑に落ちないな
572デフォルトの名無しさん:04/11/20 17:43:02
Name::a::type const ::Name::a::data = 100;
573デフォルトの名無しさん:04/11/20 20:31:13
>>572
typedef char* type;
ポインタだと違う型になってしまう悪寒。

574558:04/11/20 23:01:50
御解答ありがとうございます。
>>559>>562>>563>>568
で検討して見ます。
できれば、allocaの代わりになるものでANSI準拠のものが良かったのですけど。
ちなみに、boostってライセンスってどうなんですか?
改変、商用OKであれば、嬉しいです。
575デフォルトの名無しさん:04/11/21 00:02:00
>>574
OKだったはず。バイナリ配布なら特に明記もいらないんじゃなかったっけか
576デフォルトの名無しさん:04/11/21 00:42:46
577デフォルトの名無しさん:04/11/21 01:34:34
>>573
ちがいはありません
578デフォルトの名無しさん:04/11/21 03:20:04
>>577
通報シマスタ
579デフォルトの名無しさん:04/11/21 10:05:27
#define UNICODE
#define _UNICODE
#include <iostream>
int main()
{
 std::wcout.imbue(std::locale("japanese"));
 std::wcout << L'A' << std::endl;
 return 0;
}
実行結果: 65
Aって表示して欲しいのに数字で表示されちゃいます。
vc7.1 STLport-4.6.1です。

580デフォルトの名無しさん:04/11/21 10:19:27
"A"
581デフォルトの名無しさん:04/11/21 10:35:57
std::wcout.put(L'A') << std::endl;
582デフォルトの名無しさん:04/11/21 10:40:37
std::wcout.put(L゚∀゚) << std::endl;
583デフォルトの名無しさん:04/11/21 10:55:27
>>582 さんの様に入力するとコンパイルエラーがでます。
584デフォルトの名無しさん:04/11/21 11:17:45
そりゃそうだ
585デフォルトの名無しさん:04/11/21 11:35:51
なんで殆どの方はVC7.1にもstlport適用するかな(プンプン
586デフォルトの名無しさん:04/11/21 12:25:15
漏れ適用してないよ。
587デフォルトの名無しさん:04/11/21 13:27:22
>>581 >>582
ハゲワラ
588579:04/11/21 13:33:30
coutだとcout<<'A'<<endlでちゃんと表示されるのに...。 仕様ですか?

ほかの人のソースを見るとlocale::global(locale("japanese"))で、できてるのですが
stlportだとstd::wcout.imbue(std::locale("japanese"));ってしなきゃならないのらしいのですが
これはstlportが単独でわるいのですか?585さんが言うようにvc7.1とあわさると悪くなるのですか
589デフォルトの名無しさん:04/11/21 14:41:07
x=new double*[X];
for (int i=0;i<X;i++)
{
    x[i] = new double[Y];
}
で2次元配列を確保しているのですが、これをメモリ上で連続した領域に確保するにはどうしたらよいでしょうか?
590デフォルトの名無しさん:04/11/21 14:44:49
x=new double*[X];
x[0] = new double[X*Y];
for (int i=1; i<X; i++) x[i] = x[0]+i*X;

とか
591デフォルトの名無しさん:04/11/21 18:25:50
>>588
VC++ではデフォルトでwchar_tはshortのtypedefだから
君が文字を突っ込んだつもりでも、向こうは数字が来たと思ってる。
さらにSTLPortはこのデフォルトの設定を使ってコンパイルしてるから
単にVC++の設定を変えるだけだとリンクエラー出る。
STLPortのmakeファイルをいじって再コンパイルが必要。
592デフォルトの名無しさん:04/11/21 18:33:37
STLPort使えねー
593デフォルトの名無しさん:04/11/21 18:46:53
VC7.1でSTLPort使うメリットあるのかね?
594デフォルトの名無しさん:04/11/21 19:33:42
かなり初歩的な質問だと思うのですが,C で普通に行える

void *a = 1;
a += 5;

のような事を C++ 内で行うと gcc に
「error: `void *' 型のポインタが計算で使われました」
と怒られてしまいます.これを回避するにはどうすれば良いのでしょうか.

ポインタだけでも教えて頂けると助かります.

; 現状は char* にキャストして回避してます...
595デフォルトの名無しさん:04/11/21 19:37:40
>>かなり初歩的な質問だと思うのですが,C で普通に行える
嘘をつくな
596デフォルトの名無しさん:04/11/21 19:39:44
void* には減算、加算はなくて ==, != しか無い。
どんなクソプログラム書いてるのか知らんが一から考え直せ。
597594:04/11/21 19:51:56

>> 594
C のコードではエラー出てなかったんで,てっきり使えると思ってました.

>> 596
mmap したものに memcpy でデータを順次書き込んでいくコードなんですが,
書き込み位置をずらすために,

void *p = mmap(...);
mempcy(p, hoge, size);
p += size; // ← ここ

のような事がしたいんですが,普通はどうやるんでしょうか?
598デフォルトの名無しさん:04/11/21 19:58:08
char*でええやん
599デフォルトの名無しさん:04/11/21 20:06:00
いや BYTE* を使うべきだろ。
600デフォルトの名無しさん:04/11/21 20:43:07
>>597
>C のコードではエラー出てなかったんで,てっきり使えると思ってました.

gcc には非標準拡張がてんこ盛り入ってる
他がそんなに綺麗なわけでもないが・・・

あんまり1つの処理系での「常識」を信じすぎるな、という教訓を得たならめでたいことだ
601デフォルトの名無しさん:04/11/21 20:51:34
おめでとう
602594:04/11/21 20:54:40

みなさん,ありがとうございます.勉強になりました.
603デフォルトの名無しさん:04/11/21 21:12:57
じつにめでたいな
604デフォルトの名無しさん:04/11/21 21:20:54
めでたいっつーか、おめでたいな。
605デフォルトの名無しさん:04/11/21 22:08:48
今日は赤飯だ
606デフォルトの名無しさん:04/11/21 22:15:50
10歳違いの妹が初整理をつい最近迎えました
607デフォルトの名無しさん:04/11/21 22:50:50
おめでとう
608デフォルトの名無しさん:04/11/21 22:55:34
VC7.1でSTLportを使うと、必ずマルチスレッドのモジュールをリンクしないと
エラーが出るので(STLportはスレッドセーフレベル2)、気をつけなければいけ
ないとすればその点かな。

速度的には・・・・どうなんでしょう?アルゴリズムは結構速いという定評ですが。
http://www.nantekotta.com/stl.html
↑これはVC6.0付属のDinkumwareとの比較なのであまり参考にならないが。
609デフォルトの名無しさん:04/11/21 22:56:42
スレッドセーフレベルって何?
610デフォルトの名無しさん:04/11/21 22:58:25
>>609
safe level でぐぐってみ。
611デフォルトの名無しさん:04/11/21 22:59:55
612デフォルトの名無しさん:04/11/21 23:00:29
ぐぐってみたけどrubyの方言か?
613デフォルトの名無しさん:04/11/21 23:01:13
>>611
そりゃRubyだろ。スレ違い。
614デフォルトの名無しさん:04/11/21 23:01:52
C++よりRubyの方が先進的。
禿も最近はRubyがお気に入りだってさ。
615デフォルトの名無しさん:04/11/21 23:02:54
STLPortはrubyで出来ていたのか(w
616デフォルトの名無しさん:04/11/21 23:04:03
C++には将来がない。
Rubyには未来がある。
617デフォルトの名無しさん:04/11/21 23:05:26
セーフ・レベルがあるのかどうかは知らんが、STLportは例外セーフおよび
スレッドセーフである事は確か。オプションでコントロールできるが。
_REENTRANTマクロだっけ。
618デフォルトの名無しさん:04/11/21 23:06:44
_MTマクロだろ
619デフォルトの名無しさん:04/11/21 23:38:59
class Vector { // 基底クラス(ベ−スクラスとも言う)
int x,y ; // 座標値のみをもっているクラス
public:
Vector( int a,int b ) { x = a ; y = b ; }
int get_x() { return x ; }
} ;

class Point: public Vector { // 派生クラス(導出クラスとも言う)
int color ;
public: // デフォルトの色は9
Point( int a,int b,int cc=9 ):Vector( a,b ) { color = cc ; }
int get_color() { return color ; }
} ;

Pointコンストラクタの後ろについている「:」がよくわかりません。
PointクラスがVectorクラスを継承しているのは分かるのですが・・・・・・
620デフォルトの名無しさん:04/11/21 23:44:58
よく本嫁
621デフォルトの名無しさん:04/11/21 23:55:06
>>619
初期化リスト。格好としては基底クラスのコンストラクタを呼び出している
ような感じになっている。
622デフォルトの名無しさん:04/11/22 00:07:38
低レベルな質問にも親切に答えて下さってありがとうございます。
623デフォルトの名無しさん:04/11/22 00:16:46
STLPortはロケール関係でメモリリークが検出されるのが気に入らない。
624デフォルトの名無しさん:04/11/22 00:17:53
なら使わなきゃイイじゃん
625デフォルトの名無しさん:04/11/22 00:33:10
使ってないけど、直してくれれば使いたい。
626デフォルトの名無しさん:04/11/22 01:49:05
自分で直せば?
627デフォルトの名無しさん:04/11/22 01:53:17
直してまで使いたいとは思わない。
628デフォルトの名無しさん:04/11/22 01:59:31
文句を言うだけでお客様然とする奴等はRubyを使う資格無し。
629デフォルトの名無しさん:04/11/22 02:21:36
ostream で、80行とかで改行してくれるような物を作ろうとしています。とこ
ろが、ostream を派生させたクラスを作ってput,writeをオーバーライドして、
書き込み文字数をカウントして、改行を付加しながら出力すれば簡単に出来る
かなと思いきや、 putもwriteもvirtualじゃないので、 ostream::operator<<
で入力した物は派生クラスのput,writeを呼んでくれなくあえなく断念。かと
言って、他のPODに対してのoperator<<を軒並オーバーライドするのも馬鹿っ
ぽいし、何か良い知恵があったら教えて頂けませんでしょうか。
書式制御なので、出来ればstreambufをいじるんじゃない方向がいいんですよね。

イメージとしては、
custom_stream stream(5)
stream << "test" << 200 << 0.05 << "test";
で、
test2
000.0
5test
のようになるようなストリームクラスを作りたいのです。
630デフォルトの名無しさん:04/11/22 02:23:37
stringstreamに一度出力して整形しながらもう一度
出力しなおすのが楽なんじゃないか?
631デフォルトの名無しさん:04/11/22 08:14:40
>>623
#ifdef _DEBUG
#define _STLP_DEBUG 1
#define _STLP_USE_NEWALLOC 1
#else
#undef _STLP_DEBUG
#endif

こんな事をしとけばいい
632デフォルトの名無しさん:04/11/22 09:06:54
633デフォルトの名無しさん:04/11/22 15:31:04
age荒らし厨ウゼー
634C++ 初心者:04/11/22 20:12:49
こんなことがしたいんですけど、
コンパイル エラーが出るんです。
どういう風に修正したらいいでしょうか?

class Record { ... };
typedef Record* RecordPtr;
typedef const Record* ConstRecordPtr;

class Hoge {
private:
  vector<RecordPtr> _records;
public:
  const vector<ConstRecordPtr>& GetRecords(void) const
  {
    return _records;
  }

};
635デフォルトの名無しさん:04/11/22 20:18:50
use "template"
636デフォルトの名無しさん:04/11/22 20:20:01
って違うな。何がやりたいのかと、エラー個所かけ
637デフォルトの名無しさん:04/11/22 20:22:49
>>634
vector<ConstRecordPtr> GetRecords(void) const
{
vector<ConstRecordPtr> result;
result.reserve (_records.size ());
copy (_records.begin (), _records.end (), back_insert_iterator <vector<ConstRecordPtr> > (result));
return result;
}
638634:04/11/22 20:22:57
return _records でエラーです。

E:\Project\Test67\Main.cpp(18) : error C2440: 'return' : 'const class std::vector<class Record *,class std::allocator<class Record *> >' から
'const class std::vector<class Record const *,class std::allocator<class Record const *> > &' に変換することはできません。(新しい動作 ; ヘルプを参照)

理由: 'const class std::vector<class Record *,class std::allocator<class Record *> >' から
'const class std::vector<class Record const *,class std::allocator<class Record const *> >' へは変換できません。

コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。
639634:04/11/22 20:24:10
>>637
あのー、戻り値は & なので、ローカルの result を返したらあかんでしょう。。。
640634:04/11/22 20:24:57
あ、戻り値の & をとったわけか。
いや、そんな重いことはしたくないですぅ。。。
641634:04/11/22 20:27:28
何がやりたいのか、といいますと、
RecordPtr のベクタを、ConstRecordPtr のベクタとして返したいわけです。
もちろん、コピーなどの操作は一切行わずに、単純な型変換だけ行ってです。
642デフォルトの名無しさん:04/11/22 20:28:38
>>640
じゃresultに相当するのをmemberにもって慎重に操作したら?
だいたいその手の最適化は最後にプロファイルしてからだ
643デフォルトの名無しさん:04/11/22 20:30:50
>>640
vector<ConstRecordPtr> GetRecords(void) const
{
return vector<ConstRecordPtr> (_records.begin (), _records.end ());
}
こっちがいいかも
644634:04/11/22 20:37:54
>>642
> だいたいその手の最適化は最後にプロファイルしてからだ
いえ、レコードが大量にあることがあらかじめ分かっているので、
コーディング時にその最適化は終わらしておきたいんです。

>>643
やっぱりコピーしなあかんですか。。。
C++ ってこういうものなんでしょうか。。。
645634:04/11/22 20:43:36
やっぱり奥の手を使うしかないのかなぁ。。。
こんなんで。

vector<ConstRecordPtr>& GetRecords(void) const
{
  return * (vector<ConstRecordPtr> *) (void *) (& _records);
}
646デフォルトの名無しさん:04/11/22 20:44:04
うっさいなぁ。これでいけ。

const vector<ConstRecordPtr> &GetRecords() const{
return (const vector<ConstRecordPtr> &)_records;
}
647デフォルトの名無しさん:04/11/22 20:45:15
>>634
こういうキャストで済む問題じゃないよな。
return *reinterpret_cast<vector<ConstRecordPtr>*>(&_records);
648デフォルトの名無しさん:04/11/22 20:45:56
ていうか、ただvectorの内容を参照したいだけなら
const_iteratorを返せばいいんじゃないの?
649634:04/11/22 20:46:20
>>646
あ!そんなんでいけるんですね。
ありがとう!感謝感謝
650デフォルトの名無しさん:04/11/22 20:54:51
>>648
イテレータ返すのって、作法としていいのかな。
vector<..>::const_iterator GetRecordsBegin()
vector<..>::const_iterator GetRecordsEnd()
みたいに2つも用意しないといけないでしょう。
651デフォルトの名無しさん:04/11/22 20:59:19
>>650
std::pair<std::vector<hoge>::const_iterator, std::vector<hoge>::const_iterator>を返せば良い。
652デフォルトの名無しさん:04/11/22 21:02:27
うわー、それを呼び出すときって、大変じゃない?
pair 変数と const_iterator 2 つを用意して、
pair 変数で受け取って、second と first をとって別の変数に代入して。。。
Python のタプルのようなものがあれば楽だけど。
653デフォルトの名無しさん:04/11/22 21:07:11
>>650
おいおい <algorithm> の関数の大半を否定するかよ・・・
654デフォルトの名無しさん:04/11/22 21:08:12
少なくとも記法という観点からは否定したいねぇ。
map とか pair を多用するけど、便利なことは便利だが。
655デフォルトの名無しさん:04/11/22 21:09:07
続きを検索なんてどうやっとん
656デフォルトの名無しさん:04/11/22 21:09:58
イテレータによるコンテナの抽象化って、
正直いってあまり使わないんだよねー。
設計の段階でどのコンテナを使うべきかだいたい決まってしまうし。
657デフォルトの名無しさん:04/11/22 21:10:28
>>655 どういうこと?
658デフォルトの名無しさん:04/11/22 21:15:22
>>657
例えばパーサ作ってるときの区切り文字とか
659デフォルトの名無しさん:04/11/22 21:18:49
それはお前がalgorithmを使いこなしてないだけ
660デフォルトの名無しさん:04/11/22 21:19:42
それはイテレータみたいの使うねぇ。
661デフォルトの名無しさん:04/11/22 21:25:41
650: イテレータ返すのって、作法としていいのかな。
653: おいおい、<algorithm> の関数の大半を否定するかよ・・・
654: 少なくとも記法という観点からは否定したいねぇ。
655: 続きを検索なんてどうやっとん
657: どういうこと?
658: 例えばパーサ作ってるときの区切り文字とか
659: ??? ←ここだけ流れが読めない
660: それはイテレータみたいの使うねえ。

「みたいの」って似て非なるものってこと?
662デフォルトの名無しさん:04/11/22 21:27:36
C++厨って馬鹿ばっかり。
663662:04/11/22 21:28:30
やっぱりRuby最高!
664660 != 659:04/11/22 21:28:47
いや、抽象的な意味でのイテレータなら使う。
それが必ずしも STL の設計を踏襲したものにするとは限らないということ。

ポインタも抽象的な意味でのイテレータだし、
FILE* を fseek() するのも FILE* をイテレータとみなしているということだよね。
665デフォルトの名無しさん:04/11/22 21:34:28
>>664
もしかしてenumeratorと間違ってない?
666デフォルトの名無しさん:04/11/22 21:34:34
いや、FILE*はオブジェクト指向だろ。
667デフォルトの名無しさん:04/11/22 21:35:20
for(int i = 0; i < N; i++){ ; }

これも、「イテレータみたいなもの」と言えるかしら
668660:04/11/22 21:36:10
>>665
どう違うの?教えて君。
669660:04/11/22 21:36:45
>>667
「これ」って何を指しているの?
670デフォルトの名無しさん:04/11/22 21:37:21
Ruby!
671デフォルトの名無しさん:04/11/22 21:39:58
>>664
そう、抽象的な意味でのイテレータだよな。
650の主張によれば始点と終点を別個に返す必要が出るらしいが、
仮に添え字で返したにしてもそれは同じことで、
本質的にシーケンス上の位置を示すものを返すことを
作法という観点からどのように否定するのか疑問に思ったわけさ。
仮に可読性と言うなら確かに STL の設計とは思想を異にする主張だな。
ある意味、template 引数が自動的な typedef になってくれることを使うか捨てるかで。

ところで、FILE* はファイル上の位置を示してないだろ。
これ、どうする?
FILE *fp1, *fp2;
fp1 = fopen("hoge", "r");
fp2 = fopen("hoge", "r");
fseek(fp2, 1, SEEK_CUR);
俺的には fseek の第2引数がイテレータで、第3引数が第2引数の型って気がするが・・・
672デフォルトの名無しさん:04/11/22 21:40:25
>>667
p[i]などとして使っていれば、「イテレータみたいなもの」と言えなくもない。
673デフォルトの名無しさん:04/11/22 21:42:05
イテレータは「繰り返すもの、反復するもの」だから
本義的にはポインタはイテレータではない。
だがC++のイテレータはポインタを含むように設計された
(つまり繰り返し処理のために++演算子を使うことにした)
からポインタはSTL内に限ってイテレータの一種になったに過ぎない。
674デフォルトの名無しさん:04/11/22 21:44:47
>>673
ptr++
675デフォルトの名無しさん:04/11/22 21:53:15
>>671
イテレータ自体が始点と終点を知っていれば何の問題も無いのでは?
JavaやC#ではわざわざendを返したりしない。
676デフォルトの名無しさん:04/11/22 21:57:06
>>675 そう、それいいね。
677デフォルトの名無しさん:04/11/22 21:57:42
>>675
終端標識を使ったから頭だけで済んだってのはナシだろ、
それだったらイテレータだって同じことじゃん。
678デフォルトの名無しさん:04/11/22 22:47:36
FILE * はオブジェクト
シークポインタがイテレータ
679デフォルトの名無しさん:04/11/22 22:49:23
>>675
Javaのイテレータは不自然だから嫌い
680デフォルトの名無しさん:04/11/22 23:01:39
>634
boost::rangeとかどうですか?
http://www.boost.org/libs/range/index.html

>652
boost::tuples::tieとかどうですか?
http://boost.cppll.jp/HEAD/libs/tuple/doc/tuple_users_guide.html#tiers
681デフォルトの名無しさん:04/11/23 06:10:24
for (int i (0); i < 10; ++ i) // <- (A)
for (int i (0); i < 10; ++ i) // <- (B)
cout << i << endl; // <- (C)

これってg++ではコンパイル出来るんですけどいいんでしたっけ?
(B)の行で(A)のiとコンフリクトするとかエラーが出るのが
本来の仕様だったりしないか不安なのですが
682681:04/11/23 06:16:01
あとこっちも
for (int i (0); i < 10; ++ i) // <- (A)
{
int i (0); // <- (B)
cout << i << endl; // <- (C)
}
683デフォルトの名無しさん:04/11/23 06:26:22
クラス全体で使うコンスタントをクラス内で定義するにはどうしたらよいのでしょうか?

class A{
    const int x=10;//<-できない
};
A::A()
{
    const int x=10;//<-ここでしか有効でない
}


684デフォルトの名無しさん:04/11/23 06:36:00
>>683
class A{
static const int x=10;
};

class A{
const int x;
};
A::A(): x (10)
{
}
685デフォルトの名無しさん:04/11/23 06:38:30
>>683
初期化リストを使うとか。A::A() : x(10) { ... };
686デフォルトの名無しさん:04/11/23 06:40:55
>>684
staticをつければいいんですか。ありがとうございました。
687デフォルトの名無しさん:04/11/23 10:59:15
質問お願いするっす、以下のこれは保証されているんでしょうか

std::map<int, int> map_weight;
map_weight[ 777 ] += 100; //いきなり
printf( "val = %d\n", map_weight[ 777 ] ); //val = 100

intの初期化は、いわゆる組込型のint()に必ずなっているんでしょうか
688687:04/11/23 11:00:25
自己解決しました。もういいよ
689デフォルトの名無しさん:04/11/23 11:10:17
>>688は騙りです
単発質問にトリップがいるのか
690トリップ ◆hEpdoZ.tHU :04/11/23 11:28:28
>>689
呼んだ?
691687:04/11/23 11:50:23
>>689
どういう意味でしょうか?
自己解決したので質問に答えなくてもいい、
というのは必要はないってことですか?
692デフォルトの名無しさん:04/11/23 11:56:28
>>691
俺は 689 ではないが・・・
別に放置でも構わなかったが
自己解決したことを律儀に連絡してくれたところまでは礼儀正しい印象だよ
最後の「もういいよ」が投げやりな印象を与えていて
キレやすい人に引火しかねないのが玉に瑕
693デフォルトの名無しさん:04/11/23 12:09:33
>>687
ISO/IEC 14882-1998
23.3.1.2 map element access

T& operator[](const key_type& x);

Returns: (*((insert(make_pair(x, T()))).first)).second
                   ~~~~
保証されている
694デフォルトの名無しさん:04/11/23 12:16:00
>>693
ありがとうございましす。助かりました。
というかそうか…出来る人はISO C++ 規格できっちり調べるのか。
回答内容以上に頭が下がる思いです。今後の指針にします。
695デフォルトの名無しさん:04/11/23 12:17:59
と失礼しました
s/ましす/ます
696デフォルトの名無しさん:04/11/23 12:27:04
クラスの静的メンバに構造体がある場合、うまく初期化できなくって困っているのですが・・・
たとえばヘッダに
class a
{
static D3DXVECTOR3 m_vPosi;
static int PosiX;
{
と定義していた場合、cppファイルの先頭の辺りで
D3DXVECTOR3 a::m_vPosi.x = 5.0f;
などとするとコンパイルエラーとなるのです。
int a::m_iPosiX = 5;
などは通るのですが・・・・。まとめて
D3DXVECTOR3 a::m_vPosi = {5.0f,5.0f,5.0f};
などとするしかないのでしょうか?
697モウモウ:04/11/23 12:30:46
.x だけ初期化したいんなら、
D3DXVECTOR3 a::m_vPosi = { 5.0f };
でいけるはず。
698デフォルトの名無しさん:04/11/23 13:33:50
>>694
当たり前だ。無駄な議論を避けるためにドラフトを読むのは常識。
そうでないとまた知ったか厨が余計な口出しをし出してスレが荒れるからな。
699デフォルトの名無しさん:04/11/23 13:35:46
>>698
ググって探せばないこともないけど、
正式に読もうとすると有料っていうのはちょっとね…
700デフォルトの名無しさん:04/11/23 13:46:32
>>697
ありがとうございます。
では、yだけ初期化したいときは?
701デフォルトの名無しさん:04/11/23 13:46:41
>>699
一個古い規格だけど最低ここは読もうよ。テンプレにもあるけど。
http://www.kuzbass.ru/docs/isocpp/
702681:04/11/23 14:37:28
すみません
681と682は他の環境ではエラーでないでしょうか?
703デフォルトの名無しさん:04/11/23 14:45:40
>>702
内側の i が外側の i を隠蔽するだけで、文法的には何ら間違いはない。
704デフォルトの名無しさん:04/11/23 14:46:51
ちなみにVC7.1では681も682もノーエラーで、内側の i の値が表示される。
705デフォルトの名無しさん:04/11/23 14:47:58
あんまり難しく考えるな。頭禿げるぞ。
706デフォルトの名無しさん:04/11/23 14:55:52
>>705
禿じゃないとC++の設計はできないらしいよ
707デフォルトの名無しさん:04/11/23 14:56:23
よくわかったな。もうハゲてます。
708681:04/11/23 15:07:20
>>705
最近ちょっと上達の兆しがあります
家系的に私はBjarneを超えるはずです

みなさんどうもありがとう
709デフォルトの名無しさん:04/11/23 15:08:37
>>708
> 家系的に私はBjarneを超えるはずです
ここに激しく同情しますな

#おれもな〜
710デフォルトの名無しさん:04/11/23 15:22:47
確かにobsoleteなC++だとfor文で定義した変数はfor文を終了しても
生き続けるから>>681は問題があるかもしれないが、VC6が今手元に
ないので実験できない。

gccなら古いC++にするオプションがあったかもしれないが覚えてない。
711デフォルトの名無しさん:04/11/23 15:24:10
>>710
-fno-for-scope
712デフォルトの名無しさん:04/11/23 15:34:52
>>711
dクス。-fno-for-scopeと-ffor-scopeの両方でgcc3.4.2('MinGW)で試してみたが
出力結果には差がありませんでした。

但しforループを完全に抜けた後で
 std::cout << i << std::endl;
の一行を付け加えると、-fno-for-scopeは古いC++の動作通り 10 が出力され
ました。-ffor-scopeでは当然ですがコンパイルエラーになりました。
713デフォルトの名無しさん:04/11/23 16:29:25
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。
714デフォルトの名無しさん:04/11/23 16:34:48
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。
715デフォルトの名無しさん:04/11/23 16:36:28
VC++7.1付属のSTLってスレッドセーフですか?
スレッドセーフじゃないならSTLPortに置き換えちゃおうと思うんですが。
716デフォルトの名無しさん:04/11/23 16:37:25
>>713
宿題スレへGo!
717デフォルトの名無しさん:04/11/23 16:38:43
VC++7.1持ってんならヘルプにもろ「Thread Safety in the Standard C++ Library」って項目あるだろうが。
718デフォルトの名無しさん:04/11/23 16:53:25
>>698
最近の cppll は悪い例だったな。
719デフォルトの名無しさん:04/11/23 16:53:55
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。

できれば、夜の7時までにお願いします。その後遊びに行きたいので。
720デフォルトの名無しさん:04/11/23 17:32:21
大変だ、後一時間半しかないぞ!
721デフォルトの名無しさん:04/11/23 18:04:12
課題
『標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。
但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、
空行は出力しないで下さい。
また、同じ長さの行は入力した順番に出しなさい。
レポートでは、実行例として、作成したソースプログラムをプログラムに入力した出力と、
http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、
最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに
依存しなければなりません。勝手な上限を設けてはいけません。』

CとC++のどちらでも構いません。よろしくお願いします。

夜の7時までにお願いします。今コンパ中なんで、帰ったらできてるようにな。
722デフォルトの名無しさん:04/11/23 18:56:06
>>721
激しくむかつく奴だな
赤っ恥かいたうえ絶対に単位もらえっこないネタ用意しといてやろうか
723デフォルトの名無しさん:04/11/23 19:00:17
>>722
ネタニマジレスカコワルイ
724デフォルトの名無しさん:04/11/23 19:03:11
ちなみにそれ、コピペ。俺が答えたのに無視したからな。
http://pc5.2ch.net/test/read.cgi/tech/1100530682/303
725デフォルトの名無しさん:04/11/23 19:07:14
>>724
そいつ多分ここにもマルチしてるよ。質問の内容が同じだし。
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+18210
726デフォルトの名無しさん:04/11/23 19:08:20
無視したんじゃなくて、解答してもらえたことすら理解できてないんだろう
727デフォルトの名無しさん:04/11/23 20:29:31
C++Primerのサンプルコードにこういう行がありました。
typedef vector<string, allocator> textwords;

以下のようにしないとエラーになるんですが、
コンパイラとGCCのSTLのどっちが正しいのでしょうか?
typedef vector<string, allocator<string> > textwords;
728デフォルトの名無しさん:04/11/23 20:31:21
>>727
何ページの何行よ?俺も試してみるから。
729デフォルトの名無しさん:04/11/23 20:33:37
>>728
ページ数はちょっと分りませんが、chap12のprg12_2.Cです。
gcc−3.4.3で
$g++ prog12_2.C
としただけなので何かオプションが必要なの、かもしれません。
730デフォルトの名無しさん:04/11/23 20:34:18
いや、それ以前にallocatorのデフォルトテンプレート・パラメータ値は
存在しないので、前者は明らかな間違い。誤植か、作者のミスだろう。
731デフォルトの名無しさん:04/11/23 20:37:01
>>728
日本語版C++Primer第3版なら、P607にあるぞ。

typedef vector<string> textwords;

に直されてる。英語版の原著の間違いだろ。
732デフォルトの名無しさん:04/11/23 20:43:52
>>727

typedef vector<string, allocator> textwords;
を受理するためには
template <class STR, template <class X> class ALC>
class vector
{
ALC<STR> for_exsample;
};
のように定義されている必要があるな。
733デフォルトの名無しさん:04/11/23 20:51:23
>>730-731 どもです。
私の持ってる英語版のはP583にサンプルコードと同じように載っていました。

またGCCのSTL、bits/stl_vector.hでは
template<typename _Tp, typename _Alloc = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
のようになっていました。
bits/allocator.hは見てみましたが>>730さんの言うとおりデフォルト
テンプレートパラメータはないようでした。
734デフォルトの名無しさん:04/11/23 21:00:15
>>732
template <class STR, template <class X> class ALC = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
こういうテンプレートの定義はありなんですかね。
735デフォルトの名無しさん:04/11/23 21:01:51
>>734
> template <class STR, template <class X> class ALC = allocator<_Tp> >
 template <class STR, template <class X> class ALC = allocator >
ありなら、こうじゃないか
736デフォルトの名無しさん:04/11/23 21:02:00
template <class STR, template <class X> class ALC = allocator<STR> >
class vector : protected _Vector_base<STR, ALC>

あ、こうだった。ちょっと調べてきます。
737デフォルトの名無しさん:04/11/23 21:26:37
>736
だ〜が〜ら〜,それ通らねえべって.allocator<STR>は型でねーが.
デンプレートデンプレートパラメーダに代入できるわけないべさ.
738デフォルトの名無しさん:04/11/23 21:36:15
>>737
template <class STR, template <class> class ALC = allocator>
class vector : protected _Vector_base<STR, ALC<STR> >
あ、こうかな!w
739デフォルトの名無しさん:04/11/24 00:05:48
>>493
コンストラクタとデストラクタから仮想関数を呼べないなんて知らなかったよ。。。

明日会社行ったらソースを見直してみます。
740デフォルトの名無しさん:04/11/24 00:15:23
厳密に言うと、呼ばれないのはオーバロードされた派生クラスの
仮想関数ってことかな?

派生クラスのコンストラクタ、デストラクタで呼ばれるのは基底クラスの
仮想関数ってことなんだよね?

ほんまかいな。
741デフォルトの名無しさん:04/11/24 00:30:08
>>740
>厳密に言うと、呼ばれないのはオーバロードされた派生クラスの
>仮想関数ってことかな?

違う、ctor/dtorを実行中は *this へのメッセージについて virtual の効力がない
742デフォルトの名無しさん:04/11/24 00:47:31
まだコンストラクタが呼ばれてない派生先のメンバが呼ばれたらおかしくなるわな。
743デフォルトの名無しさん:04/11/24 00:49:05
>>741
同じことを言っているように読めるが。
744740:04/11/24 00:50:17
>>493のリンク先を読んだけど、>>740とリンク先で書かれているのは
同じつもりなんだけど…
745デフォルトの名無しさん:04/11/24 00:50:28
>>743
オーバーロード != オーバーライド
746デフォルトの名無しさん:04/11/24 00:52:17
>>742
なるほど、たしかにそうだね。

ではJavaでは派生クラスのメンバ関数が呼ばれるのはどういうこと
なんだろうか。
747743:04/11/24 00:52:26
あぁあああああああああ・・・・orz

死ねよ>>740
何ナチュラルに間違えてんだ。
748740:04/11/24 00:53:49
>>745
スマソ たしかにオーバライドですわ。
749デフォルトの名無しさん:04/11/24 00:57:30
>>746
Javaは猿でも出来るのが建前だから、
まったく同じはずのコードが場所によって違う振る舞いをするのは好ましくないから
そういう特別扱いはしないことにした、そうだ。

なんかJavaって仕様策定してるやつらも猿なんだなぁ。
かえって厄介な問題を内包させただけじゃん。
750デフォルトの名無しさん:04/11/24 01:00:08
コンストラクタでは仮想関数によるテンプレートパターンが使えないんだよねー
751デフォルトの名無しさん:04/11/24 01:04:10
コンストラクタとデストラクタを通常の関数と同じように考えてはいかんということでしょ
752デフォルトの名無しさん:04/11/24 04:44:19
質問です。
ワケあって、int,float,double,boolなど、型の異なる要素の入り混じった
リスト(配列でもいいです)を実現したいのですが(・∀・)イイ!!方法はないでしょうか。
初めポリモフィズムを試したのですが、自分がやりたい事と微妙に違っていましたし、
力技でこの構造を実現しようとすると、どんどん構造やUIがブサイクになっていってしまいますた。
753デフォルトの名無しさん:04/11/24 04:49:17
>>752
union
754デフォルトの名無しさん:04/11/24 04:55:52
boost::any
755デフォルトの名無しさん:04/11/24 05:03:37
どちらにせよ取り出すときに型情報の指定が必要になる罠
756デフォルトの名無しさん:04/11/24 07:07:36
>>755
C++を使う以上、どうしようもないよね。
757デフォルトの名無しさん:04/11/24 07:50:31
( ´,_ゝ`)プッ

曖昧さがもたらす混乱と決別する気はないのかよ、お前ら。
758デフォルトの名無しさん:04/11/24 07:55:25
要素数と順番が固定なら、boost::tupleも使えるかもね。
759デフォルトの名無しさん:04/11/24 08:09:42
Ruby最強と言うことでファイナルアンサー?
760デフォルトの名無しさん:04/11/24 09:31:50
類の要員函數を静的にせずに呼び返し函數の引数として
与えるにはどうしたらいいの?
761デフォルトの名無しさん:04/11/24 09:49:59
>>760
氏ね
762デフォルトの名無しさん:04/11/24 10:30:46
->より-+>の方がかっこよくね?
763デフォルトの名無しさん:04/11/24 12:14:57
->より-|>の方がかっこよくね?
764デフォルトの名無しさん:04/11/24 12:16:11
->より→の方がかっこよくね?
765デフォルトの名無しさん:04/11/24 12:28:22
-> より ☞ の方がかっこよくね?
766デフォルトの名無しさん:04/11/24 14:00:29
APL っぽくなってまいりました。
767デフォルトの名無しさん:04/11/24 17:01:42
なぜそれでUIがブサイクになるのか教えてくれ。
768デフォルトの名無しさん:04/11/24 17:03:34
C++の規格書の新しい奴は丁寧なつくりのPDFになっているでしょうか?
目次やリンクが張られたものになっているのでしょうか?
14882(1998)みたいに雑なつくりなら買いたくないので。
769デフォルトの名無しさん:04/11/24 17:33:00
>>768
雑。
770デフォルトの名無しさん:04/11/24 18:28:29
>>752
boost::variant

>>760
呼び返し函数の仕様による。
771デフォルトの名無しさん:04/11/24 18:57:55
int a = 0;
int a(0);

どうちがうんですか?
772デフォルトの名無しさん:04/11/24 19:00:41
違わない。
773デフォルトの名無しさん:04/11/24 19:04:58
>>771
もう一つこういう書き方もOKらしい。
int a = int(0);
774デフォルトの名無しさん:04/11/24 19:15:48
std::random_shuffleを要素が二つのものに対して行うと必ず入れ替わるのですが、
入れ替わることもあれば入れ替わらないこともあって欲しい場合にはどうすればいいのですか?
775デフォルトの名無しさん:04/11/24 19:48:24
>>772-773
わかりました。
776デフォルトの名無しさん:04/11/24 19:51:54
random_shuffleをrand()回繰り返す
777デフォルトの名無しさん:04/11/24 20:03:59
>>776
いや〜ん。素晴らしい!
my_random_shuffle書いてたけどそれにします
778デフォルトの名無しさん:04/11/24 20:22:02
>>774
初めて知った。
全然ランダムになっとらんやん。
779デフォルトの名無しさん:04/11/24 20:25:22
その代わりランバダになってるよ。
780デフォルトの名無しさん:04/11/24 20:27:26
じゃあ俺ガンダムになる。
781デフォルトの名無しさん:04/11/24 20:41:00
>>774
rand()の戻り値の最下位ビット判定でswap()するかどうか決めるんじゃ駄目なのか?
782デフォルトの名無しさん:04/11/24 20:47:02
>>781
rand()が最下位ビットが0と1交互に出てくる乱数の場合もあるだろ…
783デフォルトの名無しさん:04/11/24 21:22:24
VC++のヘルプ曰く、
「範囲 [1, last - first) 内の各 N に対して swap(*(first + N), *(first + M)) を 1 回評価します。M は、範囲 [0, N) 全体に対する一様乱分布の値とします。つまり、関数はシーケンス内の要素の順序をランダムにシャッフルします。」
なんで、要素数2なら確実に毎回交換されるだろうな。


784デフォルトの名無しさん:04/11/24 21:38:30
相談なんですが 別アプリのソフトのコンボボックスのメッセージを
フックしてメモ帳に書き込むことは可能ですか?
 良ければサンプルソースなどお願いします。
785デフォルトの名無しさん:04/11/24 21:40:18
>random_shuffle
ごくふつーにライブラリのバグじゃん
やること決まってるし・・・
786デフォルトの名無しさん:04/11/24 21:55:51
>>782
初めて聞いた。
早速ですが具体例を挙げてください。
OS名・コンパイラ名・srand()の乱数種の数値を添えてください。
できればコンパイルオプションも添えてもらいたいです。

みんな興味を持ってると思うので後学のために是非書いてください。
お願いしますよ >>782さん、期待してますんで。
787デフォルトの名無しさん:04/11/24 22:15:27
昔のrand()で32bit(31bit?)ぐらいの精度の時の乱数は0と1が交互にでてきったとか・・・聞いたことがある
漏れの記憶でのお話です
788787:04/11/24 22:16:15
私は782じゃありません
789デフォルトの名無しさん:04/11/24 22:17:00
それってrand()の下位ビットの周期が短いって話と混同してないか?
790デフォルトの名無しさん:04/11/24 22:22:56
>>786
俺は782じゃないが、自分でググれ。
791デフォルトの名無しさん:04/11/24 22:25:04
>>789
処理系によってはマジでそういうのがあるのよ。
792デフォルトの名無しさん:04/11/24 22:28:23
そこでムェルセンヌツィスタァですよ
793デフォルトの名無しさん:04/11/24 22:32:30
>>792
それ、メモリ喰い過ぎ
794デフォルトの名無しさん:04/11/24 22:34:53
手軽な乱数ルーチンって何があるの?
795デフォルトの名無しさん:04/11/24 22:36:11
>>794
rand()
796デフォルトの名無しさん:04/11/24 22:56:18
>>795
rand()が最下位ビットが0と1交互に出てくる乱数の場合もあるだろ…
797デフォルトの名無しさん:04/11/24 22:59:37
>>796
それってrand()の下位ビットの周期が短いって話と混同してないか?
798デフォルトの名無しさん:04/11/24 23:06:55
ユニコードでの文字処理に関してなのですが、
VC6で_MBCSを削除し_UNICODEとUNICODEを追加してユニコード対応にしました。
LPTSTR a;
_tcscpy(a, _T("ハロー"));
このコードがビルドは通るのですが、実行するとエラーになるのです。エラー個所は_tcscpyが展開された
wchar_t * __cdecl wcscpy(wchar_t * dst, const wchar_t * src)
{
wchar_t * cp = dst;

while( *cp++ = *src++ )
; /* Copy src over dst */

return( dst );
}
のwhile文で起こっています。どこが間違っているのか教えていただけるでしょうか。
799デフォルトの名無しさん:04/11/24 23:08:51
LPTSTRは実質wchar_t*なわけだが。で、ポインタaはどこを指してるんだ?
800デフォルトの名無しさん:04/11/24 23:13:30
>>799
初めて聞いた。
早速ですが具体例を挙げてください。
OS名・コンパイラ名・srand()の乱数種の数値を添えてください。
できればコンパイルオプションも添えてもらいたいです。

みんな興味を持ってると思うので後学のために是非書いてください。
お願いしますよ >>799さん、期待してますんで。
801デフォルトの名無しさん:04/11/24 23:14:17
copipe uzai
802デフォルトの名無しさん:04/11/24 23:15:43
思うんだが、>>786って、なんというか、小学生がよく言う、
「何年何月何日何分何秒に!?」ってやつと同じ匂いがするよな。
803デフォルトの名無しさん:04/11/24 23:15:57
>>801
そーゆー方面の文句ある奴は煽ってねえで削除板池
礼儀を諭しているつもりか知らんが自分が反則してることに気付よ早く
804気付よ:04/11/24 23:16:39
気付よ
805デフォルトの名無しさん:04/11/24 23:17:04
ハァ????
806デフォルトの名無しさん:04/11/24 23:19:23
ああ機能の人格障害君か
・・・放置
807デフォルトの名無しさん:04/11/24 23:19:23
メモリを初期化する関数でmemsetってありますよね。
現場のコーディングルールで、構造体を使う時は、必ずmemsetで初期化しなさいと言われたので、
「なんで?」って聞いたら、「常識だろ?」って怒られちった・・・。

常識のない私に理由を教えてくれる人がいるとすごくうれしいです。
808デフォルトの名無しさん:04/11/24 23:20:44
>>807
非常識はコーディングルールにゴネたこと
809デフォルトの名無しさん:04/11/24 23:21:55
>>807
ああ、それは馬鹿がやることだ。
810デフォルトの名無しさん:04/11/24 23:23:13
C++ならコンストラクタで初期化すりゃいいのに。
811デフォルトの名無しさん:04/11/24 23:24:31
>>809
そういえばstaticも馬鹿だな
812デフォルトの名無しさん:04/11/24 23:29:35
構造体の初期化なら={0};じゃないのか。
813デフォルトの名無しさん:04/11/24 23:32:05
>>807
理由はこうだ。

int *a = new int
*a = 123;

delete a;

int *b = new int

cout << *b << endl;


ってやると、bが123として表示される。
つまり、単にゴミデータが残るのならまぁ許すとして、前にnewしたときに
設定したデータが、後でゴミとして残ってしまう。
このようなリスペクトなバグは排除したほうがよい。

ちなみに、問題なのはヒープ領域であって、スタック領域だと、自動的に初期化してくれるので問題なし!


814デフォルトの名無しさん:04/11/24 23:42:23
new String と new String() の意味は同じであるが、
クラスではなく int などのスカラー型の場合、標準の5.3.4節では
前者の形式では割り当てられたオブジェクトの値は不定になり、
後者の形式ではメモリは0で初期化されるということを明記している

C++プログラミングの処方箋より抜粋


つまり int *b = new int(); とすればmemsetなどは必要なし?
815デフォルトの名無しさん:04/11/24 23:43:06
>>802
小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
816デフォルトの名無しさん:04/11/24 23:48:53
>>802
小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
817デフォルトの名無しさん:04/11/24 23:49:21
>>802
小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
818デフォルトの名無しさん:04/11/24 23:50:00
>>802
小学生呼ばわりでも全然構わない。
お前が実例・具体例を挙げれば全て解決する。
処理系がある、だけではわからん。
rand()で奇数と偶数が交互に返される実装があるんだろ?
ライブラリの名前だけでも書けよ、礼儀として。
819デフォルトの名無しさん:04/11/24 23:50:48
池沼
820デフォルトの名無しさん:04/11/24 23:53:43
また出たよ母親に問題あるやつ
821デフォルトの名無しさん:04/11/24 23:54:01
>>815
お前も人に聞く前に少しくらいググれよ、礼儀として。
822デフォルトの名無しさん:04/11/24 23:54:22
あ、そーなのー・・・ぐらいで軽く流せないのかね
会社で相当いじめられてるのは同情するけどさ
823デフォルトの名無しさん:04/11/24 23:54:45
Ruby最強!
824デフォルトの名無しさん:04/11/24 23:55:49
よっぽど悔しかったんだね
825815:04/11/24 23:57:13
>>816-818
コピペは止めてもらえないだろうか。こちらは真面目に質問している。
具体例を挙げるべき人が荒らしているのかもしれないが、
そんな暇があったら名前を挙げてくれればよいのに。実に簡単なことだろ?
826デフォルトの名無しさん:04/11/24 23:58:36
恥ずかしい香具師とはいっしょにいたくないよね。
仲間と思われたくないし。
827デフォルトの名無しさん:04/11/25 00:05:37
>>797
俺だったら、これが真実だとしても全然問題ないと思うんだが
828デフォルトの名無しさん:04/11/25 00:06:02
検索すらろくに出来ないような低脳じゃ同僚に冷たくあしらわれても仕方ないわな
しかしその憂さ晴らしをここでするのは勘弁してもらいたいな
829デフォルトの名無しさん:04/11/25 00:07:18
同僚がでてきたぞw
830デフォルトの名無しさん:04/11/25 00:12:36
>>825
本当に真面目に訊いてんだったらちょっとでいいからググってみれ。
それで本当に見つけれないんだったらお前、プログラマとしてちょっとヤバイぞ。
831デフォルトの名無しさん:04/11/25 00:14:28
ここは質問するためのスレじゃないの?
検索しろで済ますのならスレ自体いらんでしょ。
832デフォルトの名無しさん:04/11/25 00:14:53
デフォルトコンストラクタって0で初期化してくれなかったっけ?
833デフォルトの名無しさん:04/11/25 00:19:33
MacOS X & ProjectBuilder & SDLでLifeゲームを作ってたんだけどどうもおかしい。
Win2000 & BCC32の時にうまく動いてたコードをそのままコンパイルしたんだけど縞々模様が出たまま動かない。
初期化するときに(rand() % 2)を使ってるんだけど良く見てみるとrand()が奇数と偶数を交互に返してる(ぉぃぉぃ。
srand()以外になんか準備がいるんすかぁ?
834デフォルトの名無しさん:04/11/25 00:20:45
UNIX の /usr/ucb/cc、gcc、g++を解析した結果、 rand( ) は以下の動作をすることがわかった。

static long x=1;
void srand(unsigned s) { x=s; }
long rand() { x=x*1103515245+12345; return x&2147483647; }

これは、非常にシンプルな線形合同法である。この乱数の最下位ビットは0と1の繰り返しになる。
すなわち、偶数と奇数が交互に生成される。このことから、この乱数で下位ビットを乱数として使うのは危険であることがわかる。
また、ある乱数が得られたら、次に現れる乱数が1種類しかないという欠点も持つ。
835デフォルトの名無しさん:04/11/25 00:22:07
>>831
まったくだ
何かディープに勘違いしてる「回答者」には困ったものだな
836デフォルトの名無しさん:04/11/25 00:22:42
あーあツマンネ
837デフォルトの名無しさん:04/11/25 00:23:15
おこんばんは、お願いいたします。
ステップ実行時、「ほにゃららDllが見つかりません」と言われます。

とあるexeから、自分の作っているdllを呼ぶ処理です。
プロジェクトの「設定」で、とあるexeを指定して、
そのexeでファイル選択をすると、
自分のdllのソースのブレークポイントで止まってくれる予定なのですが。。。


プロジェクトの「設定」のどこかに、
関連するdllを列挙する必要って、ありましたっけ?
何が設定不足なのでしょうか?
よろしくお願いいたします。
838デフォルトの名無しさん:04/11/25 00:24:27
そうだ、このスレはそもそも必要なかったのだ。

我々はぁぁ!
この(類の)スレのぉぉ!
永久停止を要求するぅぅ!
839デフォルトの名無しさん:04/11/25 00:28:20
Rubyで全部解決すると言っておろうが!
840815:04/11/25 00:28:40
>>833-834
降参します。orz
841デフォルトの名無しさん:04/11/25 00:34:09
>>837
スレ違い。自分が使用している開発環境の専用スレに逝け。
842デフォルトの名無しさん:04/11/25 00:35:23
>>831,>>835
検索しても簡単にわからんことなら仕方がないが、
検索すればすぐに分かるようなことを検索するように勧めても
尚、検索しようともしない馬鹿の言い訳にはならない。
843デフォルトの名無しさん:04/11/25 00:37:31
まさか本当に検索できなかったわけじゃないよな?
844デフォルトの名無しさん:04/11/25 00:40:26
水に落ちた犬は(ry かよ。お前らも容赦ないなwwwwwwwwwwwww
845デフォルトの名無しさん:04/11/25 00:41:17
福祉施設職員を少しは見習ってもらいたいものだ。
846デフォルトの名無しさん:04/11/25 00:44:02
>>842
キーワードでも示してやったら? 「回答者」さん
847デフォルトの名無しさん:04/11/25 00:45:29
"rand 偶数 奇数 交互"
848デフォルトの名無しさん:04/11/25 00:46:05
まさかキーワードが思い浮かばなかったわけじゃないよな?
849デフォルトの名無しさん:04/11/25 00:46:35
すんません。三行三列と三行二列の行列の積を求める書き方教えてください。
めんどくさかったら軽いヒントでもいいんで
ちなみに初期数値は与えられてます。forを使うみたいですがいまいち・・・
850デフォルトの名無しさん:04/11/25 00:46:58
まさか検索エンジンが思い浮かばなかったわけじゃないよな?
851デフォルトの名無しさん:04/11/25 00:47:11
テンプレにgoogleのURLが必要なのだろうかw
852デフォルトの名無しさん:04/11/25 00:48:27
>>849
数学板逝け
853デフォルトの名無しさん:04/11/25 00:49:32
>>849
教科書嫁
854デフォルトの名無しさん:04/11/25 00:49:52
>>848
まさか答えがわからなかったわけじゃないよな? 「回答者」さん
855デフォルトの名無しさん:04/11/25 00:52:38
|abc||pq|
|def||rs|=ap+br+ct+dp+...+fs+iu
|ghi||tu|
856デフォルトの名無しさん:04/11/25 00:52:49
>>844
水に落ちた犬は・・・の続きは何?
「水に落ちた犬を打つ」があるけど、それとは違うっぽいのでググッたほうがいいのかな。
857デフォルトの名無しさん:04/11/25 00:53:43
Linux&g++でシステムコールを使う時について質問します。
gccで.h等をインクルード無しで使えていたread(,,)等のシステムコールがImplisitエラーを出します。
g++になってシステムコールの使用法に変化があるのでしょうか?
858デフォルトの名無しさん:04/11/25 00:54:39
このスレはC++相談室なわけだが・・・
859デフォルトの名無しさん:04/11/25 00:55:12
Implisitってなんですか
860デフォルトの名無しさん:04/11/25 00:55:24
>>848
実際、そういう人もいるよ。
多分、>>846もそういう人なんだろ。
861デフォルトの名無しさん:04/11/25 00:55:55
C++の仕様が原因かどうかを論じるならスレタイ合致だな
862デフォルトの名無しさん:04/11/25 00:57:55
>>857
man readして必要なヘッダをインクルードしろ。C++では宣言無しでは関数は使えない。
863デフォルトの名無しさん:04/11/25 01:00:53
>>862
だったらコンパイルエラーのはずだ
857 を読む限り実行時の障害のように聞こえる
864デフォルトの名無しさん:04/11/25 01:03:13
おいおいおいおいいおいおいおいおい
865デフォルトの名無しさん:04/11/25 01:05:32
>>864
コンパイルエラーのメッセージテキストには implicit なる語は出てこないだろ
866デフォルトの名無しさん:04/11/25 01:07:05
>>865
出るよ
867デフォルトの名無しさん:04/11/25 01:14:04
implicit declaration of function です。
コンパイルエラーです。
文字と>>862さんから推察するとgccでは暗黙の宣言として使っていたのが
g++では使えなくなったということですね。
方法を探してみます。ありがとう御座いました。
868デフォルトの名無しさん:04/11/25 01:14:38
$ g++ test01.cpp
test01.cpp: In function `int main()':
test01.cpp:3: error: `read' undeclared (first use this function)
test01.cpp:3: error: (Each undeclared identifier is reported only once for each
function it appears in.)
869デフォルトの名無しさん:04/11/25 01:17:17
>>867
g++というよりc++でだよ
870デフォルトの名無しさん:04/11/25 01:53:46
>>869これはすいませんでした。仕様を間違えてはいけませんね。
#include <unistd.h> が必要でした。
皆さんありがとう御座いました。
871デフォルトの名無しさん:04/11/25 06:12:47
std::string が空文字列で初期化されることって保証されてるんですか?
872デフォルトの名無しさん:04/11/25 06:30:46
std::listってクイックソート出来ないんですか?
std::sortは使えないし
873デフォルトの名無しさん:04/11/25 06:36:20
>>872
std::list::sort()ってメンバ関数はマージソート(安定ソート)だがなかなか速い。
O記法によるオーダもO(NlogN)でクイック・ソートと同じだし。但し平均的な
コンピュータのアーキテクチャではクイック・ソートの1/2程度の速度になる。
874782:04/11/25 07:50:32
uwaaaaヽ(`Д´)ノaaaan
875デフォルトの名無しさん:04/11/25 10:27:04
こういうのって、foo が先に初期化されるのか、
Base が先に初期化されるのか、どちらでしょうか?

class Hoge : Base {
  Foo foo;
public:
  Hoge(void) : foo(100), Base(&foo) {}
};
876デフォルトの名無しさん:04/11/25 10:31:33
>>875
FooとBaseのコンストラクタにプローブ入れて試せば?
877デフォルトの名無しさん:04/11/25 10:31:56
>>875
コンストラクタ
ベース→メンバ(宣言した順)→自身
デストラクタ
自身→メンバ(宣言と逆順)→基底
878デフォルトの名無しさん:04/11/25 10:35:42
じゃぁ、Base で Foo の関数を呼び出すことはできないのですね。
それは不便ですねぇ。。。
879デフォルトの名無しさん:04/11/25 10:40:47
Baseの初期化にFooが必要なら、BaseにFooを持たせてしまえば?
880デフォルトの名無しさん:04/11/25 10:44:02
いえ、Foo は FooBase を継承するクラスで、
Base のコンストラクタは FooBase* なら何でもとるのです。
Base のコンストラクタで FooBase の関数を呼び出したいのです。
881デフォルトの名無しさん:04/11/25 11:09:50
>>880
設計見直せ
882デフォルトの名無しさん:04/11/25 11:18:07
>>881
ありがとう。見直してみます。
だけど、C++ ってここらへんがぎこちないですね。
初期化リストの記述順に初期化してくれればいいのに。。。
883デフォルトの名無しさん:04/11/25 11:21:53
>>882
よく考えろボケ
884デフォルトの名無しさん:04/11/25 11:36:55
君の頭の方がぎこちないです。
885デフォルトの名無しさん:04/11/25 12:01:32
C++のぎこちなさが嫌だったらさっさと他の言語に乗り換えて下さいです。。
886デフォルトの名無しさん:04/11/25 12:06:14
ひろゆきキター
887デフォルトの名無しさん:04/11/25 12:30:59
??
888デフォルトの名無しさん:04/11/25 14:23:54
キャッシュを行うクラスを作ろうと思います。

// int から int への関数のキャッシュを行うクラス。
class Cache {
public:
    typedef int (*Func)(int n);
private:
    map<int,int>    _map;
    Func            _func;
public:
    Cache(Func func) : _func(func) {}

    int Get(int n)
    {
        int result;
        map<int,int>::const_iterator it = _map.find(n);
        if (it == _map.end()) {
            result = _func(n);
            _map.insert(map<int,int>::value_type(n, result));
        }
        else {
            result = (*it).second;
        }
        return result;
    }
};
889デフォルトの名無しさん:04/11/25 14:24:45
class SomeFunc {
private:
    Cache _cache;
    static int Plus1(int n) { return n + 1; }
public:
    SomeFunc(void) : _cache(Plus1)
    {}

    int Get(int n) 
    {
        return _cache.Get(n);
    }
};
890デフォルトの名無しさん:04/11/25 14:26:07
この Func を C 関数や静的関数ではなく、
メンバ関数とするにはどうしたらよいでしょうか?
よろしくお願いします。
891デフォルトの名無しさん:04/11/25 14:53:35
boostのfunction&bindかな
892デフォルトの名無しさん:04/11/25 14:55:06
>>890
template <typename T>
class Cache {
public:
typedef int (T::*Func)(int);
private:
map<int,int> _map;
T *obj_;
Func _func;
public:
Cache(T *obj, Func func) : obj_ (obj), _func(func) {}
int Get(int n) {
int result;
map<int,int>::const_iterator it = _map.find(n);
if (it == _map.end()) {
result = (obj_->*_func)(n);
_map.insert(map<int,int>::value_type(n, result));
} else {
result = (*it).second;
}
return result;
}
};
class SomeFunc {
private:
Cache <SomeFunc> _cache;
int Plus1(int n) { return n + 1; }
public:
SomeFunc(void) : _cache(this, &SomeFunc::Plus1) {}
int Get(int n) {return _cache.Get(n);}
};
893デフォルトの名無しさん:04/11/25 14:56:04
>>890
Cacheをテンプレートクラスにすれば
894デフォルトの名無しさん:04/11/25 15:16:17
ご回答ありがとございます。m(__)m
>>891
ごめんなさい、boost はできるだけ使いたくないんです。。。
同じようなことを手動でやれればいいのですが。
>>892 >>893
やっぱりテンプレート使わないといかんですか。うーん。
895デフォルトの名無しさん:04/11/25 15:17:55
1クラス1キャッシュでいいなら
継承使ってできそうな気がしなくもない
896デフォルトの名無しさん:04/11/25 15:20:59
それは、SomeFunc を Cache から派生させるということですよね。
SomeFunc はすでに別のクラスから派生しているんです (多重継承はあまりしたくない)。
それに Cache という機能単位を継承で使うのはよい設計ではないように
思いますが、いかがでしょうか。
897デフォルトの名無しさん:04/11/25 15:24:31
>>896
>それに Cache という機能単位を継承で使うのはよい設計ではないように
>思いますが、いかがでしょうか。
まそうだろうね
boostとかテンプレートとか躊躇してるのは何で?

898デフォルトの名無しさん:04/11/25 15:31:52
> boostとかテンプレートとか躊躇してるのは何で?
テンプレートにいい思い出がないのが一番の理由です。
今 VC6 を使っているんですけど、
テンプレートの一部の機能が使えなかったり、
複雑になるとバグが発生したりして、
使いすぎると生産性が確実に低下するように思います。

あと、できるだけ外部のライブラリに依存したくないという意味で
boost は使いたくないわけです。
899デフォルトの名無しさん:04/11/25 15:44:21
VC6はご愁傷様です

>できるだけ外部のライブラリに依存したくない
この方針があなたの決断によるものなら考え直した方がいいと思いますよ
これじゃライブラリの立つ瀬が無いですからね
900デフォルトの名無しさん:04/11/25 16:03:44
アンチパターンに当てはまりまくりだな
901デフォルトの名無しさん:04/11/25 16:12:55
貧乏人がWindowsのプログラム書くなよ
902デフォルトの名無しさん:04/11/25 16:22:17
なんかlinuxerは貧乏人みたいにとれるな
903デフォルトの名無しさん:04/11/25 16:28:42
関数内のstatic変数は、最初にその関数が呼ばれたときに初期化されるそうですが
例えば

class Hoge {...];

void foo() {
static Hoge hage;
}

というのがあって、複数のスレッドがfooを同時に呼び出した場合
hageの初期化は同期されるのでしょうか?
904デフォルトの名無しさん:04/11/25 16:29:17
金を使わない奴は金がないやつ同様貧乏人。
905デフォルトの名無しさん:04/11/25 16:35:04
>>903
C++の規格ではマルチスレッドのことは考えてないので、環境によります。
906デフォルトの名無しさん:04/11/25 16:35:46
同期が保証されないから、
MeyersのSingletonはマルチスレッドでは使えない
907デフォルトの名無しさん:04/11/25 16:36:40
>>904
感心した
908デフォルトの名無しさん:04/11/25 16:48:18
金を使えば技術を得られるわけでもない
909デフォルトの名無しさん:04/11/25 16:50:09
>>908
感心した
910デフォルトの名無しさん:04/11/25 16:55:20
金を使わないヘタレに存在意義なし
911デフォルトの名無しさん:04/11/25 16:57:26
>>910
感心した










とでも言ってもらいたいのか?
912デフォルトの名無しさん:04/11/25 18:02:35
借金まみれの俺は金持ち
913デフォルトの名無しさん:04/11/25 18:51:56
vector<int> の中に整数が重複して入っていて、
その中の最頻値を取り出したいとします。
このような処理を STL を使って完結に表現することはできるでしょうか?
914デフォルトの名無しさん:04/11/25 18:53:10
はい。
915デフォルトの名無しさん:04/11/25 18:58:56
どのようにすればできるか教えていただけるでしょうか。
916デフォルトの名無しさん:04/11/25 19:46:03
>>915
誰か教えてくれるでしょう。
917デフォルトの名無しさん:04/11/25 20:09:59
クォータニオンまで扱える算術ライブラリってDirectX以外でありますか?
漫然と>>8を眺めてみたのですが、いまいち見つかりませんで

DirectXの物は中々使い心地が良いのですが、DirectXが使えない環境になりそうで困っています
918デフォルトの名無しさん:04/11/25 20:57:57
boost::quaternion
919デフォルトの名無しさん:04/11/25 21:02:01
クォータニオンなんて自作したって
1、2時間でできるんでは?
920デフォルトの名無しさん:04/11/25 21:04:35
>>918
BLAS…というかnumericの所しか見てなかったですよ
boost凄いなぁ…ありがとうございました、勇んでいじってみます
921デフォルトの名無しさん:04/11/25 21:07:19
>>919
まぁ、実際そうで、私も自前(と言ってもほぼとあるオープンソースのパクリ)のはあるのですが
自前だとまずい部分が色々とあったりで…boost情報助かりました
922デフォルトの名無しさん:04/11/25 21:08:30
>>915
あいよっ
template <typename T, template <typename> class Container> inline
pair <T, size_t> mode_count (const Container <T> &p) {
typedef std::map <T, size_t> Counter_Register;
Counter_Register counter_register;
for (typename Container <T>::const_iterator itr (p.begin ()), last (p.end ());
itr != last; ++ itr) ++ counter_register [*itr];
struct Local {
typedef typename Counter_Register::value_type Value_Type;
static bool less_by_second (const Value_Type &lhs, const Value_Type &rhs) {return lhs.second < rhs.second;}
};
return *max_element (counter_register.begin (), counter_register.end (), &Local::less_by_second);
}
template <typename T, template <typename> class Container> inline
T mode (const Container <T> &p) {
return mode_count (p).first;
}
もっとエレガントなのは誰か教えてくれるでしょう。
923913:04/11/25 21:14:14
>>922
すいません。ありがとうございます。
自分でも作ってみたのですが、あまりきれいになりませんでした。
よく読んでみます。とりいそぎ、お礼まで。
924デフォルトの名無しさん:04/11/25 21:25:16
>>922
>template <typename T, template <typename> class Container> inline
template templateパラメータはテンプレートパラメータの数がデフォルトも全部展開した
数に一致して無いといけないので,STLのシーケンスを取るならパラメータ2つ要りますよ.
あとTはContainer::value_typeで取れるから結局コンテナの型をパラメータにするのが
妥当だと思うんですけどね.

template<typename Container>

細かいツッコミ失礼.ちなみに自分ならiteratorを引数にしたいかも.
925デフォルトの名無しさん:04/11/25 21:27:46
>>922
Local::less_by_secondはローカルだけどテンプレート引数に出来るの?
926デフォルトの名無しさん:04/11/25 21:38:41
>>924
やっぱ修正するのはオイラかい?
template <typename Iterator> inline
pair <typename Iterator::value_type, size_t> mode_count (Iterator first, Iterator last) {
typedef typename Iterator::value_type Value_Type;
typedef std::map <Value_Type, size_t> Counter_Register;
Counter_Register counter_register;
for (; first != last; ++ first) ++ counter_register [*first];
struct Local {
typedef typename Counter_Register::value_type Value_Type;
static bool less_by_second (const Value_Type &lhs, const Value_Type &rhs) {return lhs.second < rhs.second;}
};
return *max_element (counter_register.begin (), counter_register.end (), &Local::less_by_second);
}
template <typename Iterator> inline
typename Iterator::value_type mode (Iterator first, Iterator last) {
return mode_count (first, last).first;
}
template <typename Container> inline
pair <typename Container::value_type, size_t> mode_count (const Container &p) {
return mode_count (p.begin (), p.end ());
}
template <typename Container> inline
typename Container::value_type mode (const Container &p) {
return mode (p.begin (), p.end ());
}
もっといいアルゴリズムはないの?
927922 == 926:04/11/25 21:41:04
>>925
g++(3.3.4)だと通るんだけどまづいっけ?

>>924
それと言い忘れたありがとう
925も
928デフォルトの名無しさん:04/11/25 22:12:56
>>925
ローカルクラスがテンプレート引数に出来ない問題との違いは,
型が外部リンケージを持っているかどうか.
Local::less_by_secondの型はbool (*)(Value_Type const &, Vlue_Type const &)で,
これは外部リンケージを持った型なのでテンプレート引数に出来るはず.
929デフォルトの名無しさん:04/11/25 22:48:40
std::stringの変数にabcが入っていたとします。
で、この変数にabc又はABCが入っていることをエレガントに確認するにはどうしたらよいでしょうか?
(つまり、小文字、大文字意識せずに、findしたいってことです)

930デフォルトの名無しさん:04/11/25 22:49:48
>>929
私はいつも stricmp(str.c_str(), "abc") しているけど、C++ 的にはどうやるんかな。
931デフォルトの名無しさん:04/11/25 23:17:51
>>930
>>929をよく読むこと。
932デフォルトの名無しさん:04/11/25 23:19:21
>>929
面倒なのでboost::regex
933デフォルトの名無しさん:04/11/25 23:31:20
STL の string って貧弱だよな。
もっとメンバ関数充実させてほしい。
934デフォルトの名無しさん:04/11/25 23:32:01
そこでRubyですよ
935デフォルトの名無しさん:04/11/25 23:35:05
>>933
うん、激しく同意。
俺が思うに、これは何かの陰謀が働いていると思う。
936デフォルトの名無しさん:04/11/25 23:36:43
そこでRubyですよ
937デフォルトの名無しさん:04/11/25 23:44:41
そこでboost string algorithm
938モウモウ:04/11/26 00:05:26
>>929
一応こんなんでできるけど。

struct CharEqualIC {
    inline bool operator() (char c1, char c2) 
    {
        return (toupper(c1) == toupper(c2));
    }
};

int main(void)
{
    string str1 = "xxxx Abc xxxx";
    string str2 = "abc";

    string::iterator it = search(str1.begin(), str1.end(), str2.begin(), str2.end(), CharEqualIC());
    cout << (it - str1.begin());

    return 0;
}
939デフォルトの名無しさん:04/11/26 00:25:02
>>938
汚物
940デフォルトの名無しさん:04/11/26 00:44:02
>>929
std::string str = "fgafjkAbCasln;tj";
std::cout << boost::algorithm::ifind_first(str, "abc").begin() - str.begin() << std::endl;
// 6が出力される。

std::string str = "fgafjkasln;tj";
std::cout << boost::algorithm::ifind_first(str, "abc").begin() - str.begin() << std::endl;
// 13が出力される。すなわちboost::algorithm::ifind_first(str, "abc").begin()==str.end()
941デフォルトの名無しさん:04/11/26 01:23:54
>929
std::mismatch 使って頑張れ

Effective STL の35項も参考になる。
942デフォルトの名無しさん:04/11/26 01:40:46
>>922,926
Iterator::value_type ではポインタを渡したときにエラーになる
※入力シーケンスは空でないという事前条件が必要

template<typename Iterator>
std::pair<typename std::iterator_traits<Iterator>::value_type, std::size_t> mode_count(Iterator first, Iterator last)
{
  typedef typename std::iterator_traits<Iterator>::value_type value_type;
  typedef std::pair<value_type, std::size_t> result_type;
  std::map<value_type, std::size_t> counts;
  result_type const* max = 0;
  for(; first != last; ++first)
  {
    result_type& counted = counts[*first];
    ++counted.second;
    if(!max || counted.second > max->second)
      max = &counted;
  }
  return *max;
}
943デフォルトの名無しさん:04/11/26 02:59:48
値を返す関数の戻り値をconst参照で受け取ったらまずいですか?

extern XXX get_value();

const XXX& xxx = get_value();

テンポラリへの参照になってしまうんでしょうか?
最適化をするとおかしくなってしまうようなんです
944デフォルトの名無しさん:04/11/26 04:26:01
>>943
クラスのインスタンスのデータメンバや静的データメンバ、
関数の静的変数、大域変数、静的変数を返したいときは、
const参照を返してもだいじょうぶ。

const参照を返したら駄目なのは関数内のローカル変数。
945デフォルトの名無しさん:04/11/26 05:09:39
>>943
あー、その場合の寿命ってどうなるんだろうな。
規格書読まなきゃわかんないな。

でもこのケースだったら無難に
const XXX xxx = get_value();
でいいんじゃないの。
946デフォルトの名無しさん:04/11/26 05:16:00
バカばっかり
テンポラリに決まってんだろ
禿本くらい読め
947デフォルトの名無しさん:04/11/26 08:32:23
>943
その関数の戻り値であるところのテンポラリは,規格としては
const参照のlife-timeまで寿命が延びる(12.2/5)ので大丈夫なはずです.
http://www.kuzbass.ru:8086/docs/isocpp/special.html#class.temporary
なので,
>最適化をするとおかしくなってしまうようなんです
というのはプログラムがおかしいかコンパイラが規格に準拠していないか・・・.
で,結論としては945さんに同意.

>944
多分文脈を読み間違えているかと.
948デフォルトの名無しさん:04/11/26 09:07:18
template <class Container, class T>
inline Container makeContainer(const T& t)
{ return Container(boost::begin(t), boost::end(t)); }

typedef std::vector<char> CharVec;

const char* p = "Hello, world";
CharVec c(makeContainer<CharVec>(p));

これがコンパイル通らないんですが仕様でしょうか…?
makeContainer(T& t) にすると大丈夫なんですが…
949デフォルトの名無しさん:04/11/26 09:28:43
boost知らんけど、ポインタなんだか参照なんだかしっちゃかめっちゃかだな。
950デフォルトの名無しさん:04/11/26 09:46:26
>948
boost::begin/endがchar const * constに対応してないのが原因.
というか,そういうことがしたいなら以下で良いのでは?

CharVec c(boost::begin(p), boost::end(p));
951デフォルトの名無しさん:04/11/26 10:04:44
>948
追記.char (const) * constはRangeのモデルにならないです.
動かせないポインタ渡されて'\0'探せって言われても困るでしょ.
もし,その枠組みでやるなら以下か

CharVec c(makeContainer<CharVec>(boost::make_iterator_range(p)));

もしくはmakeContainerをchar (const) *について特殊化するか,かな.
952951:04/11/26 10:09:52
-もしくはmakeContainerをchar (const) *について特殊化するか,かな.
+もしくはmakeContainerをchar const *についてオーバーロードするか,かな.
953デフォルトの名無しさん:04/11/26 10:27:00
> 追記.char (const) * constはRangeのモデルにならないです.
> 動かせないポインタ渡されて'\0'探せって言われても困るでしょ.

ポインタをコピーすれば困らないよ。
range側の特殊化が抜けてるだけじゃないの?
954デフォルトの名無しさん:04/11/26 11:29:43
#include <vector>

struct ClassV{
int val;
std::vector<int> vecInt;
};

int main(int argc, char* argv[]){
std::vector<ClassV> vecClassV;

vecClassV.reserve( 5 ); //resizeならBもerrorにならない
for( int i=0; i < 5; ++i ){
vecClassV[i].val = 4649; //errorが出ない …A
}
for( int c=0; c < 5; ++c ){
vecClassV[c].vecInt.reserve(10); //error …B
}
return 0;
}

お願いします、上記のコードなのですが、
恐ろしいことに今までreserveを使いAみたいな事をしていました。
しかしBのようにコンテナを使わない限り、今までの所、特に困ったこともありませんでした。
全て書き直す前にお尋ねしたいのですが、Aが上手くいっていたのは偶然なのでしょうか?
955デフォルトの名無しさん:04/11/26 11:45:16
reserveってのはresize時の効率を上げるためにあらかじめ領域を予約するものであって、実際にresizeするまではその領域を使っては*いけない*。
領域自体は確保済みなので一般保護例外などはでないだろうが、vector内部の管理情報は壊れていても不思議ではない。
956954:04/11/26 11:48:03
>>955
ありがとうございます。コンテナ以外もたまたま動いていただけなんですね。
全力で全痴漢してきます。
957デフォルトの名無しさん:04/11/26 18:58:01
メンバのoperator==はメンバ関数ポインタに入れられないのですか?
958デフォルトの名無しさん:04/11/26 19:34:53

std::vector<boost::shared_ptr<Foo> >::iterator i
= std::find_if( hoge.begin(), hoge.end(),boost::bind( &Foo::operator==, _1, foo ) );
としたいのです
959デフォルトの名無しさん:04/11/26 20:01:53
std::equal_to
960デフォルトの名無しさん:04/11/26 20:18:59
>>958
問題なさそうに見えるが、Foo か operator== のどちらかがテンプレート引数を必要としたりオーバーロードで曖昧になってたりしないか?
961デフォルトの名無しさん:04/11/26 20:49:05
>953
やっぱりそうなんですかねぇ.

>958
それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ.
indirect_iterator使って

vector<shared_ptr<Foo> >::iterator i
= find_if(make_indirect_iterator(hoge.begin()),
make_indirect_iterator(hoge.end()),
bind(&foo::operator==, _1, foo3) ).base();

とか,lambda使って

vector<shared_ptr<foo> >::iterator i
= find_if(hoge.begin(), hoge.end(), bind(&foo::operator==, *_1, foo3));

とか(このbindはlambdaのbind).というか普通にfindで良いんじゃ・・・.
962958:04/11/26 21:10:03
>>959
それだとshared_ptrの==が使われてしまい意図したものではありません。

>>960
おっしゃるとおりでコンパイラは”関数の引数があいまいなためテンプレート引数を減少できません。”といっていました。
Fooのoperator==をFooだけでなくstd::stringでも比較できるようにしていました。
オーバーロードしないようにすればコンパイルできましたが、引数からoperator==を選択してくれないのでしょうか?
bind<・・・>に型を指定してやれば解決するかと思いましたが私にはむりでした。
今はとりあえずforループを回しております。
963デフォルトの名無しさん:04/11/26 21:21:48
>>961
ええと、しょうしょう混乱しておりますが。

>それだとshared_ptr<Foo>のoperator==を呼ぼうとしますよ.
というのは>>959さん宛てですかね?
ちがったりして。

ndirect_iteratorは知りませんでした。調べてみます。
964デフォルトの名無しさん:04/11/26 21:22:10
>962
オーバーロードされた関数へのポインタを取る場合,
ポインタを取った瞬間にどのオーバーロードへのポインタなのかを
指定してやる必要があります.そのまま汎用関数の引数にすることは出来ません.
典型的にはキャストを使うか

static_cast<bool (Foo::*)(Foo const &) const>(&Foo::operator==)

一旦メンバポインタ変数に代入してから使います.

bool (Foo::*pmf)(Foo const &) const = &Foo::operator==

上のシグネチャはただの例なので実際のoperator==のシグネチャに読み替えて下さい.
・・・っていうか,lambdaが一番楽だと思いますよ.

vector<shared_ptr<foo> >::iterator i
= find_if(hoge.begin(), hoge.end(), *_1 == foo);
965デフォルトの名無しさん:04/11/26 21:30:01
>963
おっと,ごめんなさい.961はboost::lambda::bindの話です.忘れてください.

#shared_ptrに対する挙動がboost::bindとboost::lambda::bindで違う・・・.
966デフォルトの名無しさん:04/11/26 21:35:12
C++関連のスレが乱立して
閑散としているスレが増えて来ましたので
再編を提案します
http://pc5.2ch.net/test/read.cgi/tech/1101384692/

現状でC++関連は
【C++】template 統合スレ
【C++】STL(Standard Template Library)相談室
BOOSTを語れゴラァ
C++相談室 part37
とありますがこれらは
標準C++相談室【STL含む】
C++テンプレート相談室【Boost/Loki】
の2本に統合でいいように思います

どうでしょうか? 異論がなければ
ここの次スレの名前は標準C++相談室【STL含む】
でいきましょう
967デフォルトの名無しさん:04/11/26 21:37:45
>>966
STLとかBoostとか関係なく、
ベストな方法を知りたい、みたいな質問をしたい時はどこ?
968デフォルトの名無しさん:04/11/26 21:39:44
>>964
ありごとうございます。
boost以前の問題でしたね。もっと勉強します。
lambdaはうちのコンパイラが使うな(えない)というもので。。。
969デフォルトの名無しさん:04/11/26 21:41:49
>>967
そういのはここ(と後継のスレ)でいいのではないでしょうか?
話長くなりそうだったら専門スレに誘導してそこで続けていただくといいと思います
970デフォルトの名無しさん:04/11/26 21:43:24
>>966
名前は短い方がいい
余計なものくっつけるな
971デフォルトの名無しさん:04/11/26 21:43:46
>>967
ここで聞くと解決するまえにスレ終りそうだから、
新スレ立ててそこで質問しちくり。
972デフォルトの名無しさん:04/11/26 21:44:27
>>970
くっつけないと重複スレが立つんだよ。
973デフォルトの名無しさん:04/11/26 21:45:33
エキスパートが回答してくれれば
どこに質問したっていいって気分。
974デフォルトの名無しさん:04/11/26 21:46:14
>968
>lambdaはうちのコンパイラが使うな(えない)というもので。。。
相手の環境を考慮してなかったです.本当に申し訳ない.
975デフォルトの名無しさん:04/11/26 21:47:17
>>966
ISO/IEC14882で定義される範囲は「C++」でしかねえよな
STLだのtemplateだのと断片だけのスレは重複もいいとこ

つーと、残れるのはboostくらいか
976デフォルトの名無しさん:04/11/26 21:57:43
977デフォルトの名無しさん:04/11/26 21:57:51
あ"ー
978v(^・^)v:04/11/26 22:18:09
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
979v(^・^)v:04/11/26 22:18:27
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
980デフォルトの名無しさん:04/11/26 22:19:16
>>978
#include "stdafx.h"
みたいにプリコンパイル済みヘッダーをインクルードするか、
ファイルの設定でプリコンパイル済みヘッダーを使わないように設定する。
981デフォルトの名無しさん:04/11/26 22:25:45
こっちにテンプレ貼ってどうする
982デフォルトの名無しさん:04/11/26 22:43:16
ここは人工無能のいるスレでつか?
983デフォルトの名無しさん:04/11/26 22:46:12
人工無能ってなに?
984デフォルトの名無しさん:04/11/26 22:46:27
スレってなに?
985デフォルトの名無しさん:04/11/26 22:46:42
でつかってなに?
986デフォルトの名無しさん:04/11/26 22:47:08
ここってなに?
987デフォルトの名無しさん:04/11/26 22:48:08
Ruby!!!!!!!!!!!!!!!!!!!!!!
988デフォルトの名無しさん:04/11/26 22:57:38
Rubyつかうと一気に○○○が10倍に?!

↑○○○を埋めて。
989デフォルトの名無しさん:04/11/26 22:58:14
リスク
990デフォルトの名無しさん:04/11/26 22:59:06
さて、お取り込み中の所大変申し訳ありませんが、カウントダウンの時間です。
991デフォルトの名無しさん:04/11/26 22:59:28
9
992デフォルトの名無しさん:04/11/26 23:00:35
除夜の鐘みたいだ。
993デフォルトの名無しさん:04/11/26 23:00:45
>>988
ヘタレ
994デフォルトの名無しさん:04/11/26 23:03:05
>>988
そくど
995デフォルトの名無しさん:04/11/26 23:04:03
>>988
おなか
996デフォルトの名無しさん:04/11/26 23:04:23
>>988
こしけ
997デフォルトの名無しさん:04/11/26 23:05:20
>>988
肥満度
99810000000!!!!!!!!!!:04/11/26 23:05:27
10000000!!!!!!!!!!
999デフォルトの名無しさん:04/11/26 23:05:37
1000(σ´Д`)σゲッツ!!
1000一億:04/11/26 23:05:50
一億
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。