1 :
デフォルトの名無しさん :
02/06/25 22:06
実数の階乗はガンマ関数ってか?
乙カレー
v(^・^)v
v(^・^)v ←むかつく
v(^・^)v ←なんすかこれ
もうC++スレいらないって言っただろ 何で立てるんだよ?
ドイツ強いな。 fstream系のコンストラクタってなんでワイド文字バージョンが ないのだろう。変換が面倒くさい。
SendMessage(
>>11 , WM_ITTEYOSHI, 0, 0);
if (msg.sender ==
>>17 )
reject();
if (
>>11 ->temminate())
>>11 ->deallocate();
terminate()だった。逝ってきます・・・・
void
>>11 ::OnDeallocate()
{
for (;;)
new
>>11 ;
}
void
>>11 ::
>>11 ()
{
this->execute("マンキン.exe");
}
>>23 たしかに
>>22 はvoidが不要だった。コンストラクタのつもり。
オブジェクトを生成しようとすると、マンキン.exeが実行され、
HDDがあぼ〜んする。
26 :
デフォルトの名無しさん :02/06/26 00:30
C++の参照について質問です。 void A(char **a,char **b){ *a="a"; *b="b"; } main(){ char *a,*b; A(&a,&b) というように、2つの値を返したい関数があるのですが、 これを参照を使おうと思って、 void A(char &*a,char &*b) としてみましたが、 エラー:参照型へのポインタあるいは参照は定義できない と言われてしまいました。やりたいのは参照型へのポインタではなく、ポインタへの参照 だと思うんですけど、どう書いたらいいのか教えてください。
void A(char*& a, char*& b)
istreamからvectorに内容をコピーするとき、 istream_iterator<char> i(f), e(f); advance(e, 15); copy(i, e, back_inserter(v)); とやってみても一切読み込めません。 指定サイズを読み込む方法って無いんですか?
教科書に #include"compati.h" とあったので書き込むと fatal error C1083: インクルード ファイルがオープンできません。'compati.h': No such file or directory と出て来ます。 これは何者なんですか? ほんとのド素人です
>29 勘だが、その教科書の前のほうにそのファイルが定義されている
ってゆーか、他の人の方が効きたいんじゃないか>これは何者なんですか?
includeの中身を” ”でくくるっていうのはどういうことなんですか?
>32 先に近所を読む
それが教授からコピーしか貰ってないから前後が無いんですわ
その答えはK&Rに。
36 :
デフォルトの名無しさん :02/06/26 00:48
教授にそのことを言うか、同じ本を探すか、ですなぁ?
そうですか・・
ちなみに「先に近所を読む」ってどういう意味です?
compati.hについて書かれてないのならお手上げですな。 ファイル自作してエラーメッセージを見れば、あるいは内容を推測 出来るかも知れん。
stdio.hとかがあるところを読む前に、自分が作業している ディレクトリを探すってこと。たいてい標準的なのは<>で囲み、 自分たちがつくったファイルをインクルードするときは""で 囲む
教授を小一時間、問い詰めろ。
プログラムが80行あるんで順番に書き込んでみてもらってもいいですかね?
>>28 input iteratorからcopyでは無理。素直にforループを書く。
と思う
まあ、いいんでない?
46 :
デフォルトの名無しさん :02/06/26 00:58
そうだな まだスレの初めだからいいだろう。
#include<stdio.h> #include"compati.h" #define M 5 /*機会の台数*/ #define N 2 /*修理者の人数*/ #define A 10.0 /*平均故障発生感覚*/ #define H 4.0 /*平均修理時間*/ #define DT 0.5 /*時刻増分*/ #define T_END 10000.0 /*シミュレーションを終える時刻*/
void main(void) { double tt = 0.0; /*シミュレーションクロック*/ int i; /*待ち行列のforのカウンタ*/ int j; /*機会のforカウンタ*/ int k; /*修理者のforカウンタ*/ int f = 0; /*故障している機械の台数*/ int q = 0; /*待ち行列の長さ*/ int sm[M + 1] = {0}; /*機会jのjの状態*/ int sn[N + 1] = {0}; /*修理者kの状態*/ int sq[M + 1] = {0}; /*待ち行列*/ double p[M + 1] = {0.0}; /*機会がf台故障している時間*/ srand(15);
/*開始*/ while (tt <= T_END){ /*故障発生*/ for(j=1;j<=M;j++){ if(sm[j]==0){ if((1.0 / A*DT) > RAND()){ sm[j] = 1; q = q+1; sq[q] = j; } } }
/*故障修理*/ for(k=1;k<=N;k++){ if(sn[k]==0){ if(q>0){ sn[k]=sq[1]; q=q-1; if(q>0){ for(i=1;i<=q;i++){ sq[i]=sq[i+1]; } } } } else{ if((1.0/H*DT)>RAND()){ sm[sn[k]]=0; sn[k]=0; } } }
/*表示*/ printf("%7.2f ",tt); for (j = 1; j <= M; j ++) printf(" %2d",sm[j]); printf(" "); for (k = 1; k <= N; k ++) printf(" %2d",sn[k]); printf(" "); for (i = 1; i <= q; i ++) printf(" %2d",sq[i]); printf(" "); /*故障している機械の台数を数える*/ f=0; for(j=1;j<=M;j++){ if(sm[j]==1){f=f+1;} } p[f]=p[f]+DT; /*時刻を進める*/ tt=tt+DT; } /*結果出力*/ for(j=0;j<=M;j++){ printf("p[%1d]=%10f\n",j,(double)p[j]/T_END); } }
以上です
53 :
デフォルトの名無しさん :02/06/26 01:02
イテレータとかのoperator->() は普通ポインタを返すようになってますが なんでこれでメンバの参照ができるのですか? そのまま単純に考えると (イテレータ)->(メンバ名) は (Tのポインタ) (メンバ名) となるように思われ意味をなさないですよね。 Bjarneは > p->m = 7; // (p.operator->())->m = 7 てますが、つまりoperator->()は特別扱いってこと?
srandとRANDぐらい?
ぱっと見、RAND()くらいしかないような。
>54 ぽいね。なんとかなりそうじゃん
55 鬱氏
どういうことですか?
>>52 >void main(void)
ここだけでワラタ。
i=1;i<=M ってのがいいね。
#include "compati.h" のかわりに #include<stdlib.h> double RAND(void) { return (double)rand()/RAND_MAX; }
>助けてください #include"compati.h" の代わりに #include<stdlib.h> double RAND(void){return (double)rand()/(double)RAND_MAX ;} とでもすればよい
げげげ
>62 すまん。
かぶりまくっているな。
ふたりが一致したということは、かなり正解ってことかな?
おお!エラーがなくなりました!
待ち行列か。昔実験でやったよ。
ちなみに実行すると永遠に数字が出るんですがどこ直したらたらいいんですかね・・?
新たな問題発生
>70 中身についてはがんばってくれよ
>70 ここから先は宿題の範疇
ですよね(笑) っていうかマジありがとうございました! これで胸張ってあした免許の試験受けにいけます!
#define T_END 10000.0 /*シミュレーションを終える時刻*/ T_ENDの単位はわからないけど、いつか止まりそう。
あ、遅かったか。
まだいました
そうか、あしたがんがれ。
#define DT 0.5 /*時刻増分*/ #define T_END 10000.0 /*シミュレーションを終える時刻*/ 好きにかえればいい。このままだと20000行
>78 なんかいいひとっぽい。
いやー、凄いですね。今大学3年なんですけど どうやったらそんなにCできるようになるんですか?
>81 俺は大学4年だよ。Cをはじめたのは9年前だが。
プログラミングが好きならできるようになる。
試験があるならさっさと寝とけ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>81 (_フ彡 /
りょうかいです
.∧ ∧
(
>>53 ).。oO(氏にたい…)
/ \
⌒| /⌒
ノ_ノ
>>85 イテレータがポインタを返すようになってるから、->演算子はメンバを返す
ように(通常の構造体のアロー演算子のように)オーバーロードされてる
だけの話では?
>85 自分でスマートポインタ書いてみたらわかるんじゃない?
class A{ public: void f(){ puts("A::f"); } }; class B :public A{ public: void f(){ puts("B"); A::f();// ここ } }; ここで、クラス名を指定せずに自動的に継承元のメンバ関数を呼ぶことはできないのでしょうか。 perlだとSUPER::を付けると検索してくれるんですけど。
89 :
デフォルトの名無しさん :02/06/26 02:05
C++の予約語ってこれ以外に何がありましたっけ? auto and bool char class const const_cast double define defined do extern explicit enum else elif endif export float for int if ifndef include long mutable namespace or public protected private return register static static_cast struct switch short sizeof template typedef typename using void volatile while xor
>>88 多重継承が可能な言語では無理じゃないの?
>89 reinterpret_cast
>>86 operator->()が返すの自体はポインタではないですか・・・
>>87 ただ単に保持しているポインタを返すだけで期待通り動くので何も新しいことは
わからなかったです・・・
dynamic_castもな。 それから、xorは予約語じゃないぞ
95 :
デフォルトの名無しさん :02/06/26 02:13
>>89 あと
import
extends
implements
abstract
native
があります
>xorは予約語じゃないぞ そうだった(..;)どうも
>95 なかなかアグレッシブな人物だな。
extensってJavaじゃないでしか?(..;)
>>90 perlは多重継承を可能にするために@ISAが配列になってると思ってたんだけど。
>>89 なんか、要るのがなくて、要らんのがあるね
xor予約語じゃない? try,catch もある。
case break
operator,new,delete
inline
friend asm union
signed unsigned this
ifndefが入っててifdefがないのはどうよ つーか、プリプロセッサディレクティブもありなのか?
>89 スキャナでも作る気?
エディタの強調表示用のキーワード登録とか?
>113 それ、ありそう。
実装例があるかは知らないけど、exportキーワードはあるな。
括弧とか比較演算子とか、記号を奇妙な2文字の組み合わせで表現する方法があったけど、 なんて言うんでしたっけ? 検索キーワードが思いつかず、具体的な表記も分からないので検索のしようがないです
トライグラフって、C++でも有効なの?
有効。
119 :
デフォルトの名無しさん :02/06/26 09:23
stringクラスを参照ではなくそのまま関数の引数に与えるのは 良くないと言われたんだけど、本当ですか? なんでも、VC標準のSTLやSTLPortではCopy On Writeになっていないから、だそうで。
>>119 string の値渡しは、const string& で渡す場合にくらべると、
百害あって一利なしって話だと思う。
あ、一利あった。
渡した先で const_cast されて、呼び出し元のデータが壊される危険性を回避できるな。
そんな理由で効率を落とす気には、普通は、ならんと思うけど。
>>119 VCのstringはリファレンスカウントしてるよ。
GCを導入しているC++処理系はありますか? あったら教えてください
まねじだ・・・(´д`;)
>>122 operetor new, operator delete を自前で定義すれば、処理系に依らず GC を
使えるけど。BoehmGC とか。
(ただし最適化しすぎると、動作がおかしくなったりする)
Cの初心者です。 ポインタについて学び、使い方は分かったのですが、これを使う理由が つかめません。どういった場面で必要になるのか、どなたか教えて下さい。
>>126 文字列の操作、リストの実装、グラフの実装など。
ほとんどの場面で有効。
>>127 即レスthxです。参考にになりました(ノ´Д`)ノ
>>89 誰もasmキーワードに触れなかったのは何故だろう(w
>>89 規格書を引くと 2.11 Keywords に書いてあるよ。
132 :
デフォルトの名無しさん :02/06/26 21:35
>>53 よ、くじけるな! 俺も同じ疑問を持った人間だ!
何も考えてない
>>86 >>87 がマヌケなレスをしてるが、
とりあえず確認コードを書いてみるべさ。
class HOGE
{
void foo(void){cout<<"foo"<<endl;}
};
auto_ptr<auto_ptr<HOGE> > ppHoge(new auto_ptr<HOGE>(new HOGE));
ppHoge->foo();
これでどうよ? 俺もまだ実験してないけど、これで
なにかが分かってくるんじゃないか?
あとで実験報告もするべさ!
trieコンテナのあるライブラリって無いですか? 指定したノード以下の要素すべて列挙できる物が欲しいのですが。
純然たる木構造だったら、自分で書いてもたいして手間にならないんじゃない?
VC6SP5での実験結果!
以下のコードが、正常にコンパイルされることがわかった!
(ppHoge->operator->())->foo();
ppHoge->operator->()->foo();
ppHoge.operator->()->operator->()->foo();
(*ppHoge.operator->()).operator->()->foo();
(*ppHoge.operator->())->foo();
で、結論。
ようするに、「new演算子」と「operator new」みたいな関係だ!
(オブジェクト)->(メンバ)
ってのは、「->演算子」の呼び出し。「->演算子」を呼び出すと、
演算子の左側がポインタなら、直(じか)に「->演算」を行う。
演算子の左側がクラスなら、そのクラスのoperator->()を呼び出した後、
「->演算」を行う。それが、
> p->m = 7; // (p.operator->())->m = 7
の意味だっ。
だから、
ppHoge -> -> foo();
はコンパイルされない。こいつは、「->演算子」の右側に引数が来るべき
なのに「->演算子」が来ているから。
うむっ、おっけっ! どこにも矛盾はないぞっ! どうよ?
>>53 (´-`).。oO(問題は……これってプロ言を読んだら書いてありそうだなってことだ……)
>>135 そんな興奮せんでも仕様に書いてあるがな。
An expression x->m is interpreted as (x.operator->())->m for a class object…
>>136 やっぱりかいっ!
(´-`).。oO(やっぱプロ言は買っとかんとあかんかね……)
operator->()を呼び出した場合はさらにそのあとに -> があるかのようにあつかわれるのか?
というのが結局
>>53 の意図するところであったわけで・・・
漏れは「そうだよ」と言ってほしかっただけちゃうんかと・・・
ありがとう
>>135 ・・・
ARMには
>>136 のように書いてあったようだね・・・
endif に誰も突っ込まないのは何故だろう・・・ もしかしてホントにそうなの?
>>137 THE C++ PROGRAMMING LANGUAGE(=プロ言?)にあったのが
> p->m = 7; // (p.operator->())->m = 7
です・・・
> THE C++ PROGRAMMING LANGUAGE これ本当にフルネームで言うのが大変。何かいい呼び名つけようか。
(´-`).。oO(鬱病なのって俺だけかな・・・)
C++3rd
(´-`).。oO(俺の他にも鬱病がいたんだな・・・)
表紙の特徴から・・・Dragon Book、ラクダ本、Red Book 著者から・・・K&R、GoF、Petzold う〜ん、表紙は各国で違ってるし特徴ないし、著者の名前も呼びにくいし・・・
スマソ・・・
いいかも。波しぶき具合が東映ぽくて。
びあるね本 決定!
昔のUNIXは3edとかいう名前がついてたと思った。 だからC++3edで十分。つーか既に古い。
>>151 gcc 3.x 系列、そろそろ安定した? 3.0.x の頃は、ちまちまとしたバグが出てた
みたいだけど。
(そろそろ乗り換え時か)
>>152 かなりいいみたいだよ。もっともDev-C++はまだβ版だけどね。
MinGWは実行ファイルのサイズが小さくて幸せ。
>MinGWは実行ファイルのサイズが小さくて幸せ。 ンなこたぁない
>>154 そ・・・・それは、、VCとかと比べるとあまり変わらンけど、BCよりは
小さいかなと。msvcrt使ってるから。
でも、gcc3.1になってから、実行ファイルのサイズが大きくなった
ようだし。。。取り敢えずサイズが小さいという言葉は取り下げます。
156 :
デフォルトの名無しさん :02/06/27 19:29
http://www.tietew.jp/cppll/archive/3217 このメッセージから始まっているスレッドで、
コンストラクタから例外を出さない方が良いとなっているんだけど
読んでもイマイチ理解できません。
class A {
char* buf;
public:
A():buf(new char[100]{}
~A(){delete buf;}
};
たとえばこんなクラスで、newが例外をthrowしても、
クラス構築失敗で問題無いと思うんですが。
157 :
初心者以前 :02/06/27 21:04
これからVC++を始めようと思うのですが、 つくったもの(exeファイル)をネット上で実行ってできるのでしょうか? ダウンロードして、実行というものはみたことあるのですが クリックして、ネット上で実行するものをみたことありません。 どうなのでしょうか
文字列配列をnewで確保する方法ってこれであってますか? char** all_line = new char*[n]; for(int i=0;i<n;i++) all_line[i] = new char[100];
なぜvector<string>を使わない?
>>159 ごめんまだ入門者だから勉強してないんだ
>>157 「ネット上で実行」の定義を述べて下さい。
>>161 多分だけど、CGIプログラムのことじゃないかな?
>>158 いいけど100文字が分かっているなら
char (*p)[100] = new char[n][100] ;
のほうがいいと思う
>161 Terrariumとか「ネットで実行」にぴったしダネ
みなさん自前のallocaterとか書いてますよね 俺も頑張ろう...
書いてないヨ
うわーん孤立しちゃったよ〜
170 :
デフォルトの名無しさん :02/06/28 17:16
Windowsでのエラー出力をストリームでやりたいのですが、 (最終的にはOutputDebugString()で出力する) これって、ガリガリ書くしか方法は無いのでしょうか? なんかSTL辺りに含まれてそうな気がするのですが(継承して使うとか)... 又、ソースを公開されているページでも良いので、ご存知でしたらお教えください。 trace << "エラー 変数=" << tmp << endl; みたいに出来ないでしょうか...
↑そういうの待ってました!! どうもありがとうございます。
173 :
デフォルトの名無しさん :02/06/28 19:34
詳しい人に質問!たとえば ホームページの管理人つまり制作者はそのホームページに来 ている人のどこまでの個人情報を知る事ができるの?あっipから住所等の個人情報が解る なんてこという低レベルの回答は無しね。っていうか、ここには低レベルな人はいないとはおもうけど。
板違い Web制作板にいけ。
>>173 その日にしたオナニーの回数や昨日食べた朝飯、
尻の使用回数などまでバッチリ分かりますが。
176 :
デフォルトの名無しさん :02/06/28 20:44
//a.h class a { private: static int m_value; public: static int Get() { return m_value; }; }; //b.cpp #include "a.h" class b : public a {}; void main() { b::Get(); }; とすると、リンク時に「Error: 外部シンボル 'a::m_value' が未解決」 となるんですが、なぜなんでしょう?
スタチックだから
m_valueの実体が定義されてないからでした。 class a { private: static int m_value; public: static int Get() { return m_value; }; }; int a::m_value = 0;
179 :
デフォルトの名無しさん :02/06/28 21:05
180 :
デフォルトの名無しさん :02/06/28 21:39
#defineとconstの違いは何ですか? constは関数の中などで軽く定数を持たせたいときに使う事でよいですか?
>>180 Effective C++を買って読もう。君の質問の回答はそこにある。
ついで、将来君が疑問に思うであろう問題の回答の3割ぐらいはそこにあるはずだ。
>>181 どうもです。
財布に厳しい本ですが探してきます。
183 :
デフォルトの名無しさん :02/06/28 21:47
C++はプリプロセッサを使わないように改良されている・・・ by effective C++
Effective C++
思ったより値段の安い書籍でしたね。
1万円ほどすると勘違いしてました。
>>183 ナルホドどうもです。
便乗質問、EffectiveC++は図書館から借りてきて、暗記するほど 読み込んだのですが、Moreの方の評価はどんなもんでしょうか? どちらかを購入したいのですが、間違いなく良書なれど既読の前者か、 立ち読みした感じ、ちょっと重箱の隅っぽい気がした未読の後者か…。 3800円を出せぬ貧乏人に、せめて知識をお与え下されば幸いです。
>>185 Effective C++, More Effective C++, Effective STL 三部作は、食費を削っても
買うべき。
STLもあったのか。買わねば・・・
>>186 スマートポインタや例外処理の解説くらいならとりあえずいいかな
…と思って他のですが、前作に劣らぬ良書なんですねぇ。レスサンクスです。
食費\400/dayか………………(;´Д`)つI アト380ニチ…
Exceptional C++も死んでも買いなさい
Modern C++ Designもよろしく。
C++で書かれたデザインパターンの良本はありませんか?
>>191 GoF のデザパタ本で良いと思うが。後は 190 も挙げてるけど Modern C++ Desgin
が template 使ってデザパタしてる。
191 _φ(。。_) GoFは著者名でしたっけ。ミョウニチ本屋へ足を運んでみます。 ありがとうです。
洋書以外だと憂鬱本ぐらいか?(w
>>195 Inside the C++ Object Model も入れとく。コンパイラの内部動作について理解を
深めるのに最適。STL 使うなら Generic Programming - STL による汎用プログ
ラミングも必読。あとは C++ only の本ではないが Linkers & Loaders も読んで
おいて損はない。
>>196 あれも良い本だよな。OO がらみだと、デザパタ本に憂鬱本、それからリファク
タリングあたりか。
(とりあえず、こんなもんじゃない?)
憂鬱本って何ですか?
>>198 『憂鬱なプログラマのための オブジェクト指向開発講座』
C++というよりはオブジェクト指向についての本だが。
わりと具体的に話を勧めていくので分かりやすい。
//しかし、必読書のレベルですらいくらかかるんだ?
C++コンパイラのインストーラには、 これらの本を理解しているかのテストをするセクションが欲しいね。 クリアしないと絶対にインストールできないの。
>>200 実際にやってみながら学ぶことができない罠。
>>203 『Generic Programming ―』は、体系的・抽象的に書かれているので、
ある程度 STL が分かってから読むべき本のように思う。でも、読んでおくと
視野が広がるし、思考の経済というか、他方面への応用も利くと思う。
『Inside the C++ Object Model』は、以前トッパンから訳書が出ていたんだが、
同社の出版事業撤退により絶版状態のようだ。C++ を究めたいという酔狂もの
には必読。
さんきゅ。憂鬱本とあわせて、その2冊も探してみるよ。
VC7でこんな現象に出くわしたんだが、これってバグだろうか? 下記ソースをコンパイルすると error C2535: 'Aho<T>::Baka Aho<T>::f(Aho<T>::Baka)' : メンバ関数は、既に定義または宣言されています。 こういわれる。 template<class T> class Aho { typedef T::Baka Baka; //typedef int Baka; // 上の行をコメントアウトしてこの行を有効にするとコンパイルが通る template<class U> Baka f(Baka baka); template<> Baka f<int>(Baka baka) { return Baka(); } template<> Baka f<char>(Baka baka) { return Baka(); } };
207 :
デフォルトの名無しさん :02/06/30 13:57
3行目ですでに使われてるBakaをもう一度使ってるからじゃないの?
そゆ問題では無いと思う。 テンプレート引数に依存した不明な型Bakaを引数にとった関数は その特殊化よりも不明な引数の一致を優先して判断されているように 見受けられる。バグかな・・。
>>208 とりあえず gcc 2.95.3 でも Borland C++ Compiler 5.5.1 でもコンパイルエラー
になることは確認したけど。
配置構文(゚∀゚)デキタ!
>>209 するとC++として不正だって事?
なにがダメなんだろ・・・。
もしかして、 typedef typename T::Baka Baka; じゃない?
214 :
デフォルトの名無しさん :02/06/30 20:54
教えてください。 Cを一通りできるとして C++を業務レベルまでマスターするには どれくらいかかるんですか?
STL3年デザパタ5年
>>206 typedef T::Baka Baka;
の意味を考えたらよくわかるはず.
当然,class T ではすでに T::Baka が typedef されている必要がある訳で.
あとは
>>212 のいうとおり,
typedef typename T::Baka Baka;
は必須の気が.
>>216 いや、結果は変わらないんですよ・・。in VC7
他のコンパイラではどうなんでしょうか?
template<class T>
class Aho {
typedef typename T::Baka Baka;
//typedef int Baka; // 上の行をコメントアウトしてこの行を有効にするとコンパイルが通る
template<class U> typename Baka f(typename Baka baka);
template<> typename Baka f<int>(typename Baka baka) { return Baka(); }
template<> typename Baka f<char>(typename Baka baka) { return Baka(); }
};
>>217 だ か ら
具体的にどんなインスタンス作ってるか教えれ
答えるのはそれからだ
>>218 宣言しただけ。
インスタンスは作らない状態でエラーが出ます。
>>220 ・・本当だ。
つまりVC7のヴァグってことでOK?
ゲイツ氏ね
・ここではどういう意味で「インスタンスを作る」という句を使っているのか? ・TにBakaを持っていないクラスを渡しているんじゃないか? ・VC6で通って、VC7で通らないことってあるの?
>>220 今試せないけどソースは上に上げたあれのみです。
typedef Aho<ほにゃらら>
もしてないし、ましてインスタンスの作成もしてないです。
224 :
デフォルトの名無しさん :02/07/01 18:17
お取り込み中申し訳ないのですが、新しく質問しても良いでしょうか? 基本クラスのポインタに派生クラスのオブジェクトをもたせている場合、 基本クラスのポインタをdeleteしただけでは派生クラスのデストラクタは 呼んでくれないのでしょうか?今書いているソースでそうなっていて メモリリークを起こして困っているのですが・・・。
>>224 基底クラスのデストラクタを virtual にする必要があります。
>>225 あ、一応やってみています。当然ながらクラスと同名なので、デストラクタの
名前は変わってくるのですが、それでもオーバーライドしてくれるんですか?
やってみても呼んでくれてないようなんですが・・・
>>226 > 名前は変わってくるのですが、それでもオーバーライドしてくれるんですか?
もちろん。っつか、大抵の実装では名前なんか見てなくて vptr->vtbl に書き
込まれたポインタを参照するだけだし。
ダメだというそのプログラム、簡略化してテスト用のコードを張ってくれ。
>>227 ちょっと今取り込んでいるので、もし良かったら夜に張るので
お願いできますか?
ちょっと質問です。 JPEG画像を縮小して保存するプログラムを作りたいんですが、自分でバイナリ読み取ってピクセル圧縮して色とかも平均出して・・・とかってやらないと駄目でしょうか。 かなり大変そうなんですが・・・ なんか簡単にできるライブラリとかありませんか?
g++のios::begがあった〜(疲労) パパこれを探すのに5000ファイルくらい調べちゃったよ
素直にgrep汁
>>227 単なる手前のボケでした。平身低頭、申し訳ありません。
一応顛末を書いておくと、基底クラスや派生クラスが親子構造で混在するような
システムを作っていて、deleteする時はデストラクタで子供を次々deleteしていく
ようにして、一変に消せるようにしていたのですが、条件判定に変なものを使って
失敗していたようです。お騒がせしました。
直したら立派に呼んでくれて安心しました。
>>231 locate ios_base で一発じゃないのか?
まちがえた… locate '*/ios' とでもしてくれ。
236 :
デフォルトの名無しさん :02/07/01 22:37
>>230 どうもです。しかし・・・英語がむずい・・・;
なんか無理そうだ・・・とりあえず落としてみます。
すいません、236は僕です。あと下げ忘れました。スマソ!!
libjpegなら日本語解説も沢山ある
クラスのメンバ関数の引数の配列の数に変数を使いたいのですが できますか? むりなら代わりとなる方法を教えてください
配列の数って要素数?
>>239 void A::foo(int array[], int count)
{
for (int i = 0; i < count; i++) cout << array[i];
}
で何か不満でも?
242 :
デフォルトの名無しさん :02/07/02 00:54
void A::foo(int arr[N]) の N を変数にしたいってことなのかな。飛躍し過ぎ?
>>241 >>239 微妙にスレ違い
void A::foo(vector<int> ints)
{
for (vector<int>::iterator i = ints.begin(); i != ints.end(); ++i) {
hanatanhalahala(i);
}
}
template<size_t N> void f(int arr[N]); char a[256]; f(a);
>>245 動的なサイズ変更に対応できないのでアウト
247 :
デフォルトの名無しさん :02/07/02 01:07
引数だと一次元目の[]の中身って意味なさないような。
ようは、239の質問が微妙ということでいいですか?
250 :
デフォルトの名無しさん :02/07/02 01:16
>>244 スレ違いを指摘するんなら、もっとスレ違いらしさを出したコードにしとけよ。
void A::foo(vector<int>& ints)
{
for_each(ints.begin(),ints.end(),hanatanhalahala);
}
超イイ!!
>>245 へぇ〜。面白いね。配列渡しは通らないけども
#include<iostream>
template < int N >
void f(char (&arr)[N]) {
for(int i=0;i<N;i++) std::cout << arr[i] << "\n" ; } ;
int main() {
char s[] = "2channel" ;
f(s) ; }
テンプレート引数をそこまで自動で判断してくれるんだから、 次期C++には型推論が導入されたりしてな。
型推論・・・凄い時代になったものだ まあ技術は進歩し続けているわけだけど。
おお、すげえ。
これ以上コムパイラが対応しきれるかどうか・・・。
おおーできたー。
ポインタに対応できないから実用上無意味だけども
情けないことにどういう理屈なのかわからない。
263 :
デフォルトの名無しさん :02/07/02 02:43
void f( const char *p ) { std::cout << "pointer" << std::endl; } template< unsigned N > void f( const char (&x)[N] ) { std::cout << "template array " << N << std::endl; } int main() { const char x[] = "array?"; f( x ); f( &x[0] ); return 0; } ・・・template バージョンが呼ばれないです。(cygwin g++) なんで?
template版よりも、通常のfの方が呼び出しのマッチングに関して優先順位が 高いからじゃないの?
>>263 こうやったら「曖昧」と叱られたよ。
template <unsigned N>
void f(const char (&x)[N])
{
std::cout << "template array " << N << std::endl;
}
template <>
void f(const char *p)
{
std::cout << "pointer" << std::endl;
}
int main()
{
const char x[] = "array?";
f(x);
f(&x[0]);
return 0;
}
面白いな、コレを多次元配列でやるとどうなるんだろう
template< typename T > void f( T *p ) { std::cout << "pointer" << std::endl; } template< typename T , unsigned N > void f( T (&x)[N] ) { std::cout << "template array " << N << std::endl; } ・・・こっちにしてもだめですた。 実行確認せずにこれの結果って予想できるもん? や、決まってるんだろうけどさ。
Modern C++ Design買ったんだけど、俺の乏しい理解力では到底内容が わからなかったので、もう少し易しいtemplateテクニックを満載した本を 誰か出版して欲しい。
>>268 そーゆー路線だと、結城さんあたりかねぇ。
どうもchar x[] = "array?";のxが参照としてはchar[]だけども 式の評価ではchar*になってこちらが優先されるようだ。 ためしにf(&x)とすれば配列バージョンが呼ばれる
>>269 C Magazineに寄稿している人だよね?ホームページを見てみたんだが、
C++関連の内容はまだうpしてないようだ。
>>270 本当だね。この実行結果は実に興味深い。
template <unsigned N>
void f(const char (&x)[N])
{
std::cout << "template array " << N << std::endl;
}
template <>
void f(const char *p)
{
std::cout << "pointer" << std::endl;
}
int main()
{
const char x[] = "array?";
f(&x);
f(&x[0]);
return 0;
}
273 :
デフォルトの名無しさん :02/07/02 03:46
データベースをクライアントから操作するためのプログラムって ほとんどVBとかで十分なんですかぁ?VCってあまり 使われてないような、
>>273 プログラム側に何を期待するかによる。
スタンドアロンの VB 出すまでもなく Access VBA や Web がらみだと VBScript で
間に合うことも多いし、逆に VC でなければやっとれん、という事もある。
ただし、JAVAはつねにやっとれん。
>>273 うちの会社の基幹業務はAccessのVBAでやっとるよ。
最初のうちはスイスイ動いていたが、最近データの量が肥大して、
検索にだんだんと時間がかかるようになってきた。この先不安。
>>275 騙られた……。
確かに JDBC 1.0 の頃はかなり「やっとれん」感が強かったが、最近は
触ってないので知りません。
アルファベットが1文字以上連続しているものを単語と 呼ぶことにする。コマンドライン指定されたC++のソース ファイルを読み込みながら、単語ごとにその出現回数を カウントしておく。すべての単語が読み込み終わったら、 まずアルファベット順に単語とその出現回数を表示し、 その後、出現回数の多い順に単語を表示するようなプロ グラムを作成せよ。 ただし、単語にはアルファベットの大文字や小文字が 混じっていてもよいものとし、その場合大文字小文字の 区別なく、アルファベット順になるようにせよ。 また、ソートする部分については、この問題に合うソ ート用の関数を独立させて作ること。ソートの方法は何 でもよいものとする。 -----< わかります?
C++スレなんかで聞いたら10人中11人ぐらいソートせずに終わらせると思うが(藁
map使わない方が面倒だな。
283 :
デフォルトの名無しさん :02/07/02 10:20
おいお前等。 スタンダードアイオーでもイオストリームでもいいんだが、リファレンスっちゅうのはどこにあるんですか?
禿しく
>>281 の言う通り。
オレモマダマダダダシノウ...(-_-)
>>283 FILE*&
std::iostream&
C++の派生クラスの実装を、C言語だけで記述する事は可能でしょうか? 3DSMAXのプラグインSDKの仕様が、コンパイラのバージョンを指定しているけど、 そのバージョンを持っていないので、C言語でクラスのレイアウトに何とか整合してやって、 リンク可能な状態に持っていけないかなぁって・・・
コンストラクタとデストラクタがなくていいなら何とか。
> コンストラクタとデストラクタ えっ? コンストラクタとデストラクタ駄目ですか? 基底クラスのデストラクタがvirtual宣言されてマス。
基底クラスの物は呼ばれるけど、 派生(自作)クラスのデストラクタは呼ばれない。 それから、思いっきり実装依存になるよ。 CでCOMクラスを実装するのと同じ方法でやる。
ああわかってる ・・・・ わかってるってば!
人 (...・.・.) ?
C言語で仮想関数?(((( ;゚Д゚))))ガクガクブルブル
人 (...・.・.) ?
>>286 バージョン指定があるってことは、クラス名の mangling があってないと
ダメってことではないの?
> それから、思いっきり実装依存になるよ。 それは致し方無い事です。そもそも「3DSMAXのプラグイン」という事自体が実装依存なので。 > 派生(自作)クラスのデストラクタは呼ばれない。 これが問題だなー。でもなんで呼ばれないんだろう? 実装依存で、むちゃくちゃやって、何でも出来そうな気がするのだけど・・・ デストラクタが呼ばれるしくみが良く解ってないカモ > クラス名の mangling があってないと これも実装依存で、何とか実現できないものでしょうか? ふむー。そもそもVCって、CとC++を区別しちゃってて、CからC++のクラスにアクセスするのって無理なのかなぁ?
Modern C++ Designの表紙に載ってるようなナイフがホスィ。
Modern C++ Designを持っていないやしはC++プログラマにあらず
A (゚o゚)<持ってなくて悪かったなハゲー (ー)ー ))
299 :
デフォルトの名無しさん :02/07/02 18:27
2次元配列を動的に確保したいのですが class A{ public: BYTE x; BYTE y; BYTE p }; A** a; void Load(int x,int y){ a=new A*[x]; for(int i=0;i<x;i++){ →a[i]=new A[y]; } } int main(){ Load(100,100); } こうやると強制終了ダイアログが出て、落ちます。 VC++のエラーメッセージは 0xC0000005: Access Violation。で、 デバッガでは→の部分に印がつきます。 どこが悪いのでしょうか。
BYTE p;
VC++できるひといます?
302 :
デフォルトの名無しさん :02/07/02 18:55
>300 すみません。うつし間違えました。仰せのとおり;がpの後ろに必要です。
VC++できるひといます?
数値の加算、減算、乗算、割算のできるwindowsプログラム作りたいのですが、 まったくわかりません。誰か作っていただけませんか?
んで、その二次元配列にはstd::vectorを使えない理由はあるのか?
306 :
デフォルトの名無しさん :02/07/02 19:19
>305 はい、vectorを使っても落ちました。 ちなみにそのときのコードは vector <vector <MapData> > a; void Load(int x,int y){ a.assign(x); for(int i=0;i<x;i++){ →a[i].assign(y); } } これがまた→のところで落ちました。
307 :
デフォルトの名無しさん :02/07/02 19:27
実は
>>299 ではAのコンストラクタを省略してて
コンストラクタでの処理がおかしいと予想。
実は16bitのDOSアプリ、とかいう罠、はナイよな……
…… assignでなにがしたかったんだ?
310 :
デフォルトの名無しさん :02/07/02 19:54
>309 すみません。resizeでした。 vector <vector <MapData> > a; void Load(int x,int y){ →a.resize(x); for(int i=0;i<x;i++){ a[i].resize(y); } } しかしこうすると今度は上のほうで落ちました。
311 :
デフォルトの名無しさん :02/07/02 19:55
>307 コンストラクタは A(){ x=0; y=0; p=0; } となっています。
class A{ public: & nbsp;BYTE x; BYTE y; BYTE p; }; vector< vector<A> > a; void Load(int x, int y) { a.resize(x); for(vector< vector<A> >::iterator i = a.begin(); i != a.end(); ++i) { i->resize(y); } } int main() { Load(100, 100); a[99][99].x = 0xff; printf("0x%X\n", a[99][99].x); } どこで落ちるんだ?
>312 今いろいろやっていて気づきました。 a.resize(10) だったら大丈夫なのですが a.resize(100)だと落ちます。 メモリは192MB積んでいるのでメモリが足りないはずはないのですが・・・ タスクマネージャで調べても利用可能領域は40000KBありました。
314 :
デフォルトの名無しさん :02/07/02 20:26
sageてしまいますた
サイズが大きすぎ(2G以上とか)でnewがNULLを返してる?
sizeof(A)とxとyは幾つなんだろう
317 :
デフォルトの名無しさん :02/07/02 20:33
int dd=sizeof(A); 3でした。
うむ。VCのnewは例外を投げないので、返値がNULLかどうかチェック した方がよい。
>>299 (のp;を修正したもの)でも、落ちる要素は全くない
aという変数が別ファイルなりで別の型として宣言されてたりしないかな
或いはメンバ変数と仮引数とグローバル(static)変数か(xとyも両方で使われてるし)
321 :
デフォルトの名無しさん :02/07/02 21:00
//ヘッダ class MapData{ public: BYTE x; BYTE y; BYTE p; MapData(){ x=0; y=0; p=0; } } class MapManager{ vector< vector<MapData> > data; int Width; int Height; public : BOOL Load(char* MapName); } ヘッダ//
322 :
デフォルトの名無しさん :02/07/02 21:00
//cpp BOOL MapManager::Load(char* filename){ int fh=_open(MapName,_O_RDONLY); int StrLen; char buf[256]; _read(fh,&StrLen,sizeof(StrLen)); _read(fh,buf,StrLen); _read(fh,&Width,sizeof(int)); _read(fh,&Height,sizeof(int)); data.resize(Width); for(vector< vector<MapData> >::iterator i = data.begin(); i != data.end(); ++i) { i->resize(Height); } for(int s=0;s<Width;s++) { for(int j=0;j<Height;j++) { _read(fh,&data[s][j].p,1); _read(fh,&data[s][j].x,1); _read(fh,&data[s][j].y,1); } } _close(fh); return TRUE; } cpp// MapManager* mm=new MapManager(); int WinMain(----){ // mm->Load("test"); // return 0; } 詳細です。クラスだと何か違いますか?
323 :
デフォルトの名無しさん :02/07/02 21:02
int fh=_open(filename,_O_RDONLY); でした。すみません。
すいません。 クラスの便利さがわかりません。 どなたか噛み砕いて教えてください
>>324 ・メンバを非公開にできる。
・メンバ関数を持てる。
・継承が使える。
・仮想関数を使ってポリモーフィズムが実現できる。
などなど。
まずは使うべし。使って体感しる!
だめぽ。 なんか構造体と違いがあまりわかりませぬ(´・ω・`)
>>327 >>326 サソも言っておられるが、こればかりは口で説明してもなかなか
わかってもらえますまい。
簡単なクラスとそれを使ったサンプルをいくつか作ってみれば自然に
理解できるよ。
ん〜 今の仕事で、作ってます。 クラスだけえんえんと… 実際業務でクラスなんか作っても 使う部分の作業に当たらせてもらえません。 そこで、こんな仕様のプログラムでここを クラスにするとクラスのありがたみがわかる!! なんて、仕様書どなたかもっていませんか? 皆様レスアリガトウございます
stlを使えばありがたみが分かる
がんがれ
>>330 すごく「例えば」の話になるけど、リスト構造を扱う時、ポインタの付け替えを
すべてメンバ関数に任せればよいようになる。
あまりキチキチに非公開にしてしまうと効率が落ちることがあるが、バグは
どんどん出にくくなる。
>>321 関係ないかもしれないがMapDataにコピーコンストラクタを自分で作っても同じ?
vectorはresizeとかのときコピーコンストラクタよんでるとおもうけど。
なるふぉど… 確かにクラスの中だったらメモリは消えないですからね。 ポインタを頭に入れてみると確かに便利かもしれませんね。。。
>>335 んー、そうですね、クラスの中だからメモリが消えないというより、
リスト構造の細かいちまちまとした部分まで見ずに済むようになり、
プログラムの設計に専念できるようになると言ったらいいかな?
その代わり今までみたいに構造体のポインタを持って関数を
コールして操作するということはしなくなる(やろうと思えばいくら
でもできるが敢えてしない)ので、カナーリ感覚が違うんですよ。
std::stringや、CStringなどの文字列クラスを使ってみれ。 連結や比較なんかは演算子で出来るし、バッファのことは何も考えなくても よきにはからってくれる。
>>321 Width と Height に値を、resize に渡す前に確認してみたらどうか?
#include <new.h> #include <new> int new_nh(size_t) { throw std::bad_alloc(); return 0; } _set_new_handler(new_nh); これをプログラムエントリで実行して、例外を投げるようにしてみな。 vector<>内でメモリが確保できないと、通常はリカバリできないけど 例外を投げるとどうなっているかが分かる。
340 :
デフォルトの名無しさん :02/07/03 04:30
HRESULT __stdcall _com_dispatch_raw_propget(IDispatch*, DISPID, VARTYPE, void*) throw(); このように関数のプロトタイプ宣言に throw() と書いてあるものがありますが これはどういう効果があるのですか? この関数が呼ばれた瞬間に例外をスローするのですか?
>>340 逆です。この関数は例外を投げないという意味です。
>>339 #include <new.h>
#include <new>
int new_nh(size_t)
{
throw std::bad_alloc();
return 0;
}
WinMain(){
_set_new_handler(new_nh);
mm->Load(....);
}
BOOL Load(....){
//
try{
→data.resize(Width);
}catch(std::bad_alloc e){
}
//
}
こうやってみたのですが、→でハンドルされていない例外といわれます。
catch(...)だと大丈夫なのですが。デバッガは__sbh_alloc_block(int)というコンテキストで止まっています。
343 :
デフォルトの名無しさん :02/07/03 10:19
age
344 :
デフォルトの名無しさん :02/07/03 10:23
VB/BasicのGoSubに代わるCの命令ってなんかある?
>344 関数を呼ぶだけじゃないの?
>>345 関数呼びたくないの。
その関数内でしか持ってない、必要な変数多いし。
347 :
デフォルトの名無しさん :02/07/03 10:37
>346 DQNですか?
必要な処理をマクロ化するとか?(実質上コピペと変わらんが)
んー、やっぱ普通の方法無いのね。
>>348 今やってるのがそれ。
>>347 秒間何万回も使うからオーバーヘッドが
大きいってのもあるんよ。
>>342 catch(std::bad_alloc&)で捕まえてみて。
>>349 インラインアセンブラで入り口と出口を作って、その間にサブルーチンを書く。
>>349 必要な変数はクラスにまとめておいて、
引数を少なくしたメソッド呼び出しにするのがC++流。
つか、gotoか。
レスありがとう。 とりあえず351の方法使うです。 (俺も無作法だとは思うんだけど。) あともう一つだけ。 デバッグウィンドウに数字を表示したい時ってどうしてるの?
混じれ酢してみるか。 関数呼び出しはVBのGoSubより何倍も早いから気にするな。 どうしても気になるならインライン関数にするなりご自由に。 >秒間何万回も使うからオーバーヘッドが大きいってのもあるんよ。 なんかムカつく言い方だな。 そんなに速度が気になるんじゃアセンブラで最適化しろ
デバッグウインドウってなんだよ C++にそんなもんねーぞ
356 :
デフォルトの名無しさん :02/07/03 12:10
補足 BCB厨だからDQNなんじゃないぞ、 そんなことDQNだと言うんだ
なしてBCB?
>>347 でしょう。
要件があるなら、それを列挙した上で質問すべき。無条件で質問しておいて、
出てきた方法に対して煽りを返すのは、
細かいことは書かなくても、
みんな超能力者だから、
俺のことは分かってるはずだ
という思い込みがあるから。
>>349 場合によっては inline 関数が使えるかもな。ただし、ゲーム作ろうとしてる
ならムダだぞ。
> 出てきた方法に対して煽りを返すのは これどこ?
361 :
デフォルトの名無しさん :02/07/03 12:32
>350 またハンドルされていない例外になってしまいました。 ためしにvector < vector<double> > data2; data2.resize(100)でやってみても、やはり同じように落ちました。
364 :
デフォルトの名無しさん :02/07/03 12:42
>350 いま、Releaseでビルドすると落ちませんでした。Debugだと落ちます。なぜでしょう?
>>354 一応、俺も馬路レス。
関数呼び出し自体より、変数を引き渡す方を考慮しているものと思われ
10個とか引数あったらさすがに差が出る。
関数内の多数のローカル変数をサブルーチンでも使いたい。
サブルーチンは呼ばれる回数が多いので変数を一個一個渡すのはイヤ。
と彼は質問すればよかったのかな?
こういう場合はやっぱ
>>352 か強引に
>>351 のようにするのかな。
>>364 下のソースで落ちる?
#include <vector>
#include <iostream>
main()
{
std::vector< std::vector<double> > data;
data.resize(100);
}
iostreamは余計だ。
構造体をポインタで渡すのは駄目?
多数のローカル変数ってのにいちいち 構造体名が付くのがうざいけど仕方ないか。
いや、煽るつもりはなかったんだけど、 gotoがあるならgosubもあるかな、と思ってたから。 なんか荒らしたみたいでスマソ。
374 :
デフォルトの名無しさん :02/07/03 13:12
>367 それだけのソースなら落ちません。
>>374 ソース全部上げられるか?
たぶん余所でメモリ壊してるんだと思う
VCでDEBUG_NEWが定義されてるとか
STLport使ってて、_STLP_DEBUGが定義されてないとか。 前にこれで関係のないところのメモリ壊されてハマった記憶あり。
378 :
デフォルトの名無しさん :02/07/03 16:02
>377 定義してみたら落ちませんでした。これは、なぜですか?
>>378 デバッグ版とリリース版でnew/deleteが違うから。
リリース版のnewで確保したメモリをデバッグ版deleteで削除したりするとヒープが破壊される。
>379 なるほど。おかげで助かりました。どうもありがとうございました。
>>372 別に荒らしだとは思わなかったけど、
見事に定番通りのDQNぶりが見ていて微笑ましかった。
いつか「あのときあんな恥ずかしい書き込みしちゃった…」って思えるくらいに
スキルが上がるといいね。
ヤナヤシ
boost1.28をvc6-stlportでインストールしたんですけど regexのビルドって bjam〜"-sTOOLS=msvc-stlport"で作った物と regexのディレクトリでmakeしたもの、どっちが正しいんでしょうか? bjamで作った物はbin-stageディレクトリに boost_regex(_debug).dll/lib があり、 makeしたものは *mss(d) SingleThread-static(debug)? *mdi(d) MultiThread-dynamic(debug)? *mds(d) MultiThread-static(debug)? までは分かるのですが、mdidd/mssdd/mdsddが分からないです。 どれを使うのが正しいんでしょうか?
VC++だと、ヘッダの#pragmaで勝手にリンクするほうを使えばいいと思うが。
385 :
デフォルトの名無しさん :02/07/04 03:50
>>384 レスどうもです。#pragmaでリンクされるのは後者なので、
bjamで生成した物は不要だから破棄しても良いということですか?
Javaのインターフェースみたいに多重継承を使おうと思ったのですが class IA { public: virtual void Func1()=0; }; class IB { public: virtual void Func2()=0; }; class C : public IA, public IB { public: void Func1() { puts("C::Func1()"); } public: void Func2() { puts("C::Func2()"); } }; void* obj = new C; IA* a = obj; a->Func1(); IB* b = obj; b->Func2(); でどっちもFunc1()が呼ばれて困ってます。void*をC*にしたらちゃんと動きました。 IA*にC*として代入する時は何か特別なことやってるんですか?
たぶん、void*に入れたときに、大事な情報が死んだ。 CはIAやIBをインプリメントしているので、ちゃんとポインタで 受けられる。
>>386 void*から直接キャストした物だと
class D : public IB{};と区別が出来ないからしょうがない。
なる。VMTのオフセットがどうたらこたらって話かな? でも、多重継承って思ったより強力ですね。ちょっとC++見直しまひた。 (って強力すぎるから問題がでるのか・・・)
なんか作ってみた、ちょとダサいけど #include "stdio.h" #define ImplementSetOperations( Type )\ private:\ Type( unsigned int value ): value( value ){};\ public:\ Type(void) : value( 0 ){}\ Type( Type const& f ): value( f.value ){}\ Type& operator=( Type const& f ){ value = f.value; return *this; }\ Type& operator|=( Type const& f ){ value |= f.value; return *this; }\ Type& operator&=( Type const& f ){ value &= f.value; return *this; }\ Type operator|( const Type& f ) const{ return Type( value|f.value ); }\ Type operator&( Type const& f ) const{ return Type( value&f.value ); }\ bool operator==( Type const& f ) const{ return value==f.value; }\ bool operator!=( Type const& f ) const{ return value!=f.value; }\ bool operator<=( Type const& f ) const{ return (value&f.value)==value; }\ bool operator>=(Type const& f ) const{ return (value&f.value)==f.value; }\ bool operator<( Type const&f ) const{ return (value&f.value)==value && value!=f.value; }\ bool operator>( Type const&f ) const{ return (value&f.value)==f.value && value!=f.value; }\ class BooleanType;\ operator BooleanType*(void) const{ return value==0 ? NULL : reinterpret_cast< BooleanType* >( const_cast< Type* >( this ) ); }\ private:\ unsigned int value;\ public: struct FontStyle { ImplementSetOperations( FontStyle ); static FontStyle const Normal, Italic, Bold, Underline; }; FontStyle const FontStyle::Normal( 0 ), FontStyle::Italic( 1 ), FontStyle::Bold( 2 ), FontStyle::Underline( 4 ); int main() { FontStyle style; // Empty if ( style==FontStyle::Normal ) puts( "style is Normal" ); style |= FontStyle::Bold | FontStyle::Italic; if ( style>=FontStyle::Italic ) puts( "style contains Italic" ); if ( !(style>=FontStyle::Underline) ) puts( "style doesn't contain Underline" ); if ( style&FontStyle::Bold ) puts( "style contains Bold" ); }
#include <iostream.h> void main(void) { static char *b[]={"Akira", "Mitsuo", "Chiaki"}; b[1][1]='d'; *(*(b+1)+1)='g'; cout << b[1][1]<<endl; } これをコンパイルすると 〜〜の命令が〜〜を参照しましたが、メモリが"written"になることはできませんでした。 ってエラーが出るのですがなぜでしょう?
"strings"[1] = 'T'; とやるのと同じ問題では。
え??どういうことですか? 型が違うということですか???
プログラミング言語Cに於て(C++も亦)、 「文字列リテラルの値を変更している場合、その動作は未定義」 であることが規定されてゐます。
399 :
デフォルトの名無しさん :02/07/05 06:02
初心者な質問ですみません。 スタティックライブラリを作っているんですが、 これのヘッダとLIBファイルのみでインライン展開をさせることは出来るんでしょうか? やっぱりソースもないと駄目ですか?
基本的に、ある関数をインライン展開するには、 .hファイルに実装を書く、ということになります。 libファイルは基本的に全く関係有りません。 答えは「これのヘッダ」が何を意味するかによりますが その後の「ソースもないと」をみると、"駄目です"と いうのが正解でしょう。
401 :
デフォルトの名無しさん :02/07/05 06:27
>>400 そうですか。
わかりました、ありがとうございました。
>>398 なるほど、、、そうでしたかよくわかりませんが調べてみます
ありがとうございました
>402 つまり char*p="ABC";みたいなのはプログラマがいじっちゃいけない ところに文字列"ABC"が用意されてそのアドレスがpにセットされるので 参照する分には良いの。でも書き換えるとダメなの。 書き換えたいなら変数として領域を確保する必要があるの。 つまり char str[10]="ABC";みたいな。 あるいは char str[10]; strcpy(str, "ABC"); とか
なぜリテラル文字列はconst指定されてないのか激しく疑問 未定義にするくらいなら禁止しちゃえばいいのに
C++ではconstだぞ
コンストラクタの初期化リストでthisポインタを使うのは悪なのでしょうか?
>>406 って言うかアクセスできないメンバあるのか?
>>407 たとえばコンストラクタで所有者のアドレスを受け取るメンバがあったとして
ClassName() : member( this ){}
とかやると怒られる
漏れもなんでなのかよく分からん・・・
class Class { Class *member; public: Class(): member(this) {} }; 問題ないけど
>>403 ご親切にどうもありがとうございます
つまりポインタの宣言だけでは配列を確保していないってことですね
>つまりポインタの宣言だけでは配列を確保していない 違う。「リテラル」ってのが何なのか理解しなさい。
>>406-409 VC++では出るけど、この警告はM$の言語拡張らしい?
言語拡張をオフにすると出なくなる(この警告の警告レベルが下がる)
thisの中身が初期化されてないからとりあえず警告出しとくよって感じかと
thisの値(アドレス)自体は別段問題無いと思われ
>411 言葉のあやじゃないかな・・>配列を確保していない char *p="ABC"; char str[]="ABC"; の差に気が付けばいいのでは?
>413
元々は
>>395 、つまり文字列リテラルを書き換えようとしてのエラーで、>410はその理由をわかってないってこと
>>411 >>413 ということはリテラルだから変数として確保してないから書き込めない
ってことですね?
>>414 リテラルの意味さっき調べて知ったもので、、、
まあ、そういうこと。で、 char *array[] = { "abc", "def", "ghi" }; は、「ポインタの配列」で、array[0], array[1], array[2]それぞれの示す先が 文字列リテラルだから、(constを付けなくても)書き換えようとした時の動作は未定義。 char array[][4] = { "abc", "def", "ghi" }; の場合は、「配列の配列(2次元配列)」で、array[0], array[1], array[2]は配列(の先頭要素のアドレス)だから、 中身を書き換えても大丈夫。
>>417 どうもありがとうございます
わかりました
419 :
デフォルトの名無しさん :02/07/05 20:52
自分まだ林氏のスーパービギナー編を一通りやっただけのペーペー初心者です。 今、エディットボックス3つと四則演算ボタンを配置しただけの簡単な電卓を作ろうとしていて、 @ed1と2に値を入力 A「+」とか「-」とかを押す Bed3に答え(浮動小数点型)が表示 という風にしたいのですが、 出だしはCString ssでは駄目なのかとか、 またm_ed1を1項、2を2項と定義付けるにはどう記述するのかからして分りません。 ヘルプや言語リファレンス本で調べてもいまいち・・(あまりに初歩だから載ってない?)。 学校の一室にしかソフトが入ってないので(自前で買うには高い)直接いじれる日時が限られてるし・・どなたか教えて頂けないでしょうか。
420 :
デフォルトの名無しさん :02/07/05 20:54
>419 それはVC++かな?
422 :
デフォルトの名無しさん :02/07/05 20:58
C++のデベロッパーってすごいな
423 :
デフォルトの名無しさん :02/07/05 21:24
おお、素早いレスありがとうございます。 >420 はい、VC++の6.0です。 >421 さっき一通り読んだけどやっぱりわかりません(汗 でもある程度まではテンプレートが用意されてるのを知ったのは収穫でした。 明日は半日使えるけど、ヘルプでtemplateから検索していけば辿り着けるだろうか。
すいません、423は私です(名前変え忘れた)
VC++のみの話題は専用スレに行けっての
>423 テンプレートなんか使わなくてもできるよ。 ま、専用スレで聞いてくれ。
あちゃ、VC++とC++が別物だって知らんかった。お邪魔しました・・・
お前ら様方は<iostream.h>,<iostream>の違いと仮想関数の目的は明確にわかっていますか?
当然
当然わかっていません
俺様ごときがわかるわけありません。
<iostream.h>なんてイラネーヨ
<iostream.h>って、中身が古いケースも、 stdで囲ってないだけで<iostream>とおんなじなケースと、 両方あるんじゃない?環境によって
iostream.hなど(仕様には)無い。 ただしCライブラリについて、 The ".h" headers dump all their names into the global namespace, と決まっていることや、古い(namespaceをサポートしない)C++との 互換性から、c++ライブラリについてもそのようにする処理系がある。
436 :
デフォルトの名無しさん :02/07/06 05:54
例外初心者なんですが、わからないことがあります。 try{}の中でローカル変数をnewした後でthrowした場合、 そのローカル変数はどうなってしまうのですか? リークになってしまうのですか? あと、自分でいろいろ関数っを作ってるんですが、catch{}の中に書くことが無くて 例外が起きたら、レポートを作ってシステムにthrowして強制終了させるぐらいにしか 使えません。これって普通ですか? 皆さんはそんなことはないですか?
>>436 スタックの巻き戻しの際にデストラクタが呼ばれるから、デストラクタ
を正しく定義しておけばリークしないんじゃない?
>>436 >ローカル変数をnewした
意味不明。
440 :
デフォルトの名無しさん :02/07/06 07:53
>>437-439 try{}スコープの中でヒープを確保した場合(LPDWORD a = new DWORDとか)です。
chach{}はスコープが違うので解放出来ません。
マニュアルにはスタックフレームを巻き戻してautoオブジェクトを破棄するとしか
書いていません。
>>436 の言うようにauto_ptrを使うか、try{}スコープ外で宣言するしかないのですか?
>>436 例外に関しては、Exceptional C++を読むべし。
例外の正しい取り扱いは、君が想像しているよりも、はるかに難しい。
>auto_ptrを使うか、try{}スコープ外で宣言するしかないのですか
そのとおり。auto_ptr使用がお勧め。というか、例外を使い出したら、
「自前でdeleteは書かない」ことを目標にしとかないと失敗するぞ。
442 :
デフォルトの名無しさん :02/07/06 08:30
template<class T> struct S { typedef T U; }; template<class T> struct SS : public S<T> { U a; }; main(){} ---------------------- をgcc 3.1 でコンパイルすると test.cc:8: warning: `typename SS<T>::U' is implicitly a typename test.cc:8: warning: implicit typename is deprecated, please see the documentation for details というwarningがでます。X::Yという形でないのにimplicitだと いわれるのがよく分からないんですが、これは正しい動作なんでしょうか? これがコンパイラの正しい動作だとして、 U => typename SS<T>::U とやる他に回避方法はありませんか?
>>441 > 例外の正しい取り扱いは、君が想像しているよりも、はるかに難しい。
オレも痛感いたしますた。
Exceptional は読んどくべきだけど、読んですぐ身になるほど易しい問題じゃないね・・・
444 :
デフォルトの名無しさん :02/07/06 08:52
クラスの定義はヘッダに、 メンバ関数の実装はcppに書くのが普通ですか?
>>442 template<typename T>
struct S {
typedef typename T U;
};
が正解だったと思う。使ったことないんで、記憶に自信がないけど。
>>444 1.君の言う「クラスの定義」は、正しくは「クラスの宣言」。
2.君の言う「メンバ関数の実装」は、正しくは「クラスの定義」。
用語を思いっきり間違えて使っているけど、1をヘッダに、
2をcppファイルに書くのは、普通。それはあってる。
>445 どうもです。
テンプレートに毒されて、ほとんどの実装がヘッダに逝く罠 しかも、それを当たり前とすら思う罠
俺のプロジェクトも.cppより.hの方がずっとサイズがでかいぞ(ワラ
>>441 わかりました。そうします。
ありがとうございました。
別にどっちにあったってそんなに変らんと思うが ヘタレ環境だとコンパイルに時間がかかったり リンク後のサイズが大きくなったりするのかな?
>>450 何のために #include があるのか、勉強しなおせ。
c++になって.libって全く意味が無くなったよな
>>445 parse errorになります。
typename は quialifed name (X::Yのようなの) にしか使えません。
SSの定義のなかで typedef typename S<T>::U U; かなあ
457 :
デフォルトの名無しさん :02/07/06 10:37
>>452 確かにね。
OBJファイルも生のバイドコードじゃなくて
中間コードみたいなのを生成するようにして、
ヘッダとLIBで、テンプレートやインライン展開が可能になればいいのに。
>>456 ありがとうございます。
それは考えたのですが、実際のクラスでは継承が芋ヅル式に
続いています。
これでは全てのクラスに書くことになってしまうので、
避けたいのです。
>>458 取りあえずデザインパターンの本読んで目から鱗を落とすことを推奨。
>>459 関係ない話で恐縮だが、俺はあれを読んで目に鱗がついたよ
>>460 確かに、全面的に同意する気はないけどね。
でも、ああいうやり方もあるんだと。どこかでうまく使えば便利だなと。
中小クラスを継承して後からメソッドを実装するなんて当たり前のことにも名前付いてて少しワラタ。
462 :
デフォルトの名無しさん :02/07/06 12:51
>>445 クラスの「宣言」と「定義」って、そんなに明確にわかれてましたっけ?
class T { ... };
↑これをどっちで呼ぶかって話しなんだけど。
データフィールドとか、インライン関数の「定義」をしてますよね。
中でどれだけ「定義」されていても、全体では「宣言」って呼ぶんですか?
>>462 定義 class a{}
実装 a::a(){}
宣言 a *ax = new ax;
464 :
デフォルトの名無しさん :02/07/06 13:05
ファイルにロックをかけたいのですがどんなメソッド、関数がありますか? flockを使うしかないのでしょうか。
>>464 WebProg板が無駄に詳しいけどね。
後はディレクトリがあるかないかとか。
>>462 宣言 class a;
I/Fの定義 class a{}
実装の定義 a::a(){} (うまい言葉が見つからん・・・)
>>462 もともと「定義」というのは、コンパイラがそれに出会ったら、
その場でコンパイルされて何らかのオブジェクトコードが生成されるものだ。
それに対して「宣言」というのはあくまでコンパイラに教えるのが目的で、
それ自身はオブジェクトコードが生成されないものだ。
だからたとえ inline とあっても、コンパイラが出会ったその場で
オブジェクトコードが生成されるわけではないので、それは「宣言」。
つまり「関数呼び出しを生成するのではなく、その場でこれを展開してくれ」
という「宣言」なわけだ。
だから「inline 宣言」とはいうけど、「inline 定義」とは言わないよな、フツー。
とはいうものの、「テンプレート」となると話はややこしくなるが...。
>>467 なるほろ・・・日常的な「定義」とは意味が異なるのですね
>>465 なるほどー。サンクスです。
ロックかけるときだけfile descriptor取得して
Cの関数使うのはちょっと気持ち悪いなーと思ったので
質問してみました。
>>467 ってことは、
class A {};
↑これも宣言?
そんなわけないとおもうんだけどなぁ。
∧ ∧ (*゜ー゜)++
定義も宣言の一種とどこかで読んだような……
K&R では「定義」と「宣言」は明確に区別されてますね。 以下引用。 > "定義"とは変数が実際につくられ、あるいは記憶が割り当てられた > ところを指すのに対し、"宣言"とは変数の性質は指定されているが > 記憶割当てはされていないところを指す。
>>3 の C++ Final Draft を見る限り、
>>473 の意味で区別するのが正しいとは思えない。
K&RはCだからね、C++にも通用するとは限らない
473 C++3rd(邦訳版)のP.113にも class A{}; が定義であるように 解説されてますね。
477 :
デフォルトの名無しさん :02/07/06 15:15
class A; クラス宣言 class A{}; クラス定義 でいいんだよね?
class A; クラス前方宣言 class A{}; クラス宣言&定義 じゃねーの。
>>479 クラスの場合、I/Fだけでなくその挙動まで定義して初めて完全な定義な気がするから
class A{};
は(全てインラインでない限り) 不完全な定義 とでも呼ぶべきかと
ううむ、なるほど。
定義は宣言の一種っていうのは嘘?
484 :
デフォルトの名無しさん :02/07/06 15:28
class A; プロトタイプ宣言 class A{}; クラス宣言 じゃねーの。
一種って言い方はびみょーだなー 定義は宣言も兼ねる 常に成り立つわけじゃないけどさ
プロトタイプなしの関数定義がそうですね。<宣言も兼ねる
VC++の場合(エラーメッセージより) class A; 宣言 class A{}; 定義 A::A(); 関数定義
488 :
デフォルトの名無しさん :02/07/06 17:28
すごくくだらない質問で申し訳ないのですが void Func() { char* sBuf=new char[256}; } deleteしてないので256Byte開放されないわけですが、 スコープ抜けるのでsBufは消えちゃいますよね。 そうなるとこの256Byteはどうなるのでしょうか。 sBuf がないので見えなくなってメモリに ごみとして残るのでしょうか? プログラム終了時には消えると思うんですが 実行中はどうなるのかよくわからないんで。。 私以外の人はご存知と思いますので 教えてもらえないでしょうか? よろしくお願いします。
>>488 覗き穴の亡くなった箱。
ロープが切れた舟。
子供が手を離した風船。
ありがとうございます。 やっぱりそうだったんですね。 胸のつかえが取れました。
一般にメモリリークという
>>442 えー、3.1 だとそんな warning が出るわけ? 俺も同じようなことを
やってるから、ちと鬱だな。明日にでも 3.0.4 から 3.1 にしようかと
思っているのに。
template<typename T> class A { public: virtual const T method() = 0; }; class B : public A<char *> { public: [ (a) ] method() { return 0; } }; int main() { return 0; } みんな,この [ (a) ] に入れるべきものが自然に分かるですか? 私はさっき無茶苦茶はまったんで鬱です しかもまだ理屈が分かってないし
495 :
デフォルトの名無しさん :02/07/06 22:50
今まで怖くて触れてこなかったtemplateをいざ使ってみようと思ったのですが、 次のコードがコンパイルできません。。。 #include <iostream> using namespace std; template <class T = char, class C = basic_string<T> > T test(const C& str) { return str[0]; } int main(void) { cout << test(basic_string<char>("Hello, world!")) << endl; } どこが間違ってるのか分からないのですが、 出来れば、ご教授願います。環境はVC6+SP5です。 初心者質問ですいません。。。
>>494 なるほど。char * const って書かないとだめか。
理屈としては、テンプレートを解析した時点で、「T は const」
ってことに決まっちゃうからかな。const char * は、
const な「char *」じゃないっしょ。
T は char* なんだから、 const T は char* const になるですよ
>>495 関数テンプレートでデフォルトパラメータは使えたっけ
テンプレート宣言終了の;がない
テンプレートは型が完全に一致しないと実体化しないから
多分君のもくろみは外れている
とか
>>495 テンプレートの引数を省略できなかった,ていうことらしいんで
cout << test<char>(basic_string<char>("Hello, world!")) << endl;
とすれば,うまく動いているっぽいっすね
>>496-497 あー,どうもっす。そういう考えがスッと出て納得できるなんて,うらやますぃ・・・
今日ついに「プログラミング言語C++」買ってきたんで,これから
ワッシワシ勉強するですよ
>>499 出来ました…でも、関数テンプレートのデフォルト引数の例が、
Stroustrup本の13.4.1に載ってるんですけど…
例が悪いみたいですね…。すいません。
ごめんよく見てなかった&&勘違い。
問題はデフォルトパラメータは使えないこととと
>>499 だけだね
例が悪いというのは上の例が悪いってことです…。 誤解を招きそうな発言をして申し訳ありません。。。
関数テンプレートのデフォルト引数が使えるのか… VCは謎が多いな
504 :
デフォルトの名無しさん :02/07/06 23:17
cont char *とchar const *は同じ意味なのですか?
>>505 違う。constは直後の要素に掛かる。
>>503 あ、あと、BCCでもデフォルト引数が使えないみたいです。。。
一次クラステンプレートのみに使用できますとか言われて…
弱った。。。手持ちのコンパイラじゃ出来ないのか。。。(汗)
>>505 関数の仮引数では同じだったはず
他は違う
>>507 ん?
出来ないのが標準仕様(ISO)だけども何が問題?
const char* と char const* は一緒じゃないの?
だから違うというとるに
>>510 そうなんですか?
Stroustrup本のは…間違いなんですか?
> 出来ないのが標準仕様(ISO) ダセエな。
>>495 & その他
関数テンプレートでもデフォルト引数は使える。
495 がダメなのは、2番目のテンプレート引数 C は関数引数から推測できるのに
1番目の引数 T の指定がないからじゃないのか。だから 499 が正解だと思う。
普通の関数のデフォルト引数だって、1番目はデフォルトにして2番目の引数だけ
指定するなんてことはできないだろう。
>>506 通るけど。
class A {
public:
virtual const char *func() { return 0; }
};
class B : public A {
public:
virtual char const *func() { return 0; }
};
int main()
{
A a;
a.func();
B b;
b.func();
}
まったまった、今酔ってて怪しいが、これはさすがに同じだろ const char * str char const * str この辺と混同してないか? char * str const const char * const str
>>515 ふむ…。
では、引数から推測できないようにすると出来るのでしょうか?
ちょっと試してみます。
511 同じ結果になるんですが・・・。 #include <iostream> #include <typeinfo> using namespace std; int main() { char const* p1 = "hoge"; const char* p2 = "hoge"; cout << typeid(p1).name() << endl; cout << typeid(p2).name() << endl; return 0; }
わり、3番目の例はこう書きたかった ×char * str const ○char * const str
早速 Stroustrap 本読んでます (´ー`) p.133 に書いてたんですが,"const *" は存在しないから基本形の一部と 見なされるらしくて,つまり "char const *" は "const char *" と 同等だということでした # だんだん const の使い方が分かってきたかも
スマソ。いま ISO の規格書確認したら、 A default template-argument shall not be specified in a function template declaration or a function template definition って書いてあった。
>>515 >関数テンプレートでもデフォルト引数は使える。
ここでの問題はデフォルトテンプレート引数だぞ
これは使えないだろ
>規格書確認したら 持ってんのかよ!Σ(゚□゚=) イイナァ
ごめん。読んでたら遅れた
「*を挟んでconstが右にあるか、左にあるかで見分けろ」 というようなことを何かで読んだよ。 (プログラミング言語C++だったかな…或いはEffective C++だったかもしれない)
>>522 結局、ISO標準では関数テンプレートのデフォルト引数を使うことは無理なんですね。
Stroustrup本に書いてあるのは次のようなものです。
template<class T, class C = Cmp<T> >
int compare(const String<T>& str1, const String<T>& str2){
for (int i=0; i<str1.length() && i<str2.length(); i++)
if (!C::eq(str1[i], str2[i])) return C::lt(str1[i], str2[i]) ? -1 : 1;
return str1.length()-str2.length();
}
BCC5.6では、関数テンプレートにデフォルト引数を書いただけで 通らなくなりまっす。下のように書くしかありまっせん。 #include <iostream> using namespace std; template <class T, class C> T test(const C& str) { return str[0]; } int main(void) { cout << test<char>(basic_string<char>("Hello, world!")) << endl; }
すいません。
ぐえ…。Stroustrup本が標準だとばかり思っていました…。
今度から
>>527 を見に言ってから発言するようにしたいと思います。
色々ありがとうございましたm(_ _)m
手元になぜか refman.pdf という 2,860,601バイトの規格書があるが、 なぜだろう?いつの間に?
検索してみたらcpp3rd.zipなんてのも出てくるな
某所で出てから、一気に普及したんじゃないかな>refman
527 のリンク先は、draft だからさらしてても OK なのか? それともやっぱり違法?
>>527 のヂレクトリをいっこ登ると・・・(゚ε゚)キニシナイ!!
constに関しては、
>>526 が正解。参考文献は、Effective C++ の21項。
あと、Exceptional C++ の43項も読んだら、constの正しい使い方が理解できるよ。
うほほ
激重(汗 ようやく落ちた
const char* str なんつーダサい書き方は速く卒業してホスィ・・・ 常に char* const str なら何も迷うこと無いでしょ
char const* の間違い?
>何も迷うこと無いでしょ つーか間違えてるなら、迷ったってことでわ?
>>544 絶対ゆわれるとオモタYO(恥
const の位置を間違ったんじゃなくて、
1行目でconstなcharへのポインタのことを考えていながら、
2行目でcharへのconst なポインタのことしか考えてなかった。
const char* const str なんつー・・・
char const* const str なら何も迷・・・
って書けばよかたよ
実際問題、ポインタ自体をconstにすることなんてほとんどねーんだし、 そうするくらいなら、参照渡せよ、って感じだし。 (使用頻度において、T const * >> T * const ,T const *const) ポインタのポインタも、ポインタへの参照とか、vector<vector<T> >つかえば いいわけだから、ポインタでconst使うのは、実質 T const * ptr だけっしょ。 だったら、迷うもなにも、 const T *ptrってやっとけばいいんでないかい?
漏れはバリバリ使う、9割方const 配列のときとかNULLのときとか参照使えないし
>> 461 >> 当たり前のことにも名前ついてて少しワラタ。 若干オソレスだが その当たり前ってやつを他人に説明するには、名前があったほうが便利だろ〜。 デザインパターンの目的のひとつは、そういうことだぞ。 だいたい、Gof本に書いてあることなんざ、ハッカーレベルじゃ全部当たり前。
>>548 取りあえずこれ抽象クラスにしたら継承するだけでいろんな事に使えるやろ?
おお。確かに。
取りあえずこのクラスでFactoryMethodやるから。
はぁ?
日本的にあの名前達は有害かと。
しかし、参照は便利だねえ。 NULL渡しチェックの必要がなくなるのは嬉しい。 今までCOMに毒されてたから気が付かなかったよ。
>>550 逆にNULLが渡したくても渡せない罠。
>>551 NULLを渡すって事は、前提とする状況ががらっと違うわけだから。
オーバーロードさせとくのが正しい、と俺は思う。
// ポインタ渡し
void Foo(RECT* pRect){
if (pRect == NULL){
SetRect(rect_);// メンバ変数
} else {
SetRect(*pRect);
}
}
// 参照渡し
void Foo(RECT& rect){
SetRect(rect);
}
void Foo(void){
SetRect(rect_);// メンバ変数
}
こんな感じで。
>>552 結局参照はPascalのvar以上の使い方はすべきでないですか?
554 :
デフォルトの名無しさん :02/07/07 16:31
派生クラスを定義するときに 継承もとのクラスのコンストラクタをそのまま使いたいんだけど 良くわかりません。 継承もとのクラスのコンストラクタを派生クラスにコピペするのもあんまりだし・・・
Class a{ a( int c ); }; Class b : public a { b( int c ); }; b::b( int c ) : a( c ) { } こういうこと? それとも、class b のコンストラクタの定義は無しで class a のコンストラクタを流用したいってこと? それは俺も知りたい、誰か教えてプリーズ。
556 :
デフォルトの名無しさん :02/07/07 17:24
multimap<int, string> aaa; として aaa.insert(make_pair(3, "abcdefg")); としたらエラーがでました。なんか2番目の引数が問題らしいので 適当に aaa.insert(make_pair(3, string("abcdefg"))); としたらokになりますた。 これって一時的なオブジェクトstringを"abcdefg"で初期化して渡したって事ですよね? CPUとメモリ消費しながら・・ この修正で正しいですか?間違ってますか?
いいんじゃないの?
そうでしたか。どうもです。 C++標準ライブラリ〜って本では文字列を渡してますが VC++の癖ですかね〜
char const *からstringへの変換は存在するが、 pair<int, char const * const>からpair<int, string>への変換は存在しない。
>>557 つまりmake_pair()じゃなくて単にpair<>のコンストラクタを使いなさいってこった。
aaa.insert(make_pair(3, string("abcdefg")));
↓
aaa.insert( std::pair<int, std::string>(3, "abcdefg") );
書くのはvalue_typeにしとけ
と思ったけどちょっと長いな std::multimap<int,std::string>::value_type
>>561 うい、そっちの方が望ましいね。
長いのはtypedefで何とかすればよし。
564 :
デフォルトの名無しさん :02/07/08 00:36
C++のソースで、cstdioじゃなくstdio.hをincludeすると、なにか問題ある? stdio.hに愛着があるんで。
>>564 名前空間がstdに包まれなくなる。つまり通常のCのようになる。
おまえ死ねと言う気になる グローバルネームスペースを汚すなと。
567 :
デフォルトの名無しさん :02/07/08 00:39
>>564 これだからプロジェクトに加齢臭のするドキュソが入ってくるとロクなことにならねえ
と若い連中に思われる。
.cpp で使う分には問題は少ないでしょ。
うわぁレスの早さからしてとてもだめなことを聞いたね。> 俺 今日から改めます。
570 :
デフォルトの名無しさん :02/07/08 00:46
569は神。ジジイのカガミ。
名前空間についておさらいだッ
friendってどういう目的で使うのですか
クラスのprivateなメンバにアクセスしたり。
574 :
デフォルトの名無しさん :02/07/08 01:42
g++の2.95で、std::basic_string<unsigned char>のc_str()で エラーが出たりしますか?
cppってstdio.hインクルードすると良くないのかぁ・・・。 ストラップさんの本、読み直してみよう・・・。
>572 引きこもりは全部friendにしてしまう傾向があるから注意・・
>>572 operatorを定義する時に便利。乱用は禁物。
578 :
デフォルトの名無しさん :02/07/08 02:01
これってなんでエラーになるの? class Test { public: static int nHoge ; }; int main() { Test::nHoge = 0; return 0; }
579 :
デフォルトの名無しさん :02/07/08 02:03
nHogeの実体がないから。
こんなの初めて見た(ワラ
ワラウコトナイジャナイ...
>>578 とにかく覚えなさい。
class Test
{
public:
static int nHoge;
};
int Test::nHoge;
int main()
{
Test::nHoge = 0;
return 0;
}
クラス内の性的変数の定義の詳細を見ればどうにかなるんじゃない
>>582 int Test::nHoge; ←これが実体なの?
うーん謎。
>>584 class変数を複数作っても、staticメンバ変数は実体が一つしか
存在しない事に伴う特殊な書き方らしい。誰か詳細キボンヌ。
>>585 class変数 を staticメンバ変数 と言い替えている罠
588 :
デフォルトの名無しさん :02/07/08 02:30
アヒャヒャ!
>>584 staticメンバはクラスに固有なもの
インスタンスをいくつ作っても、staticメンバは複数作られない
それは、概念的にstaticメンバが、インスタンスの外にあるから。
>>589 なるほど。わかりやすいです。
staticメンバの宣言は、
各インスタンスの外にある1つの実体を指すための
ポインタ的(Cで使う意味じゃなく)なものだということだすね。
だからいくつインスタンスを生成しても指す場所は同じってことで、
値はいっしょということだと。
593 :
デフォルトの名無しさん :02/07/08 15:19
ちょっと質問! EnumWindowsとかで取得したHANDLEからそのアプリケーションが あるパスを取得する方法を教えて下さい。
>>594 サンクス、とりあえず、向こう逝きます、
596 :
デフォルトの名無しさん :02/07/08 16:34
ここのみんなでさC++の入門書書かない?HTMLとかで 大勢で思考錯誤したり分担したりすればかなりいいものが作れる気がするんだが 痒い所に手が届くような大規模なFAQとかさ、、 学んでる最中の人のがいればどこがわからないとかが指摘できたりするわけで ここには勉強中の人もかなりいるだろうからそう言うのも大丈夫だとおもう
597 :
デフォルトの名無しさん :02/07/08 16:41
599 :
デフォルトの名無しさん :02/07/08 16:49
class a{ friend class b; } class c : public b{ } この class c にも class b に対して行ったfriend宣言の効力を 効かせたいんですけど無理ですかね? やっぱり class c のfriend宣言をあらためて加えないと駄目ですか?
603 :
ななしあた :02/07/08 18:48
そうですか、残念。
>>599 class b の派生クラスを作る度に
class a の宣言を改定しなければならないのがイヤだったんです。
class b の能力としては class a のプライベートメンバにアクセス権を持つ
というのが含まれているんで、継承でそれを派生クラスに持ち越せないって
なんか変な感じがしますね。これはちょと不満かも。
>>599 激しくお勧めできないが
class A
{
protected:
int i;
friend class B;
};
class friendlyA: public A { friend class C; };
class C
{
C()
{
A a;
static_cast< friendlyA* >( &a )->i = 10;
}
};
>>606 それはまたトリッキーで・・。
でも class friendlyA は class C の内部クラスにしてしまえば
それなりに綺麗に書けそうかも。どうも参考になりました。
それか、今思ったんですがfriend宣言のところだけマクロにして
切り離すってのもアリかも。
608 :
デフォルトの名無しさん :02/07/08 19:51
>>596 いまにそれが有名になってこの板が2chの看板に!
日本語で specialization を表すのに何を使ってますか? 「特殊化」や「専門化」は instantiation の訳に用いるほうがふさわしいし、 C++3rd の「特殊バージョン」は間違いではないにしろ、すわりが悪く感じます。
特別化
>>596 >>608 あれだけいってもC FAQ/C++ FAQすらよまねえ連中だらけなのにさらにゴミ文書増やすのかヨ
>>610 ふむ、それも「専門化」とかと同じで、意味があってないんだよね
615 :
デフォルトの名無しさん :02/07/08 20:55
>> 614 いろいろと「〜化」って挙げてくれてるけど、それって「操作」を意味する「サ変名詞」でしょ だから、正しくない。 specailization は「操作」じゃなくて、クラスや関数でしょ。
○○化物
>>613 単に、specialization を日本語で "正しく" 表記したいだけだよ。
いつもは「スペシャライゼーション」って書いてるけど、長ったらしいしね
言語のままspecializationと表記することに問題が?
原語
>>618-619 うん、問題ない。めんどくさいけどね。
読みやすいかといわれると、疑問もあるけど。
>>621 気持ちは分からんでもないが、戦時中じゃないんだから、
むりやり日本語にすることもあるまい。
623 :
デフォルトの名無しさん :02/07/08 21:09
>>622 政府の見解は違うようだけどね(w
字面が場所とるのが嫌なんだが、現行どおり「スペシャライゼーション」で当面いきます。
おつきあい、ありがとう。
政府を窓から投げ捨てろ!
626 :
デフォルトの名無しさん :02/07/09 06:44
templateは言うなればクラスの特殊な物なの? 具体的な型を指定してあげればクラスと同様に扱えますか? つまり、基底クラスにして派生させてみたり、 その他いろいろ文法上はクラスと同等の扱いですか?
627 :
デフォルトの名無しさん :02/07/09 07:57
>>626 >>templateは言うなればクラスの特殊な物なの?
逆、クラステンプレートは普通のクラスを型に対して一般化したもの。
同様に、関数テンプレートは関数を一般化したもの。
>>具体的な型を指定してあげれば、クラスと同様に扱えますか?
そのとおり、テンプレート引数を与えてやれば、コンパイラは
テンプレートをそれでインスタンス化してクラス定義を作成し、翻訳単位に挿入する。
そうやって作られたクラスは、通常のクラスとまったく同じように使用できる。
>627 ありがとうございます
629 :
デフォルトの名無しさん :02/07/09 22:48
2次元配列の要素数を取得するにはどうすればよいですか?
vector?
string に数値を文字列にしていれるのに一番すっきりした方法はなんでしょう? sprintf を使ったりしてみたのですが、なんかカッコ悪いような……
>>631 boost::lexical_cast<>
ちょい重いけど
int x = 10; string s = static_cast<ostringstream&>((ostringstream() << x)).str(); とか。
itoa
>>633 それだったらboost::lexical_cast<>でいいじゃねぇか。
どうせあれも内部でstringstream使ってるし。
sprintfつかっとけ。
637 :
デフォルトの名無しさん :02/07/10 17:24
stringオブジェクトの中身を編集したいのでstring::c_str() で得られたconst char*をchar*にキャストして そこがさす文字を置き換えたりとかしても平気ですか?
自分が確保した領域にstrcpyしてからのほうがええんじゃないか? エエジャナイカ、エエジャナイカヽ(・∀・)ノ
>637 基本的にやってはいけない。 もしやるとしても、以下の出力の理由が理解できてから。 #include<string> #include<iostream> int main() { using namespace std; string s1("abcde"); string s2 = s1; char *p = (char *)s1.c_str(); *p = 'A'; cout << "s1 = " << s1 << endl; cout << "s2 = " << s2 << endl; return 0; }
基本的じゃなくて、絶対にやってはいけない。 内部文字列のコピーを返している場合もあるから。
なるほど。よくわかりました。
const_cast<>を使う時って、なんかいけないことをやってる気がするよ。
うん。
644 :
デフォルトの名無しさん :02/07/10 19:48
コンソールアプリケーションの実行ファイルサイズを抑えるために、 なにか心がけるといいことはありますか?C++で
>>644 iostreamなどの標準ライブラリを使ったらすぐ大きくなる。
>>645 そうですよね。特にg++ 3.1なんかでは半端じゃないですよね。
SGI STLのiostreamがでかいだけ。
gcc-2.95.3とかでは割と小さかったのにな。残念だな。
locale周りのサポートが入ったんだから、 でかくなるのは避けようがないでしょ
stringstreamを使うだけででかくなるのはいただけない。 どうしてもsprintfの誘惑に負けちゃうよな
だれかー初心者ですが 致命的エラー F1003 D:\borland\bcc55\Include\stdcomp.h 5: error 指令: Must use C++ for STDCOMP.H ってでるんですけどなんでー(;_;)
652 :
デフォルトの名無しさん :02/07/10 20:40
DirectX関係なんですが、クラス構造の問題なのでこっちで聞いてみます。 アクションゲームで人間クラス、背景クラス、Direct3Dラッパークラスがあるのですが 人間クラスのメンバ関数にDraw()を定義して p人間クラス->Draw(); p背景クラス->Draw(); でDirect3Dを使って描画させたいのですが、この場合Direct3Dクラスから人間クラスと背景クラスを 継承させるのが正しいのでしょうか?ただし、Direct3Dクラスが複数できるのは問題があります。
653 :
デフォルトの名無しさん :02/07/10 20:54
素朴な疑問なんですが、なぜ ++x は左辺値なのに x++ は右辺値なんでしょうか。
>>651 F1003は#error指令が出すメッセージです。
拡張子を.cppにしませう。
>>653 ++xが左辺値なのは効率の為で、x++が右辺値なのはそうせざるをえないから、かな。
実装してみればわかるよ。
むきー、x++しか使っていない 俺はまるで非効率な男みたいではないか!!
>>652 描画インターフェースを定義して(IDrawable3D::Draw()とか)、
人間クラス、背景クラスがそれを "内部クラスで" 実装し、
そのインスタンスをD3D描画管理クラスに登録するというのはどうかな。
このやりかたなら、対象となるクラスが何であろうと、描画に持ち込むことができる。
デザインパターンでいうところの・・・何だっけ
>>656 普通にプログラミングすれば、x++と--xだけあればいい。
++xやx--は使う前にアルゴリズムを見直してみることを勧める。
659 :
デフォルトの名無しさん :02/07/10 21:36
++は右っ側、--は左っ側にするのか?
>>654 ありがとうございまする 動きました!!GCCなら動いてたんだけどなぁ BCCは動かないのね…
>アルゴリズムを見直してみることを勧める そ、そんなに重大なことなのか!?
>>658 ++xとx++は、コピーコンストラクタ云々で効率が違うんだと。
詳しくは知らん。
>>658 ん〜む。何故にx++と--xのみ…
よければ理由を教えてもらえないかな?
664 :
デフォルトの名無しさん :02/07/10 22:00
>x++が右辺値なのはそうせざるをえないから、かな。 x++が左辺値だったら、なんかまずいワケ?納得いかん。
>>662 演算子の多重定義の事を考えてみると、前置++は参照値を返すように
書けるが、後置++はできない。関数内で一時変数を作成して、その値
を返すようにしなければならない。
それで、参照値が返せるというのは、すなわち左辺値になりうる、という
説明ではダメ?
そもそもxの通常の動作は xをインクリメントし、インクリメントする前の古い値を返す というもの。 「xをインクリメントする前の古い値」がxそのものであるはずがない… つまり一時オブジェクトであるということだよ。 ちなみに、ユーザー定義型ではx++に代入させることも可能だよ。 俺はそんな型扱いたくないけどね。
>>664 前置/後置で左辺値/右辺値でバランス取れてるじゃん!
右辺値だけ使いたい時も在るさ、多分
>>665 さんくす。
しかし、それでも後置を使いたいんだなぁぁ。
前置は気持ち悪いのよね。
>>669 気持ちが悪いという理由で演算子を使い分けられないのなら、プログラマは
向いてないと思われ……。
(それは仕様ですで何でも済ませるヤツもアレだが、仕様を納得できんのも
アレだ)
プログラマはというか、C++は絶対に向いてないね
しかしC++は後置だったりする
>>671 確かに向いてないかも。
templateとかあんまり好きじゃないしね。
ヘッダにずらずらと、なんだか汚く感じるんだなぁ。
>>673 C++は他の言語のいい点をたくさん取り入れたが、汚い所もたくさん
取り入れてしまったね。
ヘッダに書いた方が良いと思うが。 セパレーションは運用楽だしコンパイル速度も遅くならないが、管理が面倒。
>>673 それは同意。
資源の浪費だし、テンプレートを使ったコードの最適化は信用できないし。
でも C++ は嫌いじゃないけど?
どの言語が一番好きかといわれたらダントツでC++だな・・・
んだんだ。
仕事には私情を挟むつもりは無いが 同じく俺もだ。
>>657 ありがとうございます。
でもレスが少ないところを見ると、ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
私もラッパー程度の使い方にとどめておきます。
>>680 オレはOOだよ。
シーンやシナリオはステートパターンで。
スプライトとかオブジェクトにしとけば便利。
ゲームってOO使えそうじゃない
683 :
デフォルトの名無しさん :02/07/11 00:14
例外処理が有効な時とか RTTI が有効な時に定義されるマクロって 何かありましたっけ? __CPLUSPLUS みたいな感じの。 CodeWarrior と VC++ の場合を知りたいです。
VC++はヘルプにあった。
オブジェクトの何等かの状態を知りたい場合、intやdouble,booleanなどのメンバーに アクセスする時にC++の教科書ではメソッドを介してアクセスされてますがなぜですか? FieldやPropertyなど、メソッドを介さずに直接Publicなメンバーを用意して 値のやり取りも出来ると思うのですが。
>685 その理由を説明していない教科書は捨てろ。
(自分だけが)十分承知使うなら別にそれでもかまわんぞ
>>685 #define class struct
#define private:
#define protected:
とでもして使えばいい罠。
>>686 その理由に付いては何となく分かるんですが。(配列、ポインタ、インデクス
範囲、そんなキーワード思い付いたんですが)
教科書探して見ます。
>>687 わかりました。どうもです。
#define private public #define protected public だわな。
>>680 > ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
絶対数は知らんが、俺は OO だよ。今度、転職する先のゲームメーカーでも
開発の主力言語は C++ だそうだ。
(別のトコロで C 主流ですって会社もあったけど、そっちは断った。言語が理由
じゃないけどね)
>>688 ANSI C++ の規格では、private, protected, public の中ではメンバ変数のメモリ
配置順序は決まってるが、それをまたがった場合には実装依存になっている。
たとえば
private:
x;
public:
y;
private:
z;
だと x, y, z ではなく x, z, y の順に配置されるかも知れんわけで、そのマクロを定義
すると既存のオブジェクトとバイナリ互換性を崩す可能性があるぞ。
まぁ、ネタニマジレス だけどさ(w
695 :
デフォルトの名無しさん :02/07/11 13:57
シングルトンなクラスのgetInstance()とかでnewしたやつは どこでdeleteすべきですか?
mainの最後とか
static Singleton* pinstance = NULL; if (pinstance == NULL) { lock(); if (pinstance == NULL) { static Singleton instance; pinstance = &instance; } unlock(); } return pinstance; こうすればいい
>>696 ,697
ども。697を見てて思ったんですけど、
Singleton* Singleton::getInstance()//staticなメンバ
{
static Singleton inst;
return &inst;
}
なんてするとヤヴァイですか?
>>694 なるほど、そうすると、privateなメンバを持つクラスのヘッダファイルを
書き換えて、privateメンバをいじくって楽しむというのは危険な行為な
のですね。
まあもともとC++のカプセル化機構は、いくらでも壊すことができるから、
使う人に全責任があるわけですが。
>699 危険なヤシが居ます
ガーン。二重deleteしてるだけだった。
とりあえず
>>698 でよさげなのですが、697さんのように
いちいちチェックしたほうがよいですか?
697のはマルチスレッドで間違って2つのインスタンスが生成されるのを防ぐ方法
704 :
デフォルトの名無しさん :02/07/11 17:15
#include<stdio.h> #include<stdlib.h> typedef struct cell{ eki[20]; struct cell *next; } CELL; CELL *link(char *eki,CELL *p){ char *q,*r; q=(CELL *)malloc(sizeof(CELL)); strcpy(q->eki,eki); if(p==NULL){ q->next=NULL; return q; } r=p; while(r->next!=NULL){ r=r->next; } r->next=q; q->next=NULL; return p; } main(){ CELL *start=NULL; char eki[20]; while(scanf("%s",eki)!=EOF){ start=link(eki,start); } 連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。 ポインターの所にエラーがきます。どう直せばいいのでしょうか?
ぜんぜんC++じゃないじゃん。
> 連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。 このソースが通るコンパイラってあるのでしょうか…
>>704 通るように修正したよ。(動作確認はしてない)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cell{
char eki[20];
struct cell *next;
} CELL;
CELL *link(char *eki,CELL *p){
CELL *q,*r;
q=(CELL *)malloc(sizeof(CELL));
strcpy(q->eki,eki);
if(p==NULL){
q->next=NULL;
return q;
}
r=p;
while(r->next!=NULL){
r=r->next;
}
r->next=q;
q->next=NULL;
return p;
}
main(){
CELL *start=NULL;
char eki[20];
while(scanf("%s",eki)!=EOF){
start=link(eki,start);
}
}
>>704 VCとunixとでは仕様が全然違う。きをつけろ
eki[20]; 何型?
とおりましたありがとう。 ちなみに出力関数忘れてましたw。
Σ(´д`;) なんで仮想関数の方が呼び出しが早いんだろう・・・ おかしいな
713 :
デフォルト名無しさん :02/07/12 19:07
Vicual C++で、 int main() { char ss[5]; cin >> ss; cout << ss << '\n' ; return 0; } を実行すると、8文字まで打ち込んでも返してくれます。 9文字目でエラー発生。 どうして???
714 :
デフォルトの名無しさん :02/07/12 19:08
715 :
デフォルトの名無しさん :02/07/12 19:09
ふざけてんの?
>714 だからさ、5文字って指定しているのにどうして 8文字までOKなのかってことさ。
>>704 C++でmallocなんて化石は使うな。
と言ってみる。
718 :
デフォルトの名無しさん :02/07/12 19:11
>>716 あんたの環境ではたまたま大丈夫だったってだけだろ?
そんなもんなの???
720 :
デフォルトの名無しさん :02/07/12 19:13
s/ss[4]/s+4/
違う、ss+4だ・・
ss/ss[4]/ss+4 ?
>>716 OKじゃなかったらバッファオーバーフロウの心配なんてしねーよ。
?
s/じゃなかったら/なら
つまり幅を制御したければstd::setwを使え、と。
alignment …ああ、ネタにマジレスしちまった。
730 :
デフォルトの名無しさん :02/07/13 12:42
例外をthrowする時いろいろ情報を渡したいので MyException:クラスを作ってコンストラクタを MyException::MyException(const、char* sourceFile, int sourceLine, const char* format, ...) と定義して throw MyException("HOGE(%d) %s", a , b); 等として使っているのですが、 これだとCのヘッダ <stdarg.h> をインクルードしないと巧く行きません。 iostreamとか使ってもっと、C++風にかっこよくするにはどうしたら良いのでしょう?
731 :
デフォルトの名無しさん :02/07/13 12:44
まちがった! throw MyException("HOGE(%d) %s", a , b); ↓ throw MyException(__FILE__, __LINE__, "HOGE(%d) %s", a , b); です
無い
vectorとかに格納してみるとか。
「newしたものをdeleteしわすれる」以外に メモリーリークすることってありますか?
mallocしたものをfreeしわすれる
配列のdeleteに[]を付け忘れる。
>>735 >>736 以外でありますかね?
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
したらなぞのメモリーリーク検出するんですよねぇ。。
newもmallocもつかってないのに。。
Winの場合だけども、リソースを解放し忘れてるとか。
>>730 可変個引数はあきらめて、引数を1個、2個、3個、…持つ
テンプレート関数としてコンストラクタを定義する。
どうも。コメントアウトしながらつきつめていったら、 どうやらstd::stringのつかいかたをあやまっていたようです。 std::string str; str = ""; ってだめコードですか?
>>730 確か、operator,()ってオーバーロードできたよなぁ…
それ使って、
template <class T>
class variable_arg : public T {
variable_arg(T);
template <class T2>
operator,(T2);
};
template <class T>
MyException(int,int,string,variable_arg<T>)
とかって定義してやるのは無理かなぁ…。。。
C++初心者なのでわかりませぬ…。。。
関係ないところを訂正 MyException(const string&, int, const string&, variable_arg<T>); ちょっと試してみよう。。。
>>740 駄目ではないと思う。
str.clear() だとリークは起こらないの?
stringに関することはstlすれかな?微妙だけどとりあえずここで。 stlport(4.5.3=今の最新)はメモリリークが発生します。 SGIのアローケーターがよろしくないらしいので、 $stlport\stl\_site_config.hの #define _STLP_USE_NEWALLOC 1 をコメントアウトするといいようです。 ってがいしゅつ?(だろうな)
ちゃいます。 普通はNode Allocatorが使われるので、 #define _STLP_USE_NEWALLOC 1 か #define _STLP_USE_MALLOC 1 どちらかを定義します
thx. 自分のソースで定義しろってことですよね?
違う 〜\stlport\stl_user_config.h に書き加える。iostreamも使っている場合、 ビルドし直さないと原因不明のバグの元になる。
>730 proxyクラスのインスタンスを作って、そいつをコンストラクタに渡すのはどうよ? proxyとしてstd::ostringstreamがそのままつかえるかと思ったけど、 operator << が返すのはostream型なので コンストラクタはostringstream型ではなくostream型にしなければいけない。 だから、そのまま使うとダウンキャストが必要で、 使い方によってはここで例外が出る(動作はしらん)。 その場合はこんな感じ。 class MyException { std::string str; public: MyException(const std::ostream& s): str(dynamic_cast<const std::ostringstream&>(s).str()) {} const std::string& what() const { return str; } }; void f() { throw MyException(std::ostringstream() << " file: " << __FILE__ << " line: " << __LINE__ << " hoge"); } int main() { try { f(); } catch (MyException& e) { std::cout << "Exception: " << e.what() << std::endl; } return 0; }
この不具合ってSTLportについてだけ報告されてるの?
ostringstream() << 〜ってできないよ
>>750 不具合じゃないよ
パフォーマンスを上げるために一部をプールしてるだけ。
そうだったんだ。でも何時の間にかリークしてるっていうのは嫌だな。
>>753 リークはリークだけど、どれだけ運用してもリーク量は増加しないよ
「プール」は「リーク」じゃない と、Effective C++に書いてありますが
>>750 sgiからおとしたほうも同じく起こります。
>>754 ってことはこのリークは気にしなくてもいいのですかな?
リークとは、それを指すポインタが失われて、解放する手段がなくなった 時。
>>730 ,748
これでどう?
#include <iostream>
#include <sstream>
using namespace std;
class ErrorMessage {
ostringstream os;
public:
ErrorMessage( const char *file, int line ) {
os << file << "(" << line << "): ";
}
template<class T>
ErrorMessage& operator+( T x ) {
os << x;
return *this;
}
operator const string () const {
return os.str();
}
};
void foo( const string& s )
{
cout << s << endl;
}
int main()
{
int a = 10;
char b[] = "hogehoge";
foo( ErrorMessage(__FILE__, __LINE__) + "HOGE(" + a + ") " + b);
return 0;
}
759 :
デフォルトの名無しさん :02/07/13 16:26
カコワルイ std::string(__FILE__) + __LINE__ + "HOGE(" + lexical_cast<string>(a) + ")" + lexical_cast<string>(b);
>>760 を見てまたC++が俺の知らない間にトランスフォームしちまったのかと
焦った。Boostかあ、ちょっと見てみるかなあ。
>>760 それだけ見ると lexical_cast って、あまり使い勝手よいとは
思えないんだが、どういうインタフェースなの?
int a = lexical_cast<int>("100"); int b = lexical_cast<int>(a); float c = lexical_cast<float>("1.234"); std::string d = lexical_cast<std::string>(a); こんな感じで。
766 :
デフォルトの名無しさん :02/07/13 20:24
たとえは、"%04d"とか、書式使うには int n = 10; ostringstream os; os << "id(" << setw(4) << setfill('0') << n; ってやるしかないんじゃないの?
os.width(4); os.fill('0');
スマタ。ostringstreamか
printfの方がいいな。
os << setwidth(4) << setfill('0') << n;
STLも改訂してCの書式出力をサポートしてくんないかな・・
>>771 は間違いですから無視してくださいスマソ。
>>756 STLport が STL コンテナで使ってる node allocator の仕様だ。
いやなら _STLP_MALLOC_ALLOC (だったかな? マニュアル参照してくれ)
あたりのマクロを定義すると、node allocator 使わずに malloc / free するよ
うになるから、その手のリークチェッカに引っかからなくなる。
ただし、致命的にパフォーマンスが落ちるから、リリースビルドでは標準の
アロケータを使った方が良いと思う。
やっぱり
>>730 の方法が一番シンプルで良いと思う
>>770 #include <iomanip>
して、771 のように
ErrorMessage() + "setw(4) + setfill('0') + n;
でいける。
そんなわけわからん記述してまで・・>730がシンプルでいいじゃん。
まあまあ、半分ネタと思いつつやってるんだから (w で、オレとしては、setfmt みたいなマニピュレータを定義して、 os << setfmt("04d") とかだったら、 os.width(4); os.fill('0'); とやってくれるようなのを作ればいいんじゃないかと。
780 :
16メロミックス ◆/ECTibn. :02/07/13 21:45
パンピーより質問です。 日韓翻訳掲示板を作りたいのですが、 協力してもらう事は可能でしょうか?
ここは技術板で、制作板じゃない
782 :
16メロミックス ◆/ECTibn. :02/07/13 21:55
783 :
デフォルトの名無しさん :02/07/13 22:02
exit();で終了するとメモリーリークが起きました。 exitの代わりになる物はないですか?
終了時のメモリリークは気にするな リソースリークは気にしないとだめだが
785 :
デフォルトの名無しさん :02/07/13 22:47
>784 どうも。ってことは代替物はない? メモリーリークはどうも気持ち悪くて・・
それを潰してもプログラムの性能も安定性もまったく向上しないと思うが...
787 :
デフォルトの名無しさん :02/07/13 23:15
windowsはリソースへっていかないの?
終了時の無駄な解法の分だけパフォーマンスが落ちるね
ちゃんと80-20の法則守れよな。
790 :
デフォルトの名無しさん :02/07/13 23:18
>789 なんすか?それ
791 :
デフォルトの名無しさん :02/07/13 23:19
792 :
デフォルトの名無しさん :02/07/13 23:22
どうでもいいよ。
793 :
デフォルトの名無しさん :02/07/13 23:26
>>791 おまえ知ってるっちうか実行してるのか?
バカだな〜
仕方ねえな教えてやるよ 80才まで20本の歯を保とうだぞ? 世間の常識だから覚えとけよ。
>>793 俺は0-100だ。
たとえ重要じゃないところでもみっともないコードは残せない
796 :
デフォルトの名無しさん :02/07/13 23:32
Windowsの場合プロセス終了してもメモリ解放してくれないんじゃなかったっけ?
>>795 えーと、あれだな。
たとえスライム一匹でもフルパワーを持って倒しに行くタイプ。
スライムが居るので議論が進みません。
0-100 ではないがスライムに対しては全力で挑む。
800 :
デフォルトの名無しさん :02/07/13 23:44
スライムはほっといてメモリーリークはどうしますか? 全部潰す派ですか?
>>796 んなこたぁない。
解放されないのはリソース。
リークが怖いヤシはassert入れるなよ
解放忘れさえしてなければリークは気にしない派。
win32ならリソースも解放されるよ・・・
805 :
デフォルトの名無しさん :02/07/13 23:51
じゃあ終了時のメモリリークはバグじゃないって事でいいですね?
>>804 9x系でDCにオブジェクトを選択したままプロセスが死ぬと
GDIリソースは解放されません。
>>806 「9x系で」ってことは、OSのバグってことでいいですね?
メモリリークは命がけで怪傑汁
>>807 バグじゃなくて仕様だって。
気に入らない動作=すべてバグ って厨房じゃないんだから。
全て仕様ってことで押し通す気ですね:-)
811 :
デフォルトの名無しさん :02/07/14 17:20
numeric_limits の max/min が関数になってるのは何故ですか?
浮動小数点型とかだと、is_bound というメンバが true じゃないと max/min が裕子にならないから、みたいだよ。
>>812 その理由だと、 digits も関数になってるはず。
やっぱりわからん。
データメンバだと値を設定しないといけないじゃない
そうか、整数型以外はクラス定義での static const な変数の 初期化はできなかったね。
static でメンバ関数を宣言した時とそうでない場合の違いを教えてください。 static 関数で定義された関数を class :: 関数 で呼び出す時、 一時的にクラスは作成されるのか教えてください。
呼ばれるときにthisが漏れなく付いてくる(非static)か、 付いてこない(static)か。
>>817 C++ third editionを買ってください。
私ならそうします。
C++ は他のオブジェクト指向言語とは違い、動的にクラスを生成したり することはできない。クラスはコンパイル時に静的に生成される。
Javaも動的にクラスを生成できないが?
たしか BSF 使えばできるよ。
BSFって?
Binary Sex Fucking (両性どちらとでもOKです)
numeric_limits<>は全部関数だったらいいのに、と思ってしまうのは俺だけだろうか。 static constと入り混じってわかり難いよ…。
さっき発見したんだけど、C++ではifのなかで変数宣言できるんだね。 こりゃ便利。
>>828 Test(class : public Base{}());とか出来ればいいのになぁ…。
830 :
デフォルトの名無しさん :02/07/15 08:32
C++ではポインタはあまり使わずに参照をしたほうが良いのですか?
833 :
デフォルトの名無しさん :02/07/15 09:42
↑このメールマガジンは参考になりますか?
>>827 ,828
でも、
if (int i = foo())
みたいに代入式しか書けないよね?
if ((int i = foo()) == 2)
みたいに条件判断も書けるといいんだけど。
プログラム言語で信じられるのはANSI/ISOとかのドキュメン トと有名図書ぐらいでそれ以外の解説ははっきりいって役に 立たない。役に立たないどころか有害でさえある。
K&Rっていう遺物は有害だな。
838 :
デフォルトの名無しさん :02/07/15 20:04
cygwinのgccでc++プログラムコンパイルしたら テンプレートの定義が見つからないのかなんなのかやたらエラーがでました。 設定に問題があるのかサポート外なのか。。どっちですか?
バージョンは?
すんません。 自分で書いててあれ?gccだっけ と思いg++でやったらできますた。。
あのう 自分forにつかうiとかjも事前に、 int i,j; というふうにしとるんですけども。 やっぱりだめどすかね。 すまあとじゃねえどすかいね。
変数のスコープは最小限にしませう。
for内でi宣言すると forからでたら、i無くなっちゃうんどすか? 初心者でスマソ
844…あうーサンクスコですー そうか最近は消えるのか…やっぱり年はとりたくないもんだなーって それくらい実験すればわかったな… なんでもきいてスマソ
いいんじゃない?相談室だし。
#include<iostream> using namespace std; int main() { for(int i=0;i<2;i++){ for(int i=3;i>0;i--){ cout <<"ahhhh\n"; } } } あーうーほんとだーうごいたー なるー さんくすこ int j;がいらなくなった! あれ?前段のiを後段で呼び出すのはどうすればいいんだ?
848 ごもっとも!
俺は遊ばれたのですか?
いやー方法あるなら聞きたいと思っただけです 遊んでおりません。 なんか this.i みたいなかんじであるのかなと… 逝ってきます
そんな夢のある方法を使えば 変数ひとつでプログラムがかけてしまう!とか何とか 思ったりしたと思われ…
>>853 環境依存、動作補償なし(九九表)
int main(){
for(int i=1;i<10;i++){
for(int i=1;i<10;i++)
std::cout << std::setw(2) << i* *(&i+1) << " " ;
std::cout << "\n" ;
}
}
せめてthis->iって書いて欲しかった。
>>852 変数のスコープも和歌ランぐらい初心者なので ウル覚えですが…自分自身のクラスだったっけ??? グーぐる先生に聞きに逝ってきます
>>854 >エラー E2316 a.cpp 6: 'setw' は 'std' のメンバーではない(関数 main() ) しくしく63 >>855 そうでした スンマソン
VC6 との互換性を考えて { for(int i; i < 10; i++){} } と書くけど、やっぱダサい!
if(0)else forよりカコイイ
#define for if(0); else for
ぐあああ、俺だせぇ
>>858 VC6ではそうしないといけないのか…大変だな
>>859 隊長!動きました…けどやっぱりダメみたいですね。
結果は無残だった。
足して駄目なら引いてみるとか?
>>862 なるほどと思ったりなんかして…
#define for {for
あ、閉じる括弧は無理ジャン…
なるほどね
たした 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 1245112 2490224 3735336 4980448 6225560 7470672 8715784 9960896 11206008 ひいた 256 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18
いや別に試さんでも… 冗談だし。しかし866のメモリレイアウトはどうなっているのだろう。
あ、うまくいく場合もあるようですね 当然だが… ポインタの差を求めてそれをたし元に戻すと… ポインタの差が変わってて しょんぼりって… これじゃ使えないジャンか!!
869 :
デフォルトの名無しさん :02/07/15 22:46
boostでGUIプログラミングは作れないんですか? だとするとあんまり役に立たないような・・やっぱ MFCで逝くしかないのか・・
べつに作れるんじゃないの?
-2 1 -2 2 -2 3 -2 4 -2 5 -2 6 -2 7 -2 8 -2 9 -2 2 -2 4 -2 6 -2 8 -2 10 -2 12 -2 14 -2 16 -2 18 -2 3 -2 6 -2 9 -2 12 -2 15 -2 18 -2 21 -2 24 -2 27 -2 4 -2 8 -2 12 -2 16 -2 20 -2 24 -2 28 -2 32 -2 36 -2 5 -2 10 -2 15 -2 20 -2 25 -2 30 -2 35 -2 40 -2 45 -2 6 -2 12 -2 18 -2 24 -2 30 -2 36 -2 42 -2 48 -2 54 -2 7 -2 14 -2 21 -2 28 -2 35 -2 42 -2 49 -2 56 -2 63 -2 8 -2 16 -2 24 -2 32 -2 40 -2 48 -2 56 -2 64 -2 72 -2 9 -2 18 -2 27 -2 36 -2 45 -2 54 -2 63 -2 72 -2 81 −2を無視すると動いているようには見える
クラステンプレートって メンバ関数の実装も全部ヘッダファイルに書かないとダメ なんでしょうか?
>>872 分けることもできるけど、
その分けた実装がコンパイルされるときに
明示的なインスタンス化をやっとかないと
リンクエラーになるよん
>873 ありがとうございました、なんとかうまくいきました
875 :
デフォルトの名無しさん :02/07/16 00:17
>for(int i=1;i<10;i++){ >for(int i=1;i<10;i++) 正直これは改悪だと思われ。
forやifの後に命令ひとつでも{}してしまいたくなる症候群なのですが コンパイル時に実害はありますか?
コンパイラvs{} ↓ コンパイラwin
なんか実害はなさげですかな? コンパイラはそんなにあほではないのね。 >>878 やっぱりいるんだ。うれしいような
>>876 最近やめますた&1行だったらforの中に突っ込んですまいます。
>>876 いいと思う
if(i>=0) if(i>=1) if(i>=2) ;
else std::cout << i ;
こんなのあったら何がなんだか分からんし
そんな風にしちゃうのと、{} でくくらないのは別問題。
乗り遅れた。。 チィッ
887 :
デフォルトの名無しさん :02/07/16 08:32
メンバ関数内にstatic変数を使うくらいなら その変数はメンバ変数にしてしまった方がいいのでしょうか?
>>887 意味的には×かと。
他からアクセスする気がない変数なら敢えてそうする必要はないかと。
>>887 時と場合によりけり。
その変数をほかの関数からつかう可能性があればメンバ変数。
ほかの関数からは絶対呼ばないようなときは関数内static。
ま、「変数のスコープは最小限に」っつーことです。
でもその変数がそのクラスにとって重要ならメンバ変数でもよい。
>>888-889 レスありがとうございます。
>時と場合によりけり。
とりあえず、迷ったらメンバ変数にする方向でいきます。
なんか、上司がstatic変数にブチギレしてたので。
本人曰く「staticアレルギー」らしいです…(藁?
マルチスレッドとかで痛い目にあったんだろうな。
つぅか出来る限りstaticを使わないと言うのが・・・
893 :
デフォルトの名無しさん :02/07/16 13:26
メンバ関数の中の静的変数ってそのクラスの全部のインスタンスから 参照されてしまうからね。メンバにするのとは意味が違ってくる。
staticにするかしないかで迷うことなんてある?
通常のメンバ関数とstaticメンバ関数の違いがいまだによくわからない。
>>895 staticメンバ関数なら
ClassName::function();
と呼べる。
>>895 staticメンバ関数なら、
>>896 のようにインスタンスを作成せずに呼べる。
通常のメンバ関数だと、foo.function()のように
わざわざインスタンスを作成しなければならない。
898 :
デフォルトの名無しさん :02/07/16 20:42
あげ
all right.
901 :
デフォルトの名無しさん :02/07/17 10:40
静的メンバ関数からは静的メンバ変数しかアクセスできない。 インスタンスがあろうと無かろうと。(無い場合を考慮すれば当然だが) コールバックなんかには静的メンバ関数であれば渡すことができる。
903 :
デフォルトの名無しさん :02/07/17 19:25
C++でデータベースにアクセスするとしたらどんなライブラリが一般的ですか?
DBごとにアクセス用のライブラリが用意されてると思うけど Win上ならODBC経由だろうねー
905 :
デフォルトの名無しさん :02/07/17 19:34
unixなら何でしょう??
標準は無いと思った。蛇足だけどJavaならJDBCだのー つかスレ違いっぽいから他スレ行けよ。
そうすか。すんまそ。でわでわ
908 :
デフォルトの名無しさん :02/07/17 20:52
クラスの宣言をヘッダに定義をcppファイルに書いています。 ここでこのクラスのオブジェクトを操作するようなグローバルな関数 (例えばswap(class T, class T)みたいな)ですが プロトタイプはヘッダ、実装はcppに書く、というのが一般的な記述ですか?
910 :
デフォルトの名無しさん :02/07/17 21:01
つまり このクラスを扱うグローバルな関数をこのクラスとセットで提供したいのです。 この場合関数をcppファイルに書いたのですが、プロトタイプはどこに書こうかなぁ、、と思いまして。 externキーワードつければcppファイルに書いても他のファイルから参照できるんでしたっけ??
>>908 もっとちゃんと句読点を入れて書けよ。
テンプレートを作りたいなら、全部丸ごとヘッダに書け。
そうじゃないなら、ヘッダには宣言だけを、*.c/*.cpp に定義を書け。
そのグローバル関数のプロトタイプを、クラスのヘッダに買いときゃ いいんじゃないの?externつけるまでも無く
>912 そうですか。そうします。ありがとうございます。
関数はデフォルトでexternだから付けなくてもヨシ。
>>911 普通のクラスのメソッドの定義はヘッダじゃマズイっすか?
>>915 inlineじゃない場合、まずいんじゃない?リンク時にぶつかりそう
918 :
デフォルトの名無しさん :02/07/20 01:01
MSDNより引用 >ローカル タイプを使ってテンプレート関数 (関数テンプレートから作る関数) を作ろうとしています。テンプレート>のインスタンス化では、外部リンケージを持つ型だけが使用できます。 > >以下のコードではこのエラーが発生します。 > >template<class T> class X{}; > >void f() >{ >struct Y{}; > >X<Y> x; // エラー >} この制限は何のためにあるのですか?
919 :
デフォルトの名無しさん :02/07/20 01:04
C++仕様が"何の為"にあるかを知る本はD&EかARMのどちらかだ。 # ?(・∀・)? ソウダッケ?
プログラマの給料の為だろ
>>918 テンプレートのインスタンス生成は関数やクラスの外で行われるから。
(C++ 3rd, C.13.8.3)
これは仕様だが、なぜそういう仕様になっているかは知らない。
それを許すとあまりにもコンパイラを作るのが面倒になるからかなぁ?
bool Get() { return m_bBool; } を bool * Get(){ return &m_bBool; } とやる利点を教えてください
923 :
デフォルトの名無しさん :02/07/20 19:19
VC++でお勉強がてらコンソールアプリ作っているんですけど 画面をクリアする方法はないのですか?
system("cls");
>>918 テンプレート使いまくったプログラムのマップファイルを見れば、
少しは納得がいくと思うよ。
>>924 サンクス、systemでdosコマンド呼ぶんですね。
>>922 あえていうなら
・レジスタに乗らないようなサイズならば、参照するのに効率がよい
(でも普通はconst参照にするんでは)
・ポインタ経由で値を変更できる
boolじゃあんまり利点ないと思うけど...
>>927 > ・ポインタ経由で値を変更できる
そんなことするぐらいなら素直に m_bBool をパブリックにした方がいいと
思うぞ。
普通に考えたら、とても変なことなので
>>922 はそういうことしてる奴に
真意を確認した方がいいよ。普通はやらない。と言うか、やっちゃいけな
い。
>>928 systemはshellを呼び出す関数で、shellの内部コマンドも使えるのを知らないのか
931 :
デフォルトの名無しさん :02/07/21 00:39
漏れはboolだったら、↓の様にするけど。。。 class Hoge{ bool m_isChanged; public : Hoge() : m_isChanged(false) {} IsChanged() { return m_isChanged; } SetChanged() { m_isChanged = true; } ClearChanged() { m_isChanged = false; } };
931 bool変数をわざわざintで返すのですか?
型付け忘れてたよ。。。スマソ
( ´∀`)69%モナー
936 :
デフォルトの名無しさん :02/07/21 19:23
あのー Win32 スレッド環境で質問なんですが・・。 仮想関数の中でオブジェクトの宣言の順番を変えたり、最適化したり(-Ox) するとページ違反エラーが発生するので困っております。 次のように書くと A のデストラクト時に ページ違反 (ランタイム) A a; B b; (-O3 でコンパイル) [シングルスレッドでは問題ないのですが・・] エラーなし A a; B b; (-O0 で OK) B b; A a; (-O3 で OK) { A a; } B b; (-O3 で OK) ちなみに A と B の継承関係は以下のような感じになっているのですが・・ C はオブジェクトの ID を変数に登録しているだけで、お互いは特に関係はありません (A ← C), ( B ← E ← D ← C ) [ ← ... public 継承 ] 一日中さがしても原因がわからないのでこれはコンパイラのバグなんじゃないかと 思い始めているのですが・・バグのほかに何か考えられますでしょうか・・? コンパイラは mingw + gcc 2.95.3-6 です
シングルスレッドで問題ないなら、 同期まわりのバグのほうを疑うべきじゃないのか?
どこかでメモリ破壊をしている。 具体的なソースを上げられないなら、手の施しようがないと思うが。
>>937 ,938
アドバイスに添って調べてみたら微妙なミスを発見しました。
解決できました。ありがとうございました!
940 :
デフォルトの名無しさん :02/07/22 01:34
windowsでdllとアプリの間に共通の自作クラスを使用する場合は どこで宣言するのが吉? vector <myClass *> classes みたいなオブジェクトをdllとメインプロジェクトの間でやりとりしたくて 迷っています
宣言は必要なところすべて インスタンスの作成は所有者
>941 そうですかやっぱりメインプロジェクトの方でも宣言しないとダメですかね。 どうもdllとlibの関係がわからない・・・
>>942 だめというか、そのクラスを使うところで
使いたい対象を知らなかったら使えないでしょ?
なるほどそういわれてみればそうですね。 VisualC使ってるのですが 別プロジェクトで平行してdllを作っているので #include "../dllProj/***.h" このようにして常に最新のdllヘッダをincludeするようにしました これであとはlibとdllをdllProjの方から呼び出せればいいのですが・・ 設定のところでincludeファイルにdllProjを含めてもうまくいかない・・・
945 :
デフォルトの名無しさん :02/07/22 03:12
boost のshared_ptrって普通に参照回数を数えているのとは違うらしい んだけど、それは普通に参照回数を数えるのに比べて何がどう違って いて、どうメリットがあるんでしょうか? ドキュメント見たけど書いていないっぽいのでどなたか教えて頂けないでしょうか。
すみませんもう一つだけ質問させてください。 メインプロジェクトで myclass *test; init(test); としてdllの方のinit関数で test = new myclass などすることは可能なのでしょうか? どうもここがうまくいきません。
つまりdllの方で 動的にメモリ領域を確保してメインプロジェクトで使うことは可能かどうかということです ちなみに warning C4700: 値が割り当てられていないローカルな変数 'test' に対して参照が行われました。 という警告がでてはしまうのですが・・・・
>>940 メインで確保したメモリはメインで開放、
DLLで確保したメモリはDLLで開放する。
Windowsの力を借りれば、どっちで開放してもいいようにもできる。
その前に引数とはどういうものかを知れ。
>>945 use_count_ と weak_count_ を分けているので weak_ptr<> が作れるぞ、
ってゆーか、別に普通に数えているのと大差ないと思うけど。
つか、 myclass *test; dll_init( &test ); @dll *test = new myclass ダロ。ポインタわかってるか?
>>949 ほほぅ、そうなんですか。それってパフォーマンス下がるんですかねぇ、やっぱり。
サイズ大きくなりそうだし・・・
952 :
デフォルトの名無しさん :02/07/22 12:05
srand((unsigned)time(NULL)); この、unsigned っていうのはなんでしょうか? C or C++自体初心者なので、頭についているのも理解できません。
>>951 局所的な、パフォーマンスが要求されるポインタには、scoped_ptrを使えって。
shared_ptrは、たとえばSingletonだったり、木構造だったり、
複数の参照元を管理するためにつかうもんだろ。
954 :
デフォルトの名無しさん :02/07/22 15:13
今、VC6.0で音声認識を行うランチャーを作っています。 Microsoft Speech SDK5.1をダウンして、付属の音声認識サンプルプログラムcoffees0 をコンパイルしようとするとcofgram.hが見つからずエラーが出てしまいます。 ハードディスク内を全検索かけても、googleで検索かけても何も見つかりませんでした。 confgram.hはどーすれば手に入りますか?よろしくお願いします。
956 :
デフォルトの名無しさん :02/07/22 20:28
新スレいりますか?
いらないっつーに
958 :
デフォルトの名無しさん :02/07/22 23:22
保守あげ
>>953 いやぁ、vector に突っ込む時とかの事を考えてのつもりです。
scoped_ptr は使えないっすよね。で、shared_ptr を増産すると
普通の counted_ptr(とでも言うのかな?)と比べて weak_count_
の分よろしくないかなぁと思っただけでして・・・
>>960 カウントが2種類あるからと言って sizeof( shared_ptr<T> ) は増えたりはせんから、
同じオブジェクトを指す shared_ptr の増産なら問題は皆無だぞ、念のため。
1オブジェクトにつき4Byte程度…のメモリ消費が気になるなら
独自のカウンタを書いて intrusive_ptr<> を使うべきかと。
2つのカウンタをインクリメント・デクリメントするコストが無駄だというんじゃないの?
>>961 サイズの問題を考えるとすれば、そうです。つまり、
counted_base::use_count_ と counted_base::weak_count_
の二つを持つ shared_ptr は、フツーに count数を数えるようなの
と比べて weak_count_ の分大きくなるなぁという風に思っただけです。
あんまり weak_count のメリットを僕が分かってないせいもありますが、
「そんなのイラナイから余計なサイズ食わないで欲しいなぁ」
ってのが一つ。
それと、
>>962 の言うように、「余計なカウントしなくていいのになぁ」
というのも一つ。
まぁぶっちゃけ「参照回数のみを数える余計な事はしない軽いsmart_ptrも欲
しいなぁ」とちょっと思ったっていうその程度です。なんかお騒がせしちゃっ
たみたいでスマソ
ちなみに intrusive_ptr なる物は始めて知りました。確かにありますねぇ。
ちょっと見てみます。
埋め立て
埋め立て!!
埋め立て!! 埋め立て!!
埋め立て
埋立て
埋立
埋立
埋 め 立 て
埋 立 て
埋 立
埋 め 立 て ! !
埋め立て め 立 て
u m e t a t e
1000!!
1 0 0 0
1000 GET
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。