C++相談室 part6

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
(´-`).。o(関連URLは>>2-5の辺り)
2デフォルトの名無しさん:02/04/11 01:05
乙カレー
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
      ,, ,=、  ,, , =、
     ff | }!、,、〃 / ″オツカレー!!
      ,リ/ .ノ*´jコ`)'〃
    {{ { ′   v' 《
     ヾ.\.   \ヾ
     _,,二、》   ;  \. 三,_
  (( ゙ー=、`″〃 \. \-‐' ,))
        ゙ー=″     ゙' 一' 
v(^・^)v
7デフォルトの名無しさん:02/04/11 02:27
8デフォルトの名無しさん:02/04/11 06:35
int operator--(){}
で、
--aが出来るけど、a--ってどうやるの?
9デフォルトの名無しさん:02/04/11 06:45
>8 int operator--(int){}
10デフォルトの名無しさん:02/04/11 06:54
>8
サンキュ〜〜♪
なんでoperator--(int)なの?
なんかダサい
全ての演算子をオーバライドしてあるclassを作ってるから必要なの。
間違えた。オーバロードね。
(゚Д゚) あぁ?
>>11
ダサいから自然と使われなくなるという罠?
treeをbeginからendまでスキャンするのに後置インクリメントとかされてるのみると、
はじめっから未定義にしときゃぁいいのに、と思う。
これで「高速化のためtreeにしてみたけど余計遅くなった」とか言われたりして、、、
もうね、ア(以下略)
16デフォルトの名無しさん:02/04/11 07:32
v(^・^)v
v(^・^)v
>>1
int otsukare--(int){}
>>15
いや、構文がダサいって事。
operator--(int)
intって何よってかんじで。
前置と区別せねばよ
>>19
それはわかるが、(int)ってやっぱりセンスのかけらも感じられん
じゃあ
なんかいい方法考え出してくれ
22StroustrAp:02/04/11 08:11
後置インクリメント(デクリメント)演算子の引数 int は、
同前置演算子と比べた場合に存在する0ではないパフォーマンスの劣化を表している。
引数に渡される値は常に0だが?
24デフォルトの名無しさん:02/04/11 08:59
>>23
引っ込んでていいよ。
v(^.^)v マァマァ
26デフォルトの名無しさん:02/04/11 14:37
C++は心の病気になるとか言ってる人がいるがそれは違う!
悪いのは
27デフォルトの名無しさん:02/04/11 14:39
operator--(int) が呼ばれるときって、実際に何か引数が渡されてるの?
>>23 は 0 とか言ってるけど。そうだとしたら本当にダサいね。
28ストラウ:02/04/11 14:44
文句のあるやつは使うなよ!!ウワーン
じゃあ何かいい方法を考えるべ。
30デフォルトの名無しさん:02/04/11 14:56
初歩的なことで申し訳ないのですが、非staticなメンバ関数のアドレ
スを取得する方法ないのでしょうか? CreateThread()にメンバ関数
食わせるクラス作ろうとしてハマッてます。おたすけ。
>>30
メンバ関数にはthisがあるから、CreateThread()には食わせられないでしょう。
(素直は方法では)
32デフォルトの名無しさん:02/04/11 15:10
>>31
なるほどそうですね。
CreateThreadにthis渡してランチャ関数を1hopおくことにします。
どうもありがとうございました。
LPTHREAD_START_ROUTINE pFunc;
DWORD (WINAPI CMyClass::*p)() = ThreadFunc;
pFunc = *(LPTHREAD_START_ROUTINE*)&p;

ThreadFuncは引数無しのDWORD型のメンバ関数。
動作はまるきり保障できないが。
34デフォルトの名無しさん:02/04/11 15:25
>>27
通常の関数は定義する時には f(int i) のように必ず仮引数を書かないとエラー
になるが、operator--(int)の場合、operator--(int i)のように書かなくても
エラーにならない。それだけでも良しとしてくれ。
3530:02/04/11 15:28
>>33
ありがたき幸せ。両方頭に入れておきます。
#実はその方法で解決しようとしてスパゲッティになっておりました(w
>33
ThreadFuncは、非virtualかつ
WINAPIであれば、まぁ大丈夫、なのかな‥‥
37デフォルトの名無しさん:02/04/11 16:54
>>34
いや、通常の関数でも仮引数を指定しなくてもエラーになりませんよ。
私は開発の途中で、インタフェースでは決まっているが、まだ実装では
使っていない仮引数は、
void foo( int /* x */ ) { }
のようにしていることがあります。
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
>37
関数を/* 〜 */でコメントアウトするときにドツボにハマる罠
#if 0
こうすりゃおけ
#endif
#if 0〜は大抵のエディタで色が変わらないから、
生きているのかで混乱する罠
>>39
Cはコメントの階層化ができるようにならないんだろうか・・・
/-COMMENT_NAME1-
/-COMMENT_NAME2-

-COMMENT_NAME2-/
-COMMENT_NAME1-/

こんな風にできたらいいなぁ。
borlandのコンパイラは、コメントのネストをサポートしてたよね。
4437:02/04/11 23:26
>>39
し、失札な! C/C++ 歴 15年、そんなマヌケなことでハマったことは、
2回しかない!!
45999:02/04/11 23:34
>>前スレの1000
ゲラ
いまさらながら、「IEコンポーネントを使い倒すスレ」に触発され
ちょっと試してみたい気になりました。

タイプライブラリの取り込み(でしたよね?)で
何を指定したらよいのでしょうか?
#今BCBが手元に無いので言葉が不正確かもしれません。。。
会社でしばらく眺めていたんですが、それらしき物が
見つけられなかったんですけど。
>>46
確か、Microsoft Internet Controls です。
>関数を/* 〜 */でコメントアウトするときにドツボにハマる罠

こんなのハマるやつはどうかしてると思われ
いるとすれば>>39あたり・・・(w
491000:02/04/12 00:05
スマソ >>前スレ999
50デフォルトの名無しさん:02/04/12 01:36
>>47
thanks!!

っていうか、スマソ。
C++Builderのスレで聞いたつもりになっていた。
激しく、誤爆しちまったぞと。
行の途中をコメントアウトするときは確かに /* */で囲むこともあるが
複数行のコード全体を無効にするときは #if 0 にするなあ。ネストできるしね。

また、#if 0 ならそれは「無効化されたコードである」ということを表明していることにもなるし。
逆に
#if 0
コードではなくコメントをずらずら
#endif
なんての見るとげっそり。

(さらに#if 0 だとなぜ無効にしたのかが分かりにくいので、#if HOGEHOGE とでもして
上に // #define HOGEHOGE 1 // なんたらかんたら...
と無効にした理由、有効にもどせる判断条件などを書いたりしてるな)
試しにちょっとコメントなり #if 0 なりでくくってみるのはともかく、
昔のコードが無効になった状態で残ってるのは萎えるなあ。
リビジョン管理しろよーって感じで。

てゆーか、リビジョン管理してても残してあったり・・・
53デフォルトの名無しさん:02/04/12 13:47
なんでC++なんだよ、どう考えても++Cだろうがゴルァ!
C==C++だぞわかってんのかゴルァ!
54デフォルトの名無しさん:02/04/12 14:01
>>53
評価した後で違いに気付くっていうふかーい意味があるのさ(w
きっと
C++;
なんだろう。
>>53
迂闊に使うと効率が悪くなるっていうふかーい意味があるのさ(w
57デフォルトの名無しさん:02/04/12 16:11
暗黙の型変換の禁止したいんだけど、
class CA{,,,,,};

CA a,b;
a=b;//これを禁止するにはどうすれば?
>>57
それ暗黙の型変換なの?
単なる代入に見えるが。
代入ならば代入演算子をprivateにでもoverrideすれば防げるっしょ。
あと宣言時の代入記述は代入演算子ではなくコピーコンストラクタなので
場合によってはそっちも…

つーか、Effective/More Effective/Exceptional C++嫁
59デフォルトの名無しさん:02/04/12 16:16
>>57
CA::operator=() と コピーコンストラクタを private にする
60デフォルトの名無しさん:02/04/12 16:36
>>58>>59
サンクス♪解決しました。
>>56
上手いな……。
62デフォルトの名無しさん:02/04/13 10:49
template<class T1,class T2=ST<T1> >class TST;
template<class T>class ST{
friend class TST<T>;
public:
T t;
ST(T val=0):t(val){}
};
template<class T1,class T2=ST<T1> >class TST{
private: T2* pt;
public:TST(T1 val=0):pt(new T2(val)){}
~TST(){delete pt;}

TST operator=(const TST& rhs){return pt->t=rhs.pt->t;}
template<typename VAL>
TST<VAL>operator=(const TST<VAL>& rhs)const{return pt->t=rhs.pt->t;}

T1 Ref()const{return pt->t;}

};
/*****************************************/
void main(void)
{
const TST<int> a;
TST<double> b;
a=b;
cout<<a.Ref()<<endl;
}
とやるとfriendの型がずれてしまう。これを回避するfriendの書き方はないだろうか?
friend の問題じゃなくて、TST<int> と TST<double> は別の型なので、
TST<int>::operator= から TST<double>::pt (private) へのアクセスが
できないってだけじゃないの?
64デフォルトの名無しさん:02/04/13 12:49
>>63
サンクス♪
friend関係無かったよ。
でも、ポインタを公開したくないなぁ。どうしようかね。
Ref()を公開して、その中でポインタを使用するとかしかないのか。
65デフォルトの名無しさん:02/04/13 13:52
Visual C++でもう入力の必要がなくでEOFで強制終了したいときどうすればいいんですか。
プログラムではなく操作上の問題です
↑標準C++の仕様書ね。
ISOの最新pdfだと思う
>>65
Ctl+Z
たしか前に (a += 1) += 1; って出来ないとかいうのを見た気がするんだけど、
だったら operator+= の戻り値は const にしなきゃいけない?
70953:02/04/13 19:48
C++ Builderにおいて、ディスクの空き容量を調べようと以下のようなコードを書いたところ、
「[C++ エラー] frmMain.cpp(51): E2015 '__stdcall GetDiskFreeSpaceEx(const char *,_ULARGE_INTEGER *,_ULARGE_INTEGER *,_ULARGE_INTEGER *)' と 'Sysutils::GetDiskFreeSpaceEx' の区別が曖昧」
といわれました、 このばあい、Sysutils::GetDiskFreeSpaceExを呼び出す方法はわかるのですが、
__stdcall GetDiskFreeSpaceEx(const char *,_ULARGE_INTEGER *,_ULARGE_INTEGER *,_ULARGE_INTEGER *)
を呼び出すにはどのようにすればよいのでしょうか?

よろしくお願いします。


void __fastcall TForm1::Button1Click(TObject *Sender)

{
// Show disk capacity and freespace
bool result;


ULARGE_INTEGER freespaceforcaller;
ULARGE_INTEGER capacity;
ULARGE_INTEGER freespace;




result=GetDiskFreeSpaceEx("C:\\",(ULARGE_INTEGER)&freespaceforcaller,
(ULARGE_INTEGER)&capacity,
(ULARGE_INTEGER)&freespace);
}
::GetDiskFreeSpaceEx( ...
かな?
スレ違いかと
>72
現段階ではネームスペースについての話ってことで
74デフォルトの名無しさん:02/04/14 23:58
age
int (A::*)()がvoid *にキャストできないのはC++の仕様?
手持ちのコードがコンパイルできなくなっている。
できたらできたで困ると思うが。
>>75
どこかで書いたが、アドレスとってvoid**にキャストしてから戻せばいける。
78デフォルトの名無しさん:02/04/15 00:56
あの方法を使えば印字できるさ
79デフォルトの名無しさん:02/04/15 00:58
>>75
reinterpret_castでも使え。
仮想関数は、それでとると、戻せなくて死ぬかも。
>>69
一般的にはconstにはしていないようだね。
>>53
亀レスだが、C++はかつてCのプリプロセッサだったからだよ。
つまり、はじめはC++でもプリプロセッサのアウトプットはCってこった。




ん?こじつけだぞ。真に受けるなよ。
83三瓶です:02/04/15 21:13
http://www.njk.co.jp/otg/Study/CPP/cpp1_01.htmlの左上に水色で
for(int n=0;n<MAX;n++){n○=2;〜〜〜〜〜〜
ってありますが、○の部分の小さな×はキーボードのドコを打てばいいんですか?
>>83
"
↑これか?
>>83
お箸を持つ方が右で、お茶碗を持つ方が左です(右利きの場合)。お間違い無きよう。
んで、その * はアスタリスク(スターとも言う)で、テンキーにあるかと。
86三瓶です:02/04/15 21:38
違います。もういちどよく見てください。   >>84
>>83
*だわそりゃ。
88三瓶です:02/04/15 21:40
そうでした右でした。
了解しました。有難うございます。    >>85
89デフォルトの名無しさん:02/04/16 02:02
#include <iostrem>
int main()
{
std::cout<<"Hello,world"<<std::endl;;
return 0;
}
ASCII C++第3版で上のような状態でmainには一切手を付けないで

strustrup
hello,world!
C++

のように出力せよ、とのお言葉(問題)があったのですがどうすればよいのですか?
引っ掛けなのでしょうか?
>>89
#include <iostream>を消して(略
>>89
mainの外にグローバルなクラス変数を置いて、
そのコンストラクタとデストラクタで cout に出力する
struct A {
A() {
std::cout << "strodsjof" << std::endl;
}
~A() {
std::cout << "C++" << std::endl;
}
};

A a;

これだとVCで"C++"が出力されない。
んなアホな!
>>90-91

レスどうもです!
やっぱりコンストラクタとデストラクタでしたか〜
参考になりましたありがとう!
こうすれば簡単だよYO!
#include <iostream>

int main()
{
std::cout<<"strustrup\nHello,world\nC++"<<std::endl;
return 0;
}
#define main Main
int main()
{
std::cout<<"Hello,world"<<std::endl;;
return 0;
}
95デフォルトの名無しさん:02/04/16 04:21
coutやcinにはput(),get()のようなメンバ関数在りますけど
そのメンバ関数名&&機能一覧表とかはどこに載ってますぁ?
最後の「ぁ?」は喧嘩を売ってるわけですね。
いいでしょう。かかってきなさい。
( ´D`)つ)´Д`)グリグリ
        ↑
        96
98デフォルトの名無しさん:02/04/16 04:29
class AAA
{
private:
class BBB;
BBB b;
public:
class BBB{ };
};

これをコンパイルしようとすると、「bの定義がないYO」と言われます。
publicとprivateの位置関係を換えると通るのですが、
位置入れ替えなしでうまくできないのでしょうか?
・゚・(ノД`)・゚・。 グリグリ サレタ・・・
100デフォルトの名無しさん:02/04/16 04:39
・゚・(ノД`)・゚・。 >>98 こうしたくない理由があるの?

class AAA
{
private:
class BBB{ }
BBB b;
public:
};
・゚・(ノД`)・゚・。 あ、BBBクラスはAAA以外でも使いたいのかな?
まぁいいや寝よう。
10295:02/04/16 04:54
ごめんなさい、ぁはかの間違いでーす
103デフォルトの名無しさん:02/04/16 05:03
>100-101
>理由
それ以外の方法で出来るのかなと
気になって眠れないので、、、



… ( ´Д`)ネムイ
>>98
できません。
10598:02/04/16 15:49
>104
C++の仕様ってことですか。。。
ありがとう(・∀・)
106勉強中なの:02/04/16 19:11
あまりにもはずかしげな初心者質問でスマソ。

#include<stdio.h>
main()
{
float c;
c=100/7;
printf("%f",c);
return 0;
}

ってやると14ってでてくるんだけど、
なんで14.285...ってでてこないの?
100/7.0 とか 100.0/7 とかやるとちゃんとでてくるのに・・・
107デフォルトの名無しさん:02/04/16 19:20
>>106
C言語では、整数型同士の除算では結果も整数型になると、
C言語の規格で決められている。
c=(float)(int)(100 / 7);
109106:02/04/16 19:44
>>107
THX。
そういう規格になってるとは知りませんでした。
>>108
THX。
そういうふうに書けばいいってことなのかな?
あとでやってみます。
>>109
いや、>>108のようになっているから、
切り捨てられた後にfloatにキャストされるので、
14.0で正しいってこと。
>>106
やるなら c = (float)100 / 7; とすればいいだけの話。
もしくは、c = 100. / 7; のようにどちらかに小数点を付ける。
C++の参考書って、
ISOの企画書
Effective C++(日/英どっちでも)
More〜 (原書)
Exceptional C++ (原書)
Modern C++ Design (訳書)

こんだけそろえればとりあえずは大丈夫か?
Exceptionalは勉強になるな。
EffectiveよりAcceleratedの方が良いとどっかにあった。
templateだったらmodernより「Generic Programming−STLによる汎用プログラミング」
の方が基礎的で良いのでは?
>>113
あくまでスタイルとか、落とし穴を回避するための参考書。
STLなんかのライブラリの使い方とかはどうでもいい
115デフォルトの名無しさん:02/04/16 21:30
#include <sstream>
int main() {
std::stringstream s, ss;
ss.str("a");
s << ss.rdbuf();
}
これをコンパイルして実行すると止まらない(traceしてみるとSTL内部のどこかで
無限ループっぽい)んですけど、STLのバグか俺がアフォなのか教えて下さい。
g++, libstdc++ の 2.96 です。Kondara2.1です。
116115:02/04/16 21:32
>>115
g++の3.xだと動きますね…
117デフォルトの名無しさん:02/04/16 21:59
CからC++に移行するのに最初に読んだ
AcceleratedC++の二つめのサンプルコードで、
#include <iostream.h>と書いて(VC++)どつぼにはまった経験があるのは
おれだけか??
(低レベルなカキコすまん
118教えて:02/04/16 23:13
ファイルサイズ取得したいのですがstat以外の方法ってあるんですか。
>>118
OSも書けや。
120デフォルトの名無しさん:02/04/16 23:14
ないとおもう
121親切な人:02/04/16 23:14

ヤフーオークションで、凄い人気商品、発見!!!

「高性能ビデオスタビライザー」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
プログラム板で、凄い人気レス、発見!!!

「親切な人」↓
http://pc.2ch.net/test/read.cgi/tech/1018454705/121n

プログラム板内では、現在、このレス
の話題で、持ちきりです。
123118:02/04/17 00:00
>>119
WinXPです
GetFileAttributesExとか
GetFileSizeとか
SetFilePointerExとか
125118:02/04/17 00:21
>>124
ありがとう
126Rubyist:02/04/17 00:27
動物って好き? いいよな どこが? 皮がなぁぁぁぁ
127デフォルトの名無しさん:02/04/17 00:29
128113:02/04/17 00:57
>>114
親切に教えてやったのに、本の題名だけで判断するかね。
小人養い難しだな。
>>128
俺も持ってるよ「STLによる汎用プログラミング」。C++Builder6からSTLPort
になったので、SGIしか使えなかったバインダとかも全部使えてホクホク
してる。
130デフォルトの名無しさん:02/04/17 10:52
例外指定(例外仕様)って、使い勝手が悪いような気がするんだけど、どう?
たとえば、
void func() throw(int)
{
throw double();
}
なんて書いても、コンパイラはチェックしてくれないし。(実行時に
unexpected は発生するけど)
また、上の関数の例外指定を後で throw(int,double) に直したとしても、
func を呼び出している全クライアントを書き換えるのも大変。
みなさんは、どういう感じで使ってますか?
受け取り側のcatchが例外の型を指定して受け取るのはやな感じ。
例外の種類と同じ数だけの例外クラスがあるJavaとかC#とか見てると、なんかもっとどうにかならないのかと思う。
132デフォルトの名無しさん:02/04/17 17:28
今日帰りにExceptional C++買っていこう。
>>131
詳細←→全体がネスト構造になっているのを
ちゃんと現せればべつにクラスでなくてもいいんだろうけどね。

せっかくクラスのis a 継承のしくみがあるんだし
ゴスリングもスト羅臼トラップも
新しい例外専用の構造を導入するのが面倒だったんだろ。

専用のエラーの構造とか用意してある言語とかあるのかな。
>>130
使ってません(きっぱり)。
だって標準関数にほとんど例外指定がないんだもの。
どっから何が飛んでくるかわからんです。
bad_alloc とか。bad_allocを例外指定してない関数で、ちゃんとbad_allocをcatchするようなコード書いてますか?やってられません。
例外仕様って、なんかメリットあるのかな?本気でわからん。
ってことで、僕も使ってません。
少なくとも throw() 指定には意義がある。

constなくてもCでこまらんのと同じ。
でも const と違って throw() は実行時のコストがかかりますよね。
それに見合う意義があるかなぁ…
例外無し指定はコストかからんのでは?
いや、なんか例外が発生したら unexpected() を呼び出す、という処理が
必要になるはず。
140デフォルトの名無しさん:02/04/18 13:05
C++超初心者でーす。
DOS窓のBASICでゲームは作ったことあるので、
だいたいのフローチャートというかアルゴリズムは理解しています。
CIN COUT IF くらいでの簡単なプログラムは組めます。

目標はVC++でウィンドウズ用アプリで
シューティングとかパズルゲームを作りたいのですが、
まずどこから手をつけたらいいのかわかりません。
VCの解説書とかサイトってのは基本手にまず、C++のソースを
理解しているものとして書いてありますよね。

まずはC++の黒画面で表計算くらいできるようになってからVCでしょうか。
なにか良いサイトはありますか?
まず、イベントドリブンを知れ。
そして、Delphiやれ。
143デフォルトの名無しさん:02/04/18 16:58
struct AA{
     template<class T>void func(T t){cout<<t<<endl;}

     typedef template<class T>void(AA::*FUNC)(T);
     FUNC fff;
};
typedefのところがエラーになるんですが、templateをtypedefする方法
はないでしょうか。
>143
よくいとがわからんが。
 (↓だったら激しく勉強しる。)

template< typename T > struct AA{
void func(T t){cout<<t<<endl;}
typedef void(AA::*FUNC)(T);
FUNC fff;
};
・・・
AA<int> aa;
AA<int>::FUNC fp = aa.func;
struct AA{
     template<class T>void func(T t){cout<<t<<endl;}
     typedef template<class T>void(AA::*FUNC)(T);
     FUNC fff;
AA():fff(func){this->*fff();}
};
>>144いいえ、こうやりたいのです。
>>145
出来ない。当然だが、もうちこっと頭使え。
147デフォルトの名無しさん:02/04/18 18:57
コンストラクタでオブジェクトをnewするのはいいんでしょうか。
148144:02/04/18 18:59
>145
struct AA{ //冗長に書くと
 template<typename T1>void func(T1 t){cout<<t<<endl;}
 template<typename T2>typedef void(AA::*FUNC)(T2);
 FUNC fff;
 template< , >AA() . . .
}

template< typename T1, typename T2 > struct AA{ . . .}

template< typename T > struct AA{ . . .}
かのどれかかだろ?
(多分最後のやつしか動かんと思うが)
149デフォルトの名無しさん:02/04/18 19:26
>>148
出来ました。ありがとうございます。まさかそんなtypedefの書き方があったとは・・・。
修行し直してまいります。
150デフォルトの名無しさん:02/04/18 20:40
>>147
もちろんかまわないけど、リークに気をつけてね。
151デフォルトの名無しさん:02/04/19 01:16
C++でファイル分割ソフト作りたいんですが何か参考になりそうな
ソースとか資料とかありませんか?
>>151
簡単すぎて(以下略
153151:02/04/19 01:25
>>152
いやー初心者でして
>>151
初心者向けの本なら、どれ買ってきても「ファイルの読み込み方」と
「ファイルの書き出し方」は書いてあると思うからそれ嫁。
単純に分割するだけならそれ以上の知識はとりあえず要らん。
1551日目:02/04/19 13:26
世間ではC++難しいとかよく言われてるが、こんなのカンタンじゃねーか。
カンの悪いやつが泣き言いってるんだろーな。
156デフォルトの名無しさん:02/04/19 13:41
Modern C++ Design を読んでなお、こいつ程度のことは洩れにもできる!
ってんだったら一生ついてきます>>155さん。
それなら俺もついて逝く
>>155 そういう軽はずみな発言はC++コンパイラが書けるようになってから言え
159デフォルトの名無しさん:02/04/19 20:52
難しいってのはどういう部分を指していってるんだろう? 実は俺もちょっと
闇雲に難しい、といってる人には少し疑問がある。
言語自体は分かりやすいし、オブジェクト指向に関しても、でかいプログラム
書いたことある人なら無意識のうちに以前からやっていたことのような気がし
ない?
ライブラリでは?STLとかiostreamとか
ATL、WTL、COM、MFCとかじゃないですか?
確かに難しいし。
162159:02/04/19 21:37
COM,MFCは確かに勘弁。
でもC++というより、マイクロソフトの腐った技術が安定していないともいえる。
MFCは何をするにもソース見にゃならんので、
ブラックボックスで開発できないから勘弁だが、
COMは素性のいいものさえ使ってればいっさい問題なし。
ひろーく使われてるのは叩かれてるね。
めちゃくちゃな使われ方もされてるからだろうけど。

あんまり使われてない・アマチュアしか使ってないのはそんなに叩かれない。
なぜなら一部のマニアがオナーニしてるだけだから。
>165 FUDですか?
167C++初心者:02/04/20 08:08
class List { public: List *next; };
class B : public List { ... };

ってかんじでリストクラスを作って, リストを継承させて繋がるようにした
クラス B を作ってみたのですがクラスにリストが 2 個必要になったので

class B : public List1, public List2 { } ;

としてリストをつけようとすると 曖昧 だとエラーがでました。
やっぱりこんな実装は間違っているのでしょうか。
168デフォルトの名無しさん:02/04/20 08:13
>>167
継承すると、クラスメンバは1つしか持てないので包含を使うとよい。
class List { friend class B; public: List *next; };
class B { List list1; List list2; ... };
ってな感じで。
>>167
というより、C++ならそもそもlistを自作する必要はない。
STLにあるので、それを利用しませう。
170デフォルトの名無しさん:02/04/20 10:49
>>169
いや・・・・つーか学習用だろ。C++の入門書には必ずと言っていいほど
この手のクラス定義が出てくるからなあ。。。
171167:02/04/20 23:50
>>168-170
ありがとうございます。勉強になりました。
クラス設計もできないど素人なのでSTLはまだ何が何だかわからなくて…。
いつか皆さんのようなC++のエキスパートになりたいです…。

class B の中で Listクラスを包含すると list1.next が指すオブジェクトが
Listクラスってわかるんですが, class B かどうかまでは不明になりますよね。
class List に抽象ポインタを追加してダウンキャストしてみないと分からない
とか…。うーん…C++って難しいですね…。

class List { public: List *next; void *object; };
class B { public: List list1; List list2; };
B b; B * pb = dynamic_cast<B *>(b.list1.next->object); う…
>>171
そんなJavaっぽいリストにしなくて済むようにC++にはSTL…というか
テンプレートがあるので、やっぱり一刻も早く STL を学ぶべきかと思われ。
173デフォルトの名無しさん:02/04/21 00:17
>>171
包含は継承とちゃうから、dynamic_castは失敗するよ。
そうじゃなくて、

class List {
friend class B;
List *next;
void *object;
List() : next(0), object(0) {}
};

class B {
List list1, list2;
public:
B() : list1(), list2() {}
List* Head();
List* Tail();
bool isEmpty();
void Insert(List*);
void Delete(List*);
};

って感じで、あくまでもインターフェイスをBに持たせて、内部は隠蔽してしまう
のがいいと思う。STLも大事だけど、クラスの勉強もしてね。
>>167
Listクラスの中の List *next が未知のクラスT型だと解決しそうだな。
うーん…C++って便利ですね…。
175デフォルトの名無しさん:02/04/21 08:28
newで3次元配列を確保する時のやり方がいまいち解りません。
abc[][][4]
最後が4というのは決まってるのですが、
その前の2つが決まってない時ってどうやるんですか。
アホな質問ですいません
176デフォルトの名無しさん:02/04/21 09:44
>>176
超FAQだから調べりゃわかると思うけど、
int ***abc;
とかやって、1次元ずつnewしてください。
177デフォルトの名無しさん:02/04/21 09:59
>176
あっそ
>>176
もしくは、全体分を1次元配列とみなして一気に new して、自分で添え字
計算してアクセスする。間接参照がない分こちらの方が (マシンによっては
だけど) 速いかも。
>>178
本当に早くなるのか?
180デフォルトの名無しさん:02/04/21 11:52
>>176
(**abc)[4]とやれば、1次元分確保の手間が減るぞ。

>>178
FORTRANじゃないんだから。
あほみたいに大きいと違うだろうなぁ。
アクセスについてはほぼ変わらんと思うけど、
一括で確保できる分、全体的な処理速度は上がるかも

配列の三次元要素とか二次元要素が
OSのページングの単位内で収まるような場合は
小分けして確保した方がよい結果がでるかも。

クラス二つ用意してどっちが速いか実データで検証してみりゃ
いいのでは?

183178:02/04/21 14:18
>>179
ごめん遅いわ。とりあえず簡単化のために二次元でやってみたよ。
1000 × 1000 の配列を取って、a[i][j] = 0; を 1000 回やってみた。
>>176 版 28.922sec, >>178 版 30.344sec
だった。要は、メモリアクセス対乗算命令ってことだけど、乗算の方が
ちょっと遅いみたい。

ちなみに、アクセスしているところのコードはこんな感じ
(a[ecx][edx] = 0; のコード)...

>>176 版 (う〜〜〜ん、素直だ...)
 mov eax, DWORD PTR _a1
 mov ecx, DWORD PTR [eax+ecx*4]
 mov DWORD PTR [ecx+edx*4], 0

>>178
 mov eax, DWORD PTR _nCols
 imul eax, ecx
 mov ecx, DWORD PTR _a2
 add eax, edx
 mov DWORD PTR [ecx+eax*4], 0

>>180
> FORTRANじゃないんだから。
なんのこっちゃ ?
184178:02/04/21 14:23
>>183 の続き...

[ソース]
#include <stdio.h>
#include <conio.h>
#include <windows.h>

static int nRows;
static int nCols;
static const Loops = 1000;

static int **a1;
static int *a2;

static void _fastcall Func1(int Row, int Col)
{
 a1[Row][Col] = 0;
}

static void _fastcall Func2(int Row, int Col)
{
 a2[nCols * Row + Col] = 0;
}
185178:02/04/21 14:24
>>183 の続きの続き

int main(int argc, char* argv[])
{
 nRows = 1000;
 nCols = 1000;
 a1 = (int **)malloc(nRows * sizeof(int *));
 for(int i = 0; i < nRows; i++){
  a1[i] = (int *)malloc(nCols * sizeof(int));
 }
 a2 = (int *)malloc(nRows * nCols * sizeof(int *));

 DWORD Start = GetTickCount();
 for(int Loop = 0; Loop < Loops; Loop++){
  for(int Row = 0; Row < nRows; Row++){
   for(int Col = 0; Col < nCols; Col++){
    Func1(Row, Col);
   }
  }
 }
 printf("%d", GetTickCount() - Start);

 Start = GetTickCount();
 for(Loop = 0; Loop < Loops; Loop++){
  for(int Row = 0; Row < nRows; Row++){
   for(int Col = 0; Col < nCols; Col++){
    Func2(Row, Col);
   }
  }
 }
 printf(", %d\n", GetTickCount() - Start);

 for(i = 0; i < nRows; i++){
  free(a1[i]);
 }
 free(a2);
 getch();
 return 0;
}
/* ちなみに、配列にアクセスしているところを関数にしているのは、
  直接書くと最適化されるため。*/



[実行環境]
Mother Board: Acer M19A (440BX)
Processor: Pentium-II 400MHz × 2
Memory: 256MB × 2, PC100 SD-RAM
Operating System: Windows2000 SP2
Development System: VC++ 6.0
Compile Options:
/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"
/D "_MBCS" /FAs /Fa"Release/" /Fp"Release/test.pch" /YX
/Fo"Release/" /Fd"Release/"
nColsが定数で、2のべき乗の場合はどうよ?
無理に調べなくてもいいけどさ。
187デフォルトの名無しさん:02/04/21 18:06
漁スレなんでageとくわ
188デフォルトの名無しさん:02/04/21 19:44
class Str{
public:char* pdata;~Str(){delete[] pdata;cout<<"end"<<endl;}
    Str(char* pval){
       pdata=new char[strlen(pval)];
       strcpy(pdata,pval);
      }
};
というクラスを作ったんですが、
Str str="ABCDF";
とやると、strcpyの部分でこけるんです。何故なんでしょうか??
189デフォルトの名無しさん:02/04/21 19:54
こけませんでしたが?
>>188
strlen(pval)+1。
191デフォルトの名無しさん:02/04/21 19:57
コケるってのがコンパイルはできるが実行時にクラッシュするという意味なら、
strlen(pval)+1
だろ。
192デフォルトの名無しさん:02/04/21 19:58
>>188
車輪の再発明、もう見てらんない。
193デフォルトの名無しさん:02/04/21 20:02
>>190
ありがとうございます♪そうです、'\0'の分の領域確保を忘れて
おりました。ああ、漏れもまだまだ厨房・・・。
>>186
その場合は、>>178 版の方が速い。(nCols = 1024 で測定。) でも、
僅差 (1% 程度) だったよ。(ちなみに、nCols が定数で 1000 の場合だ
と、逆に >>176 版の方がわずかに速い。)

> 無理に調べなくてもいいけどさ。

初めそれでやってて、「やっぱ、俺って正しいわ。」と鼻高モードだった
んよ。で、よく考えてみたら...。俺ってバカじゃん、ショボーンてわけ。
>>192
まあ、そう言うな。クラスの勉強には、いい題材だよ。>>188 が必要に
駆られてやってるなら、別の勉強が必要だけどな。
196デフォルトの名無しさん:02/04/21 21:05
string で書式指定するには?
197デフォルトの名無しさん:02/04/21 21:09
例えばどんな指定をしたいの?
198かなりのスレ違いだが:02/04/21 21:35
C,C++、C#、java、perl等などを
難易度順に並べるとしたらどうよ。
std::stringstream ss;
ss << std::fixed << std::setw(2) << 1.0f;
std::string(ss.str());

こんなん?
>>196
普通はstringstreamから変換じゃないか?
でもstringstreamは遅いしいまいち不便だから
std::vector<char>とかにs(n)printfで書き込んじゃう方が多いね。

operator <<定義したオブジェクトにしかつか遠視。
202デフォルトの名無しさん:02/04/21 22:23
>>201
遅いのは確かだか...

不便なのは慣れていないから(気持ちは分かるがsprintfだって結構不便)だし、
operator<<を定義しているものならなんでも使えるのはメリットだと思う。
(sprintfは組込型にしか使えない。)
203デフォルトの名無しさん:02/04/21 22:37
誰かstd::stringにsprintf実装して下さいよ。
204デフォルトの名無しさん:02/04/21 22:39
std::string s;
s.sprintf("%dゲットズザー!",1000);
みたいに。
>>204
正直、俺もそれ楽で良いと思う・・・。
オレは、g++ 用に wprintf が欲しいよ。誰か作ってくれぇ。
207デフォルトの名無しさん:02/04/22 01:13
template<int N>
class Factorial {
public:
enum { value = N * Factorial<N-1>::value };
};
コレなんですか?何をしているかすら分からない・・・・・・・・・
階乗の計算でしょ。でもその下でN=1の場合の特殊化が必要だよ。
>>207
templateと書いてあるけど、intの特定バージョン。
また、クラスFactorialは実体化時に展開される。inlineだと展開されないから
templateを使ったのでしょう。
>>208
そうですね。コンパイル時にエラーが出るでしょう。
すげー。207じゃないけど、漏れもわからなかった。
enumは何か意味あるの?
enumは計算結果のみ意味を持っていて、計算課程をコードとして残さない。
むずかひ・・・
overflow_errorとunderflow_errorはどんなとき投げられるのですか?
実際のコードで教えて
>>203
string用にoperator+でも定義したら?
MFCのCString参考にしたら、
std::string ssprintf( const char *, ... );
くらいは簡単につくれるはず。
引数有りのコンストラクタを
newで複数(配列)確保することってできますか?

↓こんな感じ
class ctest{
public:
ctest(int a)
~ctest()
};
void main()
{
ctest *ct;
ct = new ctest(0)[32]:// これだとエラー

//delete ct;
}

とりあえず、現在
ctest *ct[32];
for(i=0;i<32;i++)ct = new ctest(0);
のように、ポインタを複数宣言して、ループで一個ずつnewやってます。

>>192
それは勉強する時には関係ないだろ
>>218
できません。
もしできるとしたら、次のように書きたい所。
ct = new ctest[32](0);
これで出てくるコンパイルエラーを見れば意味がわかりますよ。
221デフォルトの名無しさん:02/04/22 12:40
>>218
配置構文newを覚えなさい。

222デフォルトの名無しさん:02/04/22 12:47
確保
ctest *ct;
ct = new ctest[32];
for (size_t i = 0; i < 32; ++i)
new (ctest[i]) ctest(0);
解放
for (size_t i = 0; i < 32; ++i)
delete (&ctest[i])->~ctest();
かもしくは
for (size_t i = 0; i < 32; ++i)
std::destroy(&ctest[i]);


引数が一個だったらstd;;vectorを覚えた方が早い。

223デフォルトの名無しさん:02/04/22 12:53
ctest *ct = operator new (sizeof(ctest) * 32);
for (size_t i = 0; i < 32; ++i)
new (&ct[i]) ctest(0);

for (size_t i = 0; i < 32; ++i)
delete (&ct[i])->~ctest();
delete[] ct;
の間違いだった。写し

>>221
配置 new で何かできる?
>>224
この場合は特に配置newのアドバンテージはないですね。
ただ使用法のサンプルとしては面白い。
我ながら何度も書くのは情けなく思うけど
delete [] ct;
はやっちゃいけない予感。

識者よ、我らに正解を与えたまえちくしょう。

どっちにしろ、引数が一個なら配置構文のnewを使う意味はないね。


227デフォルトの名無しさん:02/04/22 16:11
質問、超初心者です。
プログラミングはじめたばかりなのですが、
C++を使ってとりあずDOS窓で動く簡単なインベーダーゲーム
みたいなのをやってみようと思うのですが、
これベーシックでやったことあるのでノウハウはわかっています。

ただ、CとC++の区別がいまいちつきません。プログラマーサイトみると
たとえば表示命令でplintf<<"とcout<<"がありますよね。
とりあえず最初に<stdio.h>と宣言したならば前者で、
<iostream.h>と宣言したならば後者ということで
よろしいのでしょうか?そのような解説をしてあるページとかってありますか?
228デフォルトの名無しさん:02/04/22 16:13
あと、座標指定のlocateって
stdio.hとiostream.hで共通?
>>225
operator newが確実に sizeof(class) を確保するとは限らない
(管理領域を余分にメモリ確保する可能性もある)から、
>>223の書き方は間違いじゃないか?
230デフォルトの名無しさん:02/04/22 16:36
>>227
>ただ、CとC++の区別がいまいちつきません。プログラマーサイトみると

初心者のうちは、むやみにそういうサイトを参照するな。
9割はヘボだから。
世間で評価の高い本でも買ってよめ。

とりあえず<iostream.h>とか書いてあるサイトは無条件に捨て。
231 :02/04/22 17:14
>>230
VC++6.0
なんだけど別にC++じゃなくてCも使えるんだよねplintf

とそんでむしろcout(iostream.h)よりもplintf(stdio.h)を使ってる
人の方が多そうだけど。plintfの方がよく使うの?
>>231
plintfはリンカエラー出るっしょ。
233 :02/04/22 17:20
リンカエラー??
じゃあとにかcoutでいいってことね。
234(;´Д`):02/04/22 17:24
>>233
plintf → printf
235 :02/04/22 17:29
ブーー!
236デフォルトの名無しさん:02/04/22 17:29
>>231
<iostream.h>は古い書き方ってこと。
今は<iostream>。
最近書かれたドキュメントで<iostream.h>と書いてあったら
筆者が勉強不足。
237 :02/04/22 17:37
あーhって書かなくてもいいんだ。
>>237
でもVC++だと-GXをつけないとえらいことになるね。
239 :02/04/22 18:11
GXってなに?
ヘルプ嫁
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.htmlを参考に
EUCの文字列をSJISに変換して出力する関数を書いてみたのですが、
うまく動きません。どこがおかしいのでしょうか?
void OutSJIS(string str)
{
  for(unsigned int i=0; i<str.size(); i++)
  {
    unsigned char chr[2];
    chr[0] = (unsigned char)str[i];
    chr[1] = (unsigned char)str[i+1];
  
    if(chr[0] < 0x80) continue;
    if(i >= str.size()) break;
    if( chr[0] & 0x01 )
    {
      chr[0] >>= 1;
      if( chr[0] < 0x6F ) chr[0] += 0x31; else chr[0] += 0x71;
      if( chr[1] > 0xDF ) chr[1] -= 0x60; else chr[1] -= 0x61;
    }
    else
    {
      chr[0] >>= 1;
      if( chr[0] < 0x6F ) chr[0] += 0x30; else chr[0] += 0x70;
      chr[1] -= 0x02;
    }
    str[i] = (char)chr[0];
    str[i+1] = (char)chr[1];
  }
  cout << str << endl;
}
とりあえずliが1増える場合と2増える場合が有ると思うんだが。
>>241
半角文字の場合continueしてしまい、表示されない。
244241:02/04/22 19:41
>>242
ありがとうございます。
str[i+1] = (char)chr[1]の次の行にi++を追加したら
とりあえず全角文字列の部分は表示できるようになりました。

>>243
確かに半角文字が表示されません。
今色々やってみているところです。
>>223
デストラクタのほうは、ループをダウンカウントにしないと
まずいっしょ。
…ていうか、よく見たら間違いだらけのような。

ctest* ct = operator new[](sizeof(ctest)*32);
for (int i=0;i<32;++i)
  new (&ct[i]) ctest(0);

for (int i=31;i>=0;--i)
  ct[i].~ctest();
operator delete[](ct);

More Effective C++の項目4を参考にした。これが正しいコードらしい。
ダウンカウントはともかくとして、>>223のコードって正しく動くの?
246デフォルトの名無しさん:02/04/22 21:33
構造体をnewで確保するとデフォールトでメンバー変数の値はNULLに
なりますか?それとも不定ですか?
>>246
structの中にコンストラクタが宣言されてなければ、デフォルトコンストラクタが
呼ばれ、「ゼロ」で初期化される。
>>247
コンストラクタがあるメンバに対しては初期化されるが
コンストラクタの無い基本型は不定じゃない?
>>248
プログラミング言語C++第3版P172§6.2.8を嫁。
>>249
読んだけど、「組み込みデータ型に対してコンストラクタを明示的に使ったときの値は」
のことなら、この場合明示的ではないので該当しないと思うが。
>>249
実行してみれ。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
int *p;
vector<int> *vp;

p = new int[10];
vp = new vector<int>(10);

for (int i = 0; i < 10; i++)
cout << p[i] << ' ';
cout << endl;

vector<int>::iterator pv = vp->begin();

for (; pv != vp->end(); pv++) cout << *pv << ' ';
cout << endl;
}
p.119
4.9.5 初期設定
中程の
「配列と構造体のメンバは、配列構造体が静的であるかどうかに関わらず、デフォルトで初期化される。」
と書かれているのは誤植で

http://www.longtail.co.jp/errata/
によると
pg.119 s/静的であるかどうかに関わらず、デフォルトで初期化される/静的であるかどうかによって、デフォルトで初期化されるかどうかが決まる/

と訂正されている。
>>251
その例は、STLが明示的なコンストラクタ呼び出しを行っているので
0初期化される例だね。

だけど、今回の>>246は単なるstructのnewの話なので、違う話だな・・・
254253:02/04/22 22:49
>>253
あ、見当違いだった。

>>251
new(の過程で呼ばれるメモリ確保が) 0初期化する処理系だと
どっちも0になってしまうよね。

試しに手元のgcc 2.9.5 で struct を new してアセンブリ出力してみたが
メンバの初期化コードは生成されなかった。
>>252
見てみた。
俺の第3版は初判第1冊だ。
鬱だ・・・・・・・・・
256名無しかも:02/04/22 22:54
プログラムの始めにdefineで変数の値を決めることのメリットはなんですか?defineのなかに数式とかも書けるのでしょうか?
>>256
C++の場合はなるべくdefineの代わりにconstやinlineを使うように。
ただ#ifdefなどのマクロ評価はC++でも多用される。
#defubeの主な目的は、 定数に名前を付けることである。円周率πを使うたびに
3.141592653589793と記述する代わりに、変数 pi にdefineを使って値を割り
当てることができ、3.14...という長い定数を使う代わりに pi を使うことが出来る。
さらに、円周率が変わった場合に、プログラムの変更が容易になるという利点がある。
259256:02/04/22 23:09
ありがとうございます♪
2609999:02/04/22 23:10

-------風俗の総合商社・MTTどこでも-------

〇デリバリーヘルス〇デートクラブ〇女性専用ホストクラブ〇
〇ハードSM奴隷クラブ〇レズビアン倶楽部〇ホモ・オカマ倶楽部
〇変態痴女と遊ぶ会〇痴漢・覗き趣味の会〇変態同好会・各種!
●楽しく遊べます! 090-8002-8356番
-----------美男・美女会員など多数在籍中-----------
  http://www.mttdocomo.jp/
-----女性アルバイト随時募集・高収入(日払い)月100万円可能-----
-----レズビアン・スタッフ●ホモスタッフ●女性専用ホストスタッフ同募-----
http://www.mttdocomo.jp/
------------------------------------------------
261デフォルトの名無しさん:02/04/23 00:28
>>252
あと、p293 「10.4.2 デフォルトコンストラクタ」も読むとよいかと。
つか、ここにも誤訳があるんだよなぁ… (ページの終わりのあたり)
>>258
「約3」なんかになっちまったおかげで、jokeがjokeで無くなってしまった...
263デフォルトの名無しさん:02/04/23 03:14
char* out(size_t size){
class local_c{
public:char* temp;local_c(size_t val):temp(new char[val+1]){}
~local_c(){delete[] temp;temp=NULL;cout<<"local_end"<<endl;}
};
local_c lo(size);

while(size--){
lo.temp[size]=pdata[size];
cout<<lo.temp[size]<<endl;
}
return lo.temp;
}
pdataは何処かで定義されている配列です。この関数を、
cout<<out(3)<<endl;
とすると、どうやらアドレスがchar*にキャストされて表示されている・・・みたいです。
returnの部分を何とか出ませんか?
>>263
それはともかく、return された lo.tempの指すメモリは、returnされた時点で開放されてるので
coutに渡されたときにはすでに無効アドレスだべ。
265デフォルトの名無しさん:02/04/23 03:32
>>264
サンクスです。何か根本から間違っていました。出直してきます。
>>264
いや、無効にならないように、関数内でnewして新規に確保しているわけだが、
デストラクタ~local_c()で既にdeleteされたポインタを返しているのが問題では
ないだろうか。
うむデストラクタで解放しちゃってるな。
なんつーか、文字列の安全な所有権の移動(共有)をやりたいだけなら
std::string使っとけばいいんとちゃうん?
264さんと266さんは多分同じ事を言っているんだろうな。
270デフォルトの名無しさん:02/04/23 10:36
>>217
効率をあまり考えないなら(どうせ sprintf だし効率悪くても良いだろ)、

1. fprintf() で /dev/null に書き込んで文字列長さを取得
2. alloca() でスタック上に文字列を書き込むバッファ領域を確保
3. 2 で確保した領域に sprintf()
4. そのバッファから std::string() をコンストラクトして返す

とかで簡単に実装できる。
271あう:02/04/23 11:09
#include<iostream>
using namespace std;

int max(int temp,int a){ /* 最大値を求めるときに渡す関数 */
return temp<a;
}

int min(int temp,int a){ /* 最小値を求めるときに渡す関数 */
return temp>a;
}

/* 一般的にトップを求める関数 */
int gettop(int* a,int size,int (*p)(int,int)){
int temp, i;
temp = a[0];

for(i=1;i<size;i++){
if((*p)(temp,a[i])) temp = a[i]; /* 共通化した処理 */
}
return temp;
}

int main(){
int data[] = {36,47,19,11,18,25,20,57,39,67,28}; /* 対象データ */

int size = sizeof(data)/sizeof(int); /* 配列サイズを求める */

/* 実際に使ってみる */
cout << "最大値 : " << gettop(data,size,max) << endl;
cout << "最小値 : " << gettop(data,size,min) << endl;

return 0;
}
一番最初の最初のmax関数とmin関数ですが、temp>aとか条件を返して
ますよね?なのになんで返り値の型はなんでintなの?boolじゃないの?
不思議に思ってコンパイルしてみたらちゃん通りましたけど理由がわかりません
どなたか教えて下さいおねがいしまう。

>>271
if((*p)(temp,a[i])) temp = a[i]; /* 共通化した処理 */
で、真か偽かだけを見ているので、boolでもintでも通ります。
つか、ふつー、std::max_elementとか、std::min_elementとか、
あるいは、関数テンプレートとか使わね?
274あう:02/04/23 11:29
わかったようなわからないような・・・
だったらやっぱりboolって書くべきじゃないですか?
275あう:02/04/23 11:31
>>273
私が書いたわけじゃないので・・・
メルマガにのっていました。
某処理系で以下のプログラムが seg. fault をおこすそうですが、
これって不正ですか?

#include <iostream>
using namespace std;
void foo(int i) throw (char*)
{
 if (i == 0) throw "zero";
 cout << "non-zero";
}

main()
{
 try {
  foo(0);
 } catch (char* s) {
  cout << "error : " << s <<endl;
 }
 return 0;
}

string& で受けても同じだそうです。
>>276
某処理系って何?
278デフォルトの名無しさん:02/04/23 14:48
#include<iostream>
using namespace std;

bool f1(void){
return true;
}
bool f2(void){
return false;
}
void get_f(bool (*p_func)(void)){
bool n=(*p_func)(void);
if(n)cout<<"nはtrue"<<endl;
else if(!n)cout<<"nはfalse"<<endl;
}
int main(void){
get_f(f1);
get_f(f2);
return 0;
}

関数ポインタを引数にとる関数つくりたいんだけどできません。
なぜ?
>bool n=(*p_func)(void);

関数呼び出しに日下部はいらんよ
280デフォルトの名無しさん:02/04/23 14:59
>>279

あ!そうでした。すいません。馬鹿だ・・・
ところで日下部ってどういう意味?
>>279
voidが不要って事ね。
284デフォルトの名無しさん:02/04/23 16:32
日下部ってまだ居るの?
 Λ Λ
(. .)
(   )〜
みたいなのだろ
>>276
g++だとchar *を投げても受け取られませんね。

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;

void my_terminate()
{
cout << "unexpected error occured!" << endl;
exit(1);
}

void foo(int i) throw (char *)
{
if (i == 0) throw "zero";
cout << "non-zero";
}

int main()
{
set_terminate(my_terminate);
try {
foo(0);
}
catch (char *s) {
cout << "error : " << s <<endl;
}
}
>>276
if (i == 0) throw "zero";


if (i == 0) throw static_cast<char *>("zero");

にしたらg++でも正しく動作しました。
どうやら throw "zero"; だけではchar *型の例外を投げたことには
ならないようです。やれやれ。
>>285
某処理系(w)では

11c12
< void foo(int i) throw (string&)
---
> void foo(int i) throw (char *)
13c14
< if (i == 0) throw string("zero");
---
> if (i == 0) throw "zero";
23c24
< catch (string& s) {
---
> catch (char *s) {

でもBus Errorを起こすみたいです。
288287:02/04/23 16:46
うが、引数逆にしちゃった(w
>どうやら throw "zero"; だけではchar *型の例外を投げたことには
>ならないようです。やれやれ。

const char* 投げてることになってるんじゃないかな?
>>289
産休。某処理系で試してみてくらしゃい。

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;

void my_terminate()
{
cout << "unexpected error occured!" << endl;
exit(1);
}

void foo(int i) throw (const char *)
{
if (i == 0) throw "zero";
cout << "non-zero";
}

int main()
{
set_terminate(my_terminate);
try {
foo(0);
}
catch (const char *s) {
cout << "error : " << s <<endl;
}
}
291241:02/04/23 19:34
>>241=>>244です。
再makeしたら動くようになりました。
これを使って、coutを継承してoperator<<をオーバーライドし、
int等の自動変換を継承しつつ、
char*やstringが渡された時に自動的に文字コードを変換するようなものを
作ることはできるのでしょうか?
できるか、という御下問ですが、結論だけをもうしますと、できます。
ただし、インスタンスであるcoutを継承する、ということはできません。
#defineなど邪法を用いれば、おそらくお望みの結果となるでしょう。
>>291
フィルタ的なストリームバッファを実装してみたら。
>>290
某処理系では何を投げても seg. fault か bus error になるようです。set_terminate効かず(泣
どうも原因は283のリンク先にあるとおりlibc_mallocでこけてるみたいです。
>>294
ライブラリがバグってるんじゃ手の施しようがないね。
g++の修正差分って配布されてないの?
296デフォルトの名無しさん:02/04/24 00:54
class A{
public:typedef void(CA::*FUNC)(void);
template<typename T>typedef void(CA::*Multi)(T);
FUNC fff[4];
A(){fff[0]=(Multi)foo;}←--------このMultiみたいに汎用のキャストって出来ます?
void func(){cout<<"func"<<endl;}勿論これはエラーなんですが・・・・・。
void foo(int a){cout<<a<<endl;}
};
297デフォルトの名無しさん:02/04/24 01:04
>>296
何をしたいのかよくわからんが、
関数オブジェクトでも使っとけ。
298デフォルトの名無しさん:02/04/24 01:08
ち、違うんだ〜〜
typedef void(*FUNC)(void);
void foo(int a){......}
void hoge(double a){........}
FUNC fff;
fff=foo;//エラー
これを、
fff=(Multi)foo;
fff=(Multi)hoge;
と書きたいんだ〜〜
>298
fffを引数可変な仮装関数みたいな感じにしたいみたいだが、
ちっとはコンパイラ開発者の身にもなってみろよ。
そういうそういうことができたとして、
fff = (multi)foo; fff(3);
fff = (multi)hoge;fff(3);
を、どうコンパイルする、っていうんだ?
引数をpritnfスタイルにして共通化するとか、
VARIANTオブジェクトに共通化しる!
300デフォルトの名無しさん:02/04/24 01:20
>>298
fffに代入した後はどうやって使う気だ?
もしかして引数の型で呼ぶ関数を変えたいとか?
301298:02/04/24 01:33
う〜ん、やはり不可能みたいですね(よく考えたら当たり前という気がしてきた)
全メンバ関数アドレスを単一の配列に格納して使用したかったんですが、
無理となると、さてどうしようか
全部void*で格納しといて使うときまたキャストするとか
ああ、いや、使うときにキャストを意識したくないんです。
だからMultiにキャスト出来る方法ないかな〜〜と考えてたわけ。
fff=(Multi)foo;(Multi)foo(3);
fff=(Multi)func;(Multi)func(3);
としたかったのよ。でも無理だねぇ。
>302
メンバ関数へのポインタのサイズはsizeof(void*)以上になることがあるよ。

305デフォルトの名無しさん:02/04/24 02:01
>>303
typedef void (*FUNC)(...);
FUNC fff[3];
void foo(...);
void hoge(...);
見たいなのか?
( ´∀`) エッ?
>>305
だから、まぁ、そうなんだけどさ・・・・
308デフォルトの名無しさん:02/04/24 03:42
( ゚Д ゚) エッ?
309デフォルトの名無しさん:02/04/24 11:55
0から1の間の数をランダムに10個表示させたいのですが。
実行するとx=0ばっかり出てしまいます・・・


#include <iostream>
#include <math.h>
using namespace std;
void main()
{
for(int i=0; i<=10; i++)
{
double x=rand()/RAND_MAX; //0〜1のランダムな数
cout << "xは" << x <<"\n" ;
}
}
310309:02/04/24 12:08
double x=(double)rand()/RAND_MAX;
これで出来たような気がします。
>>258
C言語ではそうだね。
312デフォルトの名無しさん:02/04/24 23:12
>>296
template<typename R_Type,typename Seed>void caster(R_Type& lhs,Seed& rhs){
lhs=reinterpret_cast<R_Type>(rhs);
}
こんなのどうよ?
>>312
reinterpret_cast使った時点であぼーん決定。
>>312
代入時のキャストはそれでもいいけど、関数を呼ぶ時はどうすんの?
315デフォルトの名無しさん:02/04/24 23:59
a=27などと表示させたい場合
printf("a=%d",a);←これであってますかね。
これを
std::cout<< <<std::endl;
を使うとどういうふうに書けばいいんですか?
std::cout<<"a="<<a<<std::endl;
ありがとうございました!!!!!!>>316
endl使ってる時点ですでに互換性無し。

std::cout<<"a="<<a;if(0)std::cout<<std::endl;
が正解だろ。
>>313
Seedがキャストされる前の型なんだから、それをどっかに確保して
関数呼ぶときにそれを使ってキャストしる。
ねー、endlって処理系(OS?)依存なのっ?
はつみみです。
てゆーか、>>318 が何言ってるのかぜんぜんわかんにゃ。
>>322
318じゃないけど、
endl突っ込んだら改行しちゃうよ。
でもやっぱりif(0)以降はわかんにゃ。
324323:02/04/25 01:14
あー、315が「endl使うと」って書いてるから無理やり入れてあんのか。
if(0)は//の代わりに入れてあるのか。
326322:02/04/25 01:31
わかった。
よーするに、>>318 はヒネクレモンというわけだ。
>323
あー、そういうことか。
もとのprintfのほうには、"\n"で終端してないってことか。
しかし、それを「互換性無し」という318もなんだかなー。
328デフォルトの名無しさん:02/04/25 05:10
ひねくれもんage
ヘソ曲がりなコード

int main()
{
int i = i;         // (`へ´)
return 0;
}
330デフォルトの名無しさん:02/04/25 20:53
例外指定ってありますよね
void func() throw(); <- これです。
これを指定しておくと、どういう効果があるんですか?

throw()は例外を投げないという指定だと思いますが、
この内部で例外を投げると
1 無かったことになる
2 捕捉することが出来ない
どっちなんでしょうか?

VC++6.0しか持ってないので、確認できないんです。
>>330
3.異常終了します。
unexpected()が呼ばれる
set_unexpected()で変更出来る

だったと思うけど
で、デフォルトのunexpected()がabort()を呼ぶと思う
set_unexpected でハンドラ変更したりしたところで呼び出し元には戻れないから、要するに結局のところ abort するっつぅことやね。
ダイアログ出したり、変更をファイルに書き出したりする
チャンスが与えられてる、ってのは大きな違いかも。
ふと思ったこと。set_unexpectedのハンドラから呼び出し元に戻る事は出来なくても、
unexpectedハンドラの中から、メッセージループを実行したりして
そのままずーっと実行を続けてもいいんだろうか。
>>336
ワラタ
やってみ。
338デフォルトの名無しさん:02/04/26 07:39
ファイルがオープンできなから例外を投げるのはOKでしょうか?
>>338
謎な文章書かないでください。
340338:02/04/26 07:43
ごめんなさい
こっちが正しいでありんす

ファイルがオープンできなかったら例外を投げるのはOKでしょうか?
当然オープンできなきゃ困るファイルが開けない…なら
例外を投げて処理するべきだろう。そうでもないなら
エラー処理の仕方の方針の問題な気がするのでてけとーにせよ。
>>340
いいんでないの?
MFCのCFileクラスもコンストラクタがそういうことしてるし。
343お願いします:02/04/26 11:25
feet=floor(totalInches/12.0);
いま、LABをやっているんですけどこのheader file
を教えて下さい
>>343
LABって何よ?
345デフォルトの名無しさん:02/04/26 11:45
343 desu

homework dedu

宿題なら自分でやれや。
>>343
マニュアル調べるなり検索するなりすれよ。
人をマニュアル代わりにすんなよ。
そもそもスレ違いだしな。
349338:02/04/26 17:09
おいお前ら(>>341-342さん)!

・・・・・


m(^▽^)mありがとうございま〜した。また次もおながいしまーっす
350l:02/04/26 17:44
>>343
マスかけや
わかるかな?わかんねーだろな
例外で気になったんだが、コンストラクタから積極的に例外を送出するコードってどう思う?
俺はコンストラクタ以外に構築メソッドを用意せずに、どんどん例外を投げてるんだが。

たとえば、ファイルクラスでも、open/closeで一つのクラスを使い回すのは
あまり好きじゃないんで、construct/destructで一連の作業を終了させ、
再利用できないような設計してるんだけど。
>>350
ワロタ
>>351
良いんではないかね。Javaもそうだし、リークに気を付けさえすれば、特に問題ないかと。
むしろ iostream とかがそういう風になってないのが嫌な感じ。
354HHH:02/04/27 01:50
平方採中法で乱数作るプログラムを書きたいんですが、
例えば「1234567890」という数値から「34567」という真中の桁だけ抜き出す
にはどうしたらいいんでしょうか?
正数だけなら
long n = 1234567890;
long x = (n / 1000) % 100000;
あ〜やっとC++のキーワードをソートできた〜
>>351
俺もそうしてるよ。いちいち「もしopenをやってないなら」とかチェックしなくてすむのがいいよな。
>>353はリークの心配をしてるみたいだけど、全部のクラスをそういう風に自己責任で
構築させるようにしていくと、必然的に、どんなタイミングで例外が出てもリークが
起きないようになっていくよ。
>>357
ほんとのところ、例外のリークとかは実装時に考えることにして、
あんまり深く考えてなかったんだけど、たまたまMSDNの例外安全の文章を読んでたら、
出来る限りコンストラクタから例外を投げるなという記述があったんで、気になってた。

コンストラクタ内部で例外を捕まえなかったということは、
その例外からの復帰が不能だということだから、内部で無理に捕まえなくて、
呼び出し側に例外をスルーしちゃってもいいと思ってた。

もちろん、例外指定を行えずに未知の例外が飛んでくるわけだから、
あんまり関心出来た事じゃないとは思うんだけど、catch (...)で捕捉して、
オブジェクトの作成に失敗したと扱うのは、汚いコーディングなのかな、とか。
359357:02/04/27 12:59
>>358
このページのことかな?
http://www.microsoft.com/JAPAN/developer/library/vccore/_core_exceptions.3a_.exceptions_in_constructors.htm
このページに限らず、MSDNの例外に対する記述って、やり方が古いんだよね…。
More Effective C++ 、Exceptional C++ に記述してあるやり方なら、なにも問題は
起きないはずだけど。

>呼び出し側に例外をスルーしちゃってもいいと思ってた。
いいと思う。俺はやってるよ。
ところで、「スルー」は「through」の意味で言ってるよね?「throw」は「スロー」…。
(いや、俺は例外を初めて見たときは読み間違えてたからね)

>catch (...)で捕捉して、 オブジェクトの作成に失敗したと扱うのは、汚いコーディングなのかな、
これもやってる。汚いとは思ってない。ただまあ、CFileの例外はEFile,CRegの例外はERegって
風にクラス分けはしているけど。
360デフォルトの名無しさん:02/04/27 16:27
VC6で Effective C++ のシングルトンをやろうとして下のように記述したら、
コンパイルエラーが出ます。

class Hoge{
public:
  static Hoge& GetInstance(void);
private:
  Hoge(void);
  ~Hoge(void);
};

Hoge& Hoge::GetInstance(void){
  static Hoge obj;
  return obj;
}
Hoge::Hoge(void){
}
Hoge::~Hoge(void){
}

error C2248: 'Hoge::~Hoge' : private メンバ (クラス 'Hoge' で宣言されている)にアクセスできません。

C++の仕様としては、このエラーはおかしくないですか?
ほかのコンパイラではどうなるのか、知ってる方は教えてください。
もしVC6だけのバグなら、.NETでは直ってるかどうかって情報も欲しいっす。
>>360
staticメンバobjの宣言がHogeの中にない。
>>360
コンストラクタとデストラクタはpublicに置いて下さい。
>>360
あんたの言うC++の仕様って何?
おかしいと思う根拠は?
>C++の仕様としては、このエラーはおかしくないですか?
仕様と照らし合わせたんだよね?

・誰がHogeクラスのインスタンスを破棄するか考える
・破棄者はHogeのメンバであるか、お友達であるかよく考えてみる
>>362
コンストラクタがpublicだとどこからでもインスタンスが作れるので、
Singletonクラスとしてはダメな設計だろ
365デフォルトの名無しさん:02/04/27 16:52
age
>>360
おかしくない。obj のコンストラクタは、Hoge::GetInstance() が最初に実行
された時に呼ばれるが、デストラクタは、プログラム終了の一部 (= Hoge の外側)
で呼ばれるため。
僕は>>360が嫌いです。

「Effective C++の」とか言ってるくせに、実書のページすら書いてないところが嫌いです。
「仕様としては」とか言ってちょっと知ったかを気取ってみたりするところも嫌いです。
「他のコンパイラではどうなるのか、教えてください」とか言って自分で試さないのも嫌いです。
そして何より、「VC6のバグなら」「.NETでは直っている」とか言ってバグと決めつけているのが大嫌いです。

だから、僕はこのレスをつけてみようと思いました。
>>366
答えを書いちゃうなよ。
この場合、>>363を見て本人に考えさせるべきだったんだ。
>>367
なんだ、なんだ。なんか嫌なことでもあったのか ?
>>366
この場合Hogeはstaticで定義されているから、GetInstanceを何度呼ぼうと
実体は一つしかないんだよね。
371デフォルトの名無しさん:02/04/27 17:15
>>367
なんで >>360 が「バグと決めつけている」と決め付けているのか
小一時間...。さらしあげとこ。
>>370
そうだけど、今問題にしている箇所はそこではないよ。
373366:02/04/27 17:25
>>370
細かい突っ込みで申し訳ないけど、意図してんのは obj のことだよね。
で、実体が一つしかないのは C と同じなんだけど、C++ はコンストラク
タと、デストラクタがあるからそのタイミングが問題と言うだよね。

個人的な意見としては、static で定義されているオブジェクトは、
main() 呼ぶ前に構築して、main() 終了後に破棄すると言う仕様の方が
わかりやすいと思う。もちろん、実際に使うオブジェクトだけ構築する
今の仕様の方が効率はいいと思うけど、ちょっとやりすぎな気がする。
標準化団体のメンバーになって提案してくれば〜?
375366:02/04/27 17:35
>>374
はは、流石に今からやっても余計混乱するだけだし、まああんまり困って
るわけじゃないからねぇ...。たわごとと思って聞き流してくれろ。
376360:02/04/27 18:31
>ページ
改訂2版のEffective C++ では、241ページ以降に書いてあります。
項目47、「非ローカルスタティックオブジェクトは、使用前に必ず
初期化されるようにしよう」です。

>C++の仕様
俺が調べたのはARMの記述です。これに関しては手元に本がないのでちと記憶が
曖昧ですが、「デストラクタもほかのメンバ関数と同様に、明示的に呼び出すことも、
アクセス制限を加えることもできる」ってな感じのことが書かれてました。
ARMは仕様書じゃないって? そのとおりですな。すみません。「仕様」は
言いすぎでした。回線切って首をつるほどじゃないけど、反省します。

>誰がHogeクラスのインスタンスを破棄するか考える
>破棄者はHogeのメンバであるか、お友達であるかよく考えてみる
>>366でも答えは書いてありますけど、Modern C++ Design(和書のほう)の
143ページにも答えは書いてあります。詳細な擬似コードまで示して。
でも、そのModern C++ Design の141ページで、コンストラクタも
デストラクタもprivateで宣言されて、シングルトンを実装されてるんです。
で、この記述に沿って実装しようとしてエラーが出たから、なんでじゃー、
と思ったわけです。

……最初からModern C++ Design のことを書いときゃよかったっすね。
>>376
>>366がおかしくないと言ったのは、あんたのコードがおかしくないじゃなくて、
エラーがおかしく無いという意味だろ。

Effective C++だとデストラクタはprivateで宣言されていない。

Modern C++ Designは持ってないから確認できないが、
そのSingletonはローカルstaticオブジェクトを返しているか?
newしてそのインスタンスを返してるんじゃないのか?

その場合は、破棄をしないか専用のdeleterを用意しているはず。
推測でしかないんだが、おそらく、
Hoge& Hoge::GetInstance()
{
 static Hoge* pHoge = NULL;
 if (pHoge == NULL) {
  lock();
  if (pHoge == NULL) {
   pHoge = new Hoge;
  }
  unlock();
 }
 return *Hoge;
}

こんな感じじゃないのか?
379デフォルトの名無しさん:02/04/27 18:58
char *p,s[][256] = {"abc","bc","c","","abcde","**abc","\na bcl+","@ab","abc","cba"};
int i;
for(i = 1;i < 10;i++)
cout<<((p = strstr(s[i],s[0]))?p:'@')<<endl;


これ、どこかマズイでしょうか?
まずそうな個所を指摘してください。お願いしますね
Modern C++ Design見てみた。
単純なstatic objectだし、確かにデストラクタをprivateにしてるし、
しかも利用者に勝手に開放させないためと本文にわざわざ明記してるので
コードの誤植とも考えにくいな。
>>379
その質問は何のためにしているんだ?
エラーが出て解決できずに困っているのならそのエラーを書くこと。
動作が意図と違うのならどんな意図をしているのかを書くこと。
単にスタイルの問題を指摘ほしいのなら、そう書くこと。
宿題ならスレ違い。
vc++ 6.0 NG
bcc 5.5.1 NG
gcc 2.95.3-4 OK
digital mars 8.26n OK
'@'じゃないだろ。'@'じゃ。

10という決め打ちもいくない。
こいつにModern C++は早すぎるんじゃねえか?

VC++はあまりMOdernじゃないから、そのままやってもうまくいかない場合があるぞ。
385379:02/04/27 19:14
あ、すんませんです。
本当は自作のstrstrがstrings名前空間に入ってるんで
そのテストとしてやってたんですが
三項演算子の偽部分が「'char' 型は 'char *' 型に変換できない」
ていわれるんです。
何故でしょうか?
charがchar*に変換できないから。

具体的には、3項演算子で (省略)p:'@'で、
pがchar*
'@'がchar
です。

"@"とかにしましょう
エラーメッセージのままだよ。'@' の型を知ってるかい ?
>>385
>>383ってことだな
三項演算子の真と偽は同じ型でなきゃいかんだけの話
389379:02/04/27 19:19
三項演算子のオペランドって異なる型じゃだめだったのですか?
うーん知らなかった(._.;)
みなさんありがとうございました
本を読み返してみます(._.;)
何かに代入しなければコンパイルを通しちゃってもいいと思うが、決まりならしかたないよな。
>>391
つーか、代入しないなら if() 使えよ。

>>388
ウソ書くなよ。double = xxx ? double : int; とかでも大丈夫だよ。
あくまでも、代入先の型と合わないと言っているだけで、真と偽の型が違
うから怒っている訳じゃねーぞ。
393360:02/04/27 19:57
>>377
あ、>>366の意味はわかってます。けど、俺の書き方がまずかったですね。
誤解を招くような書き方でした。

>>382
ありがとうございます! やっぱりコンパイラ次第では通るんですね。
ところで、これを全部ひとりで確認されたってことは
全部インストールされてるってことですよね……。
俺も複数のコンパイラをインストールして、今度からは自分で確認
するようにします。
>>393
いや、通っちまうのは変でしょ。そっちのほうがバグだと思うけど。
つか、Modern… の 6.3 と 6.4 は切り離して読んだほうがよい。
6.4 はあくまでも Meyers' Singleton に対するコメントでしょ。
6.3 (つまり筆者がやろうとしている方法) とは関係ない。
395360:02/04/27 21:06
>>394
たしかにそう解釈もできますけど……。
けど、6.5のソース(145ページ)はどうします?
privateデストラクタと、Meyers' Singletonの両方を組み込んだ
ソースがばっちり載っちゃってるんですが。
396360:02/04/27 21:22
>>394
たしかにそう解釈もできますけど……。
けど、6.5のソース(145ページ)はどうします?
privateデストラクタと、Meyers' Singletonの両方を組み込んだ
ソースがばっちり載っちゃってるんですが。

……というか、この問題に決着をつけるのは、『プログラミング言語C++』で
どう記述されているか、しかないと思います。
俺、持ってないんですよね。お金に余裕が出来たら買って読みますけど、
その前に、持ってる人おられましたら教えていただけませんか?
(なるべく、該当部分の記述をそのまま引用していただけたら嬉しいです)
397360:02/04/27 21:32
うわちゃ、すみません。変な二重投稿になってしまいました。
>>396
買わなくてもwebに資料あるぞ
http://joda.cis.temple.edu/~ingargio/refman.pdf
399デフォルトの名無しさん:02/04/28 00:35
>>392
if-elseを一行にすっきりとかけてなんかいい感じじゃん。
400デフォルトの名無しさん:02/04/28 00:55
確率のシミュレーションをC++でやっているのですが、演算結果をExcel等で処理したいんです。
ところがDos窓だと25行しかでないので、データのコピーができません。
ここで、スクロールバーが出せれば上のほうにさかのぼってコピーできるのですが・・・

CSV形式でファイルに出力という方法も考えたんですが、こっちは難しそうなので・・・

キーワードだけでもいいのでご存知の方教えてください。
401デフォルトの名無しさん:02/04/28 00:57
>>400
なんだかよくわからんが、>や>>をつかってファイルにリダイレクトする方法じゃだめなの?
402デフォルトの名無しさん:02/04/28 00:57
>>400
一番簡単なのはリダイレクト
それでは、
ほげほげ(EXE名) >ほげほげ.csv[リターン]
と入力すればよろし
404400:02/04/28 01:05
ちょっと初心者すぎてよく分からないです。

特に指定しない限り、出力はすべて画面に表示されます。
-o オプションを使うと、画面出力をページ単位で停止し、キー入力を待つことができます。
これはコマンド ラインを手入力する場合に便利です。
また、同じ -o オプションを使って、出力を無効化またはリダイレクトできます。

ってのがヘルプで出てきたんですが、どこにコマンドを入れるのかさっぱりです。
ちなみにC++と書きましたが、Visual C++ 6.0です。
>>404
開発環境は関係ない。
コマンドの最後に >file.txt と打てば、file.txtという名前のファイルに(標準出力が)出力される。
追加書き込みの場合は>>で。
406405:02/04/28 01:11
試しにdir >flist.txtと打ってみな。
現在のディレクトリの中にflist.txtというファイルができて、dirの出力結果が書き出されているはずだから。
>>404
むきゃー!!
...みんなに内緒でおしえてあげる。
スタートメニューからDOSプロンプトを立ち上げて、
あなたのプロジェクトのDebugもしくはReleaseフォルダに移動します。
それであなたの
[プログラム名] > [出力ファイル名][ENTER]
だってばサ。
>>405
>file.txtという名前のファイルに(標準出力が)出力される
標準出力が端末画面からファイルに切り替えられて、
file.txtという名前のファイルに出力される
集団けこーん式場はここですか?
>>408
むきゃー!!
411400:02/04/28 01:21
なるほど、できました。
ありがとうございます。

追加になりますが、スクロールバーを出す方法とかはないんですか?
Win2K使う。
lessを入れる
415400:02/04/28 01:37
Win9x系だと面倒なんですね。
学校はWin2kだったから普通に出たのか。

この板ははじめて来たのですが、いい人がいっぱいいるようですね。
色々お世話になりました。
いいひとだってサ。気持ちがよいね。
(*´д`) てれるぜ
おだてれば何でも応えてくれるスレってここですか?
そうですよ。
>>418
違う。答えられればなんでも答えるスレ。
よし、今度はなんの質問だぁ〜?
VCでboostのtokenizerを使いたいんですけど、
TCHARベースでうまく動かす方法はないですか?

char_traitsがMBCS対応してないので今は自分で作っちゃってますけど、
なんか納得行かないんです。
正式対応していないようだが。
それよりboostをVCで使う意味がわからんのだが。
それなりのスキルを持ってるんだったら、
なっとくいく自作ライブラリを作ったほうがよいとおもうのだが。
>>423
> それなりのスキルを持ってるんだったら、
> なっとくいく自作ライブラリを作ったほうがよいとおもうのだが。
Boost 並のクオリティのライブラリを書くのは「それなり」のスキルでは厳しいと
思う。あるモノは素直に利用しようよ。(ライセンスも緩いことだし)
>>426-999
v(^・^)v
>>425
v(^・^)v
427392:02/04/28 11:19
>>399
書きやすいかも知れんが、読みにくくなるからヤダ。
>>427
Lispに比べれば・・・比べちゃいかんのかもしんないけど。
>>428
LISP も、慣れれば特に読みにくくないぞ。まあ、括弧が多くてウザイから、
きちんとインデントしてないとつらいけどね。

でも、C/C++ でも
if(x == 0){ int y; y = x + 1; if(y == 0){ int z; x = y + 1; printf...
なんて書いてあったら、萎えるよ。要は、きちんとインデントして普通に書けって
ことだよ。
)))))))))))))))))))))))))) <- これ、ダサい(LISP)
>>430
}}}}}}}} <-これ、ダサい(C++)

いや、マジでいたんだよ、びびった。
>>431
見てみたいYO!
C++標準ライブラリ チュートリアル&リファレンスってのを読んでいるんですが、
4章に出てくる auto_ptr_ref ってどう役立っているのですか?
動きが(゚д゚)サパーリです。。。
434デフォルトの名無しさん:02/04/29 03:40
例えば何ですが、

int a[][][]....[];

のような配列の次元数をダイナミックに扱う
方法ってあります?
int***....* a;
436435:02/04/29 03:47
    (゚д゚)  カンチガイダッタ!
   ~(  )−
    / >
漏れは434じゃないけど、便乗。
二次元以上の配列の動的確保ってどうやんの?
二次元ができてそれ以上ができない理由はなんでしょう。
439438:02/04/29 03:54
    (゚д゚)  二次元「以上」か・・・ゴミン。
   ~(  )−
    / >
ごめん
一次元以上
int (*p)[10] = new int[10][10];
こういうのとかではなく?
442434:02/04/29 04:14
言葉が足りませんでした

int a[][];→int a[][][];

と実行時に、配列の次元数を変えたいのです
やっぱ無理かな?
そういうクラスを作ってあげるのがいいと思うYO!
>>437
このスレの >>175 ぐらいから嫁。
445デフォルトの名無しさん:02/04/29 07:09
>>443
そうね。正道。

>>442
個人的には、operator[]に拘らなくていいなら
class Dims {
public:
int iSize;
vector<Dims *> Next;
Dims(int size) { iSize = size; Next.resize(iSize); }
};
で配列の実体確保は、Dims.iSizeの積で求めて、new int[]する
のようなのは思い付くけど、それじゃあだめなんだよね...
446515:02/04/29 07:30
>>445
operator[] に拘るのはちょっと難しいかと...。次元が可変なんだから
コードの書きようがないと思う。

>>442
つーか、どういう使い方するんだ ? 単にできるかどうかが問題なの ?
447デフォルトの名無しさん:02/04/29 08:59
可能かといえば可能だけど、クラスを作るしかないです。
そういう基本的な文法では対応してないです。

でもこういう場合、「設計直せ」の方がいいと思う。
448初心者:02/04/29 09:18
初めまして。初心者なのですが分からないことがあるのですが、
教えてもらえますか?スピンコントロール2個を連動させるという
設定をしようと思っているのですが、どうもうまくいきません。
合計の最大値が決まっていて最大値から片方のスピンの値をマイナスした
値がもう一方のスピンの最大値になる、という形を作りたいんです。
今のところ下記のようなコードを書いたのですが、なぜかエラーが・・・
どこか間違っている所などあったら教えてください。
BOOL CDialog2::OnInitDialog()
{
CSpinButtonCtrl* pSB1 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN1);
CSpinButtonCtrl* pSB2 = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN2);
pSB1->SetRange(0,40);
pSB2->SetRange(0,40);
return FALSE;
}

void CDialog2::OnKillfocusEdit1()
{
max1 = GetDlgItemInt(IDC_EDIT1,NULL,FALSE);
mm_max2 = 40-max1;
pSB2 -> SetRange(0,mm_max2);//ここで問題が起きてるみたい・・
}
void CDialog2::OnKillfocusEdit2()
{
max2 = GetDlgItemInt(IDC_EDIT2,NULL,FALSE);
mm_max1 = 40-max2;
pSB1 -> SetRange(0,mm_max1);
}
長くなってしまってすいません・・・よろしくお願いします。
すれ違い
>>449
なんですか、あなたは
答える気がないなら黙っていてください。
451デフォルトの名無しさん:02/04/29 10:19
エージ
>>450
なんですか、あなたは
マナーを守れないなら黙っていてください。
453初心者:02/04/29 10:45
すいません・・・書く場所間違えたのかな?ごめんなさい。
>>453
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/test/read.cgi/tech/1014057520/
455初心者:02/04/29 10:55
おお!ありがとうございます。早速!!
皆さん失礼しました。
456初心な人:02/04/29 15:37
関数が別のファイルに定義されていたらextern func();ですよね。
クラスが別のファイルに定義されているときはどう書くんでしょ
う?extern class aa;と書いたらおこられちゃった。
externて書かなきゃいい
http://www2.airnet.ne.jp/pak04955/ramble-199912.htm

>ポインタ変数の大きさはintの大きさと同じではない。現状sizeof(int) = 4, sizeof(void*) = 4の環境が多いが,64bit環境ではsizeof(int) = 4, sizeof(void*) = 8となる場合がある。
うぁっ、誤爆
Go back!!!
>>456
普通、クラスの定義はヘッダーファイルに書いて、使う側とインプリメン
トする側で同じヘッダーファイルを読み込む。

--- aa.h ---
class aa {
private:
...
public:
aa();
~aa();
};

-- aa.cpp --
#include "aa.h"
aa::aa()
{
...
}

aa::~aa()
{
...
}

-- file.cpp --
#include "aa.h"

void foo()
{
a aa;
...
}

と言う感じ。(ANSI-C なら、関数プロトタイプでも同じようにやると思う
けど...。)
462初心な人:02/04/29 17:37
ありがとう>461
必ずヘッダーファイルを別にしておくのね。
ほのぼの
464A子:02/04/30 00:24
ageてもいい?ねえageてもいいの?
465デフォルトの名無しさん:02/04/30 00:29
C++なのかCなのか分からないけど、
関数のdefineの方法が本読んでもよく分からないんです。
誰かおせーてください。
C/C++のプリプロセッサのdefinedですか?
Perlにはdefineっていう関数だか演算子ががあったけど
>>465
define?
#defineのこと?
だとしたら関数も何も違いは無い気がする。
469465:02/04/30 00:33
>>466,467
#defineのことです。
>>469
関数に#defineは使わないと思うけど…
何したいの?
引数付きのマクロと見た
>>465
漢ならdefineの代わりにinlineとconstをできるだけ使え。
templateも使用すると吉
474465:02/04/30 00:54
間違えちゃった。
#defineじゃなくてtypedefでした。
スマソ
inlineはDebugとReleaseでは速度が10倍とか20倍とか違うんで困
る場合も結構あるんだよなぁ。普段はReleaseでビルドしてとめた
い時だけDebugってやってるけどちょっと面倒。
476デフォルトの名無しさん:02/04/30 00:56
>>474
typedef 新しい型名 既存の型名

typedef UINT unsigned int;
これでUINTはunsigned intと同じものに。
>>476 関数の話らしい
typedef 戻り値 (*名前)(引数)
だっけ。
忘れた。
479476:02/04/30 00:58
関数のtypedef?(-_-;)
関数へのポインタをtypedefするのだろうか・・・・
typedefはテンプレートに使えなくて困る場合も結構あるんだよなぁ。
template <typename T>
struct my_vector {
std::vector<T, my_allocator<T> > t;
};
とかやってるけど、やっぱ面倒だよ。
# と、愚痴ってみる。
>>476
逆だろ
typedef unsigned int Uint;
>>481
Oops!
そうだった・・
間違えるかそんなこと・・・。
# ちょっと482には仕事たのめないな。(藁
>>483
typedefなんて使わないし・・・
分かりにくくなるから。
typedef struct{}←これ嫌い。
>>465
単に関数の宣言書いて、前にtypedefつければよろし。
ポインタとして宣言するなら>>478
>分かりにくくなるから。

そんなことは無いだろ。
分かりやすくする為にあるんだぞ。
>>486
型が増えると分かりにくくなる。漏れ馬鹿だから。
せめて構造体はtypedefしないでほしいな。
488465:02/04/30 01:10
int KANSU( char* a ){
}

の場合、typedef int* BETSUMEI( char* a )ってこと?
>>488
お前もういっぺん478嫁
>>488
それだとint型へのポインターを返す関数になってしまう。
int (* BETSUMEI)(char *a)とやらないと。
慌てないーで お嫁サンバ〜
>>486
ライブラリ内で規約を設ければ解かり易くもなるが、
アプリ側ではタイプ数減らすために使うほうが多いだろうな。
スマートポインタなんかのテンプレートクラスはtypedef使わないとちょっとやってらんないな。
漏れは>>488のおかげで、
括弧を付ける理由が今わかった。
494にも仕事はやれん。(藁
>>495
演算子の優先順位表を頭に焼き付けてきました。
仕事ください。
497494:02/04/30 01:25
>>495
>>496
漏れは無職だよ。
おまいら、仕事欲しいならJavaスレに行った方がよいぞ。
>>498
現在就職活動真っ最中でして・・・・
内定ください。
500デフォルトの名無しさん:02/04/30 01:33
今日は朝6時ごろからずっと起きてるから
なんか神が降りてきた・・・・
501デフォルトの名無しさん:02/04/30 01:34
500げとずざー

ん?失敗か。

何みてんだゴルァ!!

Borland C++ Builder 6をよろしくね☆
http://www.borland.co.jp/cppbuilder/
502465:02/04/30 01:35
なんとなく分かったよーな気がします。490に感謝。
typedef int(_stdcall *KANSUMEI)(char* a);
↑こーゆーのはまだ意味わからんですが、
漏れがんばる。
   ||
   ||
   ||
   || スルスル
   ||
 ∧||∧
(  ⌒ ヽ 神です・・・・  
 ∪  ノ 
  ∪∪
504476,490:02/04/30 01:37
>>502
感謝されても困るんだが。
typedefの構文を間違えるような奴だし(藁
505500:02/04/30 01:37
カミガ オリテ
キタキタキタ━━(゚∀゚;)━━!!!


なんでも俺に聞け!!任せろ
>>505
お休み
505は仕事があるのに2chに逃避しているに500カノッサ。
508465:02/04/30 01:47
>>504
漏れアセンブラしか分からんす。
高級言語はどーも苦手。
と言ってみたいという願望を書いてみるテスト。
>>508
むきゃー!!
く・や・し・いぃぃぃーーーっ!!!
おちつけ
511デフォルトの名無しさん:02/04/30 01:54
classがウマー(´Д`)
OOがウマー(´Д`)
512Ð ë á t h ¹³:02/04/30 01:56
   ||
 ∧||∧
(  ⌒ ヽ 500が消えたので 
 ∪  ノ  上へまいりま-す・・・
  ∪∪  

   ⌒
   ⌒
513465:02/04/30 01:57
ムヒヒ。
514デフォルトの名無しさん:02/04/30 02:04
例外処理のメリットっていまいちわからないんですが・・・。
誰かおしえてプリーズ!
>>514
何らかのエラーが生じた時、通常は戻り先でelse ifの連続ショーが始まったり、
エラー処理があちこちでバラバラに分散してしまうが、例外にすると、エラー
処理を一カ所にまとめられるので見やすい。バグが出にくい。等々
516デフォルトの名無しさん:02/04/30 02:08
Cはやったことありますか?
Cのエラー処理と比べるとだいぶウマーな漢字になってます
517465:02/04/30 02:11
>>514
教えてあげたいところですが、
例外処理の意味すら分かりません。
出直してきます。
>>514
何十にもネストしたループを脱出す時はgoto使うと便利でしょ?
同じように、関数呼び出しから一気に巻き戻すのに例外は便利なのだよ。
C言語では関数外にジャンプするときはsetjumpとlongjumpを使うが、こ
れではデストラクタが呼ばれないので例外って仕組みが必要なわけよ、オーケイ?
>>514
Cで言うと、longjmp、setjmpとよく似ている。これらをよく観察すれば、
例外の意味も少しわかると思います。
520デフォルトの名無しさん:02/04/30 02:18
>>518-519
割り込みスマソ
longjmpに似ているということは、一度通った場所にしか戻れないの?
>>514
エラーの取り残しがないって事かな。
戻り値で判定する場合、ifでチェックし忘れたエラーコードは検出できないけど、try/catchなら、チェックしなかったエラーはより上位のcatchに飛ばされるから、必ずどこかでつかまるよね。
>>519
どちらかと言えば、longjmp,setjmpで例外の真似事ができるって方が近いかな。
例外は戻るのではなく、投げるものなのでcatchがあるところまで間をすっ飛ばし
ます。先月のインターフェースにCで実装する例外って記事があったよ、確かに、
longjmpとsetjmp使ってたはず。
523522:02/04/30 02:23
>>519でなくて>>520ダタ
>>522
そそ。関数から関数を多重的に呼び出している時、returnで戻ろうとすると
プログラムが超複雑になりますよね。それを例外で一足飛びに戻る。
もしくは途中まで戻って、ある程度仕事をしてから、また再throwする、など。
525514:02/04/30 08:05
様々なレスありがとうございます。

私の場合、プログラムの実行継続が難しいときに
例外を投げるという使い方をしようとしてました。
が、STLのbad_allocくらいしかcatchするものが無い・・・。
例外処理に払うコストが妥当とは思えないわけです。

何か、こういう例外の使い方がウマい!とかありませんでしょうか。
本でも読めYO!
複雑なファイル入力操作とか、いちいちエラーチェックして
ファイルクローズして返すのが面倒くさいから、入力処理と
入力ストリームのエラーチェックを同時に行う関数を用意して、
エラー発生時に例外を投げるようにしてます。
>>527
それって、?stream.exception(mask) じゃだめ?
>>527>>528
ぁ・・ホントですね、そのまんまの機能です。
知りませんでした。_φ(.._)
>>528
なにそれ?
531デフォルトの名無しさん:02/04/30 16:32
domain_errorって何ですか?
例外型の他は概ね利用方法が思い浮かぶのですが、
domain_errorだけどうしても使い道がわからないのですが。
532528:02/04/30 16:38
>>530
exceptions(iostate) で、ストリームがthrowする例外を選択する。

ifstream file(filename);
file.exceptions(failbit|batbit);

これ以降の操作で失敗したり、ストリームが壊れたりしたらfailure例外が投げられる。
上の例だけでもコンストラクタでオープン失敗してたときは、
exceptions()の呼び出しが例外投げる。
>>531
Thrown by the library, or by you, to report domain errors (domain in the mathmatical sense).

googleのトップにでてるじゃねぇか。
あー、数値計算で発生させる例外ですか。
ま、使用方法が思い浮かばないのは漏れの数学知識が
皆無だからでしょうね。
535デフォルトの名無しさん:02/04/30 19:11
template<int NAME[]=0>class X{
public:
X(){
cout<<NAME[0]<<endl;
}
};
これって不可能?class自体はエラー出無いんだけど、実体とると
こけてしまう。
NAME が 0 ならこけるんでない?
>>536サンクス
template難しいわ。例えば、

template<char* n>class X{
public:
X(){
cout<<n<<endl;
}
};

void main(void)
{
X<"aswe"> x;
}
なんて言うか、これってできないの?それても俺の書き方がおかしい?
文字列リテラルは直にできません
外部リンケージを持ったchar[]を渡しましょうや
ていうか入門書にそんくらい書いてあるだろ。
>>537
規格書読めよ。

14.3.2 Template nontype arguments
2 [Note: A string literal (2.13.4) is not an acceptable template argument
because a string literal is an object with internal linkage. (後略)
540デフォルトの名無しさん:02/04/30 20:09
>>538>>539
を、サンクス。いやぁ、templateに手を出したの最近だからさ
勝手が分からなくてね。もちっと修行してくるわ。
541初心者にもなってない:02/04/30 22:04
プログラミングを勉強したいと思っているのですが
候補としては「C」か「C++」なのですが
どちらのほうがいいんですか?
できれば長所短所をおしえてもらいたいのですが。
CをやってからC++
それ以外に選択肢は無い。
1 プログラミングを勉強したい
2 作りたい物があって、そのためにプログラミングを勉強したい

1ならJavaかC#にしておけ。
SchemeとかMLでもいいが、勉強結果が後々使い回し出来ないと思った方がいい。

2ならC++を勧めておくが、出来るなら他言語を勧める。
>>543
で、Cは?
問題外?

私は「プログラミングを勉強したい」という理由ならCを薦めるね。
>>544
たしかにC勉強して身に付くこともあるが、
今から始める人にそんな低レベルな概念から身につける必要は無いと考える。
もちろん、分野によってはCは必須だが。
もっと低レベルなアセンブラから勉強するのが正解(w
アセンブラやらんでいいからコンピュータの基礎概論から勉強してくれよ。
それだけだとつまらんはずだから、プログラミングと平行で。

独学でプログラムだけやってもろくなもんでてこない。
(´-`).。oO(プログラミングの勉強にC… どこかで見たぞこいつ)
>>541
思い切ってC++にチャレンジしてみよう!
>>548
鏡見れば思い出すかも
551デフォルトの名無しさん:02/04/30 23:17
>>542さんの通りやれ
王道を突き進め
552544:02/04/30 23:45
>>545
低レベルかもしれないけど、言語仕様が小さいから勉強にはちょうど良いかなと。

>>548
多分人違い。
「プログラミングの勉強をしたい」っていう理由なら、Cはダメっていう意見も多いね、推薦図書スレあたりで。
計算機科学をまじめにやるならScheme+SICP
作って動かしてみて楽しいのがいいならHSPやJavaScript
作りたいものの規模が大きそうならJava
シューティングゲームとかならC/C++
って感じか。

いずれにしても、身近に詳しい人がいて、いつでも質問できるのが理想、ですかね。
文系か理系かでどっちからやったらいいかってちがうんでないかな。
文系ならオブジェクト指向はわかり易いものだろうが、理系は多態性
を追っかけにくいとかいうようだ。本人のバックグランドをキボーン。
俺は理系だがどちらかというとOOのほうが好み。
thisとかselfの概念があった方がやりやすい。
俺は理系だがOOの方が好み。
どちらかというとOO向け言語にある仕組みや仕掛けが好み。
俺は理系だがOOの方が好み。
Genericsマンセー
>>557
GenericsはOOちゃうやろ。
理系と言っても情報系・数学系とよりハード寄りなその他ではまた傾向が違うのかも。
動的型付けのOOPLは、まんまGenerics。
561デフォルトの名無しさん:02/05/01 05:14
超初心者的な質問で申し訳ないのですが
(明示的)インライン関数やテンプレートを使うと

関数名 はすでに オブジェクトファイル名 で定義されています

と言われてしまいます。
いくつかの .obj に分けてコンパイルしているので、確かにそれぞれの .obj に重複定義されているのですが、こういうやり方はおかしいのでしょうか?
(別々にコンパイルしているので #ifndef --- は効きません)

普通はどうするものなのでしょう?
>>561
ヘッダに全部書いてそれぞれインクルード、の逃げ解決が普通かと。
// c.h
template <class T>
class C {
public:
void func();
};
// c.cpp
#include "C.h"
template <class T>
void C<T>::func()
{
return;
}
// main.cpp
#include "C.h"
int main()
{
C<int> c;
c.func();
return 0;
}

VC6.0でこれをコンパイルすると
「error LNK2001: 外部シンボル ***** は未解決です」
ってエラーが出るんですけど、よくわかりません。
いまは、c.cppの内容をc.hの下に書いていますが、
どうにか上のファイル構成で、コンパイルできるようにならないでしょうか?
お願いします。
>>563
2chでお願いしてもコンパイラの動作はかわらねぇな。
で、ファイル構成は変える気が無いと・・・。
c.hの最後にc.cppをインクルードでいけるか・・・。
それはそうと、外部シンボルの未解決がよくわからんってのはカナーリイタイね。
565563:02/05/01 08:05
すみません、エラーメッセージは正確には
main.obj : error LNK2001: 外部シンボル ""public: void __thiscall C<int>::func(void)" (?func@?$C@H@@QAEXXZ)" は未解決です
です。説明が足りませんでした。
すみませんでした。
566564:02/05/01 08:11
>>565
564のやつじゃだめってことか?
コンパイラとリンカ、それぞれの仕事を把握してから出直せ。
567561:02/05/01 08:50
>>562
勘違いでした^^;
ヘッダに実装も書いていたのですが、そこにうっかり普通の関数を混ぜてしまっていたのが原因でした
(戻り値がテンプレート型だったため「ありゃ!テンプレートが重複してるってエラーだよ!!」と思ってしまったのです)
>>562さんのレスを読んで冷静になれたので気づきました。
ありがとうございました。
568561:02/05/01 08:55
>>563
なんか私のと似たような質問だな…。と思いつつペイフォワードしてみよう。

何が起こってるかがわからないですか?
それはテンプレートが展開されないから、.obj に実装が含まれてないんだと思いますよ。
>>563
c.cpp の末尾に
template class C<int>;
を入れるよろし。
570563:02/05/01 12:06
>>569
ありがとうございます。
あなたは神です。
ctypeの関数はマクロで書けるのにわざわざ関数にしてた・・
鬱だ死のう(-_- )
572デフォルトの名無しさん:02/05/01 15:52
引数付のマニピュレータの作り方を誰か教えて
もらえないでしょうか?お願いします。
>>572
ios::のコード嫁。
ios::のマニュアル嫁。
読んだら作れ。

574デフォルトの名無しさん:02/05/01 17:26
std::advanceって、どうやってBidirectionalIteratorとRandomAccessIteratorを識別してるんですか?
template<class X, class Y>で受け取っちゃってるので、さっぱり想像できません
>>574
例えば、今俺の手元にあるSGI版ならこんな風になっとる。
> template <class _InputIterator, class _Distance>
> inline void advance(_InputIterator& __i, _Distance __n) {
> __STL_REQUIRES(_InputIterator, _InputIterator);
> __advance(__i, __n, iterator_category(__i));
> }

第三引数がbidirectional_iterator_tagの __advance と
random_access_iterator_tag の __advance が多重定義されてるので
上手いこと処理が分かれる。
それ以上のことは iterator_traits とかなんとかその辺でも調べるべし。
576デフォルトの名無しさん:02/05/01 20:27
>>574
タグディスパッチ
http://www.boost.org/more/generic_programming.html#tag_dispatching

(どこかに邦訳があった気がするが)
>>574
そこらへんの説明は、『Generic Programming ―STLによる汎用プログラミング―』
(アスキー)に詳しい。
578デフォルトの名無しさん:02/05/02 00:37
 ☆★☆★☆ ※『プログラマー』板は5/3予選です!※ ☆★☆★☆

/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ○真面目に投票したい人は
| 日頃からプログラマー板にお世話になっている方、
| みずほの一件でプログラマーを応援したい方々。
| 普通に<<プログラマー>>で投票をお願いします。
| 清き一票を!                 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
\__   __________    | ●不真面目な人達は
     ∨  Cafe de Biz CUBE      | 期待されているからには何かをやらねば!
    ∧_∧           ∧_∧   | やはりここはマ板らしく、明らかに不正な
   ( ・∀・)          (´∀`;) < ダントツ1位(でも無効票)を狙いましょう。
   ( つ  )つ□   □ ⊂(    )  | 真面目に投票する人の迷惑にならないよう、
  ┃レ __   | ̄ ̄ ̄ ̄ |  .___ノ┃ | ネタ仕込みの方々は<<デスマーチ>>で投票。
  ┗━┳┳\ | ̄ ̄ ̄ ̄| ./━┳┳┛ | 汚れた一票を!
     ┃┃  |_____|    .┃┃   \____________

天災もとい転載歓迎。自由にコピペどうぞ。
VC++7には面白い構文が付け加わってるね
テンプレートでパラメータクラス内のメンバ探索のための __if_exist とか
親クラスの探索のための __super とか
処理系依存というのが嫌だけど・・・
ヽ(゚∀゚)ノ スーパー!
581デフォルトの名無しさん:02/05/02 03:47
鯖あげ
ヽ(゚∀゚)ノ イフエジスト!
583デフォルトの名無しさん:02/05/02 16:23
キタ━━( ゚∀゚     )━━!!!
アイディアモリ森!!!!
584デフォルトの名無しさん:02/05/02 16:47
 |  |_∧ 
 |_|。▽゚) <イソライソアセソブラの出番だふぉるぁ〜アヒャッ
 |文|⊂)
 | ̄|∧|
 ̄ ̄ ̄ ̄
585sage:02/05/02 16:58
もう大好き!!
チュゥしちゃおう(*^3)
>>575-576
ありがとうございました。
あんまり綺麗な解決方法じゃないなぁとか思ったけど。
しょうがないのかな
>>586
boost ML でつい最近こんな話が出てたヨ。
http://lists.boost.org/MailArchives/boost/msg29007.php
588デフォルトの名無しさん:02/05/03 01:17
class PLUS{
public:int plus(int a,int b){return a+b;}
};
と書いて、

int c=PLUS().plus(12,12);

と書かなきゃいけないんだけど、

int c=PLUS(12,12);

と書きたい場合はどうすればいい?typedef,defienなしで。
コンストラクタにしたらreturn出来ないし・・・・・・
589デフォルトの名無しさん:02/05/03 01:33
>>588
operator()を使えば
PLUS()(12,12)とは書けそうな気がする。
590微妙・・・:02/05/03 01:34
class PLUS{
int buf1,buf2;
public:
int plus(){return 0;}
PLUS(int i,int n):buf1(i),buf2(n){}
operator int(){return buf1+buf2;}
};
っつーか、それをわざわざクラスにしようって思う理由は何よ。
PLUS<12, 12>()
関数オブジェクトの練習?
594588:02/05/03 02:01
>>590
感謝感激雨あられ〜〜〜〜♪ありがとぉ
595590:02/05/03 02:26
>>594
あんた>>591さんの話を聞きなさい名
普通はこげなことやらんでしょうに
596588:02/05/03 02:36
>595
すみません
593さんの言うように「関数オブジェクト」というものの話を聴いて
作ってみたくなりまして。関数のように使うクラスであるからには
PLUS().plus(....)では醜いかな、と。
関数オブジェクトだったら>>589だろ。
関数オブジェクトは違うがな
int operator()(int i,int n){return i + n;}
てなやつを
Type obj;
int j = obj(12,12);
てなやつよん?
599588:02/05/03 02:42
違うの?
「関数オブジェクト」と言うからにはクラスを関数みたいに使えるように
するものだろうと、勝手に推測したんですが。
>>599
それじゃ「関数オブジェクト」じゃなくて「関数クラス」になっちまう。
601588:02/05/03 02:44
>>599
・・・・・・うわ、考えてたのと全然違う。
602588:02/05/03 02:53
>>598の間違い
関数オブジェクトはdelegateのショボイバージョン
604デフォルトの名無しさん:02/05/03 03:18
http://www.serbestyazilim.org.tr/eski/res/image002.jpg


stroustrup
禿てるけど(・∀・)カコイイ!!
ジェームスゴスリングより
(・∀・)カコイイ!!
関数オブジェクトなんて、テンプレートと
併用してナンボだとおもうが。
関数オブジェクトの利点て何?
普通の関数より便利?
関数オブジェクトはインスタンスごとに状態をもてるから、
一種のクロージャとして利用することが出来る。
>>607
ぐ・・・・具体例を・・・おねがい
入れ子クラスの利点をきぼーそ。
>>606
templateと合わせると、関数ポインタよりはinline展開が効きやすいかもしれない。
611初心な人:02/05/03 11:06
coutって書式が不便だと思うけどどう?
iostream.hにあるform()を使えとか書いてあるけど、g++した
らエラーだったし。
612デフォルトの名無しさん:02/05/03 11:23
>>604
いや、かっこよく写るように下から写している。
正面から写っているのはしょぼいぞ
614デフォルトの名無しさん:02/05/04 13:15
今 boost のスマートポインタについて調べてるところなんですが、誰か教えて下さい。
weak_ptrのところに

> When the object last shared_ptr to the object goes away and the object
> is deleted, all weak_ptr objects have their stored pointers set to 0.

という英文があるんですけど、When 以下が良く分かりません。どういう時に
ポインタを0にすると言ってるんでしょう?last がどこにかかるのか分かって
いないだけだと思うので、英語の問題だからスレ違いと言えばスレ違いかもし
れませんが、たぶん使ってる方がいらっしゃるだろうと思うのでここで質問さ
せて下さい。
shared_ptrの参照カウントが0になってオブジェクトが破棄されたら、
それを参照しているすべてのweak_ptrが0にセットされるってことだろ
616614:02/05/04 13:46
>>615殿
はい、たぶんそんなような感じなんだろうなというのは分かるのですが、last
の意味がイマイチ掴めないんですよね・・・
とりあえずオブジェクトが破棄されたらゼロっつーのは分かるのですが・・・
lastがわからないって何だよ。
一番最後にオブジェクトを参照していたshared_ptrが破棄さて(=参照カウントが0になって)
オブジェクトが破棄されたら〜 ってそのままじゃねーか。
618614:02/05/04 15:30
あぁなるほど、
When the object pointed by last shared_ptr goes away.....
って事ですか。ありがとうございます。
last が動詞なのかと思ってワケワカになっとりました。

スレ汚しスマソ。
中学英語じゃねーか
>>619
ツボにはまると、理解できなくなることはある。大目に見といてやれよ。
PlatformSDKの文体とboostのドキュメントの文体とSGI STLのドキュメントの文体でも
色々異なるしな。

書き癖がつかめるまでは他のを読んでる場合でも?なことがある。

英語に達者な人はうらやましいねえ。
漏れは中学生 それでも理解できたから中学英語と言ったんだゴルァ
中学英語すらまともに押さえていないPGだって世の中には山ほど..
洋もののエロ小説とかpenthouseとかはすらすら読めるのになあ。
>>622
褒めて欲しい? それなら技術系の板よりも、馴れ合い系の板に行くことを
薦めるが。
エロ小説は読みやすね、知ってる単語がばっかりだし(w
あと、大統領候補者の演説が、以外にわかりやすい。
> 大統領候補者の演説が、以外にわかりやすい

教育をロクに受けてない連中にも理解できるようにしてるのよ
627JFK:02/05/04 17:26
We chose to go to the moon.
We chose to go to the moon in this decade and do the other things,
not because they are easy, but because they are hard.
「英文として正確な意味」を理解しようとしなければ、技術系の英文も比較的わかりやすいぞ。
基本的には知ってる単語ばかりだし、推測ができるし。
629デフォルトの名無しさん:02/05/04 20:23
Windows関連のコードだけどAPIとか関係なさそうなので
こちらに書かせて頂こうと思います。

メモリ上にあるビットマップのピクセルへのポインタを取得し、
インクリメントで1つ1つのピクセルを調べていくプログラムを
書いていたのですが、
for (y = 0; y < height; y++) {
  for (x = 0; x < width; x++) {
    if (*pBits = 0x00FFFFFF) {  // 色を調べる
    // 中略
    }
    pBits++;              // ポインタをインクリメント
  }
}
↑これはうまくいったのですが、
例えば任意の座標を調べたいときはどうすればよいのでしょうか?
*(pBits + x + y * width)だと実行時にエラーが出ました。
C++のポインタの基本のようなことだと思うのですが
よろしければ教えてください。
>>629
ほんとにそのコードがうまくいったのか小一時間問い詰めたい。
1pxは何バイト?
// 色を調べる?
>>631
そこには突っ込んでやるな
>>629
もちろんビットマップはトップダウンだよね。
じつはパレットを持ったビットマップだったりして。
635629:02/05/04 20:46
ループについては上手くいきました。
ポインタは
COLORREF *pBits;
なのですが(COLORREFはWindowsの型で、=ダブルワードのようです)、
インクリメントでちゃんと次のピクセルを指してくれているようです
(つまり予想通りの結果になりました)。

また、ビットマップはボトムアップで、32bit(パレット無し)です。
(ループの部分ではxとyはループのカウントにしか使ってないです)

インクリメントで型サイズ分ポインタが進むのなら、と思ったのですが
普通の加算でダメだった理由がわかりません・・・
初心者なものでいまいち上手く説明できないですが
よろしくお願いします
COLORREFはパレットの構造体だが・・・
Bitsに定まった型はない。
じつはビットマップが24bitだったり
638629:02/05/04 20:56
すみません、原因がわかりました。
どうやら画像のサイズをはみでていたようです。
レスありがとうございました。

回線切ってマウスのコードで首吊(以下略
>if (*pBits = 0x00FFFFFF) {  // 色を調べる
代入してることには突っ込まなくてよかったのか?
【´Д`;】
回線切ったからいいんじゃない(藁
>>639
>>631みれ
643デフォルトの名無しさん:02/05/05 01:19
右側にレジスタ置いてもいいようにしたほうが使えるかな?
どうおもう?
644643:02/05/05 01:21
あうっ
誤爆しました、スマソ
zukeiと云うクラスがあって、
zukei circle[1000];
zukei square[1000];
としたとき、マルの色、四角の色をそれぞれ、いっぺんに
赤、青にするのはどうしたらいいんでしょう?
for(int i=1;i<1000;i++){circle[i].color=red;}
なんていちいちやるしかないんですか?
circlecolorなんてグローバル変数を使って
他の部分にも影響出してしまうのもイヤです。
>>645
いちいち、って for (int i = 0; i < LIMIT; i++){ ... } がベストだと思うが。
むしろ、なんでグローバル変数なんて言葉がここで出てくる?
colorってのはzukeiクラスのメンバで、それを変更したいんだろだろ?
static int flag;
zukei(){if(flag++ < 1000)color = redの値; else color = blueの値;}

イクナイ?ヤッパリ....
flag とは、つまり旗です。
>>646
グローバル変数定義しといて、color の値が必要な時にそれを参照するっ
てことだろ。>>645 は、何のためにクラス使うか良く考えた方がいいと思
うよ。

>>647
なにしたいかサパーリわからんけど、とにかく flag++ なんて言う気持ち
悪い変数名のつけ方やめろ。
650647:02/05/05 12:39
( ´Д⊂ヽうえーん気持ち悪いって言われたよ〜
flag++はキモいだろ、やっぱ。
652名無し :02/05/05 12:52
>colorってのはzukeiクラスのメンバで、それを変更したいんだろだろ?
zukeiクラスのメンバーじゃなくっても、グローバル変数ならクラスの中
から参照できるでしょ。他に影響がでない、部分的なグローバル変数って
ないんですか?
653647:02/05/05 12:54
countの方がヨカタかな・・・
こんなんか
class sukei {
static color;
};
655デフォルトの名無しさん:02/05/05 12:56
http://sakura2.room.ne.jp/~boogie/cgi-bin/img-box/img20020504213921.jpg

おおもりよしはる=ロリペドオタ、アニオタ、モツオタ、ベトオタ、ブルオタ、セガ信者
ひまわりと幼女のすじまんこに異様な執着心を燃やしているロリペド絵描き
2浪して九州大学歯学科に進むがプロのイラストレーターになるために大学を中退、
同人活動とUOに専念する日々を送るが、その生活は苦しいらしい(藁
自らを画家と呼び、ともすれば不真面目なものと見られかねないアニメ絵
それも、無毛のすじまんこすらも「芸術」の域にまで高めようとしている(らしい)。

現在、伝言板でチョンが暴走中!

■幼すじは至高の芸術!おおもりよしはる■
http://yasai.2ch.net/test/read.cgi/doujin/1020515485/

前スレ おおもりよしはるキタ━━(゚∀゚)━━━ !!!!
http://yasai.2ch.net/test/read.cgi/doujin/1018642526/
関連スレ
【すじ】 ようじょのすじ  【すじ】
http://www2.bbspink.com/test/read.cgi/erog/1017041827/
【抱き枕】すじ丸出し抱き枕ってどうよ?
http://mentai.2ch.net/test/read.cgi/otaku/1016198191/
■■■ロリ絵?おおもりよしはる■■■
http://www2.bbspink.com/test/read.cgi/erodoujin/1016297545/
アニメ絵が芸術?デムパロリコン男おおもりよしはる
http://yasai.2ch.net/test/read.cgi/net/1018005845/
コピペだけで会話するスレ@DTM板
http://pc.2ch.net/test/read.cgi/dtm/1012032352/
48: 柳さんトコの抱き枕カバーとかって・・・2枚買
http://comic.2ch.net/test/read.cgi/sakura/1019402459/
>>653
2016倍ほどそっちのほうがいい。
657647:02/05/05 12:58
>>645のやりことを勘違いしてたので逝って来ます・・・・(-_-)
zukei::zukei( int c ) : color( c ) { /*...*/ }
std::vector<zukei> circle(1000, zukei(red)), square(1000, zukei(blue));

・・・これじゃだめかのぅ? >>645
std::fillで十分じゃろ。
std::fill使っても659より簡単にはならぬと思うが。
C++がOOPLじゃない点ってどんなところ?
>for(int i=1;i<1000;i++){circle[i].color=red;}
circle[0]は初期化しちゃいけないの?
main()がオブジェクトでもなんでもないところ。
664デフォルトの名無しさん:02/05/05 15:14
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>> C++
Rubyigainogenngohakuso !
あああRuby!tytytytytytyty
GW 終わるまでの我慢だな...。>>664
666デフォルトの名無しさん:02/05/05 15:20
Riubuy!!!!
667デフォルトの名無しさん:02/05/05 15:21
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ(プ
>>664 >>666-667

・・・・・・

( ΦωΦ)σ)´Д`)
669668:02/05/05 15:29
えんvwjkqえjkqうぇj
kqうぇjkqうぇjkqうぇjkqうぇjkqうぇjkq
うぇjkqうぇjkqうぇjkqうぇjkqうぇjkqうぇjk
qうぇjkqわrsfうぇfgtfgtfgtfgtfgtfgt
fgたえrw4あえrw4あえrw4あえrw4あえrw4あえrw
4あえrw4あえrw4ごーq23t5;、lq34¥mgvdfz
bv
dsv

dsvdslkhjう゛ぃお
Ruby!
宇宙人も使ってる Ruby!!!
ウチュー人しか使ってないRuby!!!
子供「ママーあの>>670なに〜?」
ママ「しっ、見ちゃいけません!キチガイになっちゃうわ」
673645:02/05/06 12:22
645の質問。答は、static memberにしておけば、
クラス共通だからいっぺんに変えられるってことだね。
まともな返事ないから、自分で答えみつけちゃった。
2chのやつらって、たよりないなあ。こんな初心者の
質問にもまともに答えられねえなんて。

>zukeiと云うクラスがあって、
> zukei circle[1000];
> zukei square[1000];
> としたとき、マルの色、四角の色をそれぞれ、いっぺんに
> 赤、青にするのはどうしたらいいんでしょう?
> for(int i=1;i<1000;i++){circle[i].color=red;}
> なんていちいちやるしかないんですか?
> circlecolorなんてグローバル変数を使って
> 他の部分にも影響出してしまうのもイヤです。
が、しかし、circleとsquareをそれぞれいっぺんに変えることは出来ないという罠。
たよりない呼ばわりしてるくせに自分の質問の意味もわからんのか?
いちいち全部変えるか、それぞれに色IDでも持たしてIDと色のテーブル用意しれ。
bakahahottoku
C++にCで言う所のfreopenに相当するものがあるか教えて下さい。
お願いします。
>>677
std::freopen()
>>678
ありがとうございます。でも、ちょっと違う嗜好なのです。
たとえば、fstreamのオブジェクトをcinやcoutと結びつけたいのです。
tieやrdbufを使ってみましたがうまくいきません。
fstreamをそのままcin/coutの替わりに使えばいいんでないの?
>>680
そうなんですが、状況に応じて切り分けたいのです。
fileがopenできた時はそのまま使い、openに失敗した時はcinに結びつけて、
そのままプログラムを走らせて行きたいのです。
>>681
こんな感じかえ?

void foo(istream& in)
{
  なんらかの処理
}
int main()
{
  ifstream f("ファイル名");
  if(f.fail()){
    foo(cin);
  }else{
    foo(f);
  }
  return 0;
}

>>682
ありがとうございます。fstreamはiostreamから派生しているので、単純に
istreamで受ければいいのですね。
てっきり、cinをfstreamにダウンキャストするしかないと思いこんでいまし
た。dynamic_castを行っても失敗するし、やっぱりだめでした。
これでプログラム書いてみます。
よほどのことがない限りキャストはやめたほーがいーよ。
685名無し:02/05/06 23:22
c++ってなじめないんだよな。出力書式なんかも不便そうだし。
printf("%-10s %6.2f %-04.5d,sarray,y,x);
なんてCの出力をC++ではどうするんだろcoutを使って。
>>685
std::printf() を使う。

いや、もちろん I/O stream と組み合わせて書式指定する方法もあるんだけど、
何かと面倒なので俺は std::sprintf() 愛用してるよ。
>>685
#include <cstdio>
してprintf使います。つーか、マニュピレータ調べてください。
688687:02/05/06 23:27
やってもーた... マニピュレータ...
シュミレーション...
>>685
確かめてないからわからんけどこんな感じじゃないの?
cout << setw(10) << sarray << setw(0) << ' ' << setw(6) << setprecision(2) << y << setw(0) << ' ' << setw(5) << setfill('0') << x;
>>689
さすがオブジェクト指向型言語

sarrayとyとx用にそれぞれoperator <<を定義するのが正道だな。
その中でstd::sprintfを使おうが何だろうが別にかまわないんでないの?
s/さすがオブジェクト指向型言語 /さすがオブジェクト指向型言語のふりして手続き型プログラミング/
>>689
吐き出すバイナリの効率はたぶんいいんだろうけど、記述の手間としては
泣きたくなるようなコードやねぇ。
>>685の記述をしたら>>689相当のコードを吐いてくれるような
機能ってのを、どうにかならんもんかしら。テンプレートの拡張とかで。
>>692
> 吐き出すバイナリの効率はたぶんいいんだろうけど
いや、ぜんぜん。
>>692
stdio.hとiostreamの簡単なベンチマークテストをやってみたら、泣きたくなるほど
iostreamは遅いよ。
処理系よって程度がちがうけどね。
VCとかのおまけiostreamは最悪かも。
そうでなくても、iostreamは遅いだろうけど。
696デフォルトの名無しさん:02/05/06 23:56
printf 使うなら ios::sync_with_stdio(); を忘れずに。
>>696
それ初めて見た.. 俺もまだまだやね。

MSDN見る限りだと性能に影響が出るようだけど、そんなもんかね?
698696:02/05/07 00:12
>>697
これしとかないとエラー終了することがあります。
しゃれにならんっス。
cin/couは10行プログラムぐらいでしかつかわないから気づかなかった。
>>698
std::sync_with_stdio()はデフォルトでtrueじゃないのか?
701696:02/05/07 00:28
>>700
実際にエラー終了したことがあるんですよ。
ちなみに Cygwin の g++ で。
ARMにはそんなもんのってやがらないんだけど、
それって標準ライブラリに含まれてるの?
>>701
怖いっすねえ。まだまだ標準C++には準拠してない点があるという事か。
>>702
ARMの時代にはなかったのではないでしょうか。
私も今ストリームバッファについての説明を「C++標準ライブラリ
チュートリアル&リファレンスを読んで解読している所です。
705デフォルトの名無しさん:02/05/07 00:36
そういう仕様があるといっても
ちゃんと準拠してるかどうか疑わなくてはいけない
C++ のやるせなさよ。
一昔前のg++って使い物にならなかったよね。
ごく簡単なまともなコードなのにコンパイルが通らない。
ちなみにv 2.7.2
g++はv 3.x.xが安定したら使うかねー。
それまでは別ので何とかしる。
namespace周りでしょ?
その辺だとtemplateはVCよりもマシだったと思うし。
やっぱりUNIX系ではCを使うべきだよ。
710デフォルトの名無しさん:02/05/07 00:44
UNIX or GNU系はあらゆる言語が使えてホスィ。
なんかそんな感じがする。
C++の言語仕様の大きさから、コンパイラメーカーの負担がぐっと
増えたんだろうなあ。その結果としてバグがたくさん埋もれている。
ようやく標準に準拠できた頃に、C+=2 なんて言語ができてきたりして。
712デフォルトの名無しさん:02/05/07 00:46
C#では不足ナリか?
>>711
> C+=2

ワラタ
C#がそのつもりらしいけど、全然違うな。
テンプレートが未だにちょビット変なVC6だけど、我慢してつかっとります。
細かいver.upでバグの増えるg++/libg++はこわくてつかえません。
VC6はnewが失敗しても例外を返さないのがなんともかんとも。
STLは例外返すことを前提として組まれてるから
メモリが一杯になると不正アクセスになる罠。
_set_new_handler で例外返すようにしてるけど、
みんなどうしてます?
716デフォルトの名無しさん:02/05/07 00:56
>>715
コテハン?
この板では珍しいね。
717shige:02/05/07 01:02
haxa?
>>717
出てこなくていいよ。お前もKusakabeもロ○鉄も
健全なコテハンを目指します。
アマですがどうぞよろしく。
720sage:02/05/07 01:07
>>715
ワシも_set_new_handlerつかってる。
>>719
できればCスレでも回答してホスィ
>>720
やっぱみんな使ってるんですね。
ファイルを追加するだけでいいようにはしてるんですが、
ホントにみんなこんなことやってるのか
ちょっと不安だったんで。

>>721
分かる範囲で回答スマス。
723デフォルトの名無しさん:02/05/07 02:08
enum DATA{A=10,B=20,C=30};
template<DATA data>class AAA{};

ダメ??
724723 :02/05/07 02:17
ごめん。漏れの頭が腐ってたわ。少し逝ってくるよ。
>>715
VC.NET(SDK版)もbad_alloc投げないよ。
標準C++ライブラリが付属してないからだと思うけど。
>>725
.NET でもまだ対応してないの!?
と思って VS.NET Academic で試したところ、大丈夫でした。
nothrow にもちゃんと対応していて、Good! です。
727デフォルトの名無しさん:02/05/07 03:08
あげとくか。
3時だし
>>726
いや、だから。
.NET Framework SDK版のVC++は標準Cライブラリしか付属してないんで、
標準C++ライブラリに所属する std::bad_alloc が含まれていない。
従って、newはNULLを返す仕様であると言うこと。
>>728
.NET がそもそも bad_alloc を返さないという
万が一の可能性を考えてチェックしただけです。
やっぱ流石になかったようですね。
730デフォルトの名無しさん:02/05/07 16:58
CとC+とC++は、初めてやるならどれから勉強したほうがいいでしょうか?
730
ねたですか?
C+++++++++++++++++++++++++++++++++++++++++++++++>>>>>C++
733デフォルトの名無しさん:02/05/07 17:03
>>728
> VC++は標準Cライブラリしか付属してないんで、

・・・・・嘘だろ・・・?
じゃあprintfとかstrcmpとかしか使えないのか?
734デフォルトの名無しさん:02/05/07 17:07
今の時代はCよりDだな。
>>733
疑うなら試せよ。

assert.h conio.h ctype.h direct.h dos.h eh.h errno.h excpt.h fcntl.h
float.h fpieee.h gcroot.h headers io.h limits.h locale.h malloc.h math.h
mbctype.h mbstring.h memory.h minmax.h new.h process.h search.h setjmp.h
setjmpex.h share.h signal.h stdarg.h stddef.h stdexcpt.h stdio.h stdlib.h
string.h tchar.h time.h typeinfo.h useoldio.h varargs.h vcclr.h wchar.h xmath.h

sys/locking.h sys/stat.h sys/timeb.h sys/types.h sys/utime.h

付属しているヘッダ。
C++として使うためにどうしても必要なnew.hおよび、例外系のベースヘッダは
ついてるけど、それだけ。
736デフォルトの名無しさん:02/05/07 17:21
>>735
sys/*.hが標準Cライブラリかよ!
737736:02/05/07 17:24
dos.hもconio.hもあるじゃない(ワラ
738デフォルトの名無しさん:02/05/07 17:37
ActiveX(COM)からクライアントDDEを呼ぶを作っています。
DdeConnectでDMLERR_NO_CONV_ESTABLISHEDエラー
でクライアントとの対話に失敗してしまいます。
COMからの呼び出しですと、何かDDEへのアクセス権
が欠けるのでしょうか?
ご存じの方いらっしゃいましたらお願いします。
739デフォルトの名無しさん:02/05/07 17:40
C++初心者ですけど設計理念についてお聞きしたいです。
クラスって’機能’に注目して、変数や、その変数を扱う関数を単にまとめただけっていうのはありですか?
いわゆる汎用性のある、組込型の様な新たな’型’を設計するのでなければ上記のようなクラス設計ってかなり需要がありそうなんですが。
たとえばコンソールクラスは、テキストバッファやアトリビュートバッファ、それらを処理する関数を単にまとめただけ。
オブジェクトは一つで十分なのでコピーも代入演算子も書かない。そういうのってよくありますか?
よくある。

そもそも クラス=型 としているC++が少し特殊なだけ
C++初心者がいきなりクラス設計をするとは・・・
デザパタに当てはめて設計するのがいいかと。
よくある勘違い。

そもそも 型≒バイト数と勘違いしてるやつが多いだけ
>>742
ハァ?
>>743
ハァ? ?
745s:02/05/07 18:23
>そもそも クラス=型 としているC++が少し特殊なだけ
けっこう勉強したつもりなんだけど未だにクラスと型の区別がつかぬ。
どゆいみ?
>740-744
そうですか。実践の場では良くあるって事でよろしいでしょうか?
どうもありがとうございました。
>>745
C#の struct と class の違いを考えてみな。
要は値型か参照型かと言うことなんだけど。
目に見える(ソースに書いた)物はもちろん型だけど、
それ自体がインスタンスを表すかどうか、と言うことだね。
>>739
つーか結局、クラスの設計をするって事は、新しい型の定義をするってことだ。

>>745
ってことで、クラスは型の一例。
750s:02/05/07 18:58
>747
ホンマに?(それなら余裕で分かるんだけど・)

>748
つまりstaticメンバのみのクラス(class/struct)や、
namespaceは型ではないということ?

(namespaceはもちろん型じゃないけど)
あ、クラス!=型 じゃなくて、
インスタンス != 型 だね。
752 :02/05/07 19:03
???
753s:02/05/07 19:07
再度引用:
>そもそも クラス=型 としているC++が少し特殊なだけ
んじゃ、クラス=型としていない言語とは?

Smalltalkとかはクラスオブジェクトがあるけど、そういうのを言うのかな・・?
>>750
メンバの無いstructだって、型だよ。
intだってvoidだって型だろ。
俺も>740がわからん・・・
>>739
定番の注意事項なんかを述べておくと、要らなくてもコピーコンストラクタと代入演算子は書いてください。中身要らんので。書いとくだけ。ただし呼べないようにprivateで。
でないとコンパイラが勝手にpublicでコピーコンストラクタと代入演算子を生成しやがります。
757_:02/05/07 20:14
#include<stdio.h>

void main(void)
{
int a;


a = 10;
}

↑を実行すると「aの値は10です」と
出力するように変更すれって言う
問題が出たんだけど分かる人います?
誰か教えて下さい m(__)m
>>757
printf("aの値は%dです\n", a);
というか激しくスレ違い。
わかる人はいっぱいいるでしょう。
ただし、「aの値は10です」と出力するには、OSと処理系を書いたほうがいいでしょう。
それから問題はもっと厳密に。じゃないと、
#include<stdio.h>
void main(void)
{
 int a;
 a = 10;
 printf("aの値は10です") ;
}
という答が返ってきます。
//#include<stdio.h>
#include <iostream>
void main(void)
{
int a;


a = 10;
std::cout << "aの値は" << a << "です" << std::endl;
}
761759:02/05/07 20:20
空振り・・・
宿題は別スレいけ
#include<stdio.h>

int main(void)
{
puts("aの値は10です");
return 0;
}
お前ら全然ダメ。
全角で数字出すんだぞ。わかッてんのか?
765_:02/05/07 21:16
結局の所763が答えなのでしょうか?

>>762
どこのスレに行けば良いの?
>>765
http://pc.2ch.net/test/read.cgi/tech/1011722640/
でももうすぐ1000だからお早めに。
どこのスレいっても全角英数使うやつはダメ。

http://pc.2ch.net/test/read.cgi/tech/1011722640/
・・・・
デバーグほどめんどくさい事は無い

誰かが言った言葉さ(;´ー`)
あーめんどい・・・・
769デフォルトの名無しさん:02/05/08 01:41
>>763 以外は
void main につっこんでないな。
770デフォルトの名無しさん:02/05/08 02:33
|  | ∧
|_|Д゚)
|文|⊂)
| ̄|∧| ネタハダメヨ・・・
771デフォルトの名無しさん:02/05/08 23:56
疲れたぽ・・・・
一人デスマーチ状態ぽ・・・
772デフォルトの名無しさん:02/05/09 00:51
テーブル持てば?
773デフォルトの名無しさん:02/05/09 01:22
>> 768

CppUnit 使うべし。
774デフォルトの名無しさん:02/05/09 01:56
>>773
知ったかハケーン
Unit Testはすでに完成(半完成)しているプロジェクトへの導入は困難です
最初から考慮して書かないとダメ
protected:に物申す。
メンバにアクセスできる相手を、クラス側から指定できるfriendと、
アクセスしてくる側が勝手に接続してくる継承が何で同じ扱いなんだ?
>>774
ってことはモデリングの段階でだめってことじゃん。
オブジェクト同士の結合度が密になっていなければ導入できるはずぽ。
777sage:02/05/09 11:35
誰かつっこんでやれよ >>775

778デフォルトの名無しさん:02/05/09 12:09
アンドリューさんのAccelerated C++ を読んだばかりの初心者なのですが、
私がコンパイラの実装等にあまり明るくないためか、8章で出てくる
typename の必然性がいまいち良く分かりません。その必要性を教えていた
だけないでしょうか? また typedef 以外で使う用途ってどんな場合があ
るのでしょうか?
>>775 dempa jusinn tyuu?
780デフォルトの名無しさん:02/05/09 17:40
newとdeleteの多重定義を行ってメモリ管理を自前で行いたいと思っています。
自前で定義したnew演算子は呼び出せるのですが、
自前で定義したdelete演算子を呼び出す方法がわかりません。
どなたか正しい方法をご存知の方はいらっしゃらないでしょうか。
使用しているコンパイラはVC6です。




void *operator new( size_t size, my_allocator& alloc )
{
return alloc.allocate( size );
}

void operator delete( void* pointer, my_allocator& alloc )
{
alloc.deallocate( pointer );
}

class X;

void f( my_allocator& alloc )
{
X* array = new( alloc ) X(); // 自前で定義したnew演算子を呼び出す。

// delete( alloc ) X; // エラーが出る。この方法は間違いらしい。
// delete X; // 標準のdelete演算子が呼び出されてしまうのでダメ。
}
globalのnewを上書くと、いろいろ面倒で、
classに対して定義しないとドツボだった記憶が。
>>780
deallocateはsizeを指定しないとエラーになりませんか?
それから、my_allocateはallocator<X>から継承したものですか?
783デフォルトの名無しさん:02/05/09 19:14
>>782
今のところ、その部分ではエラーは発生していませんが、
deallocate()は第二引数としてサイズを指定しなけりゃいかんみたいですね。
直しておきます。ご指摘ありがとうございました。

size_type とか pointer とかの定義が面倒なので、
今のところ my_allocator を std::allocator を継承していますが、
そのうち独立させたいなあ、などと夢想しています。
>>783
了解です。多分、delete array;で、自前のdeleteが呼び出されていると
思います。グローバルのdeleteを呼び出すときは ::delete array;となる
でしょうね。全体がわからないのでこちらでコンパイルできないのです
が、もし骨格部分でもうpしてくだされば、こちらで確認してみます。
785デフォルトの名無しさん:02/05/09 19:53
>>784
デバッガで追ってみたところ、 delete X とすると、自前のものではなくて
システム標準の operator delete() が呼び出されているようでした。
また、::delete X としても動作は変わりませんでした。

いくつかのC++の解説書を調べてみたところ(赤本第三版とかEffective C++とか)、
独自定義の operator new() の使用例は書いてありましたが、
operator delete() を独自に定義した場合は、システム標準と同じ引数で
例示されているものしか見あたりませんでした。

msdnオンラインのページには似たような例が載っていましたが、
operator delete()は再定義はしてあるものの、使用例が書いてないので涙。
http://www.microsoft.com/JAPAN/developer/library/vccore/vcrefcompilerwarning%28level1%29c4291.htm

骨格を切り離すのはちょっと難航中。
>>785
784です。すみません、ちょっとガセを書いてしまったと思います。
newは柔軟性がありますが、deleteは引数を一つしか取れないので
ちょっと面倒ですね。コンテナのdeleteはどのようにして実現している
のかを知らないと書けませんでした。すみません、力不足でした。
やっぱり
class foo : public myallocatio<foo>
{...};
みたいな、ModernC++な方法で……
>>778
p141 のことかな? 確かにここの説明では必要性がよく分からないかも
しれんなあ。次のようなテンプレートを考えてみてくれ。
template<class T> class Foo {
public:
 typename T::size_type foo( const T& x );
};
メンバ関数 foo() は、T::size_type という型の戻値を返すんだが、
コンパイラが最初にこのコードを読んだときは、まだ T に実際の型が
与えられていない。それでもコンパイラは、上のコードを構文解析だけは
しなくちゃならない。というわけで、プログラマがコンパイラに対して
「T::size_type は何らかの型である」ということを教えてやる必要が
あるわけだ。
Accelerated では、typename vector<T>::size_type となっているが、
これだと、コンパイラは既に #include <vector> を通っているはずで、
vector<T>::size_type が何かの型だということをコンパイラは知って
いてもよいはずなんだよね。だから必要性がよく分からないんだと思う。
実際、VC++ なんかだと、typename が無くてもコンパイルが通ったり
するし。
789778:02/05/10 00:08
>>788
すっごく分かりやすいです。完璧理解。
ありがとうございました。
>>785
オーバーロードされた operator delete を使って delete pObj はできない。
オーバーロードされたものは、対応する operator new で確保した
オブジェクトのコンストラクタが例外をスローした時に呼び出されるようにコンパイラが使用する。
>>780
そもそも operator delete をオーバーロードしたところで、new 演算子
と違い、delete 演算子には引数を付加することができないので、それを
呼ぶことは不可能。
つまり、void operator delete( void* pointer, my_allocator& alloc )
とかを定義しても、delete p; で、この operator delete が呼ばれる
ことはありえないということ。

781 も書いているように、やるなら、大域的な new/delete ではなく、
クラス内で new/delete を上書きするべし。
class X {
private:
my_allocator *pAlloc;
public:
void *operator new( size_t size, my_allocator& alloc )
{
pAlloc = &alloc;
return alloc.allocate( size );
}

void operator delete( void* pointer, size_t size )
{
pAlloc->deallocate( pointer );
}
}; // class X

void f( my_allocator& alloc )
{
X* array = new( alloc ) X(); // 自前で定義したoperator newを呼び出す。

delete X; // 自前で定義したoperator deleteを呼び出す。
}
こんなんでどう?
792791:02/05/10 12:03
あ、すげーチョンボ。
operator new の時点じゃ、まだオブジェクトが構築されてないじゃんか。
書き直し。

class X {
private:
static my_allocator *pAlloc;
public:
void *operator new( size_t size, my_allocator& alloc )
{
if (pAlloc != NULL) pAlloc = &alloc;
return alloc.allocate( size );
}
……
}; // class X

my_allocator *X::pAlloc = NULL;

これでもいまいちだけど、やりたいことは分かるよね。
793791:02/05/10 12:48
たびたびすまん。今、C++の仕様書を読み返したら、
void operator delete( void* pointer, size_t size );
というシグニチャを持った operator delete は存在しないようだ。
void operator delete( void* pointer );
を使ってね。
あと、>>790 の言ってるのは、
void operator delete( void* pointer, void * );
のことだね。
794デフォルトの名無しさん:02/05/10 14:11
g++でC++の勉強してるんだけど,日本語のライブラリマニュアルきぼんぬ.

書籍でも可.探したんだけど全然ない・・・
797_:02/05/10 15:13
>防衛関連の試験装置又は解析用ソフトの開発。Windows上でC言語で開発。

いきなりこんな事会社で言われてしまいましたが、これからC言語を学んで
いくとして、どのくらいでお金がもらえるレベルになりますか・・・?

一応Win、エクセル&アクセスでのVBAとVBEの基礎くらいならわかります。
あと、アクセスでSQLも少しならわかるくらいです。
すれ違い
799794:02/05/10 15:42
>>795-796サンクスコ.とくに>>796(・∀・)イイ!
>>793 これならうまくいったぞ。

class X;

class my_allocator : public allocator<X> {
};

class X {
private:
static my_allocator *pAlloc;
public:
void *operator new(size_t size, my_allocator &alloc) {
if (pAlloc != NULL) pAlloc = &alloc;
return alloc.allocate( size );
}
void operator delete(void *pointer, size_t size) {
pAlloc->deallocate(static_cast<X *>(pointer), size);
}
};

my_allocator *X::pAlloc = 0;

void f(my_allocator &alloc)
{
X *array1 = new(alloc) X();

delete array1;
}
}
800ですが、793さんの言われるとおり、
void operator delete(void *pointer, size_t size);という形式はないのですが、
なぜかコンパイルできてしまいます。
コンパイラはBorland-C++5.6です。今からgcc3.0で試してみます。
801です。gcc3.0でも通ってしまいました。うむむ。どなたか解説キボンヌ。
803デフォルトの名無しさん:02/05/10 16:38
>>790
あー、なんとなくわかりました。

定義されているどの operator new() で確保しても、
例外発生した場合以外は、必ず operator delete( void* ) が呼び出される。

余計な引数を付け加えた operator delete() は、
あくまで例外発生時に呼び出すのが主目的であって、
ユーザーが任意に呼び出すことは出来ない、と。

わりと納得。
802です。Borland-C++5.6でもgcc3.0でも、deallocateの第2パラメータは
ダミーで無視されていますね。Borland-C++は::delete()、gcc3.0ではfree
を呼び出していました。
>>804
Effective C++ の 10項で、void operator delete(void *p, size_t size);
の形が使われてるね。そこの説明読むと、この形の operator delete も
必要だと思えるなぁ。
>>805
どうしてもsize_tを持ったdeleteが必要な時がありますね。もっともこれは
オーバーロードだから、実際の解放には::operator deleteかdeallocateを
使うしかないわけですが。
>>793
void operator delete(void *p, std::size_t size); はC++標準ではOKなはずだぞ。
今規格が手元に無いので自分では確かめてないのだが、
Exceptional C++によれば「3.7.3.3/2を参照されたい」とのこと。
質問なのですけど
昔から#include <iostream.h>みたいに書いていたから
今もstd使わないでこういう書き方しているんですけども、
この書き方って何か問題あるんですか?
ANSI規格で、stdを使うように推奨していることは知っていますが、
using namespace std;とか
std::cout << とか書くのが面倒くさいんですけど。
>>808
別に。using namespace std;書いた時点で、iostreamもiostream.hと同じ意味に
なっちゃうよ。例えば自前のcinを作りたかったら、それを my というnamespace
ででも包めばバッティングしない。
810790:02/05/11 07:55
811デフォルトの名無しさん:02/05/11 07:56
cin,coutのcはcharacterのc?C++のC?
console
>>812
なんだ・・・
>>813
なんだとはなんだ
>>814
なんだとはなんだとはなんだ
>>815
なんだとはなんだとはなんだとはなんだ
for (int i=0;i<4;++i){
  cout << "なんだとは";
}
cout << "なんだ" << endl;
cout << "JAVA の授業さぼっちゃった" << endl;
>>817
ワロタ
>>807,>>810
おかげでかなり理解が深まったよ。ちょっとまとめてみる。長文すまん。

● placement-new に相当するような placement-delete 構文はない。
delete p; によって呼び出されるのは、次のどちらか一方。
void operator delete( void * );
void operator delete( void *, size_t );
前者が存在すれば、前者が呼び出される。
後者の size_t にどのような値が渡されるかは分からなかったが、
g++ で実験してみたところ、delete 演算子のオペランドとなったポインタを
dereference した型の sizeof になるようだ。

●placement-new 構文によるコンストラクト中に例外が発生した場合、
使用された operator new に対応するシグニチャを持つ operator delete が
暗黙裡に呼び出される。
例:
void *operator new( size_t, T1, T2, T3 ); に対しては、
void operator delete( void *, T1, T2, T3 ); が呼び出される。
このような operator delete を宣言しないとコンパイラが警告を出すことも
ある。

●placement な operator delete を明示的に呼び出してオブジェクトを
デストラクトしたい場合は、デストラクタを明示的に呼び出す必要がある。
例:
class X {};

class Foo {
public:
~Foo();
void *operator new( size_t, X& );
void operator delete( void *, X& );
};

X x;
Foo *p = new(x) Foo;
p->~Foo(); // デストラクタの明示的な呼び出し
Foo::operator delete( p, x ); // placement delete の明示的な呼び出し
821デフォルトの名無しさん:02/05/11 22:34
ねえーこれって無理なん?
コンパイラに怒られるんだけど・・。

error C2259: 'CTest' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。

class CTest
{
TestM()
{
CTest* pTest = new CTest;
};
};
>>821
コンパイラが怒るんなら、無理なんでしょう。書き方を変えてみる。
class CTest
{
  TestM();
};
CTest::TestM()
{
  CTest* pTest = new CTest;
}
823821:02/05/11 22:38
勘違いですた、すまそん
824 ◆Sd0g4XYw :02/05/11 22:41
BorlandのC++BuilderとかMicrosoftのC++とかはどう違うんですか?
MicrosoftC++しか使ったことないのでさぱ〜りです。
違いを教えてください。
>>824
MS C/C++ってまだ出てるの?
>>826
その名前・・・正確なんですか?マジで。
>>827
コマンドラインから cl とやると
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version XX.XX.XXXX for 80x86
Copyright(C) Microsoft Corp XXXX-XXXX. All rights reserved.
と表示されるよ。
MS-Cの頃からの通番だからな
>>828
勉強になりました。
831デフォルトの名無しさん:02/05/12 02:01
> Deletion of a pointer to an incomplete type is an unsafe programming
> practice because there is no way for the compiler to verify that the
> destructor is indeed trivial.

って書いてあるんですが、具体的にこれはどういうコードが unsafe なんでしょう?
そもそも "incomplete type" 「不完全な型」ってどういう意味なのかが分からない
んですが、どなたか教えて頂けませんでしょうか。

# やっぱり僕には boost はまだ早いですかねぇ・・・
832デフォルトの名無しさん:02/05/12 02:03
>>831
incomplete type っつーのは、たとえば

struct foo;
foo* p;

みたいに、実際の定義を与えていない宣言だけの型かと。
833831:02/05/12 02:11
>>832
なるほど!たしかにそーゆー型に sizeof を適用したら
"incomplete type" ってエラーメッセージが出ました。(g++ 3.0.4)
それなら話は分かります。ありがとうございました m(_ _)m
std::iterator_traits<int*>::value_type val;
VC6ですが、なぜこれでコンパイルエラーが出やがりますか?
835デフォルトの名無しさん:02/05/12 14:32
const int

int const
って何か違うの?
C++ って const の意味が増えたと聞いたんだけど・・・
a)const int i
b)int const i
c)const int *p
d)int const *p
e)int* const p

