1 :
v(^・^)v :
03/07/07 21:15 C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら
>>2-10
2get...?
3 :
v(^・^)v :03/07/07 21:16
4 :
v(^・^)v :03/07/07 21:16
5 :
v(^・^)v :03/07/07 21:16
6 :
v(^・^)v :03/07/07 21:16
7 :
v(^・^)v :03/07/07 21:17
8 :
v(^・^)v :03/07/07 21:21
9 :
v(^・^)v :03/07/07 21:30
10 :
v(^・^)v :03/07/07 21:31
11 :
v(^・^)v :03/07/07 21:31
オツカレーション
13 :
デフォルトの名無しさん :03/07/07 21:56
14 :
デフォルトの名無しさん :03/07/08 00:11
インスタンス化された関数テンプレートのポインタを取得したいのですが、以下の書き方ではエラーになります。 template<typename T> void func() { hoge }; void (*ptr)(); ptr = func<A>; // error: void(void) から void (__cdecl*)(void) に変換できません。 ptr = &func<A>; // 同上 どのように書けばよいでしょう? VC++6.0 SP5 です。
15 :
デフォルトの名無しさん :03/07/08 00:15
>>14 func<A>とかfunc<B>とかは全部オーバーロードされた関数として
扱われるので、明示的にキャストなどが要るはず。
ptr = (void(*)()) &func<A>;
>>15 ありがとうございます。
しかし、駄目でした。
error: '' から 'void (__cdecl *)(void)' に変換することはできません。
空欄の型とはいったい。コンパイラのせいなのかな。
駄目そうだったらおとなしく仮想関数を使います。
17 :
デフォルトの名無しさん :03/07/08 00:44
>>16 これは
typedef void pf();
pf p= fn<int>;
p();
>>1 また前スレの1さんでつか?
乙でし!
またよろしくおながいいたしますm(__)m
20 :
デフォルトの名無しさん :03/07/08 00:45
pf *p = fn<int>の間違い
VC7で void (*pf)(); pf=func<int>; これはコンパイルできないけど void (*pf)()=func<int>; これはコンパイルできる。なんで?
>>17 駄目でした。
最初のエラーと同じ 'void(void)' から 'void(__cdecl *)(void)' に変換できません。
特殊化を定義しておくと通ったりしてちょっと謎。
template<> func<A>() { hage }
ptr = func<A>; // OK
コンパイラのせいかな?
>>23 勝手な思い込みでした。気分害してスマソ。
新スレありがとう。。。
>>25 ネタだけどな。
つーかなんでそう思ったん?
名前欄か?
>>24 確実にコンパイルできる方法
template <class T> struct foo{ static void bar(){/*hoge*/} };
void (*pf)();
pf=foo<int>::bar;
>>25 v(^・^)vさんをコテハンだと思いますたTT
いつもこのスレには本当にお世話になり、頼りに
しています。(自分は会社勤務ではないため
聞く人がいないのです。といってMLは恥ずかしくて聞けないTT)
これからもよろしくです。。。
v(^・^)v←決まり事だと思ってた
ヌヒよ、おれを頼りにしろ。
VBの質問スレはv(^・^)bなのになんでここはc(^・^)c とかc(+・+)cじゃないの?
>>27 無事通りました。この方法でいってみたいと思います。
ありがとうございました。
c(pp^)
STLつかうと一気に実行ファイルサイズが10倍に?!
>>35 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>36 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
あれ、このやりとりどっかで見たような気が……deja vu?
ヌヒよ、STLぐらいでガタガタいってたら boostはどうすんだよ。
VC7.1にしたらwarning C4244が大量に出てきて鬱だよママン…
43 :
デフォルトの名無しさん :03/07/08 17:24
44 :
デフォルトの名無しさん :03/07/08 17:26
>>42 すげえ。VC7.1にしといてwarning C4244が大量に出てきたとかいってるよ。この人。
>>44 そんな事言われても出たもんは出たんだよヽ(`Д´)ノ ウワァァァン
まぁあんまりその辺気にせずにVC6を使ってた漏れが悪いが…
しまった。デジャブーにのりおくれた・・・
沢○が大量発生だな。おい。
僕の名前はエンポリオです。
次作「ラン・タイム・エラー」でお会いしましょう。(飛呂彦)
51 :
デフォルトの名無しさん :03/07/09 11:25
Z _____(-∀- )__ _│_│_│_│_│ │_│_│_│_│_ ポイント♪ _│_│_│_│_│ │_│_│_│_│_ (・∀・ )⌒ヽ⌒ヽ⌒ヽ _____Σ(-∀・ )_ _│_│_│_│_│ │_│_│_│_│_ ポイントカード オモチデスカ? _│_│_│_│_│ │_│_│_│_│_ (・∀・ )⌒ヽ⌒ヽ⌒ヽ _____Σ(;・Д・)_ _│_│_│_│_│ │_│_│_│_│_ _│_│_│_│_│ ・・・ポイント10バイ! │_│_│_│_│_ □⊂(・∀・ )
52 :
デフォルトの名無しさん :03/07/09 11:57
糞スレ化の危機により緊急age 質問カモ〜ン
質問:C++って死滅しちゃうの?
じゃあ俺が問題を出してやる 0<x<2などの複数回比較を可能にするクラスmulticomparisonと そのヘルパ関数mcompを作成しろ。これによって次の例が可能になる 0<mcomp(x)<3、mcomp(x)==y==z
56 :
デフォルトの名無しさん :03/07/09 19:53
57 :
デフォルトの名無しさん :03/07/09 21:40
いつからかわからんけど、ム板つまんなくなったよね。
59 :
デフォルトの名無しさん :03/07/09 23:31
60 :
デフォルトの名無しさん :03/07/10 02:07
ちと教えてたもー。 基本クラスAとその派生クラスBがあったとします。 A* p = new B; delete p; という風に書きたい場合はAのデストラクタを仮想関数にするのでいいのでしょうか?
>>60 その通り。
というか、特殊な事情がない限り
デストラクタは仮想関数にしておいた方が無難。
特殊な事情ってのは、
派生クラスを作る予定が全くない、
よほどパフォーマンスやデータサイズが気になる、
とか。
>>61-62 ありがd。
勉強になりました。
派生する価値のあるクラスが書けるかどうかはおいておくとしてとりあえず癖につけておきます。
>>60 Aのサイズでヒープを開放しようとするのでヒープ領域が破壊される
ヨカーン。
66 :
デフォルトの名無しさん :03/07/10 07:07
67 :
デフォルトの名無しさん :03/07/10 09:30
質問お願いします。 あるデータに関するクラスAがあり、 そのクラスのオブジェクトを集約リストとして持っているクラスBが別にあります。 クラスAのオブジェクトは、全てそのリストで管理されています。 クラスBは他に妥当なクラスがないという消極的な理由から、クラスAのリストを保持してます。 そこでお尋ねしたいのですが、このリストに対する操作(ソートや全検索など)を 実装する場合、それをクラスBのメンバ関数とするのと、クラスAの静的メンバ関数に するの、どちらが妥当でしょうか?
68 :
デフォルトの名無しさん :03/07/10 09:33
えっと別スレで聞いたのですが説明なしで自己満足で終わられたみ たいなのでこのスレに投げます。 SYOTI_F( char * ) test_time SYORI_P(( const time_t *tp, char *buf )); とGCCで書いてあるヘッダをC++Builderでコンパイルすると [C++ エラー] test.h(38): E2293 ) が必要 となるのですがこれはSYOTI_F( char * ) を返り値とした関数 の宣言と考えて良いでしょうか?
>>67 そのリストがどこに所属しているかによる。
クラスAの設計の一部として(クラスAが成り立つために必須)存在しているのならクラスAのメンバにすべき。
それとも、クラスAは単独で存在できるけど、たまたま今回のプログラムではそれをリスト上で管理しているのならクラスBのようなコレクションクラスのメンバにすべき。
>>68 おそらくSYOTI_FとSYORI_Pはマクロだと思うが、それが定義されていないためのエラーってことはない?
>>68 × SYOTI_F
○ SYORI_F
のタイプミスが原因に 1000 ガバス。
>>69 レスありがとうございます。なるほど、
リストというデータの帰属を問えば良いのですね。
今回の私のケースは、69さんの二行目に反するようです。
(二行目の様にリストの内包が必須なクラスを、今ちょっと想像出来なくて、少しだけ不安ですが)
ですのでBのメンバにしようと思います。御陰で吹っ切れました。重ね重ね感謝です。
73 :
デフォルトの名無しさん :03/07/10 09:57
>>68 こっちにも書いとく。
>えっと別スレで聞いたのですが説明なしで自己満足で終わられたみ
>たいなのでこのスレに投げます。
回答してくれる人をなんだと思ってるんだ?
おまえの質問に答えてやるためだけに常駐してるとでも思ってるの?
75 :
デフォルトの名無しさん :03/07/10 10:02
>>74 意味の通らないことを散々書いておいて、突然はたと居なくなるのが
自己満足以外のなんだというんですか?w
質問者に礼儀が必要なのはもちろんですが、回答者にだって必要かと..ww
76 :
デフォルトの名無しさん :03/07/10 10:03
C++には、VBのStrConv関数のようにSHIFT-JISをUnicodeに変換する関数はないのでしょうか? 以下のような関数を自作できないこともないとは思いますが。 if((fi=fopen(source,"rb"))!=NULL) if((fo=fopen(target,"wb"))!=NULL){ printf("Start conversion\n"); fputc(255,fo); fputc(254,fo); while((c = fgetc(fi))!=EOF){ 後略
77 :
デフォルトの名無しさん :03/07/10 10:04
分かっている事ばかり答えてもらってもしかたなか(-.-) 分かっている事ばかり答えてもらってもしかたなか(-.-) 分かっている事ばかり答えてもらってもしかたなか(-.-)
俺は68がまったく意味不明なんだが
80 :
デフォルトの名無しさん :03/07/10 10:07
>>75 あのね質問に全部答えても解答がでてないの〜^^;
ウンコ野郎にマジレスしちまった・・・鬱
>>79 被害の拡大を防いでくれてありがとう
>>75 >突然はたと居なくなるのが
あたりまえ。おまえみたいに暇な人ばかりじゃない。
83 :
デフォルトの名無しさん :03/07/10 10:11
84 :
デフォルトの名無しさん :03/07/10 10:12
>>81 答える事ができないのに偉そうなのがむかつく
85 :
デフォルトの名無しさん :03/07/10 10:17
>>81 分からないのに偉そうにあれを調べろこれを調べろ
って時間の無駄〜他の人にしないで下さいね
>>76 標準C++には無いよ
ライブラリかOSの機能をつかうべし
87 :
デフォルトの名無しさん :03/07/10 10:39
>>86 行いたい機能から関数を逆にたどるのがむずかしいのですが、
Borland C++ Compiler 5.5のライブラリの中にはSHIFT-JISをUnicodeに変換する関数などはないのでしょうか?
>>76 mbstowcs 関数というのがある。
ヘッダファイルは cstdlib 。
ただし、Shift-JIS を使っている OS に限る。
>>88 wchar_tがうにコードとは限らな(略
90 :
デフォルトの名無しさん :03/07/10 14:01
>>88 mbstowcs()とwcstombs()がありました。ありがとうございました。
Cを始めて勉強するのにお勧めな本はありますか?
昔、私がTemplateすれに貼り付けたもの。 C++ でワイド文字をマルチバイト文字列に変換 std::localeloc( "japanese" ); std::locale::global( loc ); std::wstring source( L"(・∀・)" ); std::string result( source.size()*2, char() ); const std::ctype< wchar_t >& ct = std::use_facet< std::ctype<wchar_t> >( loc ); ct.narrow( &*source.begin(),&*source.end(),'?',&result[0]); std::wcout << L"wide : " << source << std::endl; std::cout << "narrow : " << result << std::endl; 結果 wide : (・∀・) narrow : (・∀・) マルチバイト文字列からワイド文字列へは、 std::string source( "(・∀・)" ); std::wstring result( source.size(), wchar_t() ); const std::ctype< wchar_t >& ct = std::use_facet< std::ctype<wchar_t> >( loc ); ct.widen( &*source.begin(),&*source.end(),&result[0]); VCで確認済みだが、他の環境(UNIXとか)では知らん
こぴぺミス。 ×std::localeloc("japanese"); ○std::locale loc("japanese"); 他にもミスあるかも…
>>92 VC++7.0 では期待通り動くけど、
VC++7.1 じゃ表示がおかしくなるね。
なんか違うのかな?
前スレ
>>944 http://pc2.2ch.net/test/read.cgi/tech/1055162298/944 亀レスだけど
typedef Typelist<class1,Typelist<class2,Typelist<class3,NullType> > > ClassList;
class Base{
public:
virtual int GetID()=0;
virtual ~Base(){}
};
template <typename classname>
class BaseImpl:Base{
int GetID(){
return IndexOf<classname>::value;
}
};
class class1:public BaseImpl<class1>{
};
class AbortType{ public: AbortType(){abort();} }; class Factory{ public: Base * Create(int ID){ switch(ID){ case 0:return new TypeAtNonStrict<ClassList,0,AbortType>::Result; case 1:return new TypeAtNonStrict<ClassList,1,AbortType>::Result; case 2:return new TypeAtNonStrict<ClassList,2,AbortType>::Result; //... } //static Base * (*Funcptr[ClassList])()={TypeAtNonStrict<ClassList,0,AbortType>::Result::operator new(), //TypeAtNonStrict<ClassList,1,AbortType>::Result::operator new()}; abort(); }; }; Factoryはperlとか使って出力しておく。 templateスレへ行けとか言われそうな気もするけど思いついたので。 typelistとかTypeAtとかも書くと長くなりそうなので省略
>68 そう考えてよい。以上。
98 :
デフォルトの名無しさん :03/07/10 19:02
UTF8でファイルの読み書きしたい場合、C++標準ライブラリとかありますか?
標準には存在しない。
>>96 そういうときこそpreprosessor-metaprogrammingだ
>>98 あつかっている文字が始めから最後までUTF8なら
通常の読み書きの関数をそのまま使えば済む話だけど、
具体的にどういうことがしたいの?
102 :
デフォルトの名無しさん :03/07/10 23:08
初心者の質問ですみませんが、以下のコードがg++でコンパイル時にエラーとなります。 何故でしょうか?static をはずすか、又はコンストラクタ内で static メンバ にアクセスしないようにすると問題無くコンパイルが通ります。 % g++ a.cpp /tmp/ccC2TuDO.o: In function `Hoge::Hoge(void)': /tmp/ccC2TuDO.o(.Hoge::gnu.linkonce.t.(void)+0x5): undefined reference to `Hoge::x' collect2: ld returned 1 exit status
#include <stdio.h> class Hoge { static int x; public: Hoge() { x = 0; } void SetHoge(int a) { x = a; } int GetHoge() { return x; } }; class Hoge2 { Hoge hoge; int y; public: Hoge2() { y = 0; } Hoge2(int b) { y = b; } void SetHoge2(int a) { y = a; } int GetHoge2() { return y; } }; main() { Hoge2 hoge2; printf("%d\n", hoge2.GetHoge2()); }
どこにもプログラムコードが無いんだが
すんまそ、勇み足ですた。
>>103 Hoge() { Hoge::x = 0; }
void SetHoge(int a) { Hoge::x = a; }
int GetHoge() { return Hoge::x; }
こうすればOK
>>104-106 もちつけ(;´Д`)とりあえずニラ茶でも飲んでだな・・・
>>103 Hoge クラスを宣言し終わった後らへんに
int Hoge::x = 0;
としてやるべし。静的メンバは,クラスの外のどこかで
実体とでも言うべきモノを定義してやる必要がある。
>>102 ヌヒよ、それはコンパイル時のエラーちゃうやん。コンパイルは通ってるやん。
どもです。
>>104 さん
そのようにやってみた所、やはり同様のエラーがでてしまいますた。(;;)
>>107 さん
確かに外側で初期化したら通りました!ありがとうございました。
しかし何故外で再?定義してやらないといけないのか今一分かりません。
>>108 正確でなく、すみません。リンカーの方ですた。
>>109 クラス定義の中に書いてるのは変数の定義じゃなくてただの宣言。
これがもし定義だったらどうなるか考えてみれ。
軒並みシンボルの重複でリンクエラーになるぞ。
112 :
デフォルトの名無しさん :03/07/11 10:06
VC++ .NET + DirectXの質問ですが、適切なスレが無さそうなのでここで質問させて頂きます。 VC++ .NETでDirectX 9.0 SDKについていたサンプルプログラムをビルドしようとしているのですが DirectPlayを使用するプログラムはビルドすることが出来ません。 その際表示されるエラーメッセージが 「ChatPeer fatal error LNK1181: 入力ファイル 'dplay.lib' を開けません。」 というようなものです。 VC++ .NETの方ではインクルードファイル、ライブラリファイルともパスは通してあります。 ただパスを通したディレクトリに 'dplay.lib' ファイルはやはり無いんですよね。 'dplayx.lib' とは全く別物のようですし。 どなたか分かる方がいましたらよろしくお願いします。
> 適切なスレが無さそうなので ハァ?
無くてもリンクできる。以上。
>>114 しかし実際エラーが出てしまいます。
IDEのバージョンを一応記載しておきます。
VC++ .NET Standard 2003です。
削れといっている。以上。
いいよもう、すれ違いなんだから、無視しようよ。
もしかしてやり方がまずいのでしょうか。
IDE起動後、
ファイル→
開く→
プロジェクト→
(例えばaddressoverride.vcprojを選択後)開く
その後
ビルド→
ソリューションのビルド
ここでコンパイルエラーになります。
>>116 もう少し詳しく言ってくださるとありがたいです。
厚顔無恥とはよくいったもんだ( ´∀`)
>>120 こんなスレがあったのですね。誘導ありがとうございます。
どうもご迷惑をおかけしました。
>>100 #define MAX_FACTORY_SIZE 100
#define MACRO01(dummy,i,arg2) case i:return new TypeAtNonStrict<ClassList,i,AbortType>::Result;
//template <int i>struct int2int{
// enum{value=i};
//};
class Factory{
public:
Base * Create(int ID){
switch(ID){
BOOST_PP_REPEAT(MAX_FACTORY_SIZE,MACRO01,arg2_dummy)
//BOOST_PP_REPEAT(int2int<100>::value,MACRO01,arg2_dummy)
}
abort();
};
};
さらに手を加えればより使いやすくなるだろうけど
ただ、Factoryのサイズをdefineで定義しないといけないけど。
PP最高!!!
125 :
デフォルトの名無しさん :03/07/12 20:47
Cを勉強せずにC++をマスターすることは可能ですか?
>>125 マスターすることは不可能。
でも使うことはできる。
127 :
デフォルトの名無しさん :03/07/12 21:05
完璧なマスターは不可能だけど C++でプログラムを組むことは可能ということですね? ありがとうございました。 がんばります。
結果的にC++を熟知する頃にはCをかなり深く理解しているだろうね。 CとC"++"だけあって、C++の勉強が、そのままCの勉強ことであったりするだろうし。 個人的には、Cをある程度かじってからのほうが近道のように感じる。
C++は初心者が引っかかりそうな事項が多いからなぁ
でも一方で、初心者が引っかかりそうなポインタなんかを後回しに勉強出来る から良いって見方もあったりもするわけで。
参照は便利だよなぁ。
参照とポインタの違いは?
>>132 知らないのか?
納豆にネギを刻むと美味いんだ。
山椒とボニータの違いは??
梅干も食わねえとな
関数ポインタを参照(゚д゚)ウマー
土用丑の日に鰻なんて、 平賀源内の思惑に乗っちゃだめだ!
139 :
デフォルトの名無しさん :03/07/13 02:00
int main() { int *p; int a=100; p=&a; func(p); return 0; } void func( int &aaa ) { cout << aaa << endl; } error C2664: 'func' : 1 番目の引数を 'int *' から 'int &' に変換できません。 参照にポインタを渡す方法はありますか?
func(*p);
>>140 あ、うまくいきましたー。
あれー?
さっき同じ事やった時はコンパイラとおらなかったんだが
勘違いだったかな
ありがとうございました
class Test{ public: //... Test & operator=(int arg){ //... return *this; } }; まあこれも同じことで。
winsock2 を使っているのですが struct Request { int v; char *n; char *a; } req = {1,"sample","sample"}; という構造体を送信データバッファとして send(s, (char*)&req,sizeof(Request), 0); と書いて送信するのは正しいでしょうか?
>>143 ポインタを送信しても意味が無いと思われ。
>>144 スレッド間通信に使ってるのかもしれないじゃん(和良
'あ' みたいな2バイト長の文字定数って、やっぱり、標準ではみとめられて ないのかな? 実際には(警告はでるけど)たいていのコンパイラで使える みたいだけど。これを使って、 // 文字列コンバータのファンクタ template<int C> struct Converter { string operator()( const char* s ); }; // ソースがEUCで書かれている場合 template<> struct Converter<0xa4a2> { // 0xa4a2 == EUC('あ') string operator()( const char* s ); }; // このソースの文字コード用のコンバータ typedef Converter<(unsigned short)'あ'> ConverterT; int main() { string s = ConverterT()( "あいうえお" ); } みたいなことをやりたいんだけど…
148 :
デフォルトの名無しさん :03/07/13 16:03
visual studio 2003は C++の例外指定に対応した?
149 :
デフォルトの名無しさん :03/07/13 16:07
ANSI C++ 規格と ISO C++ 規格はなにが違うの?
>>148 どういうこと?
例外指定ってexception-specificaation?
void hoge() throw(std::runtime_error) {...}とかこういうやつ?
記述はVC6の頃から通ったと思うが。
記述されていない例外を投げるとunexpected()が呼ばれる動作とか
してなかったんだっけ?
151 :
デフォルトの名無しさん :03/07/13 16:12
windows環境での最強のC++コンパイラは 実質 VS .net 2003に付属する コンパイラってことになっちまった?
>>151 exportは無いけど、総合的にはそうなってしまったようだ
153 :
デフォルトの名無しさん :03/07/13 16:14
>>150 いや、warningだよ。
文法的に解釈はしてくれてるようだけど、
実装はされていないよ。
throw(type) The function can throw an exception of type type. However, in Visual C++ .NET, this is equivalent to throw(...). まだ対応してない模様
VS.NET 2003のmsdn library見ると: Function exception specifiers other than throw() are parsed but not used. For example: void f() throw(int); // parsed but not used void g() throw(); // parsed and used For more information on exception specifications, see Exception Specifications. ほんとだ。
>>149 昔は ANSI(アメリカ国内) だけでやってたのを ISO(国際) で標準化するようになったってだけ。
ISO/ANSI C++ とかいう言い方することもあるし。
>>147 > L'あ'
g++ 3.2.2 だと warning: character constant too long とかいわれますね。
それに、L をつけると元の EUCなりSJISなりではなくなってしまう気が。
160 :
デフォルトの名無しさん :03/07/14 00:22
柴田望洋の「プログラミング講義 C++」を買ってきました。 明日からちょっとづつ読むことにします。
161 :
デフォルトの名無しさん :03/07/14 00:27
望洋さんはいいよねー。 「Cのエキスパート」感があって、安心できる。 俺も奴の本で勉強した。
>>161 「望洋さん」と「奴」の組み合わせにワラタ
163 :
デフォルトの名無しさん :03/07/15 09:09
class A { public: virtual ~A(); int x; }; A a[2]; ↑という定義がある( A はPODではない)とき、↓の式の結果は定まりますか? reinterpret_cast<int*>(reinterpret_cast<char*>(&a[0].x) + sizeof(A)) == &a[1].x
>>163 定まる。
パディングとか考慮しても
sizeof (A) は a[0] と a[1] の距離と等しくなることが
確か保証されてた筈だから、
その要素間の距離も sizeof (A) で OK 。
int* → char* の変換でアドレスが変わるような特殊な環境でも
char* → int* の変換でちゃんと元に戻される...と思うので大丈夫。
こんな変な環境を使ってる人が今いるのかどうか知らんが。
1.8 -5- に、 "An object of POD type shall occupy contiguous bytes of storage." って書いてあるので、保証されてるのはPODだけだったりしませんか?
int*とchar*でポインタ表現が異なる環境でもreinterpret_castで問題はないのですか?
ポインタ表現が異なるの意味が分からんが、reinterpret_castはビット変化しないよ。
ポインタ表現 -> 内部表現 でした。つまりソース表記上では同じアドレスでもint*とchar*とで内部表現が異なる環境で reinterpret_castしても問題は起こり得ないのでしょうか?
> ソース表記上では同じアドレス やっぱり意味がわからん。
俺も分からん。
>>166 は「内部表現が異なる」の具体例を明示して説明すること。
ageとこう。
すまそ、寝ぼけてNULLポインタ周りの話(0の内部表現の話)とごっちゃになってます。頭冷やしてこよう。
その調子じゃNULLポインタ周りも理解して無さそうだな。
こういうことだろ char *pc = hogehoge; int *pi = reinterpret_cast<int *>(pc); if ( sizeof(char *)!=sizeof(int *) && memcmp( &pc, &pi, sizeof(char *) ) ) { piとpcは同じアドレスをさすが内部表現は違う }
すまん && -> ||
それを内部表現というのか
確認したいのですが
>>174 氏の例で、sizeof(char*)==sizeof(int*)を満たしているときは
memcmp(&pc,&pi,sizeof(char*))は常に0を返すと考えて良いのでしょうか。
あれ何か違うな。memcmp確認。
勘違いでした。 失礼。
>>165 これは、例えば int の 4 バイト(の環境として)が
連続する 4 つのバイトに確保される、ということでは?
○ xxxxooooxxxxxxxx
× xxxxooxxoxxxoxxx
で、規格見つけた。
5.3.3 -2- より抜粋
When applied to a class, the results is the number of bytes
in an object of that class including any padding
required for placing objects of that type in an array.
クラスに(sizeof を)適用した場合の結果は、
配列として配置した場合に要求されるあらゆるパディングを含めた、
そのクラスのオブジェクトのバイト数になる。
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
CTest test; test.method(); と書いても CTest pTest; pTest = new CTest(); pTest->method(); delete pTest; と書いても 結果おんなじですよね。 newする必要性を教えて下さい。
おお。 やっぱり、単純な奴は必要ないのですね。 newの 必要性があるのは、 どんな時でしょうか? 内部パラメータが大きい時とかですか? 結局確保するんだから、さいしょから CTest test;でも、 いいような気がするんですが。
>>184 そのオブジェクトを作る必要がそのときどきで異なるとき
>>184 > 内部パラメータが大きい時とかですか?
CTest test; とすると(普通は)スタックに確保され、
new CTest; とすると(普通は)ヒープに確保される。
(普通は)スタックは小さく、ヒープは潤沢なので、
確かに巨大なものを確保する時には new を使う。
今風に言えばフリーストアか? >ヒープ 律儀にフリーストアって言葉使ってる人いるけ?
テキストファイルをバッファに一度に読み込みたいのですがバッファのサイズはどうやって知るの? char filename[] = "\C\Hello.txt"; std::ifstream f(filnename,std::in); char* buf = new char[?]; int readsize = f.readsome(buf,?); buf[?] = \0; というのを考えたんですけどサイズ(?)はどうやって知るの? Win32APIにファイルサイズ知るのがあるらしいけどファイルハンドルとか要求してきてよくわかりません。 なんか良い方法ありませんか?
>>188 最後に seekg して tellg 。
>>188 std::stringとか使えば?
#include <iostream>
#include <fstream>
#include <string>
#include <boost/lexical_cast.hpp>
main(){
std::ifstream ifs("Hello.txt");
std::string s=boost::lexical_cast<std::string>(ifs.rdbuf());
std::cout << s;
}
191 :
デフォルトの名無しさん :03/07/15 18:11
>188 ファイルのサイズじゃなくて、バッファのサイズ? ヘッダに書かれていると思う。
>>189 >>190 >>191 みなさん、どうも有り難うございます。
>>189 なるほど、そうやればいいんですね。感謝。
>>190 すいません。boostライブラリはまだ自分にはちょっと無理なようです。
>>191 ファイルの内容を全部読み込みたいんです。
テキストファイルの場合は\nが2文字から1文字になる?とかあるとか読んだので
確かにファイルサイズじゃなくて全部読み込めるだけのバッファのサイズのほうが無駄がないのかな?
でもちょっとだけ大きくてもいいのでファイルサイズでもいいけど。
あとヘッダてファイルのヘッダという意味?ただのテキストファイルにもあるの?
それとも違うヘッダのことかな。
バッファとは、「需要側と供給側の間に挟まって、緩衝の役目を果たすもの」を 指します。よって、「バッファのサイズ」とは、「緩衝用途に幾らメモリが割り当て られているか」であり、「(iostreamの)バッファサイズ」なら、iostreamヘッダを 調べれば判る、という話でしょう。
>>192 std::ifstream ifs("Hello.txt");
std::ostringstream ost << ifs.rdbuf());
std::string s=ost.str()
std::cout << s;
>>188 std::inじゃなくてstd::ios::inだった。
普通こうする #include <iterator> #include <fstream> int main(int,char **av) { ifstream in(av[1]); string s((istreambuf_iterator<char>(in)), istreambuf_iterator<char>() ); cout<<s; }
>>196 ヌヒよ。そのコードは想像を絶するほど遅いぞ。
>>191 >>193 すいませんでした。自分の言葉遣いがおかしかったですね。
特にC++の場合はバッファといえばストリームクラスが使ってるバッファのクラスになりますよね。
readやreadsomeの第2引数で指定する、ファイルのデータを読み込んで書き込む領域のこととして誤って使ってました。
>>194 >>196 charの配列に読み込むよりこっちの方がC++らしいですね。
参考にさせていただきます。ありがとうございました。
>>197 想像を絶する遅さってどのくらいよ。
そんな低スペックな処理系でC++でプログラム組むんじゃねーよ。
それに、そんなBIGなファイルを一気に読みこもーなんて、ふつう、しないよ。
C/C++でパフォーマンスを否定しちゃいかんよ
>>197 istream_iteratorじゃなくてistreambuf_iteratorだぞ。
>>200 最近はそーでもない。
と思ったが C/C++ ですか…。
俺は C++ で飯食ってますが、 C/C++ なんて言語の事は知らないしな。
とりあえず C++ は「ここは可読性低くていいからとにかく速く」と
「ここはメンテしやすくいこうっと」の使い分けが大事な言語だと思った。
逆にいえばその使い分けができる言語だと思った。
そして求人広告によく載っている C/C++ ってどんな言語なんだろうと思った。
>>180 > 配列として配置した場合に要求される
こういう限定があるってことは、
非PODオブジェクトのメンバが、配列として配置したバイト列内に
存在する保証はないということになりませんか?
>>201 freadでのsetvbufに相当するのはistreambuf_iteratorではどうやればいいの?
>>204 streambufのpubsetbufでする。
実際windows環境じゃ役にたたない罠。
>>203 んー。言ってる意味がよく分からん。
例えば
struct AB {
int a;
short b;
};
とした時、単独では別に b の後のパディングは必要ないかもしれない。
AB ab;
short c;
としたときに、ab.b と c がくっついてても問題なさそうに見える。
でも、配列にしたとき int, short, int, short となるから、
5.3.3 -2- の仕様から AB::b の後にはパディングが入る
(パディングの入れ方は環境依存だけど、こうなることが多い)。
sizeof (AB) が 8(の環境とする)になるわけだから、
単独で確保してもやっぱり 8 バイトじゃなくちゃまずいということになる。
だから、AB ab; short c; でもパディングは入るし、
そのパディングのサイズは AB のサイズの中に織り込み済みである。
と、そういうことを表した仕様だと思われ。
>>208 メモリレイアウトについての規格が軒並みPOD型についてに限定してあったりするので、
非POD型については、メンバごとに全然違うメモリ領域に配置するような実装を
許そうとしているような気配を感じたのです。
(そのような実装が有利になるような環境は、現状では存在しないとは思います。)
おまいらよ。どれくらい想像を絶するかおまいらにも体験してもらおうと思って 実際にプログラムを書いてみたよ。Windows専用ですまんよ。 適当なfileという名前のファイルを用意してくれよ。 //前半 #include <windows.h> #pragma comment(lib,"winmm.lib") class Timer{ public: Timer(){ start(); } void start(){ prev_time_=timeGetTime(); } unsigned long get() const{ return timeGetTime()-prev_time_; } private: unsigned long prev_time_; };
//後半 #include <iterator> #include <fstream> #include <iostream> using namespace std; int main(){ { Timer t; ifstream in("file",ios_base::binary); char buf[10000]; string s; while(in){ in.read(buf,10000); s.append(buf,buf+in.gcount()); } cout<<t.get()<<endl; } { Timer t; ifstream in("c",ios_base::binary); string s(istreambuf_iterator<char>(in),istreambuf_iterator<char>() ); cout<<t.get()<<endl; } }
おまいら二つ目のifstreamに渡すファイル名を変え忘れたよ。 "c"から"file"に替えてくれよ
>>209 確か POD 型のメモリレイアウトは宣言順+パディング可だったはずです。
他にも仮想関数テーブルやら継承した場合やら色々仕様はあると思いますが、
基本的にはそんなもんかと。
1.8 -5- で POD 型を含めていないのは POD 型はパディング可だということを
言いたいのだと思います。
でも、パディング込みで考えれば連続領域(別の変数が割り込まない)で、
そのサイズは sizeof で得られる、
というようなことは、多分仕様に書いてあると思います(まだ調べてませんが)。
POD 型と非 POD 型を逆に書いてしもた。すまん。 たまにしか使わない用語なので。
ちなみにおれの環境では約300kbのファイルを読むのに
おれバージョンだと108ミリ秒
>>196 バージョンだと23694ミリ秒かかるよ
300kbをBigなファイルだといったり
230倍の差を気にしないとかいうならもうプログラマやめたほうがよいよ。
おまいらよ、わざわざコードまで書いてやったのに反応がまったく無いとさみしいよ。
名前が悪いと思われ
>>217 うん、うん、沢山だもんね
もう、君のネタは、沢山だよ
荒らしは完全放置
220 :
デフォルトの名無しさん :03/07/16 12:00
沢山の話し方は煽りが入っていて気に入らないが、同意せざるを得ないな。
セレロン2GHで3MBくらいのファイルをよみこんでみたら
vc6 stlport使用
リリース mt
沢山バージョンだと46ミリ秒
>>196 バージョンだと110ミリ秒かかるよ
デバッグ mt
沢山バージョンだと203ミリ秒
>>196 バージョンだと27820ミリ秒かかるよ
12MBだと
リリース mt
沢山バージョンだと203ミリ秒
>>196 バージョンだと453秒かかるよ
> デバッグ mt
>
>>196 バージョンだと27820ミリ秒かかるよ
2782ミリ秒の間違いです。
ちなみに最速はmemory mapped fileで、ファイルサイズ以上のバッファを 確保して一気に読み込みがほぼそれに近い時間で終わる。 以下、ループ実行回数に比例して実行時間が長くなり、1byteのバッファでの 読み込みとistreambuf_iteratorがほぼ同等。
おまいらよ。どうや最適化オプションを忘れてたようだよ。 正直すまんかったよ。
おまいらよ、恥かいたのでこの名前も捨てようとおもうよ。短い間だったけどありがとうよ。
と、書いたけど、もう一度ちゃんと確かめた結果は
おれバージョンは110ミリ秒
>>196 バージョンは23655ミリ秒
なんでだよ?VC7に標準で付いてるSTLは死ぬほど遅いのかよ?
227 :
デフォルトの名無しさん :03/07/16 22:22
とりあえずC#相談室よりは上にいてほしいので age
バカじゃねーの…
age
バカだなバカ
234 :
ゼーレ01 :03/07/16 22:37
IPの隠し方知ってますか?パス抜きされて困ってます。 誰か助けてください!!お願いします
236 :
デフォルトの名無しさん :03/07/16 22:39
クソスレ上げんな
すれたいがにていてまぎらわしい
>>237 ここにも顔つければいいんだよ。
c(+_+)とか。
>>233 何のために釣っているんだよ。
なにも内容が無い釣りは
何かに反応したとしか思えないぞ(w
v(・∀-)b
こうして又一人C++盲信者が潰されましたとさ。
c(P_P)
>>239 釣れればなんでもいいし
今回は「age」って書けば十分釣れると思った・・・悪かったよ
C(+ω+`)
(c +_+) < cの部分は耳だよ
(c +_+)
(c +∀+)アーヒャヒャヒャ
ends<<endl;
1000/4
perlとかのsplitみたいにstringを複数のstringに分割する関数はないですか?
>>251 boost::tokenizerがいいと思う。
#include <boost/tokenizer.hpp>だけで使えるし
>>252 > #include <boost/tokenizer.hpp>だけで使えるし
だと良いね
>> #include <boost/tokenizer.hpp>だけで使えるし >だと良いね 良いよぉ。まさかお前C++を使っていてboostを 構築はともかくインストールしていない訳じゃああるまい
その言い訳は苦しい
まあインストールしていないのは英語が分からない奴くらいだろうな
言えば言うほど見苦しい
259 :
デフォルトの名無しさん :03/07/18 18:49
芳ばしい臭いがするので、ちょっと晒し上げておこう
むしろラインセンス
ちょっと指摘されただけで英語云々持ち出さんでも・・・ 「boostにはこんなのあるよ」の一言を忘れただけなんだから次回から気をつければいいだけだろ・・・
>>262 なんだお前は英語が読めないのか?
>「boostにはこんなのあるよ」
そう言う内容なのは明らかだろ。お前は読解力ゼロ
boostつかうと保守に問題が出るよな。
英語厨のおでましか
>>263 読解力無いのはオメーだろ。
内容が明らかなのとboostがインストール済みかどうかはまったく別問題だ。
boostにケチはつけんが、boostスレじゃない場所でboostがインストール済みであることを前提に話す奴は逝ってよい。
相手は初心者かもしれん。
268 :
デフォルトの名無しさん :03/07/18 19:05
必死なのがいるなぁ。俺も晒し上げておこう。上から2スレ目だけど。
まぁ煽り文句で「英語が読めないのか」は王道だよな
どっかの会社が、boostを商用ライブラリとして出してくれないかなぁ
つーか、boostのライセンスのどこが問題なんでしょう? regex使ったら、使ったこと書いてね!! 以外になんか不満あるようなもんあるんでしょうか?
完全にboostスレ向きの質問だと思うが
そしてboostスレでもライセンスの話題は何度か出ている。
275 :
デフォルトの名無しさん :03/07/18 23:35
stringstream の中身をクリアするにはどうしたらいいんですか? clear()を呼んでも残っているみたいなんですが。
>>275 たぶんそれは、basic_ios::clear()を呼んでいる。
中身をクリアするってのはないけど、
str(string const&)で文字列を割り当てることができるので、
空の文字列を割り当てればよい。つまり
str(string());
>>275 eraseしろ!!
>>273 boostスレではライセンスに(商用でも)問題ない(らしい)という結果だったはず。
でも、問題があるよといわれれば、どこが問題なのかやはり気になるもんでね。
>>278 大変ありがたいのだが、すでにそのページは拝見しております。
私が気になるのは、問題があるという人は何をもってしてそう判断したのか?ということです。
新しい発見(?)したとか。何かの特許に抵触したとか・・・。
C++自体の質問なのでスレ違いかもしれませんが、よろしければご教授ください。 A.cppというファイルからB.hとC.hをIncludeして使おうと思っています。 C.hではクラスの宣言をしています。 そして、A.cppではそのインスタンスを作成しています。 しかし、B.hで作成したインスタンスのメンバーを読み込もうとすると、 コンパイル時に、そのインスタンスが『未定義』とされエラーがでてしまいます。 その後、A.cppでインスタンスを作成する場所でも『再定義』というエラーがでるので、 きっと、宣言の順番の問題なんだろうと思うのですが、何かよい解決策はないでしょうか。 わかりにくい文章ですみませんが、よろしくおねがいします。
すみません。 最初にこのスレを見つけられずに、他のスレッドに書き込もうとしていたので、 その時書いた文章の残骸が残ってしまいました。 スレ違い云々は気にしないでください。 申し訳ありませんでした。
いつもいつも思うんだが 質問したいならageろ! よろしくお願いしたいならageろ! あほか。なにがメール欄に「sage」だよ。 きどってんじゃねーよ。
B.h には何が書いてあるの?
癖でsageちゃうことはよくあるよね。
yes
いつもいつも思うんだが スレ違いの事を書き込むならsageろ! 晒し上げじゃないならsageろ! あほか。なにがメール欄に「nuge」だよ。 荒らしてんじゃねーよ。
代わりに上げてやってるんじゃないか。 しかもアドバイスしてさ。 親切じゃない。
余計な御世話じゃないの? 漏れなら、アドバイスだけして、本人に揚げさせる
まぁ、こういうどうでもいいレスで
ちゃんとしたレスを埋もれさせるのが一番不本意なので、
ちゃんとしたレスにアンカーを貼っておこう。
質問
>>281 レス
>>284
余計な御世話
292 :
デフォルトの名無しさん :03/07/19 11:49
クラス内で定義されている名前を クラス外で::なしで使うにはどうすればよいですか? class A { public: typedef int type; static const size_t SIZE; }; みたいなときに A::type i; size_t n = A::SIZE; とかではなく type i; n = SIZE; とか書く方法はないでしょうか。 using A::type; とかはだめみたいです。
クラス外で定義しろ
>>292 出来るが、そんなことして欲しくないので教えない。
>>292 typedef A::type type;
const int SIZE=A::SIZE;
と事前に書いとく
>>295 いじわるしないでぇ
そんなことして欲しくない理由と共に教えてください。
ちっちゃな翻訳単位ローカルに使うんだったら
そんなに悪くないとおもうんですが。
298 :
デフォルトの名無しさん :03/07/19 12:02
何のためにそんな事するのか小1時間・・・
>>296 なるほど。っていうかそんなことも思いつかん褐炭か>俺
ありがとうございます。
やるのかよ。 いや、別にいいけどさぁ・・
いやぁん♥ 冷たくしないでぇ
(c +_+) なんだかなあ……
はじめて自分の偽者とであいました。
こんにちは
>>301
>>281 です。
>>284 わかりにくくてすみません。
B.hでは別のクラスが宣言されています。
簡単に書くと、こんな感じです。
[B.h]
class CHuman
{
int Speed;
void SetSpeed(void) { Speed = Ball.Spin; } ●1
};
-------------------
[C.h]
class CBall
{
int Spin;
};
-------------------
[A.cpp]
#include "B.h"
#include "C.h"
CHuman tanaka;
CBall Ball; ●2
main()
{ tanaka.SetSpeed(); }
●1が、未定義のエラーが出るところ、●2が再定義のエラーが出るところで、
それぞれの変数はpublicで宣言されていて、コンストラクタで数値が代入されていると考えてください。
たびたびの長文すみませんが、よろしくおねがいします。
そりゃ出るわな
>>281 ポインタで宣言してコンストラクタで new すれば?
>>304 B.hで
#include "C.h"
extern CBall Ball;
とするか、SetSpeed の実装をcppに分ける。
印来るドのジュンバン #include "C.h" #include "B.h" CBall Ball; はいらない。 と思う漏れは実はC++なんてよく知らないのだが(w
309 :
デフォルトの名無しさん :03/07/19 13:21
継承したクラスのコンストラクタについての質問です。 CParentと、それを継承したCInheritedがあります。 CInheritedのコンストラクタで、 1. CInherited::CInherited():CParent(){ } 2. CInherited::CInherited(){ CParent::CParent(); } は何が違うのでしょうか。
>>304 #include "C.h"
CBall Ball;
#include "B.h"
CHuman tanaka;
こんなかんじにしたら
>>281 もしやとは思うが、
ヘッダを
#ifndef HOGE
#define HOGE
//ここに本文
#endif
でくくる方法は知ってるよな?
プリプロセッサで再定義を防げばインクルードの順番なんて関係ないはずだぞ。
>>312 すみません、知りませんでした。
調べてみる事にします。
結局
>>307 のやり方でやってみたら、なんとかできました。
こたえてくださったみなさん、ありがとうございました。
>>309 struct A{
A(){
std::cout<<this<<" A"<<std::endl;
}
};
struct B : public A{
B():A(){
std::cout<<this<<" B"<<std::endl;
}
};
/*
struct B : public A{
B(){
A::A();
std::cout<<this<<" B"<<std::endl;
}
};*/
Bの定義を入れ替えて実行結果を見てみろ。
>>311 はアホ
CParent::CParent(); は一時オブジェクトってこった。
標準C++ではコンストラクタには名前がないから CParent::CParent()などとして呼ぶことはできない
map<int,int> hoge; return hoge[0]; とかやったら、intにコンストラクタはないから返り値は未定ですよね。 int型とかにコンストラクタをつけたい場合は新しくクラスを作るしかないですか?
>>318 intはデフォルト初期化で0になるので返値は0です。
320 :
デフォルトの名無しさん :03/07/19 17:12
template<typename Iter> class Value_iter : public Iter { public: Value_iter(const Iter &it): Iter(it){} typedef typename Iter::value_type::second_type value_type; value_type operator*() { return Iter::operator*().second; } value_type operator->() { return Iter::operator->().second; } }; こういう感じで、一部の関数を上書きするために公開継承を使っても問題はないでしょうか。 std::map<A,B>::iterator 辺りを渡されることを期待するテンプレートです。
考えてみれば operator-> は要らなかった…
>>318 int n = int(); // デフォルトコンストラクタ
// 0で初期化
assert(n == 0);
>>320 ほとんどの場合、問題「ある」。例えばその例なら、
Value_iter<map<key,val>::iterator> i;
val x = *i++; // error
>>323 ああ、なるほど。理解しました。有難うございました。
325 :
デフォルトの名無しさん :03/07/19 19:17
クラスメンバのconstな関数ポインタ変数って初期化できんのー? class CMoe { const void (*pFunc)(); public: CMoe(void (*func)()): pFunc(func) // だめぽ { } };
void (* const pFunc)(); だろ
const void型って何だ(笑)
>>323 何ゆえ *i++ ←(increment operator)関数どこ?
>>320 意味ない。何のためのiteratorがあるのかわかる?
>>327 const void はそのままじゃんか。何か?
>>328 キミ、会話の意味がわかってないなら黙ってた方がいいと思うよ。
>>325 #include <iostream>
using namespace std;
const void test(){
cout << "test" << endl;
}
class CMoe{
protected:
const void (*pFunc)();
public:
CMoe(const void (*func)());
void Do();
};
CMoe::CMoe(const void (*func)()){
pFunc = func;
}
void CMoe::Do(){
(*pFunc)();
}
int main(){
CMoe moe(test);
moe.Do();
return 0;
}
>>326 なーる。サンクス!
スマソ、も1つ。
class CHoe {
// うにょにょ〜(operator=なし)
};
int main() {
CHoe hoe;
vector<CHoe> Moe;
Moe[0] = hoe; // CHoeにoperator=が定義されてない。
return 0;
}
ちゃんと定義しないとダメ?
>>325 そう、まさにそれがやりたかった。ありがと。
>>329 意味わかんないかな?
こんなのは使わんけど。
#include <iostream>
#include <map>
#include <string>
template<class T,class U>
struct TorU : std::map<T,U>::iterator
{
typedef typename std::map<T,U>::iterator base;
TorU(std::map<T,U>& m) : base(m.begin()){}
operator T(){ return base::operator ->()->first; }
operator U(){ return base::operator ->()->second; }
};
int main()
{
using namespace std;
map<int,string> cs;
cs.insert(pair<int,string>(0,"ring 0")) ;
cs.insert(pair<int,string>(1,"ring 1")) ;
TorU<int,string> tu(cs);
while(tu != cs.end()){
cout<<(int)tu<<' '<<(string)tu<<'\n';//castめんどくせー
++tu;//ここがポイントなのよ
}
}
沈黙・・・・・・
なんだconstのほうかよ これで納得いかないか? #include <iostream> template<class T> struct Imitation; template<> struct Imitation<void> { static void fun(){ std::cout<<"Variant"<<std::endl; } }; template<> struct Imitation<const void> { static void fun(){ std::cout<<"Constant"<<std::endl; } }; int main() { Imitation<const void>::fun(); Imitation<void>::fun(); }
おおっと
>>320 よみなおしたら意味違ったすまん。
ごめ。 単にCHoeのメンバがconstだったり参照だったりしてただけだった。 代入演算子が生成されないんだね。
343 :
デフォルトの名無しさん :03/07/20 15:29
template <class T> void foo(T){} template <class T> struct bar{}; template <class T> void foo(bar<T>){} int main(){ bar<int> b; foo(b); } 以上のプログラムがコンパイル通りません。 そこで以下のようにしたら無事とおりました。下のプログラムはC++的に正しいですか? template <class T> void foo(T){} template <class T> struct bar{ friend void foo(bar<T>){} }; int main(){ bar<int> b; foo(b); }
344 :
デフォルトの名無しさん :03/07/20 15:31
うわー、びっくりした。
345 :
デフォルトの名無しさん :03/07/20 15:34
static 変数をメンバに持つクラスから、幾つかのクラスを派生させ、 それぞれの派生クラスのインスタンスを作った場合、 ベースクラスから継承した一つの static 変数をそれらで共有することになりますか? 厨でスマソ。
>>347 VC7では通らなかったのですが、、、
上の例は関数の部分的特殊化に当たるから不可、なのではないのですか?
>>346 つまらない質問に付き合って下さって、ありがとうございます。
>>348 ISOのドキュメントによると関数テンプレートのオーバーロードに相当して
より特殊化したものが選ばれる。事になっていて問題ないようだけど…
より詳しい人よろしく
>>348 関数があいまいてVC7(VC6も?)はエラーがでるから
おしえてあげればいいのでは?
foo<int>(b);
しってたらごめん。
>>350 なるほど thx!
ってことはVC7はそこラ変がまだまだだったってことでしょうか
>>351 明示的に指定せずに上手くいく方法を探してます。すいません。
void func()関数で宣言したclassHogeクラスのオブジェクトcHogeを グローバル変数に渡したいのですが、どのようにすればよいのでしょうか? (ローカル変数のスコープをグローバルに変換したい) 自分がやってみたのは以下のとおりです。 おかしな点があったらご指摘頂けないでしょうか。 // グローバル classHoge* global_ptr_cHoge; // void func() { classHoge cHoge; // オブジェクト作成 global_ptr_cHoge = &cHoge; // オブジェクトのアドレスをグローバルに格納 test(global_ptr_cHoge); // テスト用関数 } void test(classHoge* ptr_cHoge) { ptr_cHoge->Method(); ... }
>>353 funcを抜けてからアクセスしなければ大丈夫
>>353 > ローカル変数のスコープをグローバルに変換したい
ここがおかしい。
>>353 諦めてグローバルにインスタンス置いと毛
>>355 func外からも使いたかったんですが、
funcを抜けるとやっぱりまずいですよね・・・
>>356 う、確かに・・・
>>357 はい、そうしときます。
変な質問してしまいすみませんでした。
みんなちゃんと理由を説明してやれよ。かわいそうに。
>>353 func を抜けたら func の auto 変数の cHoge は destruct されるから
それ以降に触るのは危険。
というか cHoge を func 内の static にしておけばいいんだけど
それだとやりたい事と意味があっているかどうかはわからん。
>>359 かわいそうも何も明らかに普通でない質問だろう。
「変な質問」と自覚していて、それでもやりたいというならば、
それこそその理由を述べるべきだ。
// void func() { global_ptr_cHoge = new classHoge; // オブジェクトのアドレスをグローバルに格納 test(global_ptr_cHoge); // テスト用関数 }
template <class T> struct bar; classと指定してるとvc6だと組み込み型の宣言ができない。 組み込み型も宣言したいときはtypenameで指定すればよかったと思われ。 template < typename T> struct bar; もう解決してるかね?
上のレスは
>>343 へのレスですー。
2重カキコすまそ。
364 :
デフォルトの名無しさん :03/07/21 15:27
using namespace std; とネームスペースを一括?指定するのはよくないことなの?
>>364 俺は .cpp でやるんなら別にいいと思うが、
.h でやるのはお行儀悪いと思う派。
そのことで前揉めてたな モミモミ
>>367 名前のバッティングを防ぐためにわざわざnamespaceに入れたのに、それをあえて同じ名前空間にインポートして無意味にしてしまうusingを、複数のソースファイルで共有されうるヘッダーファイルで使うのは問題だろ?
369 :
デフォルトの名無しさん :03/07/21 16:10
そういう理由なら.cppでやるのも同じように問題な気もするが・・・ (複数のソースファイルから共有されるという点は別だけど)
>>369 >複数のソースファイルから共有されるという点は別だけど
これは重要な違いだと思うがね。
まぁ、それでも using が嫌いという人がいるのも分かるし、
usign 使わないのを止(と)めようとは思わんが。
>>369 > (複数のソースファイルから共有されるという点は別だけど)
大きなポイントじゃないすか? 衝突の可能性を広い範囲に作っちゃうのは
やっぱ怖いというか、安心できないですよ。
自分(cppファイル)の中だけで「曖昧だ」とかコンパイラに怒られるだけなら
屁でもないですから。
些細なことかもしれないけど、この程度のことで未来に何かを課したくはないです、俺は。
using 論争ですが、 ヘッダファイルは公共の場所、 実装ファイルは家の中などのプライベートな場所、 っていう雰囲気があると思う。 家の中で素っ裸になるのは個人の自由だけど、 表でやったらタイーホの予感。 実装で using を使って怠けるのは自由だけど ヘッダで using を使うのは(明日の自分も含めた)他人への迷惑をかえりみない行為。
かわいいおにゃにょこの裸ならお外でも・・・・・ハァハァ
>>373 つまりそれは std と boost だけはヘッダで using してもいいという事ですか?
>>375 いや、「わたしかわいいおにゃにょこだからだいじょうぶね♪」といって
ネカマデブ、ババア、破壊的ブスどもが裸で街を跳梁跋扈する闇の時代がくるという予言です。
>破壊的ブス ワラタ
あ、
>>369 の言いたいことが分かった。
普段
#include "hoge.cpp"
とかやってるだろ?1から勉強し直した方がいいぞ。
久しぶりだな、半角?くん。
>>380 久しぶりだな、半角?くんを半角?くんと呼ぶお前。
つーか半角で?を打つ奴が一人しか居ないと考え
決め付けるお前の浅はかさには閉口してしまうよ?
ヴァカが紛れ込んできたようですね
どうでもいいけどどこに半角?があるんだ?誤爆?
天然?
>>364 スコープ内でusing使ってください。
あと名前のバッティングなんて別に怖いもんでないような?
エラーが出たら一括に名前付けて置換すりゃーいいんだし。
??????????
>>386 シグネチャがほとんど同じだどエラーが出なくて通ってしまい、
挙動のおかしさ悩むこともある
かなりお馬鹿な質問ですが、 C++で作った関数をC言語プログラムに組み込む方法はないでしょうか?
絵x手rん ”C"
>>390 #if cplusuplus
extern "C"
{
#endif
void MyCPlusPlusFunc(void);
#if cplusuplus
}
#endif
どぞー
マングリ返し
>>392 __cplusplus をデフォルトでサポートしてくれているコンパイラが殆どなので、
__cplusplus と書いておいた方が楽っぽ。
あと、#ifdef な。
>>394 __cplusplusは規格で必要とされている。
>>395 あ、ホンマや。
昔は規格外だったと思ったけど。
199711L で定義されてるってことは、
1997 年 11 月の規格で導入されたんだろうな。
C++ のソースファイルの拡張子が .cpp とか .cxx とか色々ある歴史的理由を教えて下さい。
#ifdef じゃあ C で #define __cplusplus (0) と定義されたらやヴぁくない?
>>398 #define __cplusplus (1)
と定義され(ry
#ifdef じゃあ エラー
#if __cplusplus #endif でできました。ありがとうございます。
402 :
デフォルトの名無しさん :03/07/22 13:44
普段Javaですが、都合でC++初めて使っているのですがかなり参ってます。 例えばデストラクタの使用で、 ... Test::~Test(){ printf("%d",0); } ... Test *t; t = new Test(); for(int i=0;i<100;i++) delete(t); これで0が100回出力されてしまうのが謎です。 tが指しているオブジェクトは1回deleteを行った時点で 破棄されているはずじゃないのでしょうか? どうして100回デストラクタが働くのでしょう?
C++では、ポインタの指しているオブジェクトの生き死にには、 自分で責任を持たないといけない。以上
クソ言語だな。おい。
( ´,_ゝ`) プッ
boost::shared_ptrとかstd::auto_ptrとかあるからその辺使えばdeleteのタイミングをあまり気にする必要なし。 例外対策にはほぼ確実に必要だし。
>>404 ,407
えーと、つまり
こんなふうにdelete100回書いちゃっても問題ないのでしょうか?
それともこの場合たまたま0が100回出力されただけで
2回目以降は偶然って考えのほうがよいでしょうか?
うーん、Javaよりむずい。
>>408 > こんなふうにdelete100回書いちゃっても問題ないのでしょうか?
大問題。
同じポインタを複数回deleteした場合、どうなっても知らない。ただそれだけだ。 それがいやならdelete後に0でも代入しておくという手もないではないが、 複数回deleteが呼ばれうるという時点で設計が間違ってる。 メンバ変数に触らない非仮想のメンバ関数はthisの値がどうなっていてもエラー にならないことが多いから動いているように見えただけ。
デストラクタを呼ぶ部分はともかく、 メモリ解放処理がなぜエラーにならないか無気味だな。
template<typename T> inline void safe_delete(T*& ptr ){ delete ptr; ptr = 0; }
オブジェクトは1度目のdeleteで破棄された(無くなった) ↓ デストラクタも無くなった ↓ 無くなってるはずのデストラクタが呼ばれる ↓ なんで??? って疑問なんじゃないの?
>>413 デストラクタなんぞ、
メンバ変数(仮想関数テーブル含む)使わん限り
普通の関数と大して変わらんじゃんかよ。
>>413 そういうことです。
>>414 なるほどと思って
別の関数を作ってdeleteした後に呼んでみた、すなわち
for(int a=0;a<10;a++)
delete(t3);
printf("%d\n",t3->test2());
これでもエラー起きないんだね。
deleteってのは振る舞いを未定義にするだけで
解放するって認識はやめたほうがいいのかな・・・
>>415 違う
一度削除されたオブジェクトへのアクセスは未定義だから、
プログラムがクラッシュすることもあれば、
突然ディスプレイが火を噴くこともある。
アドレス帳の全メアドに添付ファイルつきメールを送りつけることもある。
もちろん一見うまく行っているように見えることもある。
複数回deleteした時の振る舞いが未定義なんじゃないの? 資源の解放という認識でいいと思うけど。
紛らわしくてスマン
「削除されたオブジェクトへのアクセス」は
>>417 の意味
正直、一見何事もないかのように見えるのが一番やっかい。
俺は同じメモリを100回deleteしてみる奴始めてみた。 動作を確認してみようという姿勢は悪くは無いが。
死体に鞭打つような真似はやめようよ...。> delete 100 回
100回加熱殺菌とか
ただ、deleteによって対象のポインタがNULLになると勘違いしてる奴は沢山いる。 こういう奴は「NULLをdeleteしても問題ないから」と考えるかもしれない。
たまたま開放したままで誰もヒープをいじってないから 残骸のアドレスは空き領域で、再度開放は単にこっそり失敗してるだけだろうな。 デストラクタ自体は単なる関数だからオブジェクトがいなくなっても消えないが。 ...もしデストラクタが仮想関数だと少し事情が違うかもしれないが これも呼び出し時点で対象オブジェクトのクラスが明らかな場合は 最適化で直接呼び出しになってるかもしれんか。
template<class T>void del(T *&p){delete p;p=0;return;}
426 :
デフォルトの名無しさん :03/07/22 18:20
メモリ管理嫌ならJava使え。
safe_deleteみたいに2回目以降も安全なのと、 2回目以降は例外投げてくれるのとどっちがいい? 前者の方が楽だけど、後者の方が鬱陶しい代わりに バグの温床を早めに発見できるので。
>>427 どっちも使わないのが良い。
ポインタなんて複数箇所から同じオブジェクトを指すんだから、一箇所だけ0クリアしたって焼け石に水。
でもそれをわかった上で使うなら前者がいいと思う。
複数回deleteするかもしれないからこそわざわざsafe_delete使うんだし、それがダメなら自分でチェックすれば良い。
早い話、生のポインタなんか使うなってこった
>>428 なるほど参考になります。
そうすると下手に自作するより、Boost等のスマートポインタが
うまくやってくれるのに任せるのも安全&&楽ちんで良いですね。
結局GCになるのか。
ループで集中してdeleteしてるから、無事に動いてるように見えるけど、 delete p; . ヒープを扱う処理 . delete p; みたいに、間をおいて実行すると、すごいことになる予感。
boost::shared_ptrみたいにすでにあるもの使うこともできるし。 機能に不満があったら自作することもできるし。 選択肢が多いのはいいことだと思う。
> 選択肢が多いのはいいことだと思う。 勉強用としてはね。 実用としては悪いことになりえる。
実用としては選択肢が少ない方が良いとでも? 馬鹿じゃねぇのか? お前はBASICでも使ってろ。選択肢少ないぞ
選択肢が多い方がいいのは応用の部分じゃねーかな。 基礎の部分で多いのは困るぜ。 たとえばライブラリごとに使ってるスマートポインタが違かったりする。 コンテナにしてもSTLがあるにもかかわらずATLやMFCは独自のコンテナを持ってる。
437 :
デフォルトの名無しさん :03/07/22 20:58
C++は設計からしておかしいからね。 クソと言われてもしかたないよ。
> コンテナにしてもSTLがあるにもかかわらずATLやMFCは独自のコンテナを持ってる。 ATLは言語に依存しないCOMのため。 MFCはSTLがVC++にまともに搭載される前からのもの。
>>435 少ない方がいいとはいわんが
必要ないものはいらん。
442 :
デフォルトの名無しさん :03/07/23 03:12
>>436 例えば文字列ですかね>応用
C由来 : char*, wchar_t*
C++由来 : std::string, std::wstring
SourcePro由来 : RWCString, RWWString
Xerces由来 : DOMString, XMLString
Xalan由来 : XalanDOMString
ICU由来 : UnicodeString
SGI由来 : std::rope
MFC由来 : CString
>>436 VCの不満はマイクロソフトに言え
C++に文句言うのはお門違いだ
(*hoge)->hoge_f って()で囲んで*つけると普通の構造体参照とどう異なるの?
>>444 hogeはstruct tag **hoge
ここまで言えば分かるでしょ。
(*hoge).hoge_f の間違いじゃないのか
>>444 ポインタのポインタを指す場合は()で囲んで*をつけるのですね@@;
ありがと
448 :
デフォルトの名無しさん :03/07/23 05:45
>>446 それならhoge->hoge_fとかくだろ
450 :
教えてください :03/07/23 13:27
VC++で、Waveでデータを波形にし、サンプリング周波数を出すプログラムはできたのですが、 波形の高い部分を見つけ、それをテキストに変換し保存するプログラムが分かりません。 どなたか、教えてくれませんでしょうか? 参考URLなどご存知でしたらお願いします。 せめて、WAVEデータをテキスト変換するプログラムを教えてください。 お願いします。
↓次の質問ドゾー
452 :
教えてください :03/07/23 13:33
煽ってないでお願いします。
↑次の質問キター
>>450 テキストに変換、の意味がわからん
音声認識じゃないだろうし
455 :
教えてください :03/07/23 15:11
音声認識ソフト作ってる会社に金払って教えてもらえ
音声認識ならMicrosoftのSpeechエンジンが無料で使えるぞ
458 :
デフォルトの名無しさん :03/07/24 00:09
void printf2(const char *str, ...) { printf(str, ...); } 可変個数で受け取った引数を、さらに別の関数の可変個数の引数として 渡すことってできますか? ↑のような感じに。
>>458 void myprintf( const char* str, va_list args ) { ... }
void printf2(const char *str, ...)
{
va_list args;
va_start( args, str );
myprintf(str, args);
va_end( args );
}
とかなんとか。標準(だったけ?)ライブラリにvprintf関数
ってのがあるから、そのソース見るとかすればわかると思う。
あー、つまりその、printf に対する vprintf みたいなのが用意されてれば、 そっちに va_list を渡せばいい。そういうのが用意されてないと、無理。
通常は反則技だが。 __declspec(naked) void printf2(const char* str, ...) { __asm { jmp printf } }
あれ(
>>163 )から幾度か規格を漁るうちに、また妙な記述を見つけました。
offsetof@cstddef が引数として受け取る型は、
POD structure か、 POD union だと規格に書かれていました。(18.1 -5-)
やっぱりC++の規格は、非POD型オブジェクトについて何か想像を絶するメモリレイアウトを受け入れる余地を
意図的に残しているのだろうか?誰か知らないですか?
if ( au & kddi ) の&ってどういう処理?
byってゆー処理
C++ 始めたばかりだけど、std::string spaces(10, ' '); って構文はどうなのよ? C では () が付くと関数というルールがあると思うけど、上のはどう解釈すれば良いのかな?
コンストラクタに引数を渡しているだけでは・・・
コンストラクタとクラス名は違っても良いんだ? なるほど。 コンストラクタが「インスタンス名()」って変なの。
>>465 ありがと^^
ちなみに sig = (num < 0)
はnumが0未満だったらsigに代入するって事?
もひとつ^^; ハイビットセット処理って何?
>>468 え??
std::string型のspacesを定義してコンストラクタには(10,' ')を渡すんだと思っていたけど違うの??
>472 下のコードの sharp(10, '#'); の部分ってどう理解したら良いのやら検討が付きません。 sharp は変数名なのに引き数を取っている? #include <iostream> #include <string> int main() std::string sharp(10, '#'); std::cout << sharp << std::endl; return 0; }
編集中に int main() の次の行の { が抜けてしまいました。
>>473 そういう仕様だからしかたないんだよね・・・・
どうしても気になるならstd::string sharp=std::string(10, '#');と書きなよ。
std::string sharp(10, '#'); は上記の省略形。
>>473 コンストラクタはその型のインスタンスが構築される際に働く関数で、
変数の定義時に変数名の右に引数を書いて渡すのは、まぁ、そういう決まりってこと。
ちなみにintとかの組み込み型でも
int hoge(100);
っていう書き方ができるよ。この場合はint型の変数hogeを100で初期化してる。
かぶって候
>>475-477 レスありがとうございます。
今まで色々な言語を見てきましたが、難解ですね。ある変数を初期化、代入するのには型、変数名、
初期値があれば良いと言うのは分かりますが、「型 変数名(初期値)」という構文は脳が異次元に
ワープしそうです。
>>478 それのどこが難解なんだよ。本当に色々な言語を見てきたのか?
つーか難解さで言えば関数ポインタ型の変数の方がもっと上だろ。
>>478 × 型名 変数名(初期値);
○ 型名 変数名(コンストラクタへ渡す引数のリスト);
だ。あと、std::string(10, '#') なんかも
型名(コンストラクタへ渡す引数のリスト)
とそのまんまに解釈すべき文であって
コンストラクタ関数(コンストラクタへ渡す引数のリスト)
という意味ではないので誤解せん方がよい。
() が関数呼び出し、という固定観念から離れた方がいいと思うが、
まあ、関数と紛らわしいってのはその通りで、
string s( istream_iterator<char>(cin), istream_iterator<char>() );
と書いて変数定義をしたつもりが関数の宣言とみなされて困ったりはするのだが。
コンストラクタも関数なんだから、()は関数呼び出しという認識でも、つじつまは合う?
関数の戻り値を参照で返すとき、関数内でreturn Class1(arg1, arg2);という 具合に引数つきコンストラクタで初期化したクラスで値を返すとします。 このとき、Class1の実体が保持されているタイミングはどこまでなのでしょうか。
>>482 関数内まで。
というか、エラーも警告もなしにコンパイル通る?
>>483 警告を出してくれないコンパイラも困りものだが、
これでエラーがでたらそれはコンパイラのバグ。
>>484 非 const の場合、g++ だとエラーになったよ。
>>485 確かにこの場合、非 const だとエラーにはなるだろうが、
それは右辺値・左辺値の問題なのでオブジェクトの寿命の問題とはまた別。
487 :
デフォルトの名無しさん :03/07/24 20:51
今、ファイルへ書き込みするプログラム作ってるんだけど、 複数あるクラスのデータを、基本クラスのtypeプロパティを読み込んで switchで派生クラスのデータをそれぞれ書いてるんだけど、 なんか、あまり綺麗じゃないんです。 ちなみに、基本クラスから派生しているクラスは5種類くらいあって 中身がそれぞれ違うんで、switchみたいなの使わないといけないんですが なんか他にいい方法ないですかね?
>>487 元クラスを弄れないと仮定して、MixJなら楽勝なんだが…Visitorかな?
Siralizableとかいうインターフェースを保存したいクラスに実装してそれぞれでSirializeをオーバーライドしたら?
>>486 いや、だから寿命の話じゃなくて
エラーがでないってことはないよってことで...。
malloc()で動的にメモリ領域を確保して 構造体を格納してその後にprintfで内容を出力、 実行するとprintfの所で Segmentation fault (core dumped) gdbでデバッグしてみると #0 0x610ba041 in strlen () from /usr/bin/cygwin1.dll で落ちている... strlenで落ちる(しかもprintf)のはどうしてでしょうか?
>>493 訳が分からんが、普通strlen()で落ちるのは'\0'がないからでは?
>>494 返答ありがとう^^
調べたのですが多分\0がないからと思います。
なぜならcharに数値を代入しているみたいです(こんな事ありえますか?)
ワケワカラン。 一体どんな状況なんだ?
new->s_pt = new->s_ft + BYTE_LEN; charで定義されたs_ptに数値が代入されている恐怖の構造体みたいっす 最初は構造体の宣言に沿ってprintfの書式を決定していたのですが...w
char は整数型だから、普通の整数値として扱うこともあるが。 まぁ、その場合は普通 singed か unsigned か付けるけど、 0 〜 127 しか扱わんなら問題になることはまれだと思う。 それにこれは C じゃないのか?
>>494 ゴメ C言語なら俺に聞け! Part 62 が適当でしたね^^;;
charの謎が解けました^^;ありがと
500 :
デフォルトの名無しさん :03/07/25 09:56
500
501 :
デフォルトの名無しさん :03/07/25 10:23
質問です。 下のコードで、メモリは正常に解放されるのでしょうか? int* np; np = new int; void* vp = np; delete vp;
>>501 そのコードがうまくいったとして、
void*をdeleteすんのはまずいだろ
>>501 メモリは正常に解放されることが多いと思うが、未定義かな。
あと、デストラクタがある場合はデストラクタが呼ばれなくなってしまう。
delete をオーバーライドしてた時も、それが正常に呼ばれなくなってしまう。
ってところか。
まぁ、兎に角そんなことはすんな、と。
何をしたいのか分からんが、
テンプレートを使ったら良さそうなことを
したがってるような気がする。
オーバーロードだった。不覚。
>>593 レスありがとうございます。
動的に確保したいろいろな型のメモリアドレスを
リストかなんかで 持って置いて、あとで全ていっぺんに
解放できるかどうかためしていました。
void*で デストラクタが呼ばれないんじゃ使いもんにならないですね。
待てよ? POD 型だけなら大丈夫なのか? デストラクタないし。 規格じゃどうなってる?
>505 素直にスマートポインタを使ったほうがいいかと
508 :
デフォルトの名無しさん :03/07/25 18:18
X (int i = 0) : m_i(i) { } これってどういう意味?
アハァ?
ゴメソ全部書かないとわからんわな struct X { X (int i = 0) : m_i(i) { } int get() const { return m_i; } int m_i; }; で、どういう意味?
クラスXのintを引数にとるコンストラクタで、メンバm_iをiで初期化します。 引数を指定しなかった場合iは0になります。
>>511 510じゃないが、そういう意味なのか。わかりにくいな・・・
X (int i = 0){m_i=i } これじゃだめなのか
m_iがクラスだったらどうすんだよ。
>>512 初期化リスト( コロンから { まで )で書かれたものは初期化になるが
コンストラクタの関数ブロック内( { から } まで )に書かれたものは
普通のコードとして処理され、代入文は初期化ではなく代入になる。
int相手なら違いは無いが、メンバ変数がクラスインスタンスならこの違いが
いろいろ問題になることがある
あ、なるほど。 intと書いてあったからintでしか考えていなかった。
>>512 あと、m_i が const だとこの構文が必須。
517 :
デフォルトの名無しさん :03/07/25 21:44
教えてください。 当方、solaris環境でプログラムを作っております。 すると作ったプログラムが、動かすマシンによって動作が異なるのです。 具体的には、Blade100なら問題なく動きますが、Ultra2だとたまーに Bus Errorにてあぼーんです。 OSはSolaris8ですが、両マシンともリビジョンは同じ。環境も同じ。 違うのはOBPのバージョンくらいでしょうか。 プログラムはマルチスレッドとDBアクセスを実装してます。 なにか、ここが怪しいみたいなことありませんか?
>なにか、ここが怪しいみたいなことありませんか? おまいのプログラム
BusErrorってコア吐かないんだ。へぇー
「たまーに」の頻度によるけど、core が得られない場合には strace しとくと 原因究明の手助けになることがありますよ。Solaris だと truss? ってのかな。
525 :
デフォルトの名無しさん :03/07/25 23:22
>>511 structとして宣言してるのに、クラスとして扱えるんですか?
構造体ってメンバ関数なんて搭載できたっけ?
>>526 classとstructの違いはデフォルトのアクセス指定子だけ。
(class=private, struct=public)
>>527 細かい事言うと、
template<class A> ...
はできるけど
template<struct A> ...
はできないという違いもある。
template<ほげほげ> のほげほげに class 〜 と typename 〜 両方を使えるようにしたのはどういう意図があるのかな? 教えて偉い人。
最初は class しかなかったけど、 class じゃないものにも class を使うのもなんだってんで 後から typedef を仕様に加えた、ってんだったと思う。 細かい事言うと、 テンプレート引数にクラステンプレートを使う場合には class しか使えない。 例) template<template<typename T> class C> .... // OK! template<template<typename T> typename C> ... // Illegal!
typedef じゃなくて typename だって。
> テンプレート引数にクラステンプレートを使う場合には > class しか使えない。 こっちは、classじゃないものは型テンプレートにできないからそのまんま、 ってことなんだろうなあ。……と思ったけど、もし将来的にtypedefテンプレートが 規格に入ったら、typenameも使えるようになったりするのだろうかね。 template<typename T> typedef T size255array[255]; template<template<class> class> TCls {}; TCls<size255array> ...;
533 :
デフォルトの名無しさん :03/07/27 22:02
3つほど。 cstdioヘッダはstdio.hをstd名前空間に移したもの。っていう認識でいいんですかね? 標準 C++ ライブラリには、Cの標準ライブラリも含まれるんですか? それで、C++ソースでcstdioを(っていうかCの関数ライブラリを)利用することは なんの格好悪さも無い。という認識でいいんですかね?
>なんの格好悪さも無い とは言えんけど別にいいんじゃないかな。
535 :
デフォルトの名無しさん :03/07/27 22:12
536 :
デフォルトの名無しさん :03/07/27 22:16
vector <vector <CEnmMissile*> > m_pEnmMissile0; クラスのメンバとしてこの様に宣言したら、警告がでたんですけど。 何がいけないんでしょうか?
警告の内容はこれです。 d:\program files\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::vector<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >::vector<std::vector <CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >' : デバッグ情報で識別子が 255 文字に切り捨てられました。 d:\program files\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >::~vector<std::vecto r<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >' : デバッグ情報で識別子が 255 文字に切り捨てられました。
ああいつものやつね
>>536 お前プログラマ向いてないよ。今すぐそのソース消してやめちまえ。
普通warning C4786でドキュメント見るか検索するだろ。
>>533 >なんの格好悪さも無い
格好悪いけどどうしようもない時はある。
(プログラムの終了処理をメッセージ出力しながらデバッグしている時は
std::cout などがもうデストラクトされてて printf 系を使うしかなかったりする)
あくまで補助、あくまで利便と互換性の為。
543 :
デフォルトの名無しさん :03/07/28 01:00
BorlnadC++5.5で以下のようなコードをコンパイルすると 「push_backに一時変数を使っている」というような警告が出ます。 しかし、これは警告の方がおかしいのではないでしょうか? 仮想関数を持たないクラスなら、こんな警告はでません。 それとも、なんか勘違いしてるでしょうか。どなたかお願いします。 #include <iostream> #include <vector> using namespace std; class Hoge{ public: virtual void func() const = 0; }; class SubHoge : public Hoge{ void func() const{}; }; int main(){ vector<Hoge*> v; v.push_back(new SubHoge()); }
push_back の引数の型は const T& だから、 テンポラリオブジェクトを渡すことは規格では可能 (例えば const int& に 4 とかを渡して構わない)。 この規格がいつ追加されたか分からないけど、 BC++ がこの規格に対応してないってことだけは確かみたいだね。
警告だから対応してはいるだろ
うーん。拡張機能として扱われてるのかな。 BC++ 5.5 は古いからなぁ。
言い訳必死。
一時変数を渡してるからじゃなくて(それはできる)、 暗黙に一時変数が作られてるっていう警告だよ。確か。
>>548 >暗黙に一時変数が作られてるっていう警告だよ。確か。
よくわからんのだが、それは悪いことなの?
>暗黙に一時変数が作られてるっていう 関数の値返しでは普通の方法。 通常bcc32でその警告は非const参照で一時変数を 参照する(標準規格外の利用)時に出るんだが なぜそのプログラムでも出るのか不明
コンパイラがしっかりしてれば問題ないはず。 これに警告を出すというのがちょいと気になるところではあるけど... 多分対応してくれてると思う。
push_backにnew SubHogeの参照じゃなく、そのコピーの参照を渡してるみたいだナー cl(VC7)もそう。gcc2.95はコピーを作らなかった。
new SubHogeの結果はポインタだからコピーで問題ないのでは?良く分からんのだけど。
いまさらだけど、
>>543 のプログラムをbcc32やったら、警告でますた。
不思議でつ。
SubHoge* から Hoge* への変換で一時オブジェクトが発生。
>>555 ビンゴ!
あんたは偉い!
しかし、文法的には、それでも間違いではないよねえ。
なんで警告出すんだろ。
>>552 今、近くに環境がないんだけど、clでやるとうじゃうじゃ警告が出るのに、
IDEでやるとうそのように警告0になるってことない?
俺はSTLがらみでよく経験したような気がするんだが。
>>555 >>556 ふーん。そうなんだ。キャストじゃなくてポインタの一時オブジェクトなのか。・・・うーん。
> これは,参照変数またはパラメータが,ユーザーの期待するものではなく, > 一時変数を参照していることを意味する警告です。 ←BCBのヘルプ おまいが渡したと思った変数の参照は、実は渡されて無いぞ!ってことかな。 仮に受け取った関数側でconst外してNULLとか代入しても(そんなことしないだろうけど)、 それはコピーだからコピー元は変更されてないぞと。
コピー元はどうせ単なる値であって変数じゃないから それで問題ないんだけどね。
小4くらいのとき、マンコが穴だなんて思いもしなかった。 が、年の離れた兄貴のいる加戸は 「ヤッターマンコーヒーライター」 などという言葉を知っているいわば勇者的存在であった。 で、穴があることを知った俺たちだが、どうしてもそれが信じられない。 で、むしろ逆にガキであることを利用して調べようと思った。 ターゲットは音楽の教師である。美人だった。今にして思えば 20歳くらいだったのではないだろうか。短大出てすぐだったように思う。 実行はいたって単純。ガキ特有のカンチョーというあれである。 あれを前に突き刺すというのだ。 ガキなら許されるであろうという勝手な発想だが、 たしかにマンコすら知らない奴がほとんどだったからナイスな判断だったろう。 で、実行は加戸だった。 加戸はなんの躊躇もなくやった。 思い切り。 思い切ってやっちゃいかんだろ、と思った。なぜにおまえはフルパワーなのだ、と。 音楽教師は泣いた。20歳前後という年齢を考えればギャグでもきつい。 ガキからすれば大人だったのだが、今思うと娘だ。 むしろ、処女だった可能性すらある。すまん先生。 が、加戸も泣いていた。 両手人差し指骨折だった。第2関節より下で折れていた。 もろに刺さったんだと感心した。やはり勇者だ。 しかも、救急隊員に、マンコに指が刺さって折れましたと泣きながら事情を説明していた。 あの姿も相当かっこよかった
変数渡しても一時オブジェクト作られるけどね
仮引数のことけ?
SubHoge* a; v.push_back(a); としても、aの参照じゃなくて、aのコピーの参照が渡されるって話。
別にコピーなんて作られんと思うが。
作られてるよ
SubHogeのコピーじゃなくてSubHoge*のコピーな。
まあ、そいういうことが起こってるってのを頭の隅に入れておけばいいんじゃない
>>543
あ、やっと分かった。 コピーされるわ。
コピーされるのは当然だが なぜその警告が出るのかが分からない
当然なのか。gccはされないけど。
gccは最適化か知らんが時々変わったことをするからな rvalueをconst参照する時は一時変数が作られることになっている
575 :
デフォルトの名無しさん :03/07/29 19:14
言葉のアヤかもしれんが、(だったらすまん)
>>565 >aの参照じゃなくて、aのコピーの参照が渡されるって話。
は、少し変だと思う。
SubHoge*であるaが直接、参照Hoge*&が渡されるか、
Hoge*にキャストされたものが渡されるんだよね。
(正直よくわからんのだが。)
キャストで内部的にコピーを作ることがあるのかもしれないが、
絶対コピーされるということはないんでは?
×参照Hoge*&が ○参照Hoge*&に 鬱。
>>575 コンパイラ依存の挙動をここで語るべきではないと。
a = b;
のような代入ですらコンパイラによっては最適化で消滅してしまうのだから何も言えなくなってしまう。
>>574 そうなんだ。ごめん。ちゅうことは、処理系依存じゃなくて規格で決まってるのか。
それじゃ確かに警告はおかしいね。
>>577 まあ、つまり、俺も
>コンパイラ依存の挙動をここで語るべきではないと。
と言いたかったんだが。
それで、「コピーされる」は規格にはないのでは?と。
(これは
>>578 と同じ趣旨かな?)
なんか難しくなりすぎたな。
>>543 はどっか逝っちゃったか?
543です。みなさんありがとうございます。
でも、びびってちびりそうです。
>>543 で書いた「仮想関数を持たないクラスなら」って大嘘でした。
継承関係がある場合、同じ症状がでるようです。すみません。
それと、VC7(コマンドではなく)でやったら、警告は出ないという
話を友人から聞きました。未確認ですが。
もうROMになります。
581 :
デフォルトの名無しさん :03/07/30 00:13
例外を使わずに、失敗し得るオブジェクトの生成を行う方法にはどんなものがあるでしょうか? さしあたって、Embedded C++ です。泣けます。
くだらんレスですまんが、 >泣けます。 しみじみ。 ということで、誰か助けてやってくれ。
>>582 ありがとう。
Embedded C++ って、破綻してるような気がしてきた。
コンストラクタの失敗を伝える唯一の手段を削っておいて、
代替手段はどうするつもりなんだろう。
class PossiblyFail { ... public: static PossiblyFail* Create() { PossiblyFail* p = new PossiblyFail; if( FAILED == p->Init() ) { delete p; return 0; } return p; } }; か、あるいは class ShippaiSurukamo { ... public: ShippaiSurukamo() { ... m_bSuccessFully_Constructed = 異常なし?true:false; } operator bool() const { return m_bSuccessFully_Constructed; } } として if( ShippaiSurukamo obj ) { ... } else { /*エラー処理*/ } か、 じゃないか?よくある手としては。
>>580 C++のテンプレはよくは知らんので勘違いだったらすまんが、
引数渡しの方法がどうこうとか、push_back(arg)が引数の更に
コピーを登録しているとかなんて問題じゃなくて、543のコードは
実際不味いだろ。
v.push_back(new Hoge());
の v.push_back()の引数にオブジェクトそのものじゃなくて、newで
生成したオブジェクトへのポインタを渡しているが、メイン側では
そのポインタをどの変数でも受けてないだろ。
コンパイラはポインタを渡している関数の素性や、その先でちゃ
んとpop、delete しているか迄は関知しないから、プログラム的に
は、参照が残るがどうか分からない行方不明候補のオブジェクト
が生成された事になる。
(要は、 new Hoge(); ってのを単体でやっているのと同じ状態)
だから、「本当にいいんかい、ワレ? テメェ、この関数はちゃんと
先で責任取っているんだろうな?」ってワーニング出しているんだよ。
ワーニング吐く吐かないは、単なるワーニングレベルオプションの
設定の違いかと思われ。
>>585 その理屈だと new Hoge(); と書いたら同じ警告が出ることになるのかね?
>>585 > ポインタをどの変数でも受けてないだろ。
vが受け取ってるだろ
もっともらしくデタラメぶっこくなや
sprintfのバグ発見してしまいました。 __int64型の数字を%dで二つ入力すると二つ目の数が0になります。 char buf[32]; __int64 iTest1 = 30000, iTest2 = 20000; sprintf(buf, "%d\t%d\t\n", iTest1, iTest2); ちなみに環境はVC++.NET
age
>>592 intが4バイトなら当然かと。
一番目の%dでiTest1の4バイト分をintとして表示し、二番目の%dで残りの4バイト分をintとして表示するんだから。
%d指定しといて何言ってんの sprintf(buf, "%I64d, %I64d", iTest1, iTest2);
「表示」はしてないか。
やはりそうだったんですか。 釣りではないんですが、intの他にdoubleぐらいしか指定できなかったもので・・。 この場合はdoubleを指定すればいいんでしょうか
いるよね、592みたいな奴。 自分でミスっといてコンパイラやライブラリのせいにする奴。
>>597 はぁ?変換指定子のことか?
それなら595が%I64dと書いているだろ。__int64も含め移植性は低いが。
>>599 あっすみません。
しかし、VSのヘルプにはI64なんて載ってないよ(;´Д`)
>>600 バージョンは?
VS.NETのヘルプには書いてあります。
printf 関数の型フィールド文字 ↑ここみてました
コンパイラのせいにした挙句ヘルプにも載ってないとほざく
C++でクラス(仮にAとします)のstaticメンバの初期化は Aのグローバルなインスタンスのコンストラクタよりも先に呼ばれることは 保証されているんでしょうか?↓こんな感じです。 class A{ static int m_val; public: A(){/*m_valを参照するようなコンストラクタ。m_valが初期化されている必要あり。*/} }; int A::m_val = 0;//スタティックメンバの初期化 A a;//グローバルインスタンス int main() { //処理 } 一応、上のコードでテストしたらうまくいっているようなのですが、本当にいつでもうまく行くか よく分かりません。 教えてくださいスゴイ人!
>>543 #define STRICT
#include <windows.h>
#include <vector>
class nurupo : public IUnknown
{
public:
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void **);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
};
std::vector<IUnknown*> mona;
HRESULT fucktory()
{
mona.push_back(new nurupo);
return S_OK; // ( ´_ゝ`)< ふーん
}
>>605 グローバル変数&関数外のスタティック変数は忘れれ。
仕様としてあるだけでどっちも使い物にならん。
スタティック関数を使ってシングルトンにしな。
シングルトンをマルチスレッド対応するのは 結局どうするのが正しい(安全)んだろ?
アクセスしない
>>608 インスタンス生成でちゃんとロックしとけばええんでないの?
CPUクロック周波数と、メモリ搭載量、システムリソースの残量、IPアドレスの取得をしたいのですが、どうすればいいでつか?
×的を得る ○的を射る ○当を得る
>>611 Embedded C++ とやらがどんなもんかはよー分からんが、
C でできることは C++ でできるんだから
わざわざ C にすることはないんじゃないの?
>>614 > 文例
> この作品に対する彼の批評は的を得たものとはとうてい言いがたい.
> I really must say that his criticism of this work is wide of the mark.
> New College Japanese-English Dictionary, 4th edition (C) Kenkyusha Ltd. 1933,1995,1998
時代の流れです
第4版でそれか...。
>>614 あぃ、すんません。
>>615 基本的には、C++のフル仕様から以下のものを削除したものになります。
mutable・例外・実行時型情報・template・namespace・
多重継承・仮想継承・C++スタイルキャスト・
wchat_t・long double・ファイル操作・ロケール
C++プログラムとして相当中途半端なソースにならざるを得ないのです。
特に痛いのは、例外・templateですね。
これが有るのと無いのとでは根本的なソースの書き方が違ってしまいます。
うーん、それでも、たしかにC++のほうがいい場合も十分多くありますねぇ。
>>611 なんだか悲惨そうな話ですね。
組み込み系ってよく知らないんですが、
普通のC++を使うという選択もあるんですか?
>>611 を見ただけで、EC++嫌って気がしてきたので。
>>619 C から削られた機能がないなら EC++ でいいんじゃない?
C++ として中途半端だろうが、C より組みにくいってことはないやろ。
参照、inline 関数、クラス、bool 。
これがあれば EC++ にも十分アドバンテージあるんじゃない?
例外は昔ながらの goto + bool でいい。
どうしようもなく面倒になる場合は exit してしまったんでいいし。
template はマクロを駆使するか、使わないでなんとかするか、
どうしようもない場合は自前でソースをコンバートするか。
昔は「template は将来のために予約されています」とかヘルプに書いてあったもんじゃー。
Turbo C++ 1.0 ...懐かしい。
>>607-610 サンクス
とりあえず、グローバル変数はやめにして実装し直すことにします。
弓道をイメージすれば、「的を得る」のおかしさは自明。
あんた、よくクドイって言われるだろ。
>>624 涙目ですね。
でもそれだけ悔しい思いをすればもう間違いませんよね?
え?弓道って優勝者への景品として的が持ち帰れるのとちごたん?
このスレはいつから会社でウザがられてるウンチクおやじの ストレス発散場になりましたか?
一般常識レベルの日本語能力もないんじゃなあ。 「的を射る」は就職試験とかでも頻出してるのに。
629 :
デフォルトの名無しさん :03/07/31 20:23
みなさんC++の基礎を覚えるのにどれくらいかかりました? SDKやMFCじゃなくて初心者本で良くあるdos窓のプログラムです。
operatorから仮想関数が呼べるようになるまで3ヶ月だったかな... TCPLの初版で。
>>623-628 オマエラこのスレ的にゼンゼン的を得ない発言だな
言葉として知っていても意味を知らない馬鹿ドモハケーン
>>629 基礎がいったいドコまでを指すのかわかんね
exportが実装できるぐらいまでが基礎とか(無茶)
的を得るはあるよ。意味は「射る」とは別だけどね。
get a target
肉壷げっちゅ〜
バグを得る
的を得るは的を射るや当を得るの間違いから生まれたという説が多いが、俺はそうは思わない。 というのも、的を得るからは的を射るとは異なったニュアンスを受けるからだ。 的を射るは要点をずばり突いているという感じだが、的を得るは要点を正しく把握したうえで発言しているという印象を受ける。 つまり誤用ではなく、異なった意味を持つ造語だ。 この場合の「得る」は要領を得るの「得る」と共通するものがあると思う。
必死だな
「的を得る」は弓道から派生してきてないよ。 「景品をならべておき、それを鉄砲で撃ち、当たったら景品をお持ち帰り」 の、テキ屋からきている。 この、「鉄砲のタマを当てようとする景品」は「的」に他ならず、 「景品にタマが当たったら、お持ち帰り」なのだから、それは 「的を得る」と表すより他にない。 意味としては、「UFOキャッチャーで品物を巧くGetできて うれしいね」という状態を表す。
>>639 的を射ると同じ意味で使ってるのはおかしいと言ってるんだYO!!
つーかそろそろスレ違いだからやめようぜ。言葉は進化する厨が出てくるし。
>640 同じ意味で使っているとどうして分かる? >641 あるわけねーだろが。比喩なんだからよ。
>>640 >つーかそろそろスレ違いだからやめようぜ。言葉は進化する厨が出てくるし。
そろそろじゃねーよ馬鹿、てめー自分が再燃さしといて何抜かしてやがる、死ねキチガイ
>>644 正直すまんかった。
んじゃやめよう(´・ω・`)ションボリック
頭が悪い奴はすぐキレる
おまいらC++の話してくださいよ
>>621 たしかに言語機能の面だけで比較すればC++に移行するほうがいいです。
でも、現在の環境に特有のデメリット・導入コスト(ここらへんは詳しく説明するつもりはありません)
をあわせて天秤にかけた結果、Cのままでいくことになったわけです。
そして、みなさま、ごめんなさいでした。
ぶっちゃけtemplateがなかったらC++は廃れてた気がするよ。
>>648 まぁ、そういうことならしゃーないわな。
>>649 同意。もしtemplateが無かったら俺はC++を支持してない。
JavaやC#の方を支持してるだろうな。
ただ、Cよりかは遥かにマシ。
C++ と Java/C# は ネイティブコンパイラがメインか否かという大きな違いがあるので、 一概に比べることはできんと思うが、 純粋な言語仕様的にというなら分かる気もする。 C# は魅力的なところも多いけど、 template(generic)が無かったのには落胆した。 generic を追加するという話は聞いたことあるけど、どうなることやら...。
653 :
スカトロ初心者 :03/08/01 01:25
C++について最近勉強を始めたごくごく初心者です。 今ひとつポインタについて理解することができません。 そこで、動的オブジェクトの割り当てとその開放について質問させてください。 int *t; t = new int;*t=1; t = new int;*t=2; t = new int;*t=3; 上記のようにして動的オブジェクトを3回割り当てた場合、 ポインタtは一番最後のアドレス(値3が格納されたメモリ)のみ記憶しています。 この状態で、 質問1: 値1や値2の格納されたメモリエリアに簡単にアクセスする方法はありますか? (言い換えれば、値1や値2のポインタを取得する方法はありますか?) 質問2: delete t;では値3の格納されたエリアしか開放できません。 値1や値2の格納されたメモリを開放する簡単な方法はありますか? 質問3: ポインタを使ったポピュラーなデータ構造として「リンクリスト」がありますが、 このデータ構造は上記のプログラムと本質的に同じ部分があると思われます。 つまり、リストの各要素を格納しているメモリエリアに固有の識別名が与えられていません。 (例えば、配列なら、a[0],a[1],a[2]・・・のように、それぞれのメモリエリアの識別ができます) リストのn番目の要素のポインタや値を簡単に取得する方法はありますか? また、リスト全体を簡単にdeleteする方法はありますか? これらの質問の真意は、 確保したメモリについてプログラマはどこまで責任を持たなければならないのか?ということです。 質問2が不可能だとすると、このようなプログラムは「書いても文法上エラーにはならない」が、 やがてはメモリ不足でエラーを起こす「書いてはいけない」プログラムだということになりますよね? よろしくお願いします。m(__)m
回答1:ない 回答2:ない 回答3:ない
657 :
スカトロ初心者 :03/08/01 01:32
>>654 えぇ、意味は知っています。
要するに、これはメモリリークを起こすプログラム例だということですね?
こういうプログラムは書いちゃいけない、と。
>>655 ひゃっほう。
ってことは、リンクリストを削除する場合、
ここの要素をひとつずつたどりながらdeleteしていくしかないわけですか・・・かっふん。
658 :
スカトロ初心者 :03/08/01 01:36
>>656 現在はまだ初心者なのでその言葉の意味がわかりませんが、
頭の隅にとどめておきます。ありがとうございました。m(__)m
>>653 名前が...まぁいいけど。
回答1:
ない。1 や 2 の格納されたアドレスを保持していた変数 t は
新しいアドレスで書き換えられてしまったので、
1 や 2 の格納されたアドレスにアクセスする手段は失われてしまった。
アクセスしたいなら、そのアドレスを保持するポインタ変数を作るべし。
回答2:
ない。従って、1 や 2 の格納されたメモリエリアはプログラム終了まで永遠に開放されない。
これをメモリリークといって、厄介なバグのうちの1つである。
少量なら気づかないが、ずっとプログラムを実行しておくと溜まり溜まって
メモリを圧迫してしまうなんてこともある。
バグがあることに気づきにくいってところが厄介なわけね。
回答3:
n 番目の要素を得るには、順番に n 回辿っていかなくてはならない。
リスト全体を delete するには、普通に巡回して delete していけばいい。
回答4:(最後の話に対して)
プログラマはきちんとメモリを管理しなくてはならない。
それが面倒な場合、スマートポインタというのを使うことができる。
標準では auto_ptr 、別のライブラリには boost::shared_ptr とかある。
これでも使用法に注意する必要があって、
完全に気にしなくて良いという状態にはならない。
一般的な双方向リンクリストならstd::listを使え。
C++はCほどじゃないがメモリに関する注意(リークだけじゃなく)は怠るなってことだな。
回答2は、「ある」だよ。ガベコレ使えばいいんでないか。 簡単かどうかは、ま、何ともいえないけどサ、、
663 :
スカトロ初心者 :03/08/01 01:44
>>659 詳細にありがとうございます。
BASICから入ったせいでしょうか、
そもそも値の保持されている領域になんの名前もついていないことが
今ひとつしっくりこなくて・・・。
回答4に関してはまだ理解できませんが、覚えておきます。
深夜にどうもありがとうございました。
>>660 はい、これも記憶しておきます。
ありがとうございました。
std::vector 動的配列 std::list 双方向リスト std::deque .双方向キュー。配列とリストを融合したようなもの(要素の追加が楽な配列のようなもの) std::queue キュー(std::priority_queue というのもある) std::stack .スタック std::set 高速探索可能なコンテナ(std::multiset というのもある) std::map .連想配列(std::multimap というのもある) std::hash_set ハッシュ表+set std::hash_map .ハッシュ表+map
ガベコレはふつー、newを乗っ取る。
こんなコードを見ました。 enum col{red, black, white}; int a[3]; a[red] = 0; a[black] = 0; a[while] = 0; これはまちがってないのでしょうか。 それならどういう意味なのでしょうか。
a[0] = 0; a[1] = 0; a[2] = 0;
>>670 教科書でenumの定義を見ました。
確かにそんな感じですが、ほんとうにいいんでしょうか?
なんかenumと整数は違うとも書いてあるんです。
心配なら enum col{red=0, black=1, white=2}; とすればいい
>>671 enum の普通の使い方だけど。
enum col{ red, black, white, col_size };
int a[col_size];
a[red] = 0;
a[black] = 0;
a[white] = 0;
のように、サイズを enum で定義するテクニックもある。
まぁ、列挙子としては不正な値を1つ増やしてしまうというデメリットもあるけど。
いつもこうしちゃう、小心なオレ enum col{red=0, black, white};
>>653 struct IntList{
int i;
IntList * prev;
IntList * next;
};
IntList * pstart=new IntList;
pstart->i=0;
pstart->next=NULL
pstart->prev=NULL;
pstart->next=new IntList;
pstart->next->prev=pstart;
pstart->next->next=NULL;
pstart->i=1;
pstart->next->next=new IntList;
pstart->next->next->prev=pstart->next;
pstart->next->next->next=NULL;
pstart->next->next->i=2;
for(IntList p=pstart;p!=NULL;p=p->next){
std::cout << p->i << std::endl;
}{
IntList p;
for(p=pstart;p!=NULL;p=p->next){
delete p->prev;
}
delete p;
}
手抜きだがこんな感じでポインタ使わないと簡単には実現できないようなものを作ってみるとポインタの理解が深まるかもね
使うだけならstd::listを使うけど
追記:bad_allocとかの例外を考えると素直にスマートポインター使いましょう。
配列を関数に渡すだけでポインタ使うんだけどね。
参照で渡せる
>>680 固定長か vector ならね...。
可変長の配列などC++にはない。
>>682 渡せる配列のサイズが固定という意味で言ったのだが...。
可変固定とは別に静的に対する動的な配列はnew構文の中だけに 存在するが、配列長が実行時に決まる場合、可変な型が存在しない以上 これをポインタ以外で受け取る方法はない。 結局、サイズが固定でない配列はない。
new int[10]はint(&)[10]を返して、参照(又はポインタ先)に 限って動的型を許すのは出来ないのかね。 int (&a)[n]=new int[n];//動的配列への参照 int *a=new int[n];//標準変換によって合法 それで配列でないnewも参照を返す方がエレガントだ。 int &i=new int; int *p=&new int;
見た目は綺麗だけど、多分不便。
>>681 #include <iostream>
template <int size>
void func(int (&buf)[size]){
for(int i=0;i<size;i++){
std::cout << buf[i] << std::endl;
}
}
int main(){
int buf[]={0,1,2,3,4,5,6,7,8,9};
func(buf);
return 0;
}
templateスレだと既出っぽ
まあ、同じことだが、 void func (int buf, int size) { for (int i = 0; i < size; ++i) { std::cout << buf[i] << std::endl; } } template <int size> void func(int (&buf)[size]){ func(buf, size); }
>>688 どうせなら template のほうには inline の指定をしとけ。
690 :
デフォルトの名無しさん :03/08/01 11:06
stringをincludeしていないのにstrlenが使えるんですがなぜなんでしょうか? やさしいC++という本にはインクルードしなければいけないと書いてありました。 環境はVC.NET2003です。
>>692 だから「どうせなら」からレスが始まってるんだろ。
ソースファイルの拡張子はcppなのでC++だとおもいますが、、 Cとしてコンパイルとはどういうことでしょうか?
>>693 >>688 等はinlineぐらい知ってるだろ。
今回の話に関係ないから敢えて言及していないんだろうが。
それを何が偉そうに「しとけ」だ。
ようやく自分の知識が生かせると思って意気揚揚とレスしたのか。おめでてーな。
>>694 C++としてコンパイルしてても、別のヘッダ経由で間接的にインクルードしてるかも
>>690 cstringかstring.hをインクルードしているから
699 :
690=694 :03/08/01 17:33
プロジェクトのフォルダの中にはcppファイルが一つと 空のコンソロールプロジェクトを作成した時に自動で作られたファイルだけです。 *.hのファイルはありません。 インクルードしているのはiostreamだけです。 #include <iostream> using namespace std; でこの後にmain()関数を書いています。
700 :
デフォルトの名無しさん :03/08/01 17:34
C++で\nとendlはどう使い分けるんですか?
>>699 じゃあiostreamが中でインクルードしてるんだろ
703 :
デフォルトの名無しさん :03/08/01 19:10
コンストラクターで変数(char* name )を(Null、1Byte)初期化したい。 この場合 A::A() :name( 0 ) { } で良いのでしょうか?
705 :
デフォルトの名無しさん :03/08/01 20:00
>コンストラクターで変数(char* name )を(Null、1Byte)初期化したい 失礼しましたNullをセットするときになんとなく 口癖でNULL1Byte(=(Null、1Byte))と言ってしまうので。
>>705 やっぱり意味わからんが。
NULLポインタは1バイトということはないはずだが。
null文字1バイトを指すポインタということなら 0 ではなく "" と書かねばいかんが
まさかそういう話?
このスレは703の口癖NULL1Byte(=(Null、1Byte))をはやらすスレに なりますた。 一応突っ込んどくが… ポインタは1バイトじゃないぞ。 ついでに1バイトのNULLは '\x00'。
>>707 NULLと大文字で書いた場合はポインタ。
'\0'はヌル文字であって、ポインタではないわけだが
>>708 707の言うNULL(ラテン語)と708の言うNULL(識別子)がかみ合ってないだけと思う。
712 :
( ● ´ ー ` ● ) :03/08/01 20:55
707必(ry
> ポインタは1バイトじゃないぞ。 そうなの?
>>713 はJava厨もしくはDel厨、C#厨による
スレが荒れることを狙ったネタレスです。放置してください。
715 :
デフォルトの名無しさん :03/08/01 22:00
クラスのメンバ変数をコンストラクタで初期化する方法で質問です。 例えば Hoge::Hoge(int a, int b) { aa = a; bb = b; } これを、 Hoge::Hoge(int a, int b) :aa(a), bb(b) {} この様に書けると聞いたんですけど、 Hoge::Hoge(int a, int b) { rect.ra = a; rect.rb = b; } この様に構造体を初期化したいときはどうすれば良いんでしょうか?
Hoge::Hoge(int a, int b) : rect(a, b) {}
>>716 レスありがとうございます。
そのやり方でやってみたんですけど、(構造体のメンバの数が4個なので、引数を4個渡しました)
こんなエラーがでてしまいました。
error C2661: 'tagRECT::tagRECT' : 4 個の引数を持つオーバーロードされた関数はありません。
何でだろう?
NULL(ポインタ)とNUL('\0')は区別しよう。
>>717 tagRECT構造体に4 個の引数を持つオーバーロードされたコンストラクタがないからだろ。
もしVC++でRECT構造体使ってるならCRectクラスに変更すれ。
721 :
デフォルトの名無しさん :03/08/01 22:55
>719 NUL SOH STX ETX EOT ENQ ACK BEL BS HT NL VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US NULは使わなくてもBS,CR,LF,ESCなら使ったことあるだろ。
NULはNULLの略語じゃん
MSDNは'\0'のことを普通にNULLと呼んでるぞ まったく不毛だからその辺でやめとけ
だめぢゃん。MSDN
NUL is a null character っていうのならOKだけど。 小文字のnullは一般名詞。
>724 普通に NULL と呼んでいないと思うぞ。 terminating null character というときの null は NULL じゃない。
>>724 よくみろ。NULLじゃなくてNULL文字だ。
さすがじゃん。MSDN
731 :
デフォルトの名無しさん :03/08/01 23:20
>>714 いやまじで聞いているんだが。
1バイトなんて環境は滅多にないだろうが、規格でもそう決まっているのかと。
>>714 は知ったかぶりをしたアフォです。放置してください。
NULLポインタはポインタだ。 NULL文字は文字だ。 さてなぜNULLはポインタであると断言できよう。
NULLという定数は整数 NULLポインタはポインタ(当たり前だが)
Cでは、 #define NULL (void*)0 だったから、Cの文脈では明らかにポインタだった。 C++では #define NULL 0 となったが、 char *p = (void*)0; がエラーになるから (void*)0 を 0 にしただけで、 気持ちの上ではCのNULLとなんら変わるところはない。 CのNULLがポインタである以上C++のNULLもポインタである。
>>687 固定長の関数を関数テンプレートでいくつも作ってるだけじゃん。
inline ならともかく、inline じゃなかったら無駄に関数が大量に作られる可能性があるぜ。
>>695 ということを言いたいんだと思われ。
for(int i=NULL;i<10;i++)
void foo(char*); void foo(int); void foo(char); foo(NULL); NULLはint
>>731 JIS X3010 5.2.4.2.1
および
JIS X3010 6.3.4
を参照されたし
規格票を所有すべきであると進言する
NULLは単にマクロを意味する大文字なだけで、元のnullはゼロという意味で、C++ではNULLが0なのだから。
str[end] = NULL;
とするのも、意味論的に間違いではないと思う。
俺はしないけどさ。
ってゆーか
>>741 それ悲惨すぎるw
ISO/IEC14882 だった 逝ってきます
745 :
デフォルトの名無しさん :03/08/01 23:41
>>742 JISか。CみたいにPDFを落とせるかもしれないから探してみよう。
JISの3010ってCじゃん ウワァァァン
なんだこのぬるぬるしたスレは!
案の定荒れますた。
(^^)
752 :
デフォルトの名無しさん :03/08/02 08:45
C++の演算子や関数、クラスなどがまとめられているような本はないでしょうか? ヘルプから探すの苦手なんです(ノД`)
マジレス
>>753 に同意
ど初心者でなくなったら所有しろ
真面目に読むかどうかは別だが
辞書としてイチオシ
ヘルプから探すの苦手って時点で終わってる気がするんだが。
C++第3版はあまりおすすめしないが。 索引がおかしいせいで、調べたい情報がなかなか出てこない。
ふぁふぁふぁふぁ
そらよ。本物か知らんが ce.sharif.edu/~bateni/download/else/cpp3rd.zip
定義したクラスってメモリ(仮想)上のどこに配置されますか? やっぱりコード(テキスト)領域?
>>759 クラス自体にはこれといった場所は無い。
コードはコード領域だし、インスタンスはそれぞれのために割り当てたメモリだし・・
クラス固有なのはtypeinfo, vTableぐらい? これは定数領域かも。
vテーブルは、ふつうインスタンスメンバと同じとこだけどな。
クラスの各メンバが一箇所にまとまってるんじゃなくて データメンバならデータ(定数)領域 メンバ関数なら実行コード領域という感じですか?
メモリレイアウトは環境依存でどうにでもなるんじゃないの?
浦東戸新鳩南川赤志王王西駒本東後飯市四永溜六麻白高五戸荏旗長洗石雪御久千池蒲京糀大穴天羽羽 和川塚井が鳩口羽_子_が_駒大楽田がつ田池本布金輪反越原の_足川谷嶽が鳥__浜_鳥守空田田 美口安宿谷が元岩_神_原_込前園橋谷谷町山木十高台田銀中台_池台大山原町__蒲_居稲橋空西 園_行__谷郷淵茂谷子_込_______王一番輪__座延_原__塚___上田田谷_荷_港タミ ●――――――●――――――――●●●●●――――●―――――――――――●―――――●●空特 ●――――――●――――●―――●――●―――――●――●――――――――●―――――●●特快 ●●――●――●――●―●――●●●●●●●―●―●――●―――●――――●●―――●●●快速 ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●各停 ←――――――→←――――――――――――――→←→←――――――――――→・←――――→ . ↑ ↑ ↑ ↑ ↑ ↑ . 埼 営 営 東 京 京 . 玉 団 団 急 急 急 . 高 南 池 池 蒲 空 . 速 北 上 上 田 港 . 線 線 線 線 線 線
765 :
デフォルトの名無しさん :03/08/02 18:14
仮想関数テーブルはインスタンスの先頭ってきまってなかったっけ?
>>752 母数が大きいと756のようなアンチの数も比例するが
TCPL3は辞書としての使い勝手は悪くない
現に漏れがそういう使い方をしている
別な話バイブルや規格票は良し悪しに関係なく用意すべき
TCPLが\7Kくらい、ISO/IEC14882は\30Kくらいするが
完全に遊びならともかく「ちゃんと」取り組むなら
やむを得ない出費と割り切るべし
C++第3版は検索ですぐ見つかりましたがISO/IEC14882 とは本の名前でしょうか?検索しても書籍名として出てきませんでした。
769 :
デフォルトの名無しさん :03/08/03 07:49
stringをインクルードして文字を代入するのと配列に代入するのはどうちがいますか? 使い分けあるんですか?
そらよ。本物か知らんが www.rgai.hu/~beszedes/munka/ISO+IEC+14882-1998.pdf
773 :
デフォルトの名無しさん :03/08/03 12:17
class storage { T a[N]; public: T* get(); // a の中のある要素を指すポインタを返す bool contains( T const* p ) const; // p が a の中の要素を指しているかどうか判定 }; bool storage::contains( T const* p ) const { return ( p != 0 ) && ( &a[0] <= p ) && ( p <= &a[N] ); } ↑この storage::contains のような判定は有効ですか? 「同じ配列内のポインタ以外の比較は無効」という話を見かけたので心配になりました。
あぁ・・・。 修正です。 bool storage::contains( T const* p ) const { return ( p != 0 ) && ( &a[0] <= p ) && ( p < &a[N] ); }
多分動くだろうが、規格では 細かいことは色々あるがポインタの比較で==,!=以外は (同じ配列であっても)不定と思っていいようだ。 同じ配列である時に限ってマイナス演算子は 期待通り働くがそうでなければ未定義だから使わないほうがいい かも知れない。 だからそれは標準C++で組みたければ一つ一つ==で 比較するということになるだろう
では、こんな感じ、ということですね。 bool storage::contains( T const* p ) const { #if defined( USING_RELATIONAL_OPERATORS_OF_POINTERS ) return ( p != 0 ) && ( &a[0] <= p ) && ( p < &a[N] ); #else if( p != 0 ) for( T const* q = &a[0] ; q != &a[N] ; ++q ) if( p == q ) return true; return false; #endif } あと、5.9 -2- を読む限り、同じ配列内の要素ならちゃんと定義されてるっぽいですよ。
>>773 <= とか < でなく、std::less と std::less_equal を使えば
任意のポインタについて比較ができることが保証されてる。(20.3.3.8)
ただ
std::less_equal()(&a[0],p) && std::less()(p,&a[N]);
は、pが配列内を指すならtrueなのは確かだが、外の時必ず
falseになる、と定められているかどうかはわからん。。。
>>777 おぉ、有益な情報をどうもありがとう。
しかし、ほんとに微妙ですね。
boost::pool::is_from に同様のコードを発見しました。
が、結局は、単純な結果を返すことはできないようで、戻り値の仕様は微妙です。
ん?ということは、同様のことをCでやろうとすると、 全要素比較以外の方法は標準では不定ってことですかね?
そういう場合はポインタを整数になおせばいい p - a
if ((unsigned)(p - a) < N) return trure;
なんか改行で送信される・・IMEが変になった
で、普通に書くと return (p && (unsigned)(p - a) < N); どの環境でも問題なさそうなのは return (p && (unsigned)((char*)p - (char*)a) < N*sizeof(T));
アーキテクチャ上、問題は起こらないと思うけど。
>std::less と std::less_equal を使えば >任意のポインタについて比較ができることが保証されてる。(20.3.3.8) マジで?またヘンチクリンな事しよって… 勘弁してくれ
>>766 vTableへのポインタならインスタンス中だが、先頭かどうかはわからん。
多重継承のときには複数並ぶしな。
vTable自体はインスタンスとは別に同一のクラスのすべてのインスタンスから
共有されるようにどっか別のところに配置されるだろ。
おまえら完全に誤解してる様だが、
C/C++では「移植性のある」コードを書けると期待してはいけない。
今回のケースがまさにそうだ。潔癖症な奴はこの場合、
#define is_array_ptr(〜)
でも定義しておき、環境毎に適切な処理に置き換える。
この置き換えが効く事が、「移植性が良い」といわれる所以。
>>776 みたいなコードを見ると泣けてくる・・・
CかC++の入門書より少し難しいソースコードが記載されているサイトを知りませんか?
Cはコンパイラの仕様を熟知していないと(他の環境のソースを)
正しくビルドできないことが多々あるから泣けてくる。
>>776 の試みには賛同する
>>788 > おまえら完全に誤解してる様だが、
> C/C++では「移植性のある」コードを書けると期待してはいけない。
いやここまでのところ、誰もそんなことは期待してないと思うぞ。
どの部分が「移植性があっ」て、どの部分が環境毎に
書かねばならんのか、切り分けようとしているだけで。
>>786 set<T*> やら map<T*,U> を作れるように…って苦肉の策だろうね。
おまえらの場当たり的なコードを見ると泣けてくる。
実際、誰かは気を付けても、他の誰かは守らない。
延々これの繰り返しだ。
ということだよ。
>>792 絶望するか、鈍感になるか、潔癖になるか、業界から去るか・・
自己レス。 > は、pが配列内を指すならtrueなのは確かだが、外の時必ず > falseになる、と定められているかどうかはわからん。。。 よく考えたら配列は contiguously allocated なので (3.3.4/1)、 &a[0] と &a[N] の間に配列の要素でないものを指すアドレスは 存在しない。ゆえに boost::pool::is_from の方法でOk、だ。
795 :
デフォルトの名無しさん :03/08/03 15:41
ふむ。
std::less の定義が std::set< T* > を有効にするためのものだとすれば、
#include <functional>
bool storage::contains( T const* p ) const
{
std::less< T const* > lt;
return !lt( p , &a[0] ) && lt( p , &a[N] );
}
これで十分ということになりますね。ちょっとキモいけど。
Cの場合は
>>776 のようなアプローチが最善策である、と。
そうなると、boost::pool::is_from の仕様がやたら複雑に記述してあるのは
どういうわけなんでしょうか?
日本語のサイトはないのでしょうか? 英文が全然駄目で。
C++も英単語ですが。
ひまわりを使うことにしました。 C++なんて糞!!
799 :
デフォルトの名無しさん :03/08/03 15:51
JavaのpackageみたいなのをやりたいときC++ではnamespaceですか? my; //ルート my.util; my.math; たとえば↑みたいなのは、 //util.h namespace my { namespace util { //class ... } }; //math.h namespace my { namespace math { //class ... } }; ってやらないとだめなのでしょうか・・・。
レスいただいた皆さんいろいろ情報ありがとうございました。 アマゾンでC++第3版注文することにしました。
図書館で借りる→返せと電話が来るまで借りる→返す→また借りる 俺はこの繰り返し。
つーかよ、お前ら 標準にアクセスする方法知らないの 致命的じゃねえかよ
ほんとC++の参照はクソだな 参照をベースに多態を書こうと思ったら思わぬ縛りがわんさか
初期化死が書けないだけ constを激しく誤解している 未だにコストが0だと強弁している 以上は、ただ恥ずかしいだけ 配列が作れないのはイヤだけど
806 :
デフォルトの名無しさん :03/08/03 22:50
class A{ int a; ; class B : public A{ int b; }; A *p = new B; ?????
馬鹿がいます
馬鹿はボクでした アホがいます
810 :
デフォルトの名無しさん :03/08/03 23:03
クラスをnewで作成して、deleteする可能性のあるものには、必ずデストラクタをつけたほうがいいですかね?
馬鹿でアホはボクでした
この中に一人、侍がおる オマエやろ
>>814
814 :
デフォルトの名無しさん :03/08/03 23:25
>810 new し delete することと、デストラクタの要不要はまったく無関係だ。
ていうかデストラクタは、全部のクラスにつけとけよ馬鹿
不要な仮想関数テーブルを持ちたくない場合もあるのだよ
・・・( ゚Д゚)ポカーン
・・・( ゚ポ゚)Дカーン
そういえば、鶴の折り方忘れた
intじゃなくてINTを使ったり、voidじゃなくてVOIDを使ったりする メリットってありますか?
その昔は #define VOID int という処理系があったりしたものじゃ
ちょっと疑問に答えてくれ struct test1{ int &x; test1(int &i):x(i){} }; struct test2{ const int &x; test2(const int &i):x(i){} }; int i; //new int&(i);//(a)これはもちろん出来ない new test1(i);//(b)これが出来る new test2(1);//(c)これも出来てしまう まず、(b)(c)はできるものなのか。出来るのならば (a)が出来ないのに(b)が出来るのは不思議である。 というのも実際に参照を生成しているのと同等に見える。それはいいのだが 次に(c)が出来てしまうのはどう考えよう。この時int型の一時変数が 出来るとして、その寿命はどうなるのた?
int i; int &r1 = i; // (b) const int &r2 = 1; // (c) 単純化するとこういうことだよね。(b)も(c)も可能。 C++の参照ってのは別名と考えるといいんでない? (b)の場合、r1はコンパイルの便宜上iにつけられた別名。 (c)のr2は、無名インスタンスにつけられた名前。 r1やr2という「参照型のインスタンス」が存在するわけではない。
>>825 >const int &r2 = 1; // (c)
上とtest2*p=new test2(1);が同じだとすると
このp->xの参照先の一時変数の寿命はどうなるのだろう?
縛っている*pと同じで長寿か、それともそのローカルのスコープで
一時変数だけ死んでしまうのか?それがわからない。
>>824-826 12.2 -5- より、引用。
"A temporary bound to a reference member in a constructor's ctor-initializer persists until the constructor exits."
コンストラクタを抜けるまで有効らしい。
というより、この場合「p->xの参照先の一時変数」というものは存在しないのでは。 test2 *p = new test2(1); というコンストラクタ呼び出しは、「p->xは1の別名である」と言っているにすぎない。 p->xが出てきたら、その都度リテラル1に置き換えられるだけ。 って、すげー勘違いしてる?
あー。微妙にずれてるな。 コンストラクタの呼び出しに一時オブジェクトへの参照を渡すんだから、 この場合はこっちか?(同じく 12.2 -5- より) "A temporary bound to a reference parameter in a function call persists until the completion of the full expression containing the call."
> p->xが出てきたら、その都度リテラル1に置き換えられるだけ。 それはすげー勘違い。
>>827 それだ!
という事はそういう事をするとメンバ自体が無意味になってしまうのか…
つまり結局参照をメンバに持つクラスはnewで生成する物ではなく
(同じくnewで生成された寿命を持つオブジェクトを参照するなら
ポインタでいいわけだし)
しかも一時変数は値を得るだけでメンバに参照させてはならないということか
言われてみれば当然だが、俺の中で参照の株が急落中
test2 t(1);程度はしていいものと思っていた。
const int i=1;同じ寿命の物を用意して
test2 t(i);としなければならないわけか。参照意味なし
この場合、コンストラクタである必要はなく、ただの関数引数でも一緒でしょ。 void f(int& r); void g(const int& r); int i; ここに、f(i), g(i), g(0)は可能だけど、f(0)は無理。 同様に、 void f(string& r); void g(const string& r); に対して、g("ABC")は可能だけどf("ABC")は不可能。 もちろん、関数呼び出しの間だけ有効なstring型の一時オブジェクトが作られる。
あ、良く読んだら参照の生存期間の問題も絡んでるのか。 ポインタもそうだけどエイリアスの問題だね。 大昔はconstでない参照にも勝手に一時変数が作られたから 参照の生存期間と一時変数の生存期間の違いによるバグも多かったんだろうな。
オマエバカジャネーノ?
↑
836 :
デフォルトの名無しさん :03/08/04 12:00
あるクラスにint型のデータメンバが二つあるとします。(仮にaとb) このクラスのオブジェクトXをaとbの値が0で初期化して作成します。 このXにint型の値3をたしてaとbの値を3にするには+演算子をオーバーロードしないといけないのですが、 クラスのメンバ関数として X X::operator +(int n) { a+=n; a+=n; return *this; } というようにするかフレンド関数として X operator+(X x,int n) { X tmp; tmp.a = x.a + n; tmp.b = x.b + n; return tmp; } とするのはどちらがいいのでしょうか?
前者は operator + ではなく operator += をオーバロードすべし。 その上で、両方とも定義して可。
>このXにint型の値3をたしてaとbの値を3にするには+演算子をオーバーロードしないといけないのですが、 別に演算子オーバーロードにしなくてもいいです。 >X X::operator +(int n) >{ > a+=n; > a+=n; operator + なのに += しちゃ意味違うだろ。しかも a に2回足してるし (誤植だろうけど注意力30000過ぎー) 質問の本来の答えは、Effective C++ あたりを読んでくだちい
レスありがとうございます。 誤植すいません。 まだプログラム初めて一週間ぐらいなんでって言ってもいいわけですね。
>>839 プログラムはじめて1週間で演算子オーバーロードですかおめでてえな。
もっと先に覚えなきゃいけない事イパーイあるよ。
というか演算子オーバーロードは使い方難しいからもう少し後にしな。
>>839 プログラム初めて一週間なら、誤植は仕方ないな。
ンナワケネーダロ
842 :
デフォルトの名無しさん :03/08/04 16:35
質問 あるアドレスが 動的確保されているかどうかチェックできるような 標準関数ってない?
「標準」では存在しないはず。
>>840 一週間もたっていればそれくらい進んでいてもおかしくない。
…とマジレスしてみるテスト
プログラムの入門書でやっているのですが winアプリを作るときは入門書に書いてあることは すべて必須なんでしょうか? 今使っている入門書はやさしいC++です。
(´-`).。oO(世の中の大半は無駄なことだよ・・・・・・・・・)
>>839 今すぐ本を読むのを止めて以下のキーワードでググれ。
RegisterClassEx
CreateWindowEx
ShowWindow
UpdateWindow
GetMessage
TranslateMessage
DispatchMessage
>>848 何が情けないの?
「今やってる事って役に立ちますか?」とか甘っちょろい事言ってるから、
とりあえず自分の目で見て眩暈の一つもおこして見ろって言ってんの。
WTLかMFCにしろって事?
このスレは誘導禁止らしいです。
>>850 がそう言っています。
皆さんもスレ違い君がきても、絶対にこのスレに引き止めるように!
855 :
デフォルトの名無しさん :03/08/04 21:08
MFCじゃなくてWin32APIをつかえってこと?
>>847
今からMFC覚えるヤシなんているわけないじゃん
>>845 マジレス致しますと内容は無駄ですが頑張って学んだ事実は今後に生きてきますのでがんがれ!
このスレって怖いよね・・・
860 :
デフォルトの名無しさん :03/08/05 00:11
operator[] で operator[](uint index) operator[](uint index) const という風に、constが付くか付かないか、と言う違いだけというのは、 問題ないですか?
nai
書き込み用、読み込み用で問題ないかと
>>860 わかってるとは思うが、順番を間違えんようにな。
864 :
デフォルトの名無しさん :03/08/05 06:10
みなさんは標準ライブラリのテンプレートや関数をどのくらい覚えているんですか? 量がかなり多いと思うんですが。
STLは一般的なアルゴリズムとデータ構造を知ってればおぼえなくていい。 stringは直感的に使えるからおぼえなくていい。 iostreamはおぼえないといけないかも。 「おぼえなくていい」というのは、わかんなくなったときだけリファレンス引けばいいってことな。
>>864 関数名にしろ引数の取り方にしろ、共通している部分が非常に多いから、
関わっていくうちにあまり多いとは思わなくなるし、片っ端から覚える必要を
感じなくなるよ。
基本がわかってれば、いつでもすぐ調べて使えるって感じ。
最初はアルゴリズムの数にちょっと圧倒されたけど、あれ結局数個しか使ってないし。
STLも、やっぱりおぼえないといけないことはけっこう有るかな。 言い換えると、 おぼえないといけないことがライブラリの総量に比例しているわけではない ってこと。
Cの標準ライブラリよりは覚える量は少ないかも>STL
今言っている「覚える」とはスペルや引数、使用条件を覚えるということなのか、 「こういう機能を持っているものがある」ということを知っているのとどっちですか?
後者でしょ。前者は利用しているうちに自然と覚えてくる。
871 :
デフォルトの名無しさん :03/08/05 10:04
>863 順番てconstの位置と言うことですか? それなら理解してると思います。
872 :
デフォルトの名無しさん :03/08/05 17:44
Accelerated C++という本が入門にいいときいて本屋で立ち読みしたんですがいきなり標準ライブラリとかメンバとかでてきてややこしく感じました。この本でプログラムを始めるのには向いてないんでしょうか?
人には向き不向きがあるよ。別に無理してプログラマになる必要はないと思われ。
STLやクラスは中盤以降だよ( ´ー`)y-~~
875 :
デフォルトの名無しさん :03/08/05 19:56
stringがいきなり出てくる本は珍しいとおもわれ。 他の入門書はchar型の配列やポインタに代入しているが
でもC++で文字列としてchar配列使ったら馬鹿だよ。
878 :
デフォルトの名無しさん :03/08/05 20:20
stringがUNICODEだったら乗りかえるのになぁ。
>>872 独学なら興味あるところから始めれ
誰も引っ張ってくれないし客のプレッシャーもない
自分のやる気が全て
因みに漏れはoperatorから始めたyo
TCPLの初版とZortec C++ 1.06で
stringは廃止してwstringにしろ。
そこでアメリカ人ブチキレですよ。
邪婆厨か...
そこでJava厨ブチギレですよ。
おれはC・C++のワイド文字列の仕様は失敗だと思ってる。 だって、おれ自身全然使わないもん!
localeがちょっと面倒だね
初心者質問なのですが、 gcc.exeやcl.exe等で、GUI実装したWIN32アプリケーションを 作ることはできますか?
できますよ。
初心者質問ですが、 int array[2]; のような配列を宣言する時、 std::vectorを使いますか? 配列の操作としては、 swap( array[0], array[1] ) しかしません。 C++の本を読んだときに、 「ポインタはなるべく使うな。配列もまた体の良いポインタである。 C++では配列を使わずにvectorを使う。」(かなり適当かつ出典忘れました。) 見たいな事が書かれていたので、他の方はどうされているのか 気になっています。
> 配列の操作としては、 > swap( array[0], array[1] ) > しかしません。 それなら配列は使わない。 int a,b;
>>889 という事はVC++買わなくても、
Win32SDKやMFCを入手してそのままコンパイラで使えるという事ですか?
そうだったら余計な出費が減りますね。
>>891 自分でデータ型を定義するかstd::pairやboost::tupleなどを
使うといい
>>893 統合環境がいらないならその通り
MFCはどうやって手に入れるのだろう。 というよりGUIプログラム作成の可否とMFCは直接は関係ないような。
すみません、MFCじゃなくてWin32SDKでした。 しかしGUIプログラムは総合環境無しでは難しそうですね。 やっぱり買いますか…
ソースあるやん
>>897 ソースとは?
Frameのデザインとか数値だけで指定するのは面倒ですね。
あと今更ですが893だったのに気づきました。
レスありがとうございます。 なんかC++以前の問題だったようですみません。 これを機にboostにも手を出してみようと思います。
900 :
デフォルトの名無しさん :03/08/06 02:43
901 :
デフォルトの名無しさん :03/08/06 04:44
Accelerated C++ は読んでみたけどなかなかいいとおもいました。
903 :
デフォルトの名無しさん :03/08/06 14:42
VCなのですが、epsilonより小さい数値が0にならないみたいなのですが、 良いのでしょうか? #include<iomanip> #include<cfloat> #include<cstdio> int main(){ float ffff = FLT_MIN*FLT_EPSILON; printf("\n%.8f\n",ffff);//0.0000000 std::cout << std::setprecision(8) << ffff << std::endl;//1.4012985e-045 }
905 :
デフォルトの名無しさん :03/08/06 16:58
Accelerated C++の話が出でいるので聞きたいのですが各章の最後にある課題の答えはどこかにあるのでしょうか? ソースコードや落とせる場所や解説しているページがあればお願いします。
906 :
デフォルトの名無しさん :03/08/06 21:26
フォームのTextが空欄だと、ShowInTaskbarがtrueでもタスクバーに表示されないのはバグですか?
907 :
デフォルトの名無しさん :03/08/06 21:27
全角スペースを入れてください
女房がどこへ逝ったか知りませんか?
俺の横さ
”タスクバーに”じゃなくて、”タスクバーが”だった。
タスクバー自体は制御しねーよハゲ
914 :
デフォルトの名無しさん :03/08/06 23:04
ミロバーは?
Blake Stowell: C++ is one of the properties that SCO owns
today and we frequently are approached by customers who wish
to license C++ from us and we do charge for that. Those
arrangements are done on a case-by-case basis with each
customer and are not disclosed publicly. C++ licensing is
currently part of SCO's SCOsource licensing program.
http://mozillaquest.com/Linux03/ScoSource-02_Story03.html C++もおしまいですね。
918 :
デフォルトの名無しさん :03/08/07 02:58
実はSCOの幹部の中身があの民族に変わってたりしないよな?
922 :
デフォルトの名無しさん :03/08/07 20:46
あげ
>>921 ビジニュー水戸家
おまいの推測どおりあの法則だ
なんだかんだいってSCOの主張が棄却されないところをみると 正当な主張なのだろう。
またか・・・またあいつらか・・・いい加減にしろよまったく
926 :
デフォルトの名無しさん :03/08/07 23:12
プログラムを勉強し始めようと思ってるんですが CとC++どちらから勉強するのがベターですか?
>>926 Windowsが好きならC#、そうでなければJava。
C/C++は実務・教養どちらにもあまりお勧めできない。
>>927 Cの基本的な内容を含むC++参考書で勉強するといいと思われ。
ディレクトリを開いて中のファイル名をすべて読み込みたいのですが C++に特有な方法ってありますか?
930 :
デフォルトの名無しさん :03/08/08 01:01
なんでC++標準のstringってわざわざSTLなんかを使っているのですか? MFCのCStringやVCLのAnsiStringをみれば分かるとおり クラスで実装できるでしょ。 使いたいだけちゃうんかと小一時間
あまりにも正当な意見で反論の余地が無いのか?
だとしたら本当に
>>930 は頭がいいのだろう。
解読が難しいだけ
>>930 すごいすごい。おまえ知能指数10000000はあるよ。
もうプログラミングやめろ。
>>929 ディレクトリの扱いは C, C++ 標準規格には入ってない。OS 非依存、
例外安全にしたければ boost 使うのが良いと思うぞ。
>>930 string が STL ですか。そうですか
>>936 「stringがSTL」とは言ってない。
Cマガの「C++基礎講座」という連載でC++の勉強をしています。 2003/02号の記事のlist4を、cygwinのgcc version 3.2 20020927 (prerelease)でコンパイルすると、 binder1st< less<int> > b1st( less<int>(), 3 ); という部分で「type specifier omitted for parameter」というエラーが出ます。 これはgccが悪いのでしょうか? ちなみに、 binder1st< less<int> > b1st = binder1st< less<int> >( less<int>(), 3 ); とやると上手くいきますが、これはあまり美しくないですよね?
Cマガなんて読むな
>>935 ありがと、boostにあるのしらなかたよ
boost, lokiってまともなプロジェクトでの実績ってあるの? なんかお遊びツールにしか思えないんだが。
>>941 何を以って実績と言うかが問題だ。
std::copyを使ったからといってSTLの実績とはいえないからな。
自社プロジェクトでの採用率 STL: 100% boost: 0% loki: 0%
まず、boost のコードがちゃんとコンパイルできる コンパイラを用意しないとな。
VC7.1が普及するこれからってことか
じゃあさっさとVC7.1をクロスプラットフォームにして下さい。
ヤレヤレ、まだC++は枯れてないのか。
> ↓次スレよろ ふが。わかった。ちょっと待ってて。
953 :
デフォルトの名無しさん :03/08/09 02:52
保守
954 :
デフォルトの名無しさん :03/08/09 03:03
>>947 >>950 バグですか。
実は同じ号のlist7,8も上手くコンパイルが通らず、こっちは調べて
解決出来たのですが、938の件では自分・記事・コンパイラの
どれが悪いのか悩みました。
その後の号でも訂正記事は載ってないと思うのですが、やはり
Cマガを読んで勉強する人はあまりいないんですかね?
とりあえずバグということで納得して、次に進みたいと思います。
どうも有難うございました。
957 :
デフォルトの名無しさん :03/08/09 14:18
映画が本当になったぞ!! レインボーブリッジが封鎖されてるよ!!
レインボーブリッジが光ってるよ!!
レインボーブリッジの制御プログラムはC++で書かれている。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ /\ /\ < 糞スレ / \ / \ | おめでとうございまーす / \_/ \ \_______ / \ / ヽ___ ___ / / ヽ__/ \ / ゙Y" \ | │ / / \ | 丶/ / \ \ / ̄ ̄ ̄ ̄) * ( ̄ ̄ ̄ ̄) ヽ_____| ─< |\ >─ ( | ) / (|ミ;\ ( ) ヽ  ̄ ̄) /(___人|,iミ'=;\ (  ̄ ̄ ) /" ̄ ̄ ̄ ̄ / 《v厂リiy\  ̄ ̄ ̄ ̄\ / / ゙|,/'' v:,,、.¨)z,_ \ / / ミ/ .-─ .゙》z、 \ / / 〔」″ノ‐ 、u ¨\ ) ( / ゙|, ..冫 .rー  ̄\_ | | 〔 ミ./′ ..r-ー __,,ア┐ | | | {. .,,,, .′ .´′ .¨\|
| | ∨ ノ冖′=vvvvvv¨\ | / ミ. ,i' .゙\_ | / .{. ノ ,r¬″ .¨\ | / ゙|, | ノ ー''''''''''' .ーミz | | ミ. .,、 ._,,,、、r ,,,,_____ ゙┐ _/" | .ミ. ./′ ´′  ̄⌒'h..¥ (______) {. } ._,,,、 ,ノ冖''^¨ ″〕 ゙|, .,| ./` ,r'′ vvvv、 | .ミ、.` | 二、 〔 、 ,| .〔 | .、 〔 rーー | |.,} .ミ .′ .| 〕 .} ─-「 y-リ .\ |, ´v,,,]、、、v- ..,/′ ゙\ .\、 . _/ ¨'ーvu,,____''工レ-'″
963 :
デフォルトの名無しさん :03/08/09 18:59
VC7.1でstlportを使うメリットはありますか?
964 :
デフォルトの名無しさん :03/08/10 00:27
教えてください。 仮想関数テーブルはすべてのクラスのインスタンスにコピー されていると聞いたのですがなぜですか? 1つのテーブルを共有すればいいと思うのですが。。。
つーか、仮想関数テーブルはクラスに1つだろ。 インスタンスは、そいつへのポインタを持つのがふつう。
>>966 ですよね。僕もそうだと思っていたのですが
最近読んだ書籍に、継承を多用するのは各インスタンスの
仮想関数テーブルを増大するから良くないみたいに書かれて
いたのです。
>>967 > 継承を多用するのは各インスタンスの仮想関数テーブルを増大するから良くない
その書籍は捨てた方がいいかもな。
その書籍の題名とISBNをたのむ。
>>968 ネットでいろいろ調べてみたのですが...
>その書籍は捨てた方がいいかもな。
みたいですね。。。(−−);;
多重継承を多用するってんならともかく。
973 :
デフォルトの名無しさん :03/08/10 01:34
Cを初めて触る初心者に適したマニュアルありますか?
>>972 多重継承する場合は、1 インスタンス中に vptr (vtbl を指してるポインタ)
が複数格納されるっつー話なら、正しいぞ。
>>975 それは普通にサブオブジェクトとして格納された結果だろ。
vtblは関係ない。
>>974 いちおう...
「MFCインターナル」のP185です
969さんも聞いてくれていたのですね。 同時刻書き込みで見忘れてますた。 結構メジャーな本なのですが。。。
んで関連質問なのですが、今基本クラスで仮想関数として 定義されている関数foo()を派生クラスでオーバーライド しているとき、両クラスはもちろん別のvtblを持つと思いますが テーブル内のfoo()の場所は同一のオフセットと考えていいですよね。
>>979 そう考えてあながち間違いではないが、
その考えに基づいたプログラムを書いてはいけない。
>>981 処理系依存のプログラムになる。
このスレで聞くからには処理系依存は良しとされないだろう。
>>982 あ、なるほど。
もっともです。。。(--);;
>>967 継承を多用するとそのクラスごとに仮想関数テーブルが作製される。
仮想関数の数が途方も無く多いと弊害がでる。
MFCってことはウインドウメッセージをそれぞれすべて仮想関数化すると?って感じの前フリがあったのでは?
仮想関数エントリの数百〜数千くらい無視できるほど小さいと思う俺は贅沢すぎですか?
C++プログラマはみな無視します
継承多様による弊害は仮想関数テーブルの増大なんかよりも別にあると思うが
>984 「各インスタンスの仮想関数テーブルを増大」 つまり、クラスとインスタンスの区別の付かないくらい 著者が莫迦だといいたいんだね?
>>987 それはまた別の話。インターフェース継承なら、ふつー多重継承する
ものだし。
>>985 たとえエントリが 1 万個あったとしても、32bit マシンだと 40KB
程度でしょう。誤差、誤差。
>>941 boost のスマートポインタ系や bind, compose, mem_fn, call_traits,
それに文字列処理に関して format, regex あたりは仕事で使ってるけど。
さすがに lambda, mpl なんかは、使ってる処理系のバージョンが古い
ためもあって使ってない。
991 :
デフォルトの名無しさん :03/08/10 13:37
C++のRTTIについて質問なのですが、これってC++は どうやって実現しているのですか? 文字列で各インスタンスに埋め込んでいるのでしょうか?
次スレに質問移動しますた。
ウメ〜
1000鳥合戦はいつ始まるの?
スレが立てられた時に始まっています
1000
998 :
デフォルトの名無しさん :03/08/10 14:07
記念カキコ v(^-^*)
999 :
GET!DVD :03/08/10 14:12
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。