a=b
c=d!=e
int const のほうが幸せ。
1) const int *p
2) int *const p
3) const int const *p
4) const int const *const p

訳分からんわ・・・・
int const * const p なら幸せ。
840835:02/05/12 14:48
>>836
thx!
a==b
c==d
である事が分かればそれでいいんだ。
テストコード書いて見た限りじゃ一緒っぽかったんだけど、
一応不安だったんで聞いてみたっす。
# さすがにc != e は分かっとるよ。
>>838
3と4の先頭のconstは不要
>>839>>841
産休。何となくわかってきました。今実験中です。
843831:02/05/12 23:14
えーと、皆さんにとって有用性があるかどうかはカナーリ怪しいのですが、
お世話になったお礼というわけでもないんですけど、boost に関する指摘な
メモでも書いてみました。

http://www4.tkcity.net/~toshiki/boost/index.html

まだ勉強始めたばっかりなんで、内容薄いんですけど、今後も暇があれば勉強
した事を加筆していくつもりです。ですが、なにぶん若輩者故間違ったところ
等あると思うんで、そーゆーのは指摘して頂けるとありがたいです・・・
前から831は大物になると踏んでたんだよね。
>>843
なんていうか、目次頁がEUCで中身がSJISとかいう、文字コードごちゃまぜはやめてくれる・・・? IEが混乱するのよ・・・それか各頁で文字コードを指定しておくとか
846845:02/05/13 07:17
ごめ。全部EUCやね。IEがおかしかっただけでした。
まあでも SJIS または EUC で書くときは charset を指定して欲しいよね。
ブラウザによる自動判別にも限界があるし。
848847:02/05/13 10:13
最初に文句がきちゃったみたいですまんけど、boost を読むとっかかりに
させてもらいます。
849831:02/05/13 11:20
とりあえず content-type 指定しといたっす。
スマソ,スマソ。

ところで ref の使い方が分かんないんですがどなたか教えて頂けませんでしょうか。
僕の理解によると、

struct Aho : binary_function<int&, int, void>
{
void operator() (int& a, int b) const {cerr << a << " " << b <<endl;;}
};
struct Baka : binary_function<int, int, void>
{
void operator() (int a, int b) const {cerr << a << " " << b <<endl;;}
};

int main()
{
int i=30;
typedef boost::binder1st<Aho> funca;
typedef boost::binder1st<Baka> funcb;
Aho a;
Baka b;
funca fa = boost::bind1st(a, i);
funcb fb = boost::bind1st(b, boost::ref(i));
fa(0);
fb(0);
i = 20;
fa(0);
fb(0);
}

これで
30 0
30 0
20 0
20 0
と表示されるんじゃないかと思ったんですが、
30 0
30 0
20 0
30 0
ってなるんですよね。(g++ 3.0.4)
参照渡しのパラメータを持つ関数オブジェクト(Aho)でも ref 無しでも fb が
作れちゃうみたいですし、ref の効用がイマイチ分かりません。
どなたか教えて頂けませんでしょうか。
あ、Aho とか Baka っつーのは hoge とか foo みたいなもんなんで、あまりお気に
なさらずに・・・

>>843
next(),prior()のところ、template <class T>じゃないの?
851841:02/05/13 13:40
>>850 ご指摘の通りでした。直しておきました。ただオリジナルのドキュメントのコピペなんすよ、アレ。
オリジナルが間違ってるんですよねぇ。でも英語書けないから報告は出来ないや。

ちなみに作りかけの ref を間違ってウプしとりました。見なかった事にして下さい。
852831:02/05/13 16:28
>>851 は841じゃなくって831の間違いです。スマソ。 # boost::any 見てたらちょっと感動した。
# でもこれあんま使えないような・・・。
853デフォルトの名無しさん:02/05/13 23:34
template<int N>struct STA{
static N;
};
void main(void)
{
int a[10]={STA<12>::N};
}
test.obj : error LNK2001: 外部シンボル ""public: static int STA<12>::N" (?N@?$STA@$0M@@@2HA)" は未解決です

・・・・・・・・・・・・・分からない、ナンデ??
template<int I>
struct STA {
 static int N;
};

template<int I>
static int STA::N = I;
855デフォルトの名無しさん:02/05/13 23:51
>>854
サンクス♪
キタ━━(゚∀゚)━━ァ!
と思ったら終わってた・・・打つ
857831:02/05/14 01:04
>>856
もしかしてウチの事でしょうか・・・なんか今tkcityの名前が引けないっぽい
んですよね。DNSが死んだっぽくって。まぁその内アクセス出来るようになると
思うんで・・・
# スレ汚しスマソ
858デフォルトの名無しさん:02/05/14 04:18
あるクラスのメンバ変数の名前を
つけかえたいんですが、そんなことは可能でしょうか?
言いたいことはよくわからないけれど、
define、参照、置換、プロパティのどれかでできるとおもう
std::mapでもにたことができるかも
861858:02/05/14 07:23
>>859
ありがとうございます。
参照で出来ました!
862デフォルトの名無しさん:02/05/14 18:53
あの有名なVNCのソースを見ていて疑問がわきました。

class _OMNITHREAD_NTDLL_ omni_mutex_lock {
omni_mutex& mutex;
public:
omni_mutex_lock(omni_mutex& m) : mutex(m) { mutex.lock(); }
~omni_mutex_lock(void) { mutex.unlock(); }
private:
// dummy copy constructor and operator= to prevent copying
omni_mutex_lock(const omni_mutex_lock&);
omni_mutex_lock& operator=(const omni_mutex_lock&);
};
上記クラスのコンストラクタで引数omni_mutex&mを受け取りomni_mutexのコンストラクタに渡しています
ここでomni_mutexのコンストラクタに引数omni_mutex&を受け取る物はありません。
const omni_mutex&を受け取る物ならありますがこれはコピーコンストラクタのダミー定義だけです
omni_mutex_lock(omni_mutex& m) : mutex(m) { mutex.lock(); }のmutex(m)はエラーにならないのですか?
>>862
2行目をよく見てみそ
864862:02/05/14 18:58
参照だとどうなるのですか?
教えてくんか。
これ以降はFAQだ
866862:02/05/14 19:07
参照だとコンストラクタを呼ぶ必要は無いですが(と思う)
この場合mutex(m)はどう働くのですか?
教えて君で申し訳ないのですがよろしくどうぞ。
参照の初期化!=オブジェクトの初期化
int i = 10; // 普通の変数の初期化
int&j = i; // これは何でしょうね?
869862:02/05/14 19:13
要するにポインタでかくと
omni_mutex *mutex;
mutex = &m;
みたいな事ですよね。
でも : mutex(m)ってのはコンストラクタを呼ぶ物じゃないんですか?
>>869
呼ばない
871862:02/05/14 19:26
本来:mutex(m)みたいな記述はmutex=mの意味なんですか?
operator=が禁止されているのでこんな風にやるとか?
int i( 10 ); // 普通の変数の初期化
int&j( i ); // これは何でしょうね?
>>873
あ、そっか。
初期化の=はコンストラクタ呼ぶんだ。
875862:02/05/14 19:41
int i(10);なんて初期化の方法があったんですね。。知りませんでした。

参照の場合も要はポインタだから組込型と同じようにコンパイラは初期化の方法を知ってて
クラスの場合はコピーコンストラクタとかを呼ぶんですね?
876831:02/05/14 20:41
なんか tkcity 氏んだままなので、移転しました。
http://members13.tsukaeru.net/toshi/
間違っとる所とか、指摘して頂けると幸いです。
# boost 関係のページは実はダミーなんですけどね(藁
>>875
だから呼ばんちゅうに。あんたもガンコな人だね。
>>877
参照=ポインタならC++には参照はいらないな。
879デフォルトの名無しさん:02/05/14 21:36
>>862
omni_mutex& mx0( m );
omni_mutex mx1( m );

これら二つがまったく異なることは気がつきましたか?
ちなみに配置されているアドレスを比較すると、以下のようになるはず。

&mx0 != &mx1;
&mx0 == &m;
>>878
なんで 877 を指しているのかは謎だけど、機能的には、
T& foo == T* const foo
じゃないの?
>>880
バインドについて勉強してこい
>>881
ああ、シンタックス上有用、というのはそのとおり。
「機能的」と書いたのが間違い。「機構的に」と書くべきだった。
独立参照ですよね?
884デフォルトの名無しさん:02/05/15 00:26
C#のようにクラスの中にmainを含めることはできないのですか?
885デフォルトの名無しさん:02/05/15 00:27
HOGE h( 10 ); // 普通のコンストラクタ
HOGE h2=10; //これはなんでしょうね?
C.C.やね。
確かカーボンコピー。
explicit 付けなさいってこった。
888デフォルトの名無しさん:02/05/15 01:23
よし!
C++のことならぜんてわかるから
質問があるならこの俺に
>>888
8Qeensをコンパイル時に解く方法はありますか?
890888:02/05/15 01:29
うえーん(p_;)
ごめんなさい出直します
891889:02/05/15 01:33
スペリングミスつてた
Qeens -> Queens
892888:02/05/15 01:51
ちょっと変えます

C++の"基本的なこと"なら何でも俺に聞け!
893デフォルトの名無しさん:02/05/15 02:02
・class Baseから派生したA,B,Cがある
・クライアントからはBaseしか見えない
・これらのインスタンスをソートする際の比較を、 AB、AC、BC等、
 相手クラスとの組み合わせによって、別々の方法で比較しなければならない

これに今後D,E,Fと追加される予定がある場合にも、
柔軟に対応できるよい設計方法ってないでしょうか?
できればダウンキャストを使いたくないのですが、やはり使うべきでしょうか?
>893
それぞれが 中間的な比較対象を生成して、それを比較するとか。
例えば、現在の内部状態を一旦数値化して、それを比べるっていうのだと
Baseに state_to_val() = 0; というのを用意しておいて、具体的な実装はA,B,C側でやる。

class A{
 //...
 bool operator< (const Base& b){
  Val val1 = this->state_to_val();
  Val val2 = b.state_to_val();
  return val1 < val2;
 }
 //...
}

Base* pb1 = new A;
Base* pb2 = new C;
if( pb1 < pb2 ) //...

…頭が回ってないので変なこと書いてたらスマソ
>>894
レス感謝です。これならメチャスマートですねぇ。

具体的にはA,B,Cは独自プリミティブ、ソートはZソートなんです。
894さんの言う中間的な比較対象を、Z値のmin、maxとして
引っかかった場合のみ、もにょもにょするのが良いのかな…。

できればこの、もにょもにょの部分(円と方形のコリジョン判定など)も、
中間的な比較対象として一般化したいのですが、難しいですよねぇ…。

もう少し悩んでみます。アドバイスありがとうございました。
あ…、気づいたらサッカー終わってる(´Д⊂
試してないから動く自信なっしんぐだけど…

bool operator< ( const Base& lhs, const Base& rhs ) {
 return lhs.isLessThanBase( rhs );
}
class Base {
 virtual bool isLessThanBase( const Base& rhs ) const = 0;
};
class D1 : public Base {
 virtual bool isLessThanBase( const Base& rhs ) const { return rhs.isMoreThan(*this); }
 template<class T>
 bool isMoreThan( const T& rhs ) const { return Compare(*this, rhs)>0; }
};
class D2 : public Base {
 virtual bool isLessThanBase( const Base& rhs ) const { return rhs.isMoreThan(*this); }
 template<class T>
 bool isMoreThan( const T& rhs ) const { return Compare(*this, rhs)>0; }
};

でごっそりとCompareを用意とか。
「ダブルディスパッチ」で検索かけてみると良いと思われ。
897896:02/05/15 08:36
あーだめだ。↑それじゃ全く駄目。回線切って寝てきます。さらば。
>>895
共通的な比較対象に変換するというアプローチならば
すべてポリゴン(三角形リスト)に変換するというのもアリかな。
実行速度の点でダメだろうけど。
ダブルディスパッチをするのならVisitorパターンをオススメする。
ダウンキャストしない方法は多分それしかない。
Modern C++ に依存関係を最小にするVisitorパターンのやり方とか
のってるよ。
899デフォルトの名無しさん:02/05/15 11:41
age age♪
900893:02/05/15 15:33
だ、ダブルディスパッチすごいです!むはー、ダウンキャスト使用と拡張性は
不可避なトレードオフだとと思ってたのに、こんなエレガントな解決法があるなんて…。

今回は、比較対照である要素が2つという特殊なケースだったので、
ConcreteVisitorA〜Cを用意し、それぞれをA〜Cに関連づけ、Visitorを
B.conpare(A->VisitorA)の様に渡す事によって、実行時型チェックを避けることができました。

できれば中身は同じなのに、別のものとしているABとBAの扱いを、
同じものにできれば、ConcreteVisitorも一つにまとまり、
素晴らしそうなのですが…これは今後の課題にしたいと思います。
>>896
うちのショボーンコンパイラだと、クラス内の関数テンプレートが
うまく自動生成してくれなくて…でも今後の参考にさせて頂きます。
>>898
三角形リストでやっておいてから、もとのプリミティブに還元……と。
これも分かり易いですねぇ…。Modern C++の紹介も感謝、入手しておきます。

お二人ともレス、ありがとうございました!
VisitorとAcceptor(A〜C)の二人でダブルなディスパッチな訳だから
Visitorがひとつになることはないよ。
行列の行と列のようになるはず。
で、順番入れ替えは・・上の話でもう自明かと。
それからModernは(もし読んでなければ)
デザパタ本読んでからのほうが良いと思われる。
902893:02/05/15 23:06
>>901
AcceptorA( VisitorB )と
AcceptorB( VisitorA )という、同じ処理なのに別の記述なとこを
どうにかできたらと思ったのですが、仰るとおりでこれやったらダブル
ディスパッチでもなんでも無くなるんですね。考えてみたらもう一枚クラスを
かませれば良いだけですし…。いやはや、素人の浅知恵でした…。

ご推察の通り、私はGoF本の分かり易いところ拾い読みした程度でして…。
今回のことで感銘を受けたので、もう一度基礎から読み直してみたいと
思います。ご忠告ありがとうございました。
903デフォルトの名無しさん:02/05/17 04:22
VCだとコンパイルできるんだけど、BCCやMingwだと先頭のclassのところで
エラーになっちゃいます。なぜでしょうか?

------------------

/* Tera Term
Copyright(C) 1994-1998 T. Teranishi
All rights reserved. */

/* TTMACRO.EXE, error dialog box */

// CErrDlg dialog
class CErrDlg : public CDialog
{
public:
CErrDlg(PCHAR Msg, PCHAR Line, int x, int y);

//{{AFX_DATA(CErrDlg)
enum { IDD = IDD_ERRDLG };
//}}AFX_DATA

//{{AFX_VIRTUAL(CErrDlg)
//}}AFX_VIRTUAL

protected:
PCHAR MsgStr, LineStr;
int PosX, PosY;

//{{AFX_MSG(CErrDlg)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

typedef CErrDlg *PErrDlg;
MingwやBCCでMFC使えるようにしてるん?
905デフォルトの名無しさん:02/05/17 04:38
そのくらいやってるよ。ば〜か
もっと気の利いたこといえヴォケ
>>904
ああ、これってMFCだったのですね。
実はC++ではろくに書いたことがなくて、さらにWindowsでプログラムを
書いたこともロクにないもんで気づきませんでした。

確かにBCCにはMFCはついてきませんね。さて、どうしたもんかなあ。
907デフォルトの名無しさん:02/05/17 04:48
>906
仕事でやってるんですか?趣味でやってるんですか?
>>906
つか、あんた……他人のコード、名前入りで晒すなよ……
著作権侵害だあ
>>907
趣味なのです。
TeraTermにSSH2をつけようとしてて、それだけだったら
MFCと関係なくやれるのですが(だいたいできた)、
どうせならTeraTermもろとも、無料環境でコンパイルできるように
したいなと思ったのです。
>>903

以上Windowsプログラミングの知識0のド素人の激しくスレ違いな妄言でした。
>910
仕事でなくてよかったですねぇ。そのレベルで仕事だったら大変です。
以前ヴァカ上司がVC++の仕事をC++やろ?とかいって取ってきたときは地獄を見ました。
>>906
ftp://ftp.digitalmars.com/Digital_Mars_C++/MS/4.21/MFC4.21.zip
MFCとATL落ちてるんで拾ってきて使えるようにしよう
>>911
大変失礼しました。

>>912
私ごときのレベルではとてもプログラミングを業とすることはできませんね。
もっと勉強が必要なのですが、Windows関係はなんでもお金が高くついて
いけません。
class A {
 const int c;
public:
 A() : c(0) { }
};

class B : A { };

B b1, b2;
b1 = b2;

このコードが通りません
constメンバを持つクラスにはoperator=がデフォルトで設定されないのでしょうか?
916デフォルトの名無しさん:02/05/17 07:20
age
>>915
operator = はコンストラクタじゃない。
コンストラクタじゃないから const メンバは変更できない。
だから暗黙の生成はされないってことでしょ。
918デフォルトの名無しさん:02/05/17 07:52
>>913
Digital Mars C++用のものを無理矢理Mingwにつっこんでみましたが、
必殺Internal Compiler Errorになってしまいました。手も足も出ん。
>>918
修正しろって。
MFCはたいしたことやってないから、時間を掛ければ凡人にも直せる
920デフォルトの名無しさん:02/05/17 08:21
>>919
他のエラーならどうにかこうにかAdHocに直せるだろうが、
Internal Compiler Errorじゃどうしていいのかわからん。
error message全体をコピペしないってのは単なる妄言としか思えませんが。
むしろ君の出力ではどうしていいのかわからん。
placement newを使うのに必要なメモリ量ってどうやって得るのでしょうか?

class A { };
BYTE b[sizeof A * 2];
A* pa = new(b) A[2];
これだとオーバーランしちゃうと思うんですが
>>922
alignment の問題をいってる?
924デフォルトの名無しさん:02/05/17 16:08
1つのソ−スが大きくなる時
クラスのメンバ関数を別ファイルで定義してインクルードするのはありなんですか?
>>924
include = そのまま挿入

だから動くだろうけど読みやすいかと言えば死ぬほど読みにくい。
template ライブラリはしょがないじゃねかと蛙鳴く
927デフォルトの名無しさん:02/05/17 18:48
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

.netでC++プロジェクトでコーデングしているとこのような警告ダイアログが出て止まってしまいます。
これはどういうことでしょう。スタックオーバーフローというやつでしょうか。
実行時のチェックの失敗ー
変数a 周辺のスタックの内容が破壊されました。

よくあるエラーだねぇ・・。
929922:02/05/17 19:08
>>923
alignmentじゃないです。
たとえばdouble[2]とかでもかまいません
http://www.google.co.jp/search?q=cache:u_dSdwqiAL8C:www.eva.hi-ho.ne.jp/reki/diary/2001/20010206.htm+placement+new&hl=ja&lr=lang_ja
ここを見ると配列で取ると管理領域分余分にメモリを消費するようで、
これが規定されてるのか不満なんです
#include <stdio.h>
void main (void)
{
int a,b,c;
scanf("%s %s %s",&a,&b,&c);

printf("%5s\n",a);
printf("%11s\n",b);
printf("%16s\n",c);
}
コンパイルエラーはないんですが
実行するとエラーが出るのですが原因わかりますか?
メモリがどうたらこうたら初心者でスマソ
>>930
mainの戻り値はint
>>930
貴方は2つの罪を犯しています。
1つ目の罪はその質問はC質問スレですべきということで、
2つ目は罪はprintfのドキュメントをちゃんと読んでないこと、
です。%sが文字列であることを確認してからやり直しましょう。
9330927:02/05/17 20:23
>>928
なるほど。見直してみると配列a[10][10]の添え字の範囲を超えてアクセスしていました。
>>931
うーん、意味がわからない。無知でスマソ
>>932
ドキュメント?
すれ違いでしたか
逝ってきます
>>929
operator new() と operator new[]() は別物だよ。そのリンク先の人は、
カン違いしてるか、古い仕様の C++ コンパイラを使ってると思われる。
>>929
示された URL に...

> だが、管理領域のサイズはどこにも定義が無いことから、これらは
> 不定のサイズと考えるべきだ。他のコンパイラでは(場合によっては
> コンパイルオプション次第で)違うサイズの管理領域を確保している
> 可能性は十分ある。

と書かれているが...。これじゃ不満なの ?

こんなことがしたいのなら、::operator new() と ::operator delete()
を適切に定義すべき。
937922:02/05/17 20:45
>>936 これじゃ不満なの ?

不定であるなら、それを求められないと必要なメモリ量が分からないから、どうすればいいの?
って質問なんですけど

938936:02/05/17 20:53
>>937
だから ::operator new[]() と ::operator delete[]() を定義しろと、
書いてあるんだけど、見えないのか ?
(そう言えば、仕様変わったんだよな、忘れてたよ。サンクス。>>935)
939935:02/05/17 20:56
すまん、カン違いしていたのはオレのほうみたい。
void *operator new[]() を定義した場合は、てっきり、これが返す
アドレスから配列はが始まると思っていたのだが、やっぱり、先頭部は
管理領域になるようだ。
940デフォルトの名無しさん:02/05/17 21:11
boost 1.28.0 age
941935:02/05/17 21:12
ただし、operator new[](size_t size, ...) の size には、
その管理領域も含めたサイズが渡ってくるので、メモリを確保するのは
そこでやればよいのかな。
1.28の目玉はlambdaか。
>>942
LISPみたいな?
944831:02/05/18 00:38
>>943
こんな感じに書けるんよ。結構感動。

vector<int> v(10);
for_each(v.begin(),v.end(), _1 = 50);
for_each(v.begin(),v.end(), cerr << _1 << " ");
>>944
1行foreach、へぇ。
946831:02/05/18 00:43
lambda の説明としてはこっちの方が適切か。

int i = 3, j = 5,k;
k = (_1 + _2)(i, j); // k = 8
>>944
for_each(v.begin(),v.end(), cerr << "error: " << _1 << " ");
となると素直には書けないので constant() とか使わないと
いけないのが、ちょびっとだけ悲しいんだけどね。
948デフォルトの名無しさん:02/05/18 04:12
あげ
949デフォルトの名無しさん:02/05/19 04:46
class CTest
{
public:
int m_i;
CTest& operator+=(const CTest& t)
{
(*this).m_i += t.m_i;
return (*this);//これは必要なのか。
}
};

operator+= にreturn(*this)は必要なんでしょうか?
なくても動くような気がするのですが、どのような場合、
return (*this); が必要なのでしょうか。
>>949
戻り値があることについては、
a = (b += c);
というふうに、足した結果をさらに参照できるよううに。

戻り型が値でなく非constの参照なのは、代入結果の左辺値にさらに変更を加えることを許すためじゃないすか。
(a += b) += c;
とか。
951949:02/05/19 05:01
>>950
なるほど、
>a = (b += c);
のような使い方、したことなかったので、気がつきませんでした。
納得しました。ありがとうございました。
>>950
>> (a += b) += c;

でもそれって int とか基本型では保証されてないって聞いた覚えがあるぞ。気のせいか?
const CTest& operator=(const CTest& t)
const CTest& operator=(const CTest& t) const
なんつって
状態を変更するからoperator=() constはありえない
956デフォルトの名無しさん:02/05/19 09:45
//例外をthrowできない関数
void Test1() throw()
{
throw 1;//Error!
}
//例外をthrowできる関数
void Test2 throw(...)
{
throw "Test2";//Ok
}
//例外をthrowできる
void Test3() throw(int)
{
throw 1;//Ok
}
throwについて調べてるんですが、
末尾につけるthrow(...),throw()は、
プログラムのミスを避けるためのものだと思うのですが、
使わないと最適化への影響や何らかの弊害があるのでしょうか?
よろしくお願いします。
957思い出:02/05/19 09:45
class C{};

C obj_c();  //これでデフォルトコンストラクタ呼んでたと思ってた
>>956
帰ってくる例外の型を特定するための機能だよね。
959デフォルトの名無しさん:02/05/19 10:06
>>958
void Test4() throw(unsigned int)
{
throw 4;
}

void TestCatch1();
{
try{
Test2();
Test3();
Test4();
}
catch(int){//型がわかる
//Test2
}
catch(unsigned int){//型がわかる
//Test4
}
}

TestCatch2() throw()
{
try{
TestCatch1();
}
catch(...){//残り
//Test3
}
}

あいまいさを解決できるということですね。納得できました。
そういうわけでもないんだが。
呼び出し側が捕捉すべき例外を明示するための機能。
throw(unsigned int)と指定されていれば、
throw floatは成立し得ない(プログラムが落とされる
>>952
気のせいだろ。というか、その程度、ちょっとコンパイラで
確認すればいい話じゃないのか?
> (a += b) += c;
このコードは、VC6SP5 , bcc5.5.1 , gcc2.95.3-6 で
コンパイルが通って、なおかつ期待通りに計算されてたぞ。
ただ、ついでに確認したhttp://www.digitalmars.com/の
コンパイラだと、コンパイルが通ってくれなかったな。
このコンパイラがヘヴォなだけだと思うんだが…。
本格的に確認したければ、プロ言C++を見るしか。

>>953>>954
operator=()の戻り値をconstにはするな、とEffective C++に
書いてある。理由は、Scott Meyersお得意の『intのように振舞え』
だったけど。
Exceptional C++にもconstにはするな、と書いてある。こっちの理由は、
STLのコンテナに入れられなくなるから、だ。
そういうわけで、constを付けちゃいけない。
>>960
throwする側が仕様以外の例外を返さないようにする保険のようなもんじゃないの?
>>962
する側じゃなくて、される側のために用意してあるもんなんだが
>>963
まぁ、お互いのためだ。

出す側が未定義の例外投げればコンパイルエラーになるし、出される側も飛んでくる型が特定できる。
965デフォルトの名無しさん:02/05/19 10:23
もし同じ型の例外が複数きたときはどうすればいいんでしょうか?
>>965
その例外の値(intとか)クラスメンバ(Exception.typeみたいな)で判断するべし。
>>964
コンパイルエラーにはならないっしょ。例外仕様が指定されていないライブラリのために。

>>965
言ってる意味がわからん。例外は、投げるときは必ずひとつのはずだが。
968965:02/05/19 10:37
>>967
よく考えてみれば、一つですね。
>>966
例外処理クラス作ります。
uncaught_exceptionがサポートされてない処理系(VCとか)で
スタックに確保したオブジェクトのデストラクタがthrowするとか。
>>969
例外のためのアンワインド中に、スタック上のオブジェクトのデストラクタが
さらに例外を投げた場合って意味か?
その場合はいきなりプログラムがあぼーんじゃなかったっけ。
だからデストラクタでは例外を投げるなよ、といろんな本に書いてあるのでは。
971デフォルトの名無しさん:02/05/19 12:10
>>957
えっ?違うの・・・?
# ネタじゃありません・・・
ていうか
もう痔スレ立てますよ?
>>972
よろしこ。
>>972
おっと、いつのまに1000間近か…よろしく
>>971
関数宣言になっちゃう
976971:02/05/19 14:02
>>975
ナルホドサンクスコ。
v(^・^)v
グッシッシ
v(^・^)v
981    :02/05/21 00:45
v(^・^)v
v(^・^)v
v(^・^)v
v(^・^)v
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
v(^・^)v
996v(^・^)v:02/05/22 18:25
Boost 感動した。よくやった。
997
998v(^・^)v:02/05/22 18:27
1000 トルナラ イマノウチ
999v(^・^)v:02/05/22 18:28
キタ━━(゚∀゚)━( ゚∀)━(  ゚)━(  )━(゚  )━(∀゚ )━(゚∀゚)━━!!!!!
1000v(^・^)v:02/05/22 18:29
v(^・^)v
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。