【標準C++】C++相談室 part39【STL含む】

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

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

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

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
5v(^・^)v:05/01/23 16:48:20
6v(^・^)v:05/01/23 16:49:00
7v(^・^)v:05/01/23 16:49:39
8v(^・^)v:05/01/23 16:51:37
■関連スレ■
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
どこかで誰かがC/C++の宿題を片付けます 38代目
http://pc5.2ch.net/test/read.cgi/tech/1105541524/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
9デフォルトの名無しさん:05/01/23 16:55:04
                                     ̄ ̄ ̄
                    _ , ― 、
                  ,−'  `      ̄ヽ_
                 ,'            ヽ
                (   `ー'ー'ヽ`ー'ー'ヽ  )        
               (  ノ ''''''   '''''':::::::ヽ  )
               ( . )(●),   、(●)、.:( ) +
               ( )   ,,ノ(、_, )ヽ、,, .::::( )    <ヨン様が華麗に4get!
               . ヽ )   `-=ニ=- ' .:::::::|ノ  +
                  \  `ニニ´  .:::::/      +
               ,,.....イ.ヽヽ、ニ__ ーーノ゙-、.
               :   |  '; \_____ ノ.| ヽ i
10デフォルトの名無しさん:05/01/23 16:55:02
■コンパイラスレ■
フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/
GCCについて part5
http://pc5.2ch.net/test/read.cgi/tech/1103057320/
タダで使えるVisual C++ $2 (DAT落ち)
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/
"Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/
11v(^・^)v:05/01/23 16:56:20
■開発環境スレ■
★初心者にVisual C++を教えるスレ★ Part16
http://pc5.2ch.net/test/read.cgi/tech/1101022051/
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
C++Builder相談室 Part12
http://pc5.2ch.net/test/read.cgi/tech/1099238936/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
12v(^・^)v:05/01/23 16:57:07
STLつかうと一気に実行ファイルサイズが10倍に?!
13v(^・^)v:05/01/23 16:57:40
>>12
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
14デフォルトの名無しさん:05/01/23 16:58:16
>>13
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
15v(^・^)v:05/01/23 16:58:49
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
16v(^・^)v:05/01/23 16:59:21
>>15
#include <stdafx.h>

後死ね。
17デフォルトの名無しさん:05/01/23 16:59:36
>>16
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
18デフォルトの名無しさん:05/01/23 17:00:43
今回のテンプレに割り込み
>>9 計1件

今回のテンプレにマジレス
0件
19デフォルトの名無しさん:05/01/23 17:05:00
前スレここだろ
C++相談室 part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/
20デフォルトの名無しさん:05/01/23 17:07:10
こんにちは質問ですが、

Class階層として

CFirst -> CSecond -> CThird
となっているものがあるとして、

CFirst内ヘッダで
public:
int a;//aはコンストラクタ内でa=10;として初期化。
virtual void function();

CThird内ソースで、
void function()
{
 int c=a;
}

そして、
(CFirst*) pF = (CFirst*) pThirdObject;
int value = pF->a;

とすると、pF->aの値が0x00000000になって、エラーになります。
どうしてなのでしょうか?
これは、基底クラスから呼び出した派生クラスメソッド内で、基底クラスのメンバ変数を呼び出すとエラーになるということでしょうか?
2120:05/01/23 17:09:02
追記
(CFirst*) pF = (CFirst*) pThirdObject;

のpThirdObject; は、CThird ThirdObject; として作られたオブジェクトのポインタなもの、
pThirdObject = &ThirdObject;

です。
22デフォルトの名無しさん:05/01/23 17:12:15
C++スレの理想分割構想

環境非依存のC++に関する事,STL…C++相談室
STL以外のtemplate全般(boost,loki,メタプログラミング)…template統合スレ

コンパイラ依存…>>10
開発環境依存…>>11
2320:05/01/23 17:15:48
追記
(CFirst*) pF = (CFirst*) pThirdObject;
int value = pF->a;

は、MFCのCViewクラスから派生されたクラス内のメソッド内でインプリメントされたものです。
24デフォルトの名無しさん:05/01/23 17:17:39
環境非依存のC++に関する事,標準C++ライブラリ(STL,stream,locale)
【標準C++】C++相談室【STL含む】

標準C++ライブラリ(STL,stream,locale)以外のライブラリ全部
C++非標準ライブラリ相談室【Boost/Lokiなど】
(現テンプレート統合スレ)

コンパイラ依存
>>10

開発環境依存
>>11

こうでしょ?
25デフォルトの名無しさん:05/01/23 17:18:10
>>23
MFCはスレ違い
26デフォルトの名無しさん:05/01/23 17:18:28
>>20
static_cast<CFirst*>(pThirdObject)だとどうなる?
27デフォルトの名無しさん:05/01/23 17:19:48
>>24
じゃあライブラリじゃない生templateの話もこっちのスレ?
28デフォルトの名無しさん:05/01/23 17:22:08
>>27
そうだよ。
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/7-45

ちなみにMFCとかWTLとかの環境依存ライブラリは非標準ライブラリとは更に別のスレになる。
29デフォルトの名無しさん:05/01/23 17:26:32
環境非依存のC++に関する事,標準C++ライブラリ(STL,stream,locale)
標準C++ライブラリ以外に依存しないtemplateの話
【標準C++】C++相談室【STL含む】

標準C++ライブラリ(STL,stream,locale)以外の環境非依存ライブラリ全部
(lib*やらlokiやらboostやらcrypto++やらBlitz++やらACEやらSDLやら)
C++非標準ライブラリ相談室【Boost/Lokiなど】
(現テンプレート統合スレ)

コンパイラ依存
>>10

開発環境・実行環境依存(環境依存ライブラリ含むWTLやらMFCやら)
>>8,11
30デフォルトの名無しさん:05/01/23 17:39:04
>>20
CThird::function() はいつ呼ばれてるの?
31デフォルトの名無しさん:05/01/23 17:57:38
>>20
>(CFirst*) pF = (CFirst*) pThirdObject;

なぜ明示的にキャストをしている?
3220:05/01/23 18:13:13
CFirst* pF = (CFirst*) pThirdObject;

です。
今、自己作成のシステムを最初から作り直してます。
すいません。
33デフォルトの名無しさん:05/01/23 18:16:33
根本的に分かってないような…
34デフォルトの名無しさん:05/01/23 18:22:40
>>20
今のままやってもどうせまたすぐどこかで詰まるよ
推薦図書/必読書のためのスレッド PART 22
http://pc5.2ch.net/test/read.cgi/tech/1106175218/
こういうスレもあるから、一から入門書見てやり直した方が
ためになると思う
35デフォルトの名無しさん:05/01/23 18:47:54
>>32
> CFirst* pF = (CFirst*) pThirdObject;

CFirst* pF = pThirdObject;

で済むのだが・・・
36デフォルトの名無しさん:05/01/23 18:49:55
Cしか分からない香具師がC++書いた時に偶に見かけるミスだのう
37デフォルトの名無しさん:05/01/23 20:14:24
質問です。

初期化が必要なクラスを複数同時に管理する方法はありませんか?
現在はstd::vectorを使っていますが、初期化と開放をコードに
付け加えるのが面倒なので。

コード例。

class Cstruct{
 char* data;
public:
 Cstruct(int n){data =new char[n];}
 ~Cstruct(){delete[] data;}
};

class Cclass{
 vector<Cstruct> object;
(以下略)
};

要するに、新しいクラスを追加する時に、コンストラクタが
自動的に作動するようなvectorが欲しいのですが。
38デフォルトの名無しさん:05/01/23 20:32:54
>>37
Cstructクラスにコピーコンストラクタを作ればいいんじゃね?
つか、作らないとまずいだろう
39デフォルトの名無しさん:05/01/23 20:41:52
>>1がバカだと萎えるな。
40デフォルトの名無しさん:05/01/23 20:48:33
>>38

コピーコンストラクタ?operator=(Cstruct)のことですか?
コピー禁止にして、なおかつ各Cstructは別々の値が入るようにしたいのですが。
ひょっとして、vector内部ではそれで初期化しているのでしょうか?
(コピー禁止は省略しました。情報不足すみません。)

違うのならば、調べます。
41デフォルトの名無しさん:05/01/23 20:50:38
>>40
コピー禁止したクラスは vector には入れらんないよ。
42デフォルトの名無しさん:05/01/23 20:51:06
vector<Cstruct*>
43デフォルトの名無しさん:05/01/23 20:57:39
>>40
コピーコンストラクタはCstruct(const Cstruct&);みたいなコンストラクタのこと
44デフォルトの名無しさん:05/01/23 20:59:46
失礼しました。Cstruct::Cstruct(Cstruct&)の方でしたか。
こちらは知らなかったので、もう一度調べなおします。
ありがとうございました。

>>41
利用側でする、つまり実質何もしなかったので、気付きませんでした。

45デフォルトの名無しさん:05/01/23 21:07:25
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-01-22: C++ Standard Core Language Issues List (Revision 33) is available
46デフォルトの名無しさん:05/01/23 23:04:45
void class_b::func( void* pclass_a )
{
 class_a* ptr = (class_a*)pclass_a;
 ptr->hoge = 1;  ←★
 ptr->foo();    ←★
}
こんな風にptrにはclass_aのポインタを入れてclass_aのメンバ、メンバ関数にアクセスしてますが、
数が多いと、"ptr->" の部分が冗長で面倒なのです。
スコープがまるでclass_aの中にいるときのように省略する手段などありませんか?
47デフォルトの名無しさん:05/01/23 23:12:32
>>46 class_c : class_a
48デフォルトの名無しさん:05/01/23 23:21:00
>>47
スイマセン、詳細をお願いします。C++全然知らずに使ってるもので。
class_cをclass_aから継承して作るということでしょうか?
49デフォルトの名無しさん:05/01/23 23:21:58
CBitmap* CXSFrm::GetBitmap()
{
return m_pBitmap;
}

GetBitmap()=new CBitmap();
error C2106: '=' : 左のオペランドが、左辺値になっていません。

関数の返り値がポインタで、そのポインタをnewすることってできないんですか?
やっぱ無理ですか?
初心者質問でスマソ
50デフォルトの名無しさん:05/01/23 23:23:12
>>35
> CFirst* pF = (CFirst*) pThirdObject;

pThirdObject;はCThirdObjectだから、キャストしてるんだと思われ。
51デフォルトの名無しさん:05/01/23 23:35:01
>>49
CBitmap*& CXSFrm::GetBitmap()
{
return m_pBitmap;
}

GetBitmap() = new CBitmap();

あまりお勧めはしないけど
52デフォルトの名無しさん:05/01/23 23:40:22
>>50
pThirdObject;はCThirdObjectだから、キャストしなくてもいいと指摘してるんだと思われ。
53デフォルトの名無しさん:05/01/23 23:45:58
しつも〜ん

ゲーム開発は主にC言語がメインですが、
C++で開発はしないのでしょうか?
何かデメリットでも?

C++で開発できたほうが、楽だと思うんですが。。。
54デフォルトの名無しさん:05/01/23 23:50:10
>>53
C++も使われてるわけだが
55デフォルトの名無しさん:05/01/23 23:51:31
>>48 そういうことだよ。
56デフォルトの名無しさん:05/01/23 23:54:57
>>53
C++を知らない人が多かったらCを使うんでしょう。
でも、そういうところは全体的に低レベルなところ。
57デフォルトの名無しさん:05/01/23 23:56:56
>>53
例外処理やRTTIの実装が重いのがデメリット。
そいつらをコンパイルオプションで無効にすれば問題ない。

最近はコンパイラの実装が洗練されたり、
環境自体がリッチになってきたりといった理由で、
フルのC++でも大丈夫な環境も増えているだろう。
58デフォルトの名無しさん:05/01/24 00:04:45
>>55
その後、どうなります?
class_cのインスタンスを作って、class_bに渡してもあまり進展がない気がします。
59デフォルトの名無しさん:05/01/24 00:07:53
>>58
おまいさんはカプセル化というものを意識してるかい?
60デフォルトの名無しさん:05/01/24 00:11:50
>>59
つまり、こういうことですか?
class class_c : public class_a {
public:
 class_b class_b_instance;
};
もしこれでしたら、これはできないんです・・・。多分。
61デフォルトの名無しさん:05/01/24 00:12:52
>>58 class_c に新しいメンバ関数を作って、class_b::func ではそれを呼び出せ。
62デフォルトの名無しさん:05/01/24 00:14:49
>>53
> ゲーム開発は主にC言語がメインですが、
ダウト。というか、そういう話をどこから仕入れてきたのか気になるな。
63デフォルトの名無しさん:05/01/24 00:16:10
>>61
なるほど!そういうことですか。
そのメンバ関数は非常に大きい上に、class_b固有の処理の色が強いので、class_cに含めづらいっす。
ただ、非常に参考になりました。
64デフォルトの名無しさん:05/01/24 00:19:28
あと、class_aはアプリケーションのフレームワーク的なものなので、class_cに継承するのはどうなのかなーというところです。
もしかして良くわかってないだけかも知れませんが。
65デフォルトの名無しさん:05/01/24 00:24:15
PS2の開発ってC言語だろ?
C++で組んでるなんて聞いたことねーぞ。
66デフォルトの名無しさん:05/01/24 00:26:03
>>65 聞いたことが無いものは存在しない、か。おめでてーな。
67デフォルトの名無しさん:05/01/24 00:27:03
g++もCWもC++コンパイラじゃないか。
68デフォルトの名無しさん:05/01/24 00:27:09
>>65
君が無知なだけ。
69デフォルトの名無しさん:05/01/24 00:27:45
>>66
おめでとう!!!!!!!!!!!

さぁ!うんこトークの時間です!!!!
70デフォルトの名無しさん:05/01/24 00:27:49
>>63-64
クラス分けに失敗してる可能性が高いな。
可能なら class_a/class_b の役割を再考したほうがいい。
71デフォルトの名無しさん:05/01/24 00:27:51
古くからずっと零細の下請けソフトハウスとかCしか使って無さそうだな
72デフォルトの名無しさん:05/01/24 00:28:42
こっちのスレからかわいそうな方が移動してきたようです
ゲーム製作に最適な言語
http://pc5.2ch.net/test/read.cgi/tech/1071176841/
73デフォルトの名無しさん:05/01/24 00:29:17
巣へお帰り
7465:05/01/24 00:29:58
>>71
そりゃもう、普段からコードなんてぐだぐだで、しかも、C++なんて高等言語が理解
できるはずないじゃないですかー
75デフォルトの名無しさん:05/01/24 00:32:41
ならなんでC++スレに来るんだ?
76デフォルトの名無しさん:05/01/24 00:37:51
>>70
それはありますね。デザインパターンなんか1つも知らないですし。
class_a はフレームワークなのでみんなが共通でアクセスしたい情報を集中的に持っていて、
class_p、class_q、class_r がその情報にアクセスしたいときに、一番最初のコードを使ってるんです。
class_p,q,rのインスタンスは、class_aのメンバ変数になってる class_x がnewでインスタンスを生成して
そのポインタだけ保持してる形です。・・・こんなの書いてもわからないですよね・・・。
77デフォルトの名無しさん:05/01/24 00:40:23
ちなみに、class_aから使用頻度の高いものを抜粋して、グローバル変数にして
externで共有という最後の奥義を使うべきか使わざるべきか迷うところです。
78デフォルトの名無しさん:05/01/24 00:40:39
それってもはやclass_aのメンバ変数がグローバル変数と
変わらないレベルになってるんじゃないの?
そこまでひどいならCで書いた方が余計な事書かなくていい分まだマシだよ。
79デフォルトの名無しさん:05/01/24 00:42:10
とりあえずデザインパターンどうこうとか言うレベル以前に
カプセル化あたりから勉強し直してみたら?
80デフォルトの名無しさん:05/01/24 00:43:02
皆さん、初めまして。
CやC++で簡単なゲームくらい作れるようになりたいと最近思っているのですが
なんかいい参考書とかないでしょうか?(Webサイトでもいいんですがやっぱり書籍にはかなわないと思っているので・・・)

自分のレベル的にCでプログラムの基本文法をやったくらいでC++は未経験です。
ツールはVisualStudio.netを持っているのでそれを使おうかと思っています。
初心者に毛が生えたような僕に最適な書籍が何かあれば紹介してください。
宜しくお願いします。
81デフォルトの名無しさん:05/01/24 00:43:11
「なぜオブジェクト指向で作るのか」を読んでみては。
82デフォルトの名無しさん:05/01/24 00:52:06
ゲーハー板に、プログラマーの人がいるんですが、その人が

「C言語の場合、例外処理あたりで問題がおきてるでつ」

というから、

「C言語に例外処理はないよ」

と突っ込んだら、10分間のブランクの後に、

「そうでつた、エラーシーケンスと例外処理とを勘違いしてまつたニヤ。」

と返事きたので失笑した。
83デフォルトの名無しさん:05/01/24 00:53:08
みなさん、どうもです。多分自分のやり方に問題がある可能性は高いのですが、
この形を崩すとなると、本当に1から書き直しになるので、現状維持で行ってみます。

>>81 機会があれば読んでみます。
84デフォルトの名無しさん:05/01/24 00:53:46
CでもSEHはあるよね?環境依存だけど。
85デフォルトの名無しさん:05/01/24 00:55:12
ゲームキャラクターをクラス単位でオブジェクトにして管理したら楽そうだなぁ。

グランツーリスモなんて何百台あるわけだろ。
それはクラスで管理したらスゲー開発楽そうだが。

実際はどんな言語で組んでるんだろ?
86デフォルトの名無しさん:05/01/24 00:55:35
そもそも言語仕様として例外が定義されていないだけだから、
エラーシーケンスを例外処理と言おうが構わない。
87デフォルトの名無しさん:05/01/24 00:57:22
ゲーム開発でのオブジェクト処理はタスク処理としてアセンブラの時代から根付いているので
ゲ制作板でも行って勉強してください。
88デフォルトの名無しさん:05/01/24 00:57:32
広義の「例外処理」はC言語でもプログラム中に存在する。
C言語に無いのは、言語に組み込まれた例外処理機構。
89デフォルトの名無しさん:05/01/24 00:58:16
>>85 スレ違い。出て行け。
90デフォルトの名無しさん:05/01/24 01:01:57
>>88
そんな事言ったらきりがない。

基本的に(一般的に)C言語は例外処理が扱えない。
91デフォルトの名無しさん:05/01/24 01:03:04
>基本的に(一般的に)C言語は例外処理が扱えない。
C言語ではエラーは全部無視するのか?
92デフォルトの名無しさん:05/01/24 01:12:01
try-catch-through いや、throw が使えないってことかな
93デフォルトの名無しさん:05/01/24 01:13:02
>>90 言語に組み込まれた例外処理機構がないと、こういうことを言うようになるという例。
94デフォルトの名無しさん:05/01/24 01:13:52
>>92
だから、>>88でいいだろ。
95デフォルトの名無しさん:05/01/24 01:23:43
>>94
ゴメン、トライキャッチスルーって言いたかっただけ。スロウちゃうんかと。
ああもう明日も会社で鬱だから寝るわ。
96デフォルトの名無しさん:05/01/24 01:54:27
97デフォルトの名無しさん:05/01/24 13:57:14
ThreadLocal みたいなライブラリってありませんか?
98デフォルトの名無しさん:05/01/24 13:59:21
標準C++とSTLにはありません。
99デフォルトの名無しさん:05/01/24 16:43:55
>>97
JavaのAPIとかよくわからんが
C++でスレッド使うんなら、Boostライブラリとか・・・
100100get!:05/01/24 17:15:01
_beginthreadexとか…
101デフォルトの名無しさん:05/01/24 17:15:49
それportability0やん
102デフォルトの名無しさん:05/01/24 17:53:12
ポインタとアドレスってわかりません。
「構造体のポインタを渡す」って言われても、ちんぷんかんぷんです。
本を読んでも意味不明です。

どなたかこれに関して俺みたいに相当のアホにでもわかるような
説明できる方はいませんか?
103デフォルトの名無しさん:05/01/24 17:55:44
Cスレ逝け
104デフォルトの名無しさん:05/01/24 17:58:36
アドレス(address)は住所だが、転じてメモリがある位置を表す内部の数値を意味する。ポインタ(pointer)は指し示すもの、つまりアドレスそのものか、その入れ物。
105デフォルトの名無しさん:05/01/24 18:05:45
#includeがわかりません。
Task.hで
class Task{
....};
Task.cppで定義します。
このTaskクラスを2つの・・・.hファイルで継承して
使いたい時には、それぞれでTask.hをインクルードすれば
いいんでしょうか?2重定義みたいじゃないっすかね?
ヘッダファイルが分かってないのかな・・・
106デフォルトの名無しさん:05/01/24 18:07:23
>>105
インクルードガード、でググれ
107デフォルトの名無しさん:05/01/24 18:13:55
>105
二重宣言かどうかはコンパイル単位で決まる。クラス宣言中のメンバ関数定義はinline化されるので気にしない。
二重に#incされるのを避けたいなら、ヘッダーの内部か外部を#ifndef..#define..#endifで囲む必要。
108105:05/01/24 18:29:36
超すばやい返信ありがとうございます。
おかげで無事解決しました!
インクルードガードっていうんだぁ・・・
ところで、個人が趣味程度でゲーム作るとかに
分割ファイルしていいんでしょうか?無意味?
109デフォルトの名無しさん:05/01/24 18:40:01
分割コンパイルはモジュール化と再利用性向上とコンパイル時間短縮を促す。大いに分割したまへ。
110デフォルトの名無しさん:05/01/24 18:42:42
main.cpp
#include "proc.h"
main()
{
 proc();
}

proc.h
void proc()
{
 proc1();
 proc2();
 proc3();
}

proc1.h
proc1()
{
 cout << "a";
}

proc2.h
proc2()
{
 cout << "b";
}

proc3.h
proc3()
{
 cout << "c";
}
111デフォルトの名無しさん:05/01/24 18:56:32
レベル1 全部main()の中に書いてしまう
レベル2 関数を使い出す。ただし基本的にグローバル変数
レベル3 auto変数を使い出す
レベル4 ポインタを使い出す
レベル5 構造体を使い出す。構造体へのポインタも。
・・・先が長ぇw
112デフォルトの名無しさん:05/01/24 19:00:32
>110
もっと分割しろ!
一行一ファイルにしろ
113デフォルトの名無しさん:05/01/24 19:07:27
>111
まともなIDEや解説本ならサンプルコードも実行結果も関数の使い方も載ってるけど
114help:05/01/24 23:27:27
あげます。早急に疑問を解きたいです。
改行が多いといわれたので、2回にわけます。

以下、ソースを見せます。(ほんの少しのソースです)
[Field.h]
#ifndef __INCLUDE_FIELD__
#define __INCLUDE_FIELD__
#include <string>
/**
* フィールドを表すクラス
*/
class Field {
/** 名前の取得
* @retval 名前
*/
public:
const char* getName() const;
protected:
std::string name;///< 内容
};

#endif __INCLUDE_FIELD__
115help:05/01/24 23:28:06
続きです。
[Field.cpp]
#include "Field.h"

const char* Field::getName() const {
return this->name.c_str();
}
以上、
↓が、
"bcc32 Field.h Field.cpp" にてコンパイルした実行結果です。
エラー E2141 field.h 8: 宣言の構文エラー
*** 1 errors in Compile ***
field.cpp:

構文のエラーとは、なぜでしょうか。よろしくお願い致します。
116デフォルトの名無しさん:05/01/24 23:30:29
ヘッダをコンパイルすんな
117デフォルトの名無しさん:05/01/24 23:37:28
ふつーヘッダもコンパイルするだろ
118デフォルトの名無しさん:05/01/24 23:41:33
>>117
ありえなーい!

>>114
とりあえず
bcc32 field.cpp
119デフォルトの名無しさん:05/01/24 23:48:53
>>117
ヘッダはヘッダ。
ソースはソース。
120デフォルトの名無しさん:05/01/25 00:10:47
スレ違いな気もしますが質問させて下さい
古い本ですが「ロールプレイングゲーム プログラミング」を入手したものの、
デバックの仕方が全然わからなくて止まっています
どなたか教えて下さいませんか
当方超初心者ですorz
121デフォルトの名無しさん:05/01/25 00:12:15
あきらめるのがいいとおもうよ
122help:05/01/25 00:18:08
みなさん、ありがとうございます。
bcc32ってヘッダファイルなくていいんですね?
というかbcc32の仕組み分かってなかったのかな・・・
nasm?かLsi食べるなんとかってのだと、.hもコンパイルするときファイル列挙しないと
だめだったきがしたので、ついやってしまいました。

ありがとうございました・・・感謝
123デフォルトの名無しさん:05/01/25 01:07:45
>>122
おーい、勘違いしてるぞ。
field.hはfield.cppがインクルードしている。
つまりコンパイル時にはfield.hの内容はfield.cppに挿入されてんだよ。

>bcc32ってヘッダファイルなくていいんですね?
んなわけねえだろ。

>というかbcc32の仕組み分かってなかったのかな・・・
んなわけねぇ。おまえが#includeの意味を知らなかっただけ。
124デフォルトの名無しさん:05/01/25 03:08:50
nasmはアセンブラ。LSI試食版もインクルードファイルをコンパイルすることはありえない。
125デフォルトの名無しさん:05/01/26 02:10:13
class TestA {
TestB b;
};
class TestB : public TestA {
};

という具合にTestAを継承したTestBクラスをメンバに持つクラスTestAを作りたい場合どうすればいいですか?
126デフォルトの名無しさん:05/01/26 02:18:54
>>125
自分が何をしようとしているのか冷静に考えて味噌
127デフォルトの名無しさん:05/01/26 13:33:18
128デフォルトの名無しさん:05/01/26 16:22:26
>>125
それが必要になる状況について詳しく
129ヽ(´ー`)ノ ◆.ogCuANUcE :05/01/26 16:46:44
>>125
TestA が持ってる TestB のメンバがポインタでいいのなら、

class B;
class A {
class B * b;
};

class B : public A {};

もしくは参照を使って、

class B;
class A {
A();
class B& b;
};

class B : public A {};

コンパイル通ったから動くんじゃない?(´σД`)ホジホジ

ただ、サブクラスのインスタンスをスーパークラス側で持ちたいってのは、
どう考えても設計ミスなので、オススメはしない。
130デフォルトの名無しさん:05/01/26 16:49:01
> ただ、サブクラスのインスタンスをスーパークラス側で持ちたいってのは、
> どう考えても設計ミスなので、オススメはしない。
C++じゃないけど、java.lang.Object#toString はどうなんだ、という、
131ヽ(´ー`)ノ ◆.ogCuANUcE :05/01/26 16:58:47
>>130
あれは、java 自体が java.lang.String を特別扱いしてるところがあるので
例えとしてはどうかと…。「インスタンスを保持」しているわけでもないし。

どう考えても設計ミスだと断言したのは、そういうケースでは
自クラスのインスタンスを保持して polymorphism しないの?って話。

class A {
class A * a;
};

わざわざ「サブクラス」に限定する意図が分からん。
132デフォルトの名無しさん:05/01/26 21:48:20
数値を16進数として文字列に格納したいんですが、
stdにはsprintf以外で変換する方法はあるんでしょうか?

今のところCの関数使ってない分sprintf入れると見栄えが
悪くなるんで使いたくない・・・
133デフォルトの名無しさん:05/01/26 22:03:38
int a = 1000;
std::stringstream ss;
ss << std::hex << a;
std::cout << ss.str() << std::endl;
134デフォルトの名無しさん:05/01/26 22:13:52
#include <iostream>
#include <sstream>
int main()
{
    int a = 1000;
    std::cout << dynamic_cast<std::ostringstream&>(std::ostringstream() << std::hex << a).str() << std::endl;
}
135デフォルトの名無しさん:05/01/26 22:24:55
>>132
boost::lexical_cast
136デフォルトの名無しさん:05/01/27 00:01:08
なるほどこんなのがあるんですね・・・
どうもありがとうございました。
137デフォルトの名無しさん:05/01/27 00:05:22
BOOST紹介はもう要らない。
つまらないからもう逝っていいよ。
っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。
勝手にそんな事ができない場合だってあるだろうに。
BOOSTで用意された機能すらも自分で実装できないようなへたれか?
138デフォルトの名無しさん:05/01/27 00:07:34
>>137 boost で実装された機能の劣化コピーをがんばって作って、自分はへたれじゃないと言い聞かせている人ですか?
139デフォルトの名無しさん:05/01/27 00:12:22
>>138
なにいってんのこの人。
貴方が2chでよく書き込みされている池沼さんですか?
140デフォルトの名無しさん:05/01/27 00:15:44
>139
そいつは使えるものは使えってひねくれて言ったんだろ。人違い。いい加減にID見ないとヤるぞ!
141デフォルトの名無しさん:05/01/27 00:17:15
>>140
IDなんて出てないもん! にゃんにゃん
142デフォルトの名無しさん:05/01/27 00:42:26
コンソールプログラムでの入力で
13.9 12.5
の様な入力を簡単に配列に代入する方法はありますか?

143デフォルトの名無しさん:05/01/27 00:48:00
>>142
それをどういう規則で配列に入れるかによる
144デフォルトの名無しさん:05/01/27 00:49:02
>>142
std::vector<int> v;
std::copy(std::istream_oprator<int>(std::cin), std::istream_operator<int>(), std::back_inserter(v));
とか。
試してないから動くかどうかわからん。
145デフォルトの名無しさん:05/01/27 00:50:01
あ・・・・
×std::istream_operator
○std::istream_iterator
146ヽ(´ー`)ノ ◆.ogCuANUcE :05/01/27 00:51:47
>>137
インスコしなくても、*.hpp コピってくればとりあえずは使えるぞ。
regex とかは無理だけど。

>>142
istream_iterator
147142:05/01/27 00:52:49
レスありがとうございます。

>>143
この場合はfloat型の配列です。

>>144
調べてきます
148デフォルトの名無しさん:05/01/27 01:30:52
>>137
>っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。
>勝手にそんな事ができない場合だってあるだろうに。
できる場合だってあるので
解決法の1つとしてここで提案するのはいいのでは?
もし標準ライブラリの範囲で回答を限定したければ
そういう風に質問すればいいでしょうし
149デフォルトの名無しさん:05/01/27 01:37:04
それを未然に防ぐためにスレタイに【標準C++】って入れたんじゃ
ないだろうか。俺はどっちでもいいと思っているけど。
150デフォルトの名無しさん:05/01/27 01:49:42
そんな理由で【標準C++】を入れろだなんて誰もいってない
厨が勝手につけただけ
151デフォルトの名無しさん:05/01/27 01:55:48
>>149
それはスレ乱立防ぐためじゃなかった?
152デフォルトの名無しさん:05/01/27 02:09:08
>>151
それは【STL含む】では?
153デフォルトの名無しさん:05/01/27 03:11:00
class Singleton {
public:
static Singleton* getInstance();
private:
Singleton();
static Singleton mSingleton;
};
Singleton Singleton::mSingleton;

void main() {
}

というコードを書いたところ
main.obj : error LNK2005: "private: static class Singleton Singleton::mSingleton" (?mSingleton@Singleton@@0V1@A) は既に Singleton.obj で定義されています。
とエラーになります、どこが悪いのでしょうか?
154デフォルトの名無しさん:05/01/27 10:42:00
>153
二重定義のためリンク時エラー。
構築がprivateでいいの?
155デフォルトの名無しさん:05/01/27 10:46:49
>>153
Singleton Singleton::mSingleton; をヘッダに書いてるんじゃないか?

>>154
コンストラクタ private にしないと、 new Singleton がエラーにならない。
156デフォルトの名無しさん:05/01/27 10:57:30
> っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。
> 勝手にそんな事ができない場合だってあるだろうに。

こっちの主張は一理あるが、

> BOOSTで用意された機能すらも自分で実装できないようなへたれか?

こっちは馬鹿丸出しだな
157153:05/01/27 11:02:49
>>155
ヘッダファイルに書いてますがどうしてヘッダファイルに書くと何故駄目なんでしょうか?
158デフォルトの名無しさん:05/01/27 11:06:17
>>157
そのヘッダファイルを2つのソースファイルでインクルードしてたら、
Singleton::mSingleton の定義が2つリンクされるだろ?
C/C++には定義は一つでなければならないというルール(One definition rule: ODR)がある。
159153:05/01/27 11:10:53
なるほど、ありがとうございました
160デフォルトの名無しさん:05/01/27 12:18:45
std::ifstreamで名前付きパイプのファイル名を指定すると読み込めないんですが、
そういうものですか?
(Cのopen() / read()では普通に読めるんですが)
161デフォルトの名無しさん:05/01/27 12:21:13
>>160
C++のfopen()/fread()では如何ですか?
162デフォルトの名無しさん:05/01/27 13:43:20
環境を書いてませんでした  linuxでやってます(kernel 2.4.20/gcc 3.2.2) 。

fopen() / fread()でも読めませんでした。
読めないというか、書き込み側のプログラムを終了させた途端、一気に溜まっていたものが読み出されました。

名前つきパイプのファイルは普通のファイルとは違うので、システムコールのopen()/read()じゃないと、
fifoとしての読み込みは出来ないということでしょうか?



163デフォルトの名無しさん:05/01/27 13:51:58
バッファリング方法を変えろ
164デフォルトの名無しさん:05/01/27 14:39:41
なるほど、指定した長さを読み込むまでブロックされてました。すみません。
fread()でも普通に読めるようになりました。

が、std::ifstreamでは相変わらず読めません。read()で1バイトずつ読もうとしてますが、
そこで止まったままです。
(書き込み側は同じプログラムです)
165デフォルトの名無しさん:05/01/27 21:57:35
最近標準c++の使い方の勉強を始めました。
listとかvectorとか色々便利そうなんですけど、
使い方がいまいちわかりません。

関数とか色々用意されているようですが、
どんな関数があるのか調べる方法はありませんか?
色々ググってみてるんですが、
どうもうまいことひっかかりません。
166デフォルトの名無しさん:05/01/27 22:04:08
167デフォルトの名無しさん:05/01/27 22:05:54
>>165
ぐぐってC++をマスターするのはほとんど無理。
どうしてもと言うなら、
ttp://www.cc.nao.ac.jp/fsunman/japanese/C++_new/index.html
当たりを印刷して、じっくり眺めるんだな。
初心者が陥りやすい落とし穴などは、Effective C++とかC++ FAQのような
本を買って読む方がはるかに良い。
168デフォルトの名無しさん:05/01/27 22:06:19
>>166
テンプレにありましたか・・・申し訳ありませんでした…。

6らへんまで読んで英語で挫折してました・・・・。
169デフォルトの名無しさん:05/01/27 22:38:32
英語で挫折しているようなら、あきらめた方がいいよ。
170デフォルトの名無しさん:05/01/27 23:02:10
とりあえず
Effective C++
More Effective C++
Effective STL
を買ってそれを枕がわりにして寝るとよい
171デフォルトの名無しさん:05/01/27 23:09:51
レスありがとうございます。
明日にでも本屋行ってきます。

英語も頑張ります。
172デフォルトの名無しさん:05/01/28 00:13:05
>>164
これだな。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=5799

fstream "named pipe" でぐぐれば見つかったぞ。
173デフォルトの名無しさん:05/01/28 00:49:03
>>170-171
その前に「プログラミング言語C++ 第3版」読めよ。
174デフォルトの名無しさん:05/01/28 01:05:26
>>173
その前に規格票だろw
175デフォルトの名無しさん:05/01/28 03:29:49
規格票って何だよ
176デフォルトの名無しさん:05/01/28 03:56:56
>>175
無知な奴はすっこんでろ
177デフォルトの名無しさん:05/01/28 05:27:32
>>176
間違いに気付かない奴はぬっこんでろ
178デフォルトの名無しさん:05/01/28 08:37:03
規格票って言葉は間違い?OKでしょ。
俺は使わないけど。
179デフォルトの名無しさん:05/01/28 08:39:39
180デフォルトの名無しさん:05/01/28 11:50:06
>>178
普通、「規格書」 って呼ぶよな。
「票」 では意味が合わない。

ttp://dictionary.goo.ne.jp/search.php?MT=%C9%BC&kind=jn&mode=0
ひょう へう 【票】

1.(名)
  選挙で投票する紙片。また、その数。
  「―を投ずる」「―を読む」「―が伸びる」「浮動―」

2.(接尾)
  助数詞。投票数を数えるのに用いる。
  「わずか五―差で敗れた」
  〔上に来る語によって、「びょう」「ぴょう」ともなる〕

  ――が開(あ)・く
  選挙で、開票が始まる
181デフォルトの名無しさん:05/01/28 12:04:32
182デフォルトの名無しさん:05/01/28 12:25:48
>>180
選挙に関係なく、票とは、何かが書いてある紙きれとかいう意味があるよ。
183デフォルトの名無しさん:05/01/28 12:33:10
まず「規格」があって、「書」とか「票」とか「HTML」とかの形態をとる、
と考えるのがよいと思いました。
184デフォルトの名無しさん:05/01/28 13:03:48
>>182
求人票とか。
185デフォルトの名無しさん:05/01/28 13:57:42
>>180
広辞苑の場合、
1.ふだ。紙片
2.中国で証書・証券、また手紙、紙幣
3.選挙・採決などで意思を表示したふだ
となってるわけだが。ま、いらん恥かいたな
186デフォルトの名無しさん:05/01/28 19:52:21
煮詰まってきたので質問させてください。

配列クラスarrayを、次のように定義します: ※エラー処理等の詳細は省略
template <class T>
class array {
T *data_;
int w_, h_;
public:
array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; };
virtual ~array() { delete[] data_; };
T get(int x, int y) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_]; };
void set(int x, int y, const T& t) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t; };
};
このクラスは2次元配列を1次元配列として実装してあります。
array<int> ia(10, 5);
ia.set(5, 3, 10);
cout << ia.get(5, 3) << endl;
というようにして、値の設定と取得ができます。
これをより簡易な表記ができるよう、[]演算子をオーバーロードしようと思いました。
添字が一つの場合は
T& operator[](int p) { return data_[min(w_*h_, max(0, p))]; };
のように書けるのですが、[]演算子への引数が二つ(xとy)あるケースでどう書けばいいかがわかりません。
ia[5][3] または ia[5, 3]
のような表記ができるようなコードは、どう書けばいいのでしょうか?
187デフォルトの名無しさん:05/01/28 19:57:33
>>186
つMore Effective C++
ただ禿はこういうときは[]なんか使わずに()を使え
188187:05/01/28 19:58:39
って言ってる
189デフォルトの名無しさん:05/01/28 20:00:59
>>187
んなもん誰が信じるかってーのwwww
190デフォルトの名無しさん:05/01/28 20:46:00
>>186
こんな感じかなぁ
添字の指定順序を逆にするともう少しシンプルになる
template <class T>
class array {
T *data_;
int w_, h_;
public:
array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; };
virtual ~array() { delete[] data_; };
T get(int x, int y) {x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_];};
void set(int x, int y, const T& t) {x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t;};
struct Proxy {
T *data_;
int w_ , h_, x_;
Proxy (T *data, int w, int h, int x): data_ (data), w_ (w), h_ (h), x_ (x) {}
T &operator[] (int y) {y = min(h_, max(0, y)); return data_[x_+y*w_];}
};
Proxy operator[] (int x) {x = min(w_, max(0, x)); return Proxy (data_, w_, h_, x);}
};
191デフォルトの名無しさん:05/01/28 21:32:00
>>186

template<typename T2>
class temporary {
  T2* plineData_;
  int index_x_, w_, h_;
public:
  temporary(T2* x, int index_x, int w, int h) : plineData_(x), index_x_(index_x), w_(w), h_(h) {}
  T2 operator[](int y) { return plineData_[index_x_ + y * w_]; }
};

template <class T>
class array {
  : 
  :
  // 追加分
  temporary<T> operator[](int i) {
    temporary<T> tmp(data_, i, w_, h_);
    return tmp;
  }
};

array::operator[]()でいったん別クラスのオブジェクト生成して、さらにそれのoperator[]()を呼んでいる
arrayのw_, h_の役割を交換するともっとシンプルになりそうな気がするが・・・
192デフォルトの名無しさん:05/01/28 23:39:44
Cではマクロ定義に#defineを使いますが
C++ではどうなりますか?そのまま使えますか?
193デフォルトの名無しさん:05/01/28 23:40:33
関数に出来るときは関数にする
194デフォルトの名無しさん:05/01/28 23:44:03
>>192
そのまま使えます
195デフォルトの名無しさん:05/01/28 23:44:47
使えるけどinline,enum,constを代わりにしてもいい
196デフォルトの名無しさん:05/01/28 23:49:43
>>193-195
どうもです。
197デフォルトの名無しさん:05/01/28 23:54:38
ここで同じ質問を最低10回は見たかもしれない。
つまらん。なぜ過去スレを見ないのか。
198デフォルトの名無しさん:05/01/29 00:21:40
見られないからでは? :-)
199デフォルトの名無しさん:05/01/29 01:01:15
テンプレートクラス自作できる人は忍耐強いね。
C++2年やってるけど未だにテンプレートが原因で出たエラーメッセージは分かりにくい。
200デフォルトの名無しさん:05/01/29 01:04:47
>>199
> テンプレートクラス
クラステンプレートだ。間違えるな。
クラスのテンプレートなんだよ?そのテンプレートを元にいろんな種類のクラスを作る
ものだ。
201デフォルトの名無しさん:05/01/29 01:32:46
質問です。

class A
{
protected:
void Hoge() {}
};

class B : public A
{
};

class C : public A
{
public:
void Func(B& b) {
b.Hoge(); // <- これがエラーになる
}
};

こんな感じのソースで、
C::Func() の中から、B::Hoge() を呼び出そうとしたのですが
コンパイルエラーになってしまいました。(VC6)
CはAを継承しているので、A::Hoge()そのものは呼び出せると
思っていたのですがダメなんでしょうか?
202デフォルトの名無しさん:05/01/29 01:34:25
ぷぶぃc
203201:05/01/29 01:43:35
あ、VCスレのほうがよかったですか?
204デフォルトの名無しさん:05/01/29 01:47:35
205201:05/01/29 03:29:40
>>204
ありがとうございます。
英語苦手なのですがこんな感じであってますか?

派生クラスのフレンド関数またはメンバ関数が基底クラスのstaticでない
プロテクトメンバを参照するとき、追加のアクセスチェックがclass.accessで
述べられているものより先に適用されます。
(注:この追加のチェックは他のメンバ、例えばstaticなメンバ変数や列挙された
メンバ定数には適用されません)
メンバへのポインタを生成するときを除いて、派生クラス自身(またはそのクラスからの派生クラス)のオブジェクトやポインタ、参照を通してアクセスしなければなりません。
もしそのアクセスがメンバへのポインタを生成することならば、
nested-name-specifier が派生クラスを明示するものとします。

うーん、へなちょこ訳では理解に苦しむ・・・
とりあえず、例を見る限りではできないのがokということみたいですね。。。うむむ。。。
206デフォルトの名無しさん:05/01/29 03:34:45
>>205
CはAを継承しているが、Bを継承してはいない。
従って、CからはA::Hoge()は見えるが、B::Hoge()は見えない。
それだけの事だ。
207201:05/01/29 03:47:07
>>206
すばやい回答ありがとうございます。

でも、

void C::Func(B& b)
{
  A& b2 = b;
  b2.Hoge();
}

たぶんこれもダメっぽかったんですが・・・CはAを継承してるので
A::Hoge()はよびだせてもよさげなのに・・・納得いきません
208デフォルトの名無しさん:05/01/29 03:52:06
>>206
本当か?public Aをpublic Bにしてもエラーは変わらないぞ。
209201:05/01/29 04:02:38
>>208
C::Func() を 207のように変えてもダメだったというのは確かだと思います。
(今手元にコンパイラがないので記憶頼りのカキコですが。。。)

>public Aをpublic Bにしてもエラーは変わらない

class A;
class B : public A;
class C : public B;

と変更しても、やっぱりC::Func() はエラーになる、ということですか?

うーん、このルールを理解しにくいのは、
おいらの理解しようとする方向がずれてるだけなのかな・・・ムー
210デフォルトの名無しさん:05/01/29 04:04:49
>>207
おそらく>>204は、(実は今JIS-X3014を読んだわけだが)、protectedメンバは、
例えpublic継承が行われていても、もしくはprotected継承でも、自分自身(this)
に対してそのメンバを参照する事は可能だが、基底クラスあるいは自分より上の
クラスのメンバについてはprotected修飾の方が先に効くって事だろう。

例えば
class A {
protected:
int i;
static int j;
void Hoge() {}
};

class B : public A
{
int k;
};

class C : public B {
public:
void Func(B& b) {
b.Hoge(); // <- これがエラーになる
b.i = 1; // エラー
b.j = 2;
b.k = 3; // エラー
}
};
211デフォルトの名無しさん:05/01/29 04:06:16
失礼。ちょっと修正
class A {
protected:
int i;
static int j;
void Hoge() {}
};

class B : public A
{
protected:
int k;
};

class C : public B {
public:
void Func(B& b) {
b.Hoge(); // <- これがエラーになる
b.i = 1; // エラー
b.j = 2; // staticなのでエラーではない
b.k = 3; // エラー
}
};
212デフォルトの名無しさん:05/01/29 04:18:01
もう少しまとめてみよう。
基底クラスAをpublic継承した派生子クラスBをpublic継承した派生孫クラスC
のthisポインタからは、AとBのすべてのprotectedメンバ、publicメンバが見える。

しかし、void Func(B& b)のようなメンバ関数の引数bにはthisポインタが適用さ
れていないので、派生ではない通常の関数のようなアクセス制限を受ける。

但し、特別な例外があり、派生クラス内もしくは基底クラスでfriend宣言された
関数またはクラスからは、staticメンバーのみこの制限が適用されない。
という事か。
213201:05/01/29 04:21:38
>>210
例のコードは理解できます(というかそういうルールがあるのを今学んだんですが)。
でも、thisからだけ参照できるというわけではないと思うんですが・・・
以下のようなコードは結構書いた記憶がありますので。。。

class A
{
protected:
void Hoge();
};

class B : public A
{
public:
void Func(B& b) {
Hoge(); // thisを通しての Hoge()
b.Hoge(); // b を通してのHoge()。ok(のはず・・・)
A& a = b;
a.Hoge(); //<--- これはどうなるんでしょう・・・・?????
}
};


なんか、アタマが寝てるかもしれないので、今日はいったん落ちます。
アドバイスしてくれた方々、ありがとです。

あ、レスがついてるみたいなので、まだ起きてます。
214201:05/01/29 04:23:58
>>213
あれ、もしかしてダメかも。コンパイラが手元に無いのが痛い・・・

>>212
ちょっとじっくり読んでみます。すんません・・・
215201:05/01/29 04:33:04
>>212
なるほど。すっきりしたルールっぽいですね。
でも、やっぱり、thisからしか非静的protectedメンバにアクセスできない
というのがひっかかるので、明日フリーコンパイラでも入れて検証してみます。

いろいろすみませんでした。寝まする・・・
216デフォルトの名無しさん:05/01/29 04:37:08
>>215
寝られましたか。
>>212もまだ間違えてるっぽい。
というのは、>>213のソースをコンパイルしたら、b.Hoge()が通るからです。
どうして>>211のb.Hoge()がだめで、>>213のb.Hoge()はよいのか。まだわかりません。
でも私も頭が寝てきたので寝ます・・・・・
217デフォルトの名無しさん:05/01/29 06:40:31
>>12-17
何度見てもおもしろい。
218デフォルトの名無しさん:05/01/29 08:20:55
>>201
protectedメンバにアクセスできるのは
自分自身と同じ型のポインタ(暗黙のthisを含む)か
参照を介したときのみ。

だから>>213

class B : public A
{
public:
void Func(B& b) {
Hoge(); // thisを通しての Hoge() ヲケ
b.Hoge(); // b を通してのHoge()。 ヲケ
A& a = b;
a.Hoge(); //<--- これはどうなるんでしょう・・・・?????  ダメ
}
};
219デフォルトの名無しさん:05/01/29 08:21:40
>>213
class A
{
protected:
  void Hoge();
};

class B : public A
{
public:
  void Func(B& b) {
    Hoge(); // thisを通しての Hoge() →Aを継承したBクラスから呼ぶからこれはOK
    b.Hoge(); // b を通してのHoge()。ok(のはず・・・) →NGだよ! Aクラスでprotected指定してるから
                             //これがOKだったらメンバカプセル化が出来ないことになる
                             //そしてどのクラスからでもprotected指定のメンバが見えてしまう
                             //ことになる
    A& a = b;
    a.Hoge(); //<--- これはどうなるんでしょう・・・・????? →エラーだよ! Aクラスでprotected指定だから
  }
};
220デフォルトの名無しさん:05/01/29 08:48:10
>>219 ダウト
>b.Hoge(); // b を通してのHoge()。ok(のはず・・・) →NGだよ! Aクラスでprotected指定してるから
これはヲケなの。一辺コンパイルしてみ。

//これがOKだったらメンバカプセル化が出来ないことになる
//そしてどのクラスからでもprotected指定のメンバが見えてしまう
//ことになる
きみ、protectedの意味知ってる?
221デフォルトの名無しさん:05/01/29 11:08:30
昨晩解決しないまま寝てしまった216です。よく寝ましたがまだ解決しません。
class A {
protected:
void Hoge() {}
};

class B : public A {
public:
void Func(B& b) {
b.Hoge(); // OK
}
};

int main()
{
B b;
b.Func(b);
}
が良くて、
222デフォルトの名無しさん:05/01/29 11:09:50
class A {
protected:
void Hoge() {}
};

class B : public A
{
};

class C : public B {
public:
void Func(B& b) {
b.Hoge(); // NG
}
};

int main()
{
B b;
C c;
c.Func(b);
}

がダメなのは、B& bが、Cと同じ型でないからダメだという理解であってるでしょうか?
223デフォルトの名無しさん:05/01/29 11:13:59
>>222
そう。継承関係はあるけどA, B, Cはそれぞれ別のクラスだから他のクラスのprotectedは見えない。
224デフォルトの名無しさん:05/01/29 11:33:07
>>223
ありがとうございました。これでようやく頭の中が整理できました。
225デフォルトの名無しさん:05/01/29 12:03:58
>>220
横から済みませんが
エラー出るんですが
226225:05/01/29 12:06:20
すみません
エラー出てたのb.Hoge(); の方でした
失敬
227225:05/01/29 12:07:27
じゃねa.Hoge();でした
228デフォルトの名無しさん:05/01/29 12:59:11
>>221-222について便乗質問。

>>222のクラス宣言で、

int main()
{
  C c1,c2;
  c1.func(c1);  //これは>>221と同じでOK
  c1.func(c2);  //ここ
}

が、エラーになるような気がするんだが、記憶違いか?
229デフォルトの名無しさん:05/01/29 13:09:14
>>228
そりゃぁ、エラーになるわなぁ。どこにfunc()があるんだ?
230デフォルトの名無しさん:05/01/29 14:03:20
>>228
もともと>>222はダメなケースのサンプルだぞなもし。

それは無視した上で、
もしc1.func(c1)が通るならc1.func(c2)も当然通る罠。
通らんと思う理由は?
231デフォルトの名無しさん:05/01/29 14:10:57
間違ってC言語スレのほうで聞いてしまいましたので、こちらで聞きます

float型をcoutでsetprecisionを使って15桁表示すると、
7桁の制度しかないのに15桁分表示されます
8桁から15桁までの数字はどこを参照して表示しているのでしょうか?
また、7桁の制度しかないものを15桁表示しても問題ないのでしょうか?
232デフォルトの名無しさん:05/01/29 14:27:11
#include <stdio.h>
int main(){
printf("%.30f", 0.1);
return 0;
}
233デフォルトの名無しさん:05/01/29 14:48:19
>>231
もともとfloatに精度なんて期待するな。
234 ◆utqnf46htc :05/01/29 14:49:26
それは言い過ぎ
235デフォルトの名無しさん:05/01/29 15:41:24
同バイト数の整数よりも有効桁数少ないからねぇ。
236デフォルトの名無しさん:05/01/29 16:01:58
同バイト数の整数より有効桁数多かったらビビるよオレ
237デフォルトの名無しさん:05/01/29 16:06:11
わらい
238デフォルトの名無しさん:05/01/29 16:06:25
さざめき
239デフォルトの名無しさん:05/01/29 16:10:19
えいしょう
240デフォルトの名無しさん:05/01/29 16:14:59
いのり
241デフォルトの名無しさん:05/01/29 16:17:04
ねんじろ!
242デフォルトの名無しさん:05/01/29 16:19:25
※ お お っ と ※
243デフォルトの名無しさん:05/01/29 16:19:54
フロートなんて使ったこと無い。
244デフォルトの名無しさん:05/01/29 16:20:47
float は まいそうされます
245デフォルトの名無しさん:05/01/29 16:21:18
C言語だとfloatの立場が悪すぎ。
アセンブラならdoubleよりfloatの方が全然速いのに、
Cで書くと逆になるんだもん。
246デフォルトの名無しさん:05/01/29 16:39:36
だからどうbぇしかつかったことありません。
でもなぜロンgどうbぇが無いのか不思議なのですが。
247デフォルトの名無しさん:05/01/29 16:40:41
>>246の翻訳
だからdoubleしか使ったことありません。
でもなぜlong doubleが無いのか不思議なのですが。
248デフォルトの名無しさん:05/01/29 17:45:34
>>231
途中でdoubleに拡張されているから
249デフォルトの名無しさん:05/01/29 18:07:10
>>248
だからなに?
250デフォルトの名無しさん:05/01/29 18:08:01
>>248
printfだとそうなるけど、iostreamでもそうなの?
251デフォルトの名無しさん:05/01/29 19:39:07
bitsetって個々の要素へのアクセスはboolの配列とどっちが速いですか?
252デフォルトの名無しさん:05/01/29 19:41:12
>>251
要素へのアクセス法にもよると思うけどbitsetが速いんじゃない?
253デフォルトの名無しさん:05/01/29 19:51:47
リードアクセス
 bool[]: メモリ位置の算出→メモリからのロード→決定
 bitset<>: メモリ位置の算出→メモリからのロード→ビット位置によるマスク→決定
ライトアクセス
 bool[]: メモリ位置の算出→データのライト
 bitset<>: メモリ位置の算出→データのロード→ビット位置によるマスク→データのライト

bool[] のほうが速いんじゃないだろうか。
254デフォルトの名無しさん:05/01/29 19:53:36
オレもbool[]の方が速いんじゃねーかと思った

がvector<bool>と比べるんならbitsetの方がはやいんじゃねーかな
255デフォルトの名無しさん:05/01/29 19:55:56
ランダムアクセスするならどっちも同じじゃねーかな
256デフォルトの名無しさん:05/01/29 19:59:09
アクセス法がbitsetのanyみたいな操作だったら
bitsetが速いんじゃないかな?
ちょっと取り込んでるので誰か測定をよろしく
257デフォルトの名無しさん:05/01/29 20:01:49
>>256
質問には「個々の要素へのアクセス」と書いてあるのだ。
258デフォルトの名無しさん:05/01/29 20:16:30
>>257
まぁそうだね
259デフォルトの名無しさん:05/01/29 22:08:50
httpプロトコルでダウンロードを行えて、
LinuxとWindows間でportableなライブラリって何が有名ですか?
260186:05/01/30 08:29:06
レスありがとうございました。More Effective C++買って読んでみました。
Proxy Classというテクニックがあるんですねえ。勉強になりました。
261デフォルトの名無しさん:05/01/30 11:00:14
バイナリファイルを読み出して書き出すという単純なプログラムを製作しているのですが
なぜか特定のバイトを読み飛ばして出力してしまうのです。
いかにソースを書きます(Borland C++ Builderにてコンパイル)

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;


void main(){
ifstream in("bb.swf");
ofstream out("out.txt");

char c;int index = 0;
while(in >> c){
if(index == 16){out << endl;index = 0;}
index ++;

stringstream dusts;
dusts << hex;
dusts.width(2);
dusts << static_cast<int>(static_cast<unsigned char>(c)) << " ";
out << dusts.str() ;
}
in.close();

}

そのような仕様でもあるのでしょうか
262デフォルトの名無しさん:05/01/30 11:15:07
>>261
はい。
263デフォルトの名無しさん:05/01/30 11:18:03
>>261
まずバイナリモードで開いていない。
ifstream in("bb.swf", ios_base::binary);
あと確かoperator >>は空白文字を読み飛ばす仕様だったはず。メンバのget()を使え。

さらに言えばいったんdustsに出力しなくても直接outに吐けば良いと思うのだが。
264デフォルトの名無しさん:05/01/30 11:27:10
こういう処理だと素直にcstdioのfopen()/fread() or fgetc()の方が楽だと思うなぁ。
265デフォルトの名無しさん:05/01/30 12:00:17
ファイル入出力の処理を書く度に、標準C++の限界を感じる
266デフォルトの名無しさん:05/01/30 12:01:29
>>265
具体的に。
267デフォルトの名無しさん:05/01/30 13:32:45
>>266
そうですねぇ、例えばtxtファイルで、数字がスペース以外で区切られている物を
数値へパースする時に、Cなら一発だなぁ…とか良く思います。いや使えば良いんだけど。
268デフォルトの名無しさん:05/01/30 13:37:42
iostreamなんてキモイのはほとんど使ったこと無い。
漢は黙って#include <stdio.h>
269デフォルトの名無しさん:05/01/30 14:34:23
>>268
漢なら他人が作ったライブラリすらも使わずにつくれや。
270デフォルトの名無しさん:05/01/30 14:44:41
>>269
車輪の再生産をするやつぁタダのアフォ。漢ではない。
271デフォルトの名無しさん:05/01/30 14:53:42
>>270
お前は漢を全然理解できてない
272デフォルトの名無しさん:05/01/30 15:01:11
>>271
そんな変態的な漢ならば意味を理解したいとは思わない。
273デフォルトの名無しさん:05/01/30 15:02:56
>>272はヘタレ
274デフォルトの名無しさん:05/01/30 15:09:07
>>269
標準ライブラリやシステムコールのライブラリ抜きに
標準入出力書くのは、かなり困難な上に移植性ゼロではないか。
275デフォルトの名無しさん:05/01/30 15:11:09
C++でJavaで言うsuperを実現するにはどう書いたら良いでしょうか
276デフォルトの名無しさん:05/01/30 15:26:21
>>267
cstdioインクルードファイルがCだとでも?
277デフォルトの名無しさん:05/01/30 15:28:05
まぁ、ぶっちゃけCだな
278デフォルトの名無しさん:05/01/30 15:29:31
>>270
アホな奴だな。
現代の自動車のタイヤは平安時代の牛車の車輪と同じか?
279デフォルトの名無しさん:05/01/30 15:30:34
>>271
オマエガナー
バカは漢ではない。文(既存の資産の活用)武(自分でガシガシ書く)両道してこそ漢。
280デフォルトの名無しさん:05/01/30 15:33:55
>>279
既存の資産の活用を蓑に着て勉強を疎かにする大学生ですか?(藁
281デフォルトの名無しさん:05/01/30 15:37:46
>>278
無駄についてる機能を性能と勘違いする池沼はこれだから困っちゃうよ。
282デフォルトの名無しさん:05/01/30 15:38:29
>>279
青木敦さんのセミナーでも受けてこい。
ちょっとはマシになるかもしれないから。
283デフォルトの名無しさん:05/01/30 15:45:16
>>281
おいおい、なにが無駄についている機能だって?ww
284デフォルトの名無しさん:05/01/30 15:57:15
もしかして必死に検索なんかしちゃったりしてるのかな
285デフォルトの名無しさん:05/01/30 15:59:07
>>277
では、どこからがC++?
286デフォルトの名無しさん:05/01/30 16:03:35
>>283
存在自体が無駄。使わないと出来ない要件などない。
よって>>278は妄想乙
287デフォルトの名無しさん:05/01/30 16:06:51
>>286
なんとも苦々しい反論だなww
まぁ、どちらが妄想癖を持っているか、他の人は解かっていると思うが。
288デフォルトの名無しさん:05/01/30 16:08:11
おまけに有名な人物の名すら知らない無知と来てる。
もう説得力もなにもあったものじゃないよ。
289デフォルトの名無しさん:05/01/30 16:11:04
>>287-288
iostreamじゃないと出来ないことを言ってみろよ池沼
現代の自動車のタイヤなんだろ?w
290デフォルトの名無しさん:05/01/30 16:14:34
>>289
ははwwww
こいつは真性か?!
>>269-289の流れではiostreamの話は既に終わってる事だということにまだ気づいて
いない。
読解力も無いのか…お前は哀れだな。
291デフォルトの名無しさん:05/01/30 16:20:10
ああ、マジで池沼だ。相手の意思も確認せずに勝手に終了にしてるし。
それともこれは降参の意思表示なんだろうか・・・。
292デフォルトの名無しさん:05/01/30 16:20:24
さて、次の話題にいこうか。
293デフォルトの名無しさん:05/01/30 16:21:42
>>291
なんだ、まだいたの?
もう説得力無いんだからさ。
レスすんなよ。な?
294デフォルトの名無しさん:05/01/30 16:23:39
>>278>>283>>287(288) → >>290>>293

流れがメチャクチャ。>>287から>>290の間が抜けてる。
脳に障害のある人なんですかね。それとも別人が混ざってるのか。
295デフォルトの名無しさん:05/01/30 16:28:19
>>281のレスからおかしくなってきているような
296デフォルトの名無しさん:05/01/30 16:29:39
自演乙
297デフォルトの名無しさん:05/01/30 16:30:47
>>295
stdioではiostreamの代わりにはならないという >>278
大して代わらねーよという俺
298デフォルトの名無しさん:05/01/30 16:35:22
C言語の前に日本語がマスターできてないage厨(=>>296?)も逃走したようなので、
次の話題どうぞ↓
299デフォルトの名無しさん:05/01/30 16:35:35
> 大して代わらねーよという俺

俺って言われてもだれかわかんねーよ。
「たいして変わらない」ということは、同じではないことは知ってるんだよな。
その違いが大きいか小さいかは人やプログラムによって違うのが当たり前。

自分と違う答えを認めることができない奴は池沼と言われてもしかたがない。
300299:05/01/30 16:36:11
>>298 スマンカッタ
301デフォルトの名無しさん:05/01/30 16:40:10
>>298
また自演ですか?
302デフォルトの名無しさん:05/01/30 16:43:50
>>301
俺は自演などしない。お前と違って自信があるからな。
それと、お前のmail欄は sage じゃなくて age だろ? age厨君。
303デフォルトの名無しさん:05/01/30 16:45:31
>>300 スマンな。休日だから許してね
次の話題どうぞ。↓
304デフォルトの名無しさん:05/01/30 16:46:05
>>302
また妄想ですか?
305デフォルトの名無しさん:05/01/30 16:50:43
みんな…ごめんね。
実は僕様チャン、学校でいじめられて、ついカッとなって、2chに八つ当たりでレス
つけちゃったんだ。
ごめんなさい…
306デフォルトの名無しさん:05/01/30 18:00:22
>>275
親クラス名::メンバ名
307デフォルトの名無しさん:05/01/30 18:11:49
バカはすっこんでろ
308デフォルトの名無しさん:05/01/30 21:01:58
>>275
『C++の設計と進化』 13.6参照
309デフォルトの名無しさん:05/01/30 22:53:42
その本の名前さ、『C++が糞言語になった理由』のほうが良くない?
310デフォルトの名無しさん:05/01/30 22:55:20
理由を述べよ
311デフォルトの名無しさん:05/01/30 23:43:46
情報処理技術者試験受けるなら何が良い?
312デフォルトの名無しさん:05/01/31 07:06:47
監査
313デフォルトの名無しさん:05/01/31 09:09:46
>>309
たかが言語をそんなにこわがる必要は無いと思いますが :-P
314デフォルトの名無しさん:05/01/31 09:37:45
なんでstringってbeginとendはあるのにfrontとbackが無いの?
ビヤーソの気まぐれ?
frontは別にいらんけどbackは有った方が便利でない?
s[s.size()-1]よりはs.back()の方が便利でしょ?
315デフォルトの名無しさん:05/01/31 10:27:23
>>314
それ、s.size() == 0のときにアウトですけど。
で、s.size() == 0のときにs.back()はどうなって欲しい?
s.back() == s.end()になるんだったらどっちみち使い難いし、例外吐くのも違う気がするでしょ?
だから敢えて実装しなかったんでない?
316デフォルトの名無しさん:05/01/31 10:31:05
0がいいです
317デフォルトの名無しさん:05/01/31 14:33:09
vectorの末尾に要素をたくさん一気に追加したい場合、
vec.insert(vec.end(), datastart, dataend);
copy(datastart, dataend, back_inserter(vec));
どちらが効率がいいですか?
318デフォルトの名無しさん:05/01/31 14:35:58
現在、情報処理2種を持っています。
1種受けようとしたらなくなっていました。
次に情報処理技術者試験受けるなら何が良いでしょうか?
319デフォルトの名無しさん:05/01/31 15:23:35
>>317
std::back_inserterは内部でpush_backを呼んでるから、
insertの方が最適化の余地が大きいとはいえると思う。

効率気にするならreserveを試してみたらどうだろう。
320デフォルトの名無しさん:05/01/31 15:52:50
つーか、やってみてベンチとったほうがはやそうだが。
結局コンパイラとライブラリの実装によるんじゃね?
321デフォルトの名無しさん:05/01/31 16:19:32
insert の方が早いに決まってるだろ
322デフォルトの名無しさん:05/01/31 18:13:57
>>317
sourceがrandom access iteratorの場合にはinsertが領域確保を
1度で行っている可能性があるから、insertの方がマシそう。
323デフォルトの名無しさん:05/01/31 18:16:13
std::vector<int> vec;
std::vector<int>::iterator it,itend;
vec.push_back(0);
vec.push_back(1);
itend=vec.end();
for(it=vec.begin();it<itend;it++)
{
 vec.erase(it);
}
要素が全部消えるときに落ちてしまいます。
何がいけないのか教えてください。
環境はVS.net2002です。
お願いします。
324デフォルトの名無しさん:05/01/31 18:23:13
>>323
vectorは要素を追加したり削除するとそれまでのイテレータは無効になる。
325デフォルトの名無しさん:05/01/31 18:24:13
>>323
erase(it)の後はitが無効になるから、
it = erase(it);
とすると良い。
それから、eraseによってendが変化するかも知れないのでので、
itendも無効になる可能性がある。
よって、
for(it=vec.begin(); it != vec.end(); ++it)
{
  it = vec.erase(it);
}
326ヽ(´ー`)ノ ◆.ogCuANUcE :05/01/31 18:24:25
>>323
erase したら it 使ったらアカンよ。

vec.clear();
vec.erase(vec.begin(), vec.end());
327デフォルトの名無しさん:05/01/31 18:47:56
323です。
皆さんありがとうございました。
328デフォルトの名無しさん:05/01/31 20:41:22
>>315
何いってんの?
vectorでもlistでもs.size() == 0の時アウトだろ。でも実装はされてる。
329デフォルトの名無しさん:05/01/31 21:14:46
>>325
無条件に++したらだめだよ
330デフォルトの名無しさん:05/01/31 21:49:16
配列→vectorへの変換はどうすれば良いでしょうか?
例えば、
int a[50];

vector<int> b;
のbに入れるための最も効率的な方法は何ですか?
331デフォルトの名無しさん:05/01/31 22:04:25
>>330
b.resize(50);
memcpy(&b[0], a, sizeof(int)*50);
332デフォルトの名無しさん:05/01/31 22:06:48
podならinsert(end()…)でも勝手にmemcpyしてくれるんじゃないんだろうか。
333デフォルトの名無しさん:05/01/31 22:08:32
>>332
insertじゃ元のが消えないからassignな。
334デフォルトの名無しさん:05/01/31 22:26:17
みんな意地悪だねぇ

>>330
int a[50]; vector<int> b;
b.assign(a, a + sizeof(a) / sizeof(a[0]));
または
b.assign(a, a + 50);
335デフォルトの名無しさん:05/01/31 22:42:38
>>331-334
教えてくださってどうもありがとうございます。

b.assign(a, a + 50);
が一番自然な気がしました。
これが思い付かなかったのですorg
336デフォルトの名無しさん:05/01/31 22:43:17
>>335
effective stl読んだ方がいいかと
337デフォルトの名無しさん:05/01/31 22:51:07
>>336
一応持っているのですが、第16項にそれらしいことが書いてありますね。
338デフォルトの名無しさん:05/01/31 22:53:43
どちらかというと第5項かな?
339デフォルトの名無しさん:05/01/31 23:04:59
>>338
なるほど。
実装上はイテレータがポインタは同じものである、ということを知った上で
第5項を読めば良いわけですね。
初心者にご丁寧にしていただきありがとうございました。
340デフォルトの名無しさん:05/01/31 23:13:32
「実装上は」じゃないぞ、むしろ「使用上は」だ
341デフォルトの名無しさん:05/01/31 23:16:28
>>340
どういうこと?
イテレータの実装にポインタ使ってるんだろ。
342デフォルトの名無しさん:05/01/31 23:19:48
今後イテレータがポインタじゃなくなっても文句は言えないってことだな
343デフォルトの名無しさん:05/02/01 00:11:01
>>342
その通り。
344デフォルトの名無しさん:05/02/01 00:20:29
つーか今でもイテレータがポインタじゃない実装はある。
345デフォルトの名無しさん:05/02/01 00:38:42
listとvectorでは前者の方が要素の追加・削除を頻繁に行う場合には速いと聞いたんですが、
両者それぞれのオブジェクトでpush_backとpop_backをたくさん繰り返して時間を計測してみると、
明らかにvectorの方が速いようなんですが、これはどういうことなんですか?
346デフォルトの名無しさん:05/02/01 00:41:05
リストの途中へのinsertや途中要素のeraseはlistの方が早い
末尾への追加削除はvectorの方が早い
347デフォルトの名無しさん:05/02/01 00:44:07
>>346
ありがとうございます。
348デフォルトの名無しさん:05/02/01 00:54:58
そりゃオデレータ
349デフォルトの名無しさん:05/02/01 02:45:33
スレ違いであればすいません。
あるクラスのメンバ関数で定義したスレッド処理関数を、_beginthreadex関数などで呼び出すことはできないのでしょうか?
VC++6.0でコンパイル時、error C2276: '&' : 仮想関数のアドレスを取ろうとしました。
というエラーが出てしまいます。
具体的には以下のようになります。

class ClassA{

 HANDLE hThread; /* スレッドハンドル */
 WORD dwThreadID; /* スレッドID */

 UINT WINAPI ThreadFunc( void *Param ) /* スレッド処理関数 */
 {
  ・・・
 };

public:
 void ThreadStart() /* スレッド開始用関数 */
 {
  ・・・
  hThread = (void*)_beginthreadex( NULL,
                        0,
                        &ThreadFunc, /* ここがマズイようです */
                        NULL,
                        0,
                        (unsigned *)&dwThreadID
  );
 ・・・
};

ちなみに、このスレッド処理関数をクラスの外(グローバル)で定義した場合は、問題なくコンパイルでき実行できます。
350デフォルトの名無しさん:05/02/01 02:57:10
>>349
ThreadFuncをstaticにするか、beginthreadexを諦めてboost::threadでも使え
351デフォルトの名無しさん:05/02/01 02:59:24
unsinged __stdcall DummyFunc(void* Param)
{
return reinterpret_cast<ClassA*>(Param)->ThreadFunc(Param);
}

void ClassA::ThreadStart()
{
hThread = (HANDLE)_bebinthreadex(NULL, 0, &DummyFunc, (void*)this, ...);
}

メンバ関数ポインタを直接コールバック関数として渡すことは出来ない。
352デフォルトの名無しさん:05/02/01 03:15:39
>>350
>>351
なるほど、ありがとうございました。
勉強になりました。
353デフォルトの名無しさん:05/02/01 12:54:54
boostのfunctionみたいに、
function<void (const T &)> f; は function1<void, const T &> f;
function<void (int, int)> g; は function2<void, int, int> g;
というように、templateの数に応じて別のクラスに置き換える方法ってどうやるの?
354デフォルトの名無しさん:05/02/01 13:17:50
マクロ
355デフォルトの名無しさん:05/02/01 13:37:08
>>353
boostのソース嫁
356デフォルトの名無しさん:05/02/01 13:57:41
>>354-355
一度読もうとして挫折したorz
もう一度tryしてみるか……
357デフォルトの名無しさん:05/02/01 14:43:21
358デフォルトの名無しさん:05/02/01 15:44:43
>>357
変態だ、わはは
359デフォルトの名無しさん:05/02/01 16:02:36
ofstreamで追記オープンできませんか?
360デフォルトの名無しさん:05/02/01 16:03:10
できます
361デフォルトの名無しさん:05/02/01 16:17:12
ググッたらios::appですた。有難うございました。
362デフォルトの名無しさん:05/02/01 17:05:29
"Newmat" (C++ matrix library)では複素エルミート行列の対角化までできますか?
知っている方、教えてください。お願いします。
363デフォルトの名無しさん:05/02/01 17:16:40
>>362
自分で作っちゃったら?
364デフォルトの名無しさん:05/02/02 10:37:51
ofstreamにマルチスレッドでカキコしても大丈夫でつか?
365デフォルトの名無しさん:05/02/02 11:51:33
ofstreamの実装によるんじゃないのかな
366デフォルトの名無しさん:05/02/02 11:53:06
>>364
仕様上、大丈夫です。
367デフォルトの名無しさん:05/02/02 11:56:47
>>366
ウソ書くな。
368デフォルトの名無しさん:05/02/02 11:58:42
>>367
なんだとこのやろ
369デフォルトの名無しさん:05/02/02 13:29:51
スレッドの概念が標準ライブラリに無かった気がするのでだめなんじゃない?
370デフォルトの名無しさん:05/02/02 13:37:05
>>369
そういう物じゃない。
371デフォルトの名無しさん:05/02/02 13:53:58
>>369
標準ライブラリのデフォはスレッドセーフ。
372デフォルトの名無しさん:05/02/02 14:02:07
>>371
んなことない。実装依存。
373デフォルトの名無しさん:05/02/02 14:05:38
スレッドセーフいって言ってる香具師はソースはどこなの?
374デフォルトの名無しさん:05/02/02 14:11:23
どっちなんだ〜〜
375デフォルトの名無しさん:05/02/02 14:16:14
例えばVC++7.1ならヘルプの[Thread Safty in the Standard C++ Library]という項目に説明がある。
自分が使ってる処理系のマニュアル読むか、ソース辿れ。
376デフォルトの名無しさん:05/02/02 14:23:48
#include <iostream>
#include <boost/thread.hpp>

void f()
{ for (;;) std::cout << "ぬるぽ" << std::endl; }

void g()
{ for (;;) std::cout << "ガッ" << std::endl; }

int main()
{
    boost::thread th1(&f);
    boost::thread th2(&g);

    th1.join();
    th2.join();

    return 0;
}

VC7.1
結果:激しくsynchronized
377デフォルトの名無しさん:05/02/02 14:26:05
ofstreamかよorz
378デフォルトの名無しさん:05/02/02 16:00:41
マジレス。標準C++にスレッドの概念は存在しない。と言うことで
激しく実装依存。つまりスレ違い。
379デフォルトの名無しさん:05/02/02 16:09:53
質問があります。
private継承というのは、継承元クラスでpublic/protectedだったメンバが、継承先では
privateメンバとなる継承だと勉強しました。

ところが実際にコードを書いてみると、private継承をした場合に、
継承先のメンバ関数から、継承元のpublic/protectedだったメンバにアクセスできるのです。
これはどういうことなのでしょうか、教えてください・・・。
環境は、VC++.NET2003です。
380デフォルトの名無しさん:05/02/02 16:15:47
>>379
オマイさんの中で何がどう矛盾してるんだ?
継承先ではprivateにちゃんとなってる。
何が疑問なんだよ
381デフォルトの名無しさん:05/02/02 16:17:12
>>379
考えてみて笑ってもらいたいんだが、「private継承をした場合に、継承先の
メンバ関数から、継承元のpublic/protectedだったメンバにアクセスでき」
なかったとしたら、派生元のクラスはどうやって使われることになるんだい?
382デフォルトの名無しさん:05/02/02 16:20:25
>>381
何で、親から親のPrivateを覗けるんだ?失礼だろう、
friendの使い方をまちがっとる、友達は親だけの関係だよ、
383379:05/02/02 16:30:21
>>380
継承元でprivateだったメンバには、継承先からはアクセスできないと思っているのですが、、、
(a)継承元でprivateで、継承先でprivate
(b)継承元でpublicで、継承先でprivate
の2つのメンバがあって、(a)はアクセスできず、(b)はアクセスできるのは変だなと。

>>381
そのことも頭をよぎったのですが、まだ自分の知らない謎の機能で何とかなるのかなと思ってました。
384デフォルトの名無しさん:05/02/02 16:37:57
こいつアホ?
385デフォルトの名無しさん:05/02/02 16:43:45
>>383
君が「習った」と言っているのは外から見たaccessibilityの話だよ。
386デフォルトの名無しさん:05/02/02 16:53:28
>>383
class Foo {
public: int Num;
};
class Bar : private Foo {
public: double x;
};
class Hage : protected Bar { };
class Hoge : public Bar {
public:
  void Set(int n, double d) {
    x = d;   //protectedなのでOK
    Num = n; //privateなのでエラー
  }
};

int main() {
  Bar b;
  b.x = 1; //これも当然エラーになる。Numも同様。
}
387379:05/02/02 17:20:28
>>385
外から見たaccessibilityと、中から見たaccessibilityがあるのですか!
ありがとうございました、なんとなく分かりかけてきました。

>>386
> b.x = 1; //これも当然エラーになる

b.xは、外から見たaccessibilityはpublicなので、エラーにはならないのでは?
388デフォルトの名無しさん:05/02/02 17:24:51
>>387
ごめん。b.xは通る。脳内ではHogeのつもりだった。
389デフォルトの名無しさん:05/02/02 17:24:53
>>376
VC7.1で混ざったぞ。どうしてくれる。
390デフォルトの名無しさん:05/02/02 17:30:02
グローバル変数のstd::vectorをマルチスレッドのコールバック関数内で
push_backしたいのですが、スレッドセーフでありません。
LONGならInterlockedとかがありますが、std::vectorの場合は
どうすればスレッドセーフになりますか?
std::vector<int> g_vec;
・・・
HRESULT WINAPI MsgHandler(・・・)
{
int i;
・・・
g_vec.push_back(i);
・・・
}
ご助言お願いします。
391デフォルトの名無しさん:05/02/02 17:33:59
>>376
ぬるぽ
ガッ
ガッ
ぬるぽ
ぬるぽガッ

ガッ
ぬるぽ
ガッぬるぽ




VC7.1だとこんな感じで改行が連続したりするのでロックしないと駄目
392デフォルトの名無しさん:05/02/02 17:34:29
>>390
クリティカルセッションとかは?
393デフォルトの名無しさん:05/02/02 17:34:29
>>390
スレッドは標準じゃないからスレ違い
394デフォルトの名無しさん:05/02/02 17:35:38
>>392と同じレベルのバカ多すぎ

google
クリティカルセッション…324件
クリティカルセクション…856件
395デフォルトの名無しさん:05/02/02 17:37:05
おい、本書いてる香具師が間違えてるぞ…

> 『Java謎+落とし穴徹底解明』の256ページに
> "クリティカルセッション(critical session)"と書かれていますが、
> "クリティカルセクション(critical section)"が正しいのでは?

そうですね。Sunの文書で、たとえばJava tutorialを見ても、
critical section になっています。

http://java.sun.com/docs/books/tutorial/essential/threads/multithreaded.html

もう正直に告白してしまいますが、私はごく最近まで、これは
cirtical session だと思い込んでいました。

ちょっと前、某掲示板で「クリティカルセクション」と書いてあるのに
気付いてGoogleしてみたら、「critical section」の方がヒット数が
多い。

実は「クリティカルセッション」がこの意味で使われているページも
結構あったりしますが、今回改めて確認したところ、やはりどう見ても
critical sectionが正解ですね。

正誤表に入れておきます。

まったく、思い込みというのは恐ろしいものです。ご指摘ありがとう
ございました。



396デフォルトの名無しさん:05/02/02 17:37:24
>>394
オマイな、クリティカルセッションを真顔で言う香具師がいると本気で信じてんのかと
397デフォルトの名無しさん:05/02/02 17:46:11
>>388
了解しました!ありがとうございました。
398デフォルトの名無しさん:05/02/02 17:53:32
#include <fstream>
#include <boost/thread.hpp>
#include <boost/ref.hpp>
#include <boost/bind.hpp>

void f(std::ofstream& ofs, int count)
{ for (int i = 0;i < count; ++i) ofs << "ぬるぽ" << std::endl; }

void g(std::ofstream& ofs, int count)
{ for (int i = 0;i < count; ++i) ofs << "ガッ" << std::endl; }

int main()
{
    std::ofstream ofs("a.txt");

    boost::thread th1(boost::bind(&f, boost::ref(ofs), 100000));
    boost::thread th2(boost::bind(&g, boost::ref(ofs), 100000));

    th1.join();
    th2.join();

    ofs.close();

    return 0;
}

VC7.1
結果:???
operator<<はアトミックってこと?
399デフォルトの名無しさん:05/02/02 17:57:21
それも実装依存だから帰っていいよ
400デフォルトの名無しさん:05/02/02 18:00:28
なんだboostって標準C++にそんな関数ないぞ
401デフォルトの名無しさん:05/02/02 18:09:26
なんだクリティカルセクションって標準C++にそんな関数ないぞ
402デフォルトの名無しさん:05/02/02 18:10:23
なんだスレッドって標準C++にそんな概念ないぞ
403デフォルトの名無しさん:05/02/02 18:16:56
馬鹿か?C++に標準は無いぞw
404デフォルトの名無しさん:05/02/02 18:19:28
405デフォルトの名無しさん:05/02/02 18:20:36
標準 C++
ISO C++ 標準規格で指定されている C++ 言語。
406デフォルトの名無しさん:05/02/02 18:23:50
ただし大多数は日本在住と思われるなのでJIS X3014も可。
407デフォルトの名無しさん:05/02/02 23:26:03
COMはありですか?

VC6 でMSXML使ってます。

XML形式の書き出しは何とかできたんだけど、出力が1行になっちゃいます。
複数行に出力されるようなフラグとかあるんですか?

現状
<?xml 略?>
<root><a><b>text</b></a></root>

理想
<?xml 略?>
<root>
タブ1個<a>
タブ2個<b>text</b>
タブ1個</a>
</root>
408デフォルトの名無しさん:05/02/02 23:31:46
なしです
409デフォルトの名無しさん:05/02/03 00:38:23
ファイルを検索する場合、Win32ではFindFirstFileとか使うけどコレだとLinuxでコンパイルできない。
C++標準ライブラリではファイル検索はサポートされているのでしょうか?
#つまりC++標準ライブラリで移植性が得られるのでしょうか


410デフォルトの名無しさん:05/02/03 00:42:56
>>409
いいえ。
ファイルシステム関連は環境依存です。
なぜなら、実行環境がファイルシステムを持たない場合も考えられるからです。
411デフォルトの名無しさん:05/02/03 00:45:16
クマー
412デフォルトの名無しさん:05/02/03 00:46:37
×なぜなら
○また
413デフォルトの名無しさん:05/02/03 00:49:31
>>410
なるほど。ありがとうございます。
414407:05/02/03 01:00:54
ナシカヨ。どこかスレあれば誘導plz
415デフォルトの名無しさん:05/02/03 01:12:27
416407:05/02/03 01:20:53
>>415
さんく。行ってくる
417デフォルトの名無しさん:05/02/03 11:54:07
std::pairがコピーコンストラクタは書いてあるのに、代入演算子は書いてないのはなぜですか?
418デフォルトの名無しさん:05/02/03 13:19:25
>>417
各メンバのoperator=を呼ぶコードをコンパイラが勝手に作ってくれるから。
419デフォルトの名無しさん:05/02/03 13:37:34
メンバがpublicだからですね!!!
420417:05/02/03 14:28:04
>>418>>419
コピーコンストラクタが書いてある理由は何でしょうか?
試しにコピーコンストラクタとテンプレート版コピーコンストラクタ?を消してみて、
pair<int, ini> pair1(0,0);
pair<int, int> pair2(pair1);
とやってみたところ、問題なく動いてるように見えるのですが・・
421デフォルトの名無しさん:05/02/03 14:46:48
>>420
> 問題なく動いてるように見えるのですが・・
本当に?嘘付いたら10000回殴って針を1000本飲んでもらうよ?
422デフォルトの名無しさん:05/02/03 17:39:18
>>420
コピーコンストラクタがないと、デフォルトコンストラクタ→operator=と呼ばれて無駄ができるからだろ、多分。
423デフォルトの名無しさん:05/02/03 18:04:57
(・∀・)
424デフォルトの名無しさん:05/02/03 18:21:34
>>422
おいおい(w
425デフォルトの名無しさん:05/02/03 18:45:17
pair<char*, char*>
さあコピーコンストラクタ消して使いまくってくれ
426デフォルトの名無しさん:05/02/03 18:52:26
template <typename T>
class C
{
public:
explicit T(T const & source)
: ptr(boost::addressof(p))
{}

T const & operator=(T const & source) {
this->ptr = boost::addressof(source);

return *this->ptr;
}

private:
T const * ptr;
};

int a;
C<int> ca(a);

a += 2;

とかやったら、C<T> に operator+= やらがないって怒られるわけだが、
これってどうにかして回避できない?

基本形は特殊化で対応すればいいけれど、T が operator+ を持ってた場合とかは
どう対応すればいいんでせう?
427デフォルトの名無しさん:05/02/03 19:30:08
>>426
うまくいえないんだけど、なんだかひどく間違っているような気がする
428417:05/02/03 20:39:17
>>421
そ、そこまで言われると自信ないです。
>>425
ポインタの場合、同じ領域を2つのpairが持つことになってまずいということでしょうか?
でもpairのコピーコンストラクタって、
pair(const pair& p)
: first(p.first), second(p.second)
{ ; }
これだけなんですよね。
これでは、書かない場合と同じだと思うのですが、私の理解が間違っているのでしょうか?
429デフォルトの名無しさん:05/02/03 21:07:24
コピー・コンストラクタを明示的に書くことで、
コンストラクタのない、あるいはprivate/protectedになっていて呼び出せないクラスが
要素になることを防止する、というのはどうだろう?
430デフォルトの名無しさん:05/02/03 21:07:32
>>428
ちなみに vc7.1 についてる stl だと、
std::pair のコピーコンストラクタはコンパイラ自動生成のものですよ。
431417:05/02/03 21:39:00
>>429
なるほど。
>>430
環境によって違うんですね。
ちなみにbcc5.5でした。


あまり気にしなくて良さそうですね。
皆様ありがとうございました。
432デフォルトの名無しさん:05/02/03 22:25:59
>>425
おいおい(w
433デフォルトの名無しさん:05/02/03 22:43:25
425の意味がわからない。
434デフォルトの名無しさん:05/02/03 23:02:40
>>425
解説キボン
435デフォルトの名無しさん:05/02/04 02:02:50
>>425
早く謝れよ
436デフォルトの名無しさん:05/02/04 02:20:04
>>425
マジで出島?
437デフォルトの名無しさん:05/02/04 02:23:03
pair<char*, char*>("うるせーよ", "糞ども");
438デフォルトの名無しさん:05/02/04 05:06:53
無名namespaceとstaticはどういう風に使い分けたらいいですか?
439マイク ◆yrBrqfF1Ew :05/02/04 05:55:09
使い分けるも何も無名namespaceだけでいいだろ。
440デフォルトの名無しさん:05/02/04 07:09:35
>>438
ファイルローカルと言う意味なら、基本は無名namespace。
内部リンケージであることが重要ならばstatic。
441デフォルトの名無しさん:05/02/04 08:29:03
>440
なんでそんな使い分けが必要?
442デフォルトの名無しさん:05/02/04 09:30:55
あげ
443デフォルトの名無しさん:05/02/04 10:19:13
髭がなくなってる・・・
ていうか若い!
444デフォルトの名無しさん:05/02/04 10:45:44
逆コンパイルってどうやるんだ?
445デフォルトの名無しさん:05/02/04 12:40:44
>>438
無名namespaseにするのが原則。
staticを関数・クラス内の静的変数・関数の指定の役割だけにするために無名namespaseが作られたのだから。
446デフォルトの名無しさん:05/02/04 15:37:46
クラスのメンバ変数の値によって、返値の型を変えるにはどうすればいいの?
447デフォルトの名無しさん:05/02/04 15:45:41
>>446
無理。
代わりにvoid *を引数に取るとか、テンプレートにした上でtypeidで照合するとかをやりな。
448デフォルトの名無しさん:05/02/04 16:23:46
すると、演算子のオーバーロードで返値を変える方法はないということになるな。鬱だ
449デフォルトの名無しさん:05/02/04 16:27:11
template+特殊化で大体のところはできると思うが。
450デフォルトの名無しさん:05/02/04 17:02:33
template <typename T> class A { // 詳細省略
 bool b_;
public:
 _???_ operator=(const T &_)
 {
  if (b_)
   return (T型オブジェクトへの参照);
  else
   return (S型オブジェクト実体);
 };
};

演算子のオーバーロードを行うとき、メンバ変数i_の値に応じて
返値の型を変えたい(参照かポインタか実体かも)。
templateの特殊化だと、Tの型に応じて(template<> class A<int>など)
オーバーロードしたメソッド内での挙動を変えることができるという認識なんだけど
こういう、変数値に応じて返値の型が変わる場合にも使えるの?
451デフォルトの名無しさん:05/02/04 17:05:13
i_じゃなくてb_にしたんだった。
一週間くらい悩んでいるので意味不明なことをほざいてるかもしれません
452デフォルトの名無しさん:05/02/04 17:57:58
MSXMLが

MSX ML

に見えて(・∀・)と思った

MS XMLね。
453デフォルトの名無しさん:05/02/04 18:17:48
vectorクラスについて質問です。

前置き:
file1にはテキストが80行
file2にはテキストが60行
file3にはテキストが30行

処理:
ファイルのテキストを1行ずつ読み込んでstringのvectorに追加。
読み込み終わったらそのデータに3行新たなテキストを追加し、
file1_1として出力。file2,3も同様にこれを行なう。

この処理をやろうとすると、
file2_1にfile1の内容が一緒に追加されてしまうのです。
つまりfile2_1の内容が
---
file1の内容
file2の内容
追加テキスト
---
になってしまうのです。
ループごとにclear()をし、追加にはpush_back()を使っています。
なぜこうなってしまうのでしょう?
454デフォルトの名無しさん:05/02/04 18:20:13
>>453
ソースがないと解からない。
455デフォルトの名無しさん:05/02/04 18:22:23
>>453
streamをcloseしてないとか。
456453:05/02/04 19:10:27
ごめんなさい。
オブジェクトの初期化をし忘れているという
単純なミスでした。解決しました。

>>454
>>455
本当にごめんなさい。ありがとうございました。
457デフォルトの名無しさん:05/02/04 20:07:17
おーい、だれかアドバイスください。
44歳のおったんだが、プログラム大好きです。
仕事ではコボラーだったが、VB、Java、C、C++を
自学した。
でもって、C++をこれから先専門にやろうと思って
IT企業の中途採用を訪ね歩くが、44歳からでは
無理でしょうと冷たい。
それで、独立してやろうと思うが、一人で受けら
れるようなC++の仕事ってどんなのがある。
なんでもいいからヒントになるようなこと教えてください。
458デフォルトの名無しさん:05/02/04 20:12:24
無い、言語指定するやつは要らない。というか、
仕事に従って言語選べるやつじゃないと使えない。
459デフォルトの名無しさん:05/02/04 20:18:45
>>457
そうだな、お前は入力でもやってろ。
460デフォルトの名無しさん:05/02/04 20:56:37
>>457
m9(^Д^)プギャー
461デフォルトの名無しさん:05/02/04 21:40:15
>>459
マ板へどうぞ
462デフォルトの名無しさん:05/02/04 21:49:03
>>457
シェアウェア作家
463デフォルトの名無しさん:05/02/04 22:35:35
>>457
ロートルになるまでガンバレ
464デフォルトの名無しさん:05/02/04 23:34:32
>>457
あんたが使い物になるならうちの会社で面倒見てやる。
雇用でも契約でもいいぞ。だが、言語知識しかアピールできないなら門前払いだ。
44歳なら44歳なりのアピールの仕方があるだろ?
465デフォルトの名無しさん:05/02/05 00:03:09
>464
NEET乙
466デフォルトの名無しさん:05/02/05 00:09:27
>>465
俺超エリート中学生。お前なら俺の子分にしてやってもいいぞ。
467デフォルトの名無しさん:05/02/05 00:12:40
>>468
細木数子乙
468デフォルトの名無しさん:05/02/05 00:15:37
>>467
ずばり言うわよ
469デフォルトの名無しさん:05/02/05 00:15:40
>>450
動的に切り替えるのは無理だし,operator=のオーバーロードもあいまいなので無理。
どういうことがしたいのかもっと具体的に例をあげて言ってみ。
470デフォルトの名無しさん:05/02/05 00:17:48
>470VIPPER乙wwwwwwwwwっうぇwwwwwwwwww
471デフォルトの名無しさん:05/02/05 00:48:53
c++は構造体の間接関数呼び出し、馬鹿っぽい
472デフォルトの名無しさん:05/02/05 02:12:22
馬鹿っぽい日本語ですね
473デフォルトの名無しさん:05/02/05 03:07:23
>>468
おながいします
474デフォルトの名無しさん:05/02/05 07:06:00
>>450
そのboolをテンプレート引数にして特殊化する、ってのはだめ?
475デフォルトの名無しさん:05/02/05 10:30:55
>>474
コンパイル時に決定するならいいけど、動的には無理だお。
476デフォルトの名無しさん:05/02/05 12:42:31
> 基底クラスのデストラクタは、public かつ virtual であるか、
> あるいは、protected かつ非 virtual であるべき。

ってどういうことですか?
477デフォルトの名無しさん:05/02/05 12:44:08
>>476
デストラクタ virtual
で具ぐれ。
死ぬほど出てくるから。
478デフォルトの名無しさん:05/02/05 13:07:04
>>441
現状、無名namespaceとC言語の(C++が継承している)staticは同じ意味にはならず、
大きな違いがリンケージであるから、です。
479476:05/02/05 13:07:45
>>477
死ぬほど出てきました。

デストラクタが virtual でない基底クラスのポインタが
派生クラスを指す時に delete するとやばいから、
デストラクタを virtual にしてそんな時も安心にするか、
もともと delete 禁止にしておけってことだったんですね。

ありがとうございました。
480マイク ◆yrBrqfF1Ew :05/02/05 13:13:18
ファイルローカルという概念は初耳だな。
481デフォルトの名無しさん:05/02/05 13:29:32
>>480 C言語からやり直せ。
482マイク ◆yrBrqfF1Ew :05/02/05 13:34:23
君がやり直した方がいいんじゃないか?(▽
483デフォルトの名無しさん:05/02/05 13:41:56
>>480-482 雑談するならマ板にでも逝って下さい。
484デフォルトの名無しさん:05/02/05 18:05:31
こんにちは。
namespace名の一文字目は大文字か小文字かどちらがいいでしょうか?
485デフォルトの名無しさん:05/02/05 18:17:26
>>484
クラスの命名で大文字を使っているなら、大文字で良いと思う。
486デフォルトの名無しさん:05/02/05 18:27:25
JavaやD風に全部小文字
487デフォルトの名無しさん:05/02/05 18:30:53
>>485
レスサンクスです、クラスは大文字なので、そろえた方がいいですよね。

>>486
JavaやDは小文字なのですか、サンクスです。
488デフォルトの名無しさん:05/02/05 18:42:05
>>484
頼むから、大文字Cで始めるのだけはやめてくれ。
#CWindowPosって名前のnamespaceを作った香具師がいるんだ。
##恐らく元はクラスのつもりだったのだろう。
489デフォルトの名無しさん:05/02/05 18:47:23
先頭大文字だと打ちにくいんだよな…

>>488
ハンガリアン恐るべし……
490デフォルトの名無しさん:05/02/05 18:59:23
ハンガリアン記法だとNか?
491デフォルトの名無しさん:05/02/05 22:12:42
>>490
Microsoft のライブラリでも、さすがに namespace まではハンガリアンしてない。
代わりに using namespace しちゃってるから意味ないが(例: WTL)
492デフォルトの名無しさん:05/02/06 00:45:02
>490
nsHoge ジャマイカ
493デフォルトの名無しさん:05/02/06 00:54:42
キモ過ぎる
MSってまだハンガリアンなの?
494デフォルトの名無しさん:05/02/06 01:30:38
.NETは違うよ。
495デフォルトの名無しさん:05/02/06 02:52:04
とりあえず別クラスにして逃げました>返値の型 スマートじゃないけど……。
別案件が一段落したらまた考え直します(´д`)
496デフォルトの名無しさん:05/02/06 07:39:43
> 演算子のオーバーロードを行うとき、メンバ変数i_の値に応じて
> 返値の型を変えたい(参照かポインタか実体かも)。
なんでそんなことをせねばならない状況になったのか詳しく
497デフォルトの名無しさん:05/02/06 16:57:26
誤爆?
498デフォルトの名無しさん:05/02/07 09:24:18
もうね、こんなに拡張するくらいなら、boost って言語を作ればいいんだよ。




とは、口が裂けてもいえない。
499デフォルトの名無しさん:05/02/07 09:25:09
激しく誤爆スマソ...
500デフォルトの名無しさん:05/02/07 13:29:06
>>496
車輪の再発明をやろうとしてました。
↑の方かtemplateスレのどこかにも過去の発明者のpdfが上がってましたが
いわゆる「propertyクラステンプレート」です。
コンストラクタで(propertyを使用する)クラスのインスタンスへのポインタと
get/set/[]/[][]/[][][]……のメソッドへのポインタをそれぞれ受けておき
operator T()のオーバーロードでgetメソッドを、
operator=(const T&)のオーバーロードでsetメソッドを、
T& operator[]のオーバーロードで[]指定を、
proxyクラス(>>186-191とMore Effective C++/テクニック)を使って[][]指定を
それぞれ実装しようとしました。
ところが、operator[]はデータメンバへの参照を返し、
その参照に対しget/set等を適用するわけですが
[][]の場合は一度proxyクラスを返し、
そのproxyクラスでデータメンバへの参照を返すことになります。
ひとつのpropertyクラスで[]と[][]を併用する場合、
メンバ変数(あるいはtemplateのtypenameのtypeid)の値に応じて
operator[]の返値の型を、T&かproxyクラスかを変える必要があります。

書いてて返値の型もtemplateにすればいいという気がしてきた……。
501デフォルトの名無しさん:05/02/07 14:39:19
これか。
http://pc5.2ch.net/test/read.cgi/tech/1101384692/192

でも、このプロパティって、例えば

class person
{
public:
// ...

property<std::string> name;
};


int main(void)
{
person p("Name");

std::cout << p.name << std::endl;

return 0;
}

とかやると、p.name に operator<< が無いって怒られない?
こういう局面だけ p.name.get() すればいいんだろうけど、
p.name にアクセスする手法が一通りじゃないってのがすごく気持ち悪いんだけど…。
502デフォルトの名無しさん:05/02/07 15:01:26
>>501
そのpdfとは実装がだいぶ違うけれど自分のコードでは
template <typename T>
ostream& operator<< (ostream &os, property<T>& t)
{
  return os << T(t);
};
のように、propertyに指定した型のoperator<<を利用しています。
503デフォルトの名無しさん:05/02/07 18:53:15
>478
>現状、無名namespaceとC言語の(C++が継承している)staticは同じ意味にはならず、
は理解しているつもりなのですが

>大きな違いがリンケージであるから、です。
具体的にどういう違いが出てくるのかが良く分からないので
良い例があったら挙げてもらえないでしょうか?
504デフォルトの名無しさん:05/02/07 20:25:02
>>502
CRTP 使って、property<T>::operator OP() を T::operator OP() に委譲できないかな。
505デフォルトの名無しさん:05/02/07 23:40:05
>>503
namespace { void external() {} }
static void internal() {}

template< void (&Function)() >
void call_twice() { Function(); Function(); }

int main()
{
  call_twice< external >();
  call_twice< internal >();
}
506デフォルトの名無しさん:05/02/08 00:12:35
正直、管理職の名に甘えて、プログラムのひとつも作れない上司に
こびへつらうのって馬鹿らしい。
507デフォルトの名無しさん:05/02/08 01:29:05
昔は藻前なんかより余程作れたんだろ。
508デフォルトの名無しさん:05/02/08 01:41:10
>>506は、たぶん、
そんな上司に仕える自分の能力の無さを嘆いているんだと思う
509デフォルトの名無しさん:05/02/08 02:01:19
>>506-508
マ板逝け ウザイ
510デフォルトの名無しさん:05/02/08 02:07:20
>505
非型テンプレート引数には外部リンケージを持つものしか指定できないので
その違いが出ることは理解できるのですが,
その例を見てもやはり無名名前空間だけで事足りるような気がします.
440で指摘されるような使い分けがなぜ必要なのかがやはり分かりません.
内部リンケージであることが積極的に必要な状況が知りたいです.
511デフォルトの名無しさん:05/02/08 03:03:42
>>504
propertyクラス自身を返すようにすればできるかもしれませんねえ。検討してみます。
ただ、operator[]の最後の1回は参照を返すが、それまではインスタンスを返す実装なので
(Boost.Functionの定義がfunction<T ()>かfunction<T& ()>で異なるため)
見直しが必要かもしれません。

CRTP?
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-selfref-template-2.html
512デフォルトの名無しさん:05/02/08 07:09:50
template <class T>
void f(T) {}
int n;
f(static_cast<int&>(n));
↑ようにキャストしても T が参照型とならないのは何故なんでしょうか?
あと、
class C {
public:
C() {}
C(const C&) { std::cout << "copy-ctor" << std::endl; }
};

template <class T>
void f(T t)
{ std::cout << &t << std::endl; }

int main()
{
C c;

std::cout << &c << std::endl;
f<C&>(c);
f(boost::cref(c));

return 0;
}
これで boost::cref は参照でわたっているにもかかわらずアドレスが
違うようなのですが、何故なのでしょうか?

VC7.1
513デフォルトの名無しさん:05/02/08 07:46:43
>>512
f<int&>(n);

解決!
514デフォルトの名無しさん:05/02/08 08:02:29
515デフォルトの名無しさん:05/02/08 15:06:01
C のライブラリを C++ で書いてます。

完全に C のライブラリを隠蔽してしまいたいのですが、mylib/types.h で
typedef int my_char_t; みたいなことをされています。

C++ 側のヘッダで my_char_t を使うには mylib/types.h を隠蔽してしまうしか
無いのでしょうか?

構造体みたいに

extern "C" {
my_char_t;
}

みたいな事はできない?
516デフォルトの名無しさん:05/02/08 15:35:29
>>515
そのままC++側でもtypedef int my_char_t;って書けばいいだけじゃないのか?
517デフォルトの名無しさん:05/02/08 15:48:04
>>516
それしかないんですね。了解しました。
ありがとうございます。
518デフォルトの名無しさん:05/02/08 20:37:05
こういうことしたいんだけど、何か良い手はないものか
他によりよい手がなきゃ仕方ないけど、なるべく virtual は使いたくない
template <typename wanker, typename bore>
struct dipshit
{
void jerk();
};
template <typename wanker>
inline void dipshit<wanker, int>::jerk()
{
}
template <typename wanker>
inline void dipshit<wanker, char*>::jerk()
{
// differs from int when char*
}
519デフォルトの名無しさん:05/02/08 21:16:12
>>515
> C のライブラリを C++ で書いてます。
> 完全に C のライブラリを隠蔽してしまいたいのですが、
????
何をしてるって?
520デフォルトの名無しさん:05/02/08 21:54:40
>>518
部分特殊化?

template <typename wanker, typename bore>
struct dipshit
{
void jerk();
};

template <typename wanker>
struct dipshit<wanker, int>
{
void jerk() { /* int ver */ }
};

template <typename wanker>
struct dipshit<wanker, char*>
{
void jerk() { /* char* ver */ }
};
521コマンドラインオプションの処理:05/02/08 21:57:29
GNU Common C++ を使っていらっしゃる方おられますか?
http://www.gnu.org/software/commoncpp/
コマンドラインオプションのパースに便利らしいクラスライブラリが
含まれているのですが、まともなドキュメントがなく使い方が分かりません。

もし他にコマンドラインオプションの処理に便利なクラスライブラリがあったら
それを使うことも検討しています。皆さん、コマンドラインオプションの
処理ってどうやってらっしゃいます?やはり独自のパーサを作ってますか?
522デフォルトの名無しさん:05/02/08 22:00:55
>>520
レスthx
main()
{
dipshit<int, int> a;
a.jerk();
// a.airhead();
}
小出しになって申し訳ないがこれもしたい
523デフォルトの名無しさん:05/02/08 22:01:28
こういうことね
template <typename wanker, typename bore>
struct dipshit
{
void jerk();
void airhead() { }
};
524デフォルトの名無しさん:05/02/08 22:09:03
>>521
僕らの boost があるじゃないか。

http://www.boost.org/doc/html/program_options.html
525デフォルトの名無しさん:05/02/08 22:10:04
template <typename wanker, typename bore>
struct dipshit_base
{
void airhead() { }
};
template <typename wanker, typename bore>
struct dipshit : public dipshit_base<wanker,bore>
{
void jerk();
};

template <typename wanker>
struct dipshit<wanker, int> : public dipshit_base<wanker,bore>
{
void jerk() { /* int ver */ }
};

template <typename wanker>
struct dipshit<wanker, char*> : public dipshit_base<wanker,bore>
{
void jerk() { /* char* ver */ }
};
526デフォルトの名無しさん:05/02/08 22:22:06
>>525
うん、そーだよな・・・・thx
527デフォルトの名無しさん:05/02/08 22:22:55
部分特殊化は class からせよってことだよな
528デフォルトの名無しさん:05/02/09 01:05:10
>514
ありがとうございます.Cとの後方互換性ということをすっかり失念してました.
そこにある2番目の理由はいまいちピンと来ないですが.
529デフォルトの名無しさん:05/02/11 15:21:38
MyFacet* facet = new MyFacet;
std::locale loc( std::locale::classic(), facet );

この場合 *facet を削除するのは loc になりますが、loc の生成時に例外が発生した
場合は誰が *facet を削除しなければいけないのでしょうか?
530デフォルトの名無しさん:05/02/11 15:42:27
>>529 std::auto_ptr
531デフォルトの名無しさん:05/02/11 16:00:20
boost::shared_ptr のデストラクタ時にユーザーが指定した関数
を実行するやつって auto_ptr 版ないの?
デストラクタで勝手に呼び出すためだけにshared_ptr使うのは
必要以上に重いから使いたくないんだけど
532ヽ(´ー`)ノ ◆.ogCuANUcE :05/02/11 16:27:58
> boost::shared_ptr のデストラクタ時にユーザーが指定した関数
> を実行するやつって auto_ptr 版ないの?
何言ってるか分からん……。

> デストラクタで勝手に呼び出すためだけにshared_ptr
??(´Д`)

boost::scoped_ptr のことか?
533デフォルトの名無しさん:05/02/11 16:40:38
>>532
ttp://www.boost.org/libs/smart_ptr/sp_techniques.html#encapsulation
こういうのだろ。
 shared_ptr<X> px(CreateX(), DestroyX);
534デフォルトの名無しさん:05/02/11 17:48:39
>>531
>boost::shared_ptr のデストラクタ時にユーザーが指定した関数を実行する
削除子(deleter)ってやつですね.auto_ptr版は無いですよ.なので自分で作るしかないと思います.
設計・実装に際してはboostに提案されているmove_ptrが参考になるかと思います.

http://home.comcast.net/~jturkanis/move_ptr/

ドキュメントも非常に良くまとまっていて,静的削除子と
動的削除子(shared_ptrが採用している方)の双方を考慮しています.
あと,より汎用な,デストラクタの呼び出しにファンクタをhookする機構というのがあって
スコープガード(scope guard)と呼ばれています.

http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/

これも参考になるかと思います.boostでもmulti_index等が採用しているので
boostのフォルダ漁れば実装が掘り出せると思います.
535デフォルトの名無しさん:05/02/11 18:14:34
>>534
サンクスコ
さっそく見てみます
536デフォルトの名無しさん:05/02/11 18:43:40
>> 529
VC++ 7.1 のソースを見ると std::locale のコンストラクタで例外が起きたときは
ファセットを削除する処理をしていないようなので

std::auto_ptr<MyFacet> facet(new MyFacet);
std::locale loc( std::locale::classic(), facet.get() );
facet.release(); // このメソッドは例外が発生しない

でメモリリークは起きないと思います。
537532:05/02/11 19:10:13
>>534
ドキュメントと実装を見る限り、どうやらこの move_ptr で
目的を達成できそうです。感謝。

しかしなんでこれが boost にまだ入ってないんだろう…便利なのに
538デフォルトの名無しさん:05/02/11 20:08:17
class Sprite{...};
typedef std::multimap<float,Sprite*> SPRITES;
typedef std::vector<SPRITES> LAYER;
class SpriteManager{
LAYER m_Layers;
void DrawSprites();
...};
として描画をやっているのですけど、スプライトが3000個位あると
30FPS位になってしまいます。
一応クリッピングしてるのですが、重い・・・
std::multimapやstd::vectorは繰り返し処理に耐えられない位
重いものなのでしょうか?
newあるいはmallocにした方が速いんでしょうか?
質問が2つになってしまって済みません。
539デフォルトの名無しさん:05/02/11 21:05:00
>>538
float を double にするだけで多少は早くならない?
C/C++ 上での float はウンコだよ。
540デフォルトの名無しさん:05/02/11 21:10:58
確かに float は無駄なだけ
541538:05/02/11 21:13:42
>>539
DirectXでFLOAT多用しているから速いものだと思ってました・・・
書き損じましたが、typedef std::multimap<float,Sprite*> SPRITESの
floatはZオーダーというかdepth値です。
depthをキーとしてレイヤー1個を描画したら次のレイヤーを上書きする
という感じでやっています。
542538:05/02/11 21:15:27
・・・depthをキーとして[スプライトを順番に描画して]レイヤー1個を・・・
543デフォルトの名無しさん:05/02/11 21:16:59
で、そのZオーダーは小数である必然があるの?
544538:05/02/11 21:18:47
>>543
あ、!それだ。有難うございます。
何で思いつかなかったのかと小一時間説教して・・・
545デフォルトの名無しさん:05/02/11 21:42:38
Zオーダーの範囲が0〜255とか〜1023ぐらいならlistの配列が最速だけどな
546538:05/02/11 22:04:51
コンソールでキーをfloatとintの奴を2つ作って試してみたけど
insertのソートに時間を大幅に食って
参照自体の時間はあまり変わりませんでした。
547デフォルトの名無しさん:05/02/11 22:13:18
>>546 まさか最適化してないとかじゃないだろうな。
548デフォルトの名無しさん:05/02/11 22:16:06
>>539-540
環境やプログラムによるだろ。一概には言えない。
549デフォルトの名無しさん:05/02/11 22:17:31
たかだか要素3000個でmultimapがどうにかなるとも思えないんだけど。
DirectXでしょ? まずは描画方面から疑ってみれ。他スレで。
550デフォルトの名無しさん:05/02/13 09:22:43
今簡単なライブラリ作ってるんですが、
こういうのって include するだけで使えるように
実装を全てヘッダファイルに書いた方が良いのでしょうか?
551デフォルトの名無しさん:05/02/13 09:57:30
ケースバイケース
552デフォルトの名無しさん:05/02/13 09:58:04
自分だけで使うならご自由に、
他人も使うなら定石に従って作る
553デフォルトの名無しさん:05/02/13 10:07:21
定石って?
554デフォルトの名無しさん:05/02/13 11:40:10
ヘッダファイルincludeするだけって出来るの?
全部inlineにするとか?
555デフォルトの名無しさん:05/02/13 12:53:39
>>554
それだと static データメンバがどーしよーもなくなる
こんな理由で使うのを勧めたくはないが、使うなら template だな
556デフォルトの名無しさん:05/02/13 13:01:00
>>555
int f() {}
f();
とかは
template <int> f() {}
f<0>();
とか?激しく汚いな…

boost とかはこの辺どうなってんだろ
557デフォルトの名無しさん:05/02/13 13:23:39
>>556
そのテクニックはstlportで使われてた。
template <int __Inst = 0> class...
みたいに。
ちなみにその例は、f<0>をラップするinline非template関数を使えば
それなりに使えるようになると思う。

>boost とかはこの辺どうなってんだろ
boostの大部分は最初からtemplateだから問題ない。
そうじゃないところは普通のライブラリ(配布はソースで)。
558デフォルトの名無しさん:05/02/13 13:32:30
>ちなみにその例は、f<0>をラップするinline非template関数を使えば
>それなりに使えるようになると思う。

あーホントだ。頭が固いせいか思いつかなかった。
確かにinlineでラップすりゃ全然問題ないですね。

stlportで使われてるってことは結構有名なのかな?
何にせよすごい勉強になった。トンクス
559デフォルトの名無しさん:05/02/13 14:16:12
struct a
{
//static float b;
static float& b() { static float c; return c; }
};
560& ◆leAf1aNbyo :05/02/15 00:05:09
くだ質で申し訳ないです

std::vector のシーケンシャルアクセスを行う場合
iterator による走査と添字による走査とではどちらかが速度的に有利になるんでしょうか?

添字の方がソース書く上では楽だけど,若干不利な気がしてます…
561デフォルトの名無しさん:05/02/15 00:10:38
ヽ(;´Д`)ノぁゎゎ…
化けた文字列が名前欄に残ってたせいでトリップができちゃった
562デフォルトの名無しさん:05/02/15 00:34:15
>>560
最適化によっては全く同じコードになることもある。
それを気にするよりも、他に気を遣うべきかと。
563デフォルトの名無しさん:05/02/15 00:34:36
自分でループを書くならどっちも変わらないんじゃないかな。

for_eachを使うと内部実装に適した走査が行われる、かもしれない、
てなことがどっかに書いてあった気がする。
どっちみちvecotorなら関係ないかも。
564デフォルトの名無しさん:05/02/15 00:42:36
>>562-563
dx 気にせず状況に合わせて書いていきます(`・ω・´)
565デフォルトの名無しさん:05/02/15 00:42:48
ループに必要な変数を考える。
iterator の場合は current,end のふたつ。
添え字の場合は top,index,num のみっつ。
というわけで iterator のほうが有利といえるだろう。

極端な例じゃないと実際に差は出ないだろうけどな。
566デフォルトの名無しさん:05/02/15 00:46:05
>>563 ヴェコター ワロス
567デフォルトの名無しさん:05/02/15 16:45:50
ローカルクラスなファンクタって STL 等の関数に渡せないんですか?
例えば
int func()
{
struct Sorter : std::...{
bool operator()(..., ...) const { ... }
};

std::sort(.begin(), .end(), Sorter());
}
ってやるとエラーが出るんですが…(VC7.1)
何かいい方法はないでしょうか?(boost::lambda以外で)
568デフォルトの名無しさん:05/02/15 16:50:25
できないからlambdaがあるんです!
569デフォルトの名無しさん:05/02/15 17:21:59
>>567
できませんよ。
570デフォルトの名無しさん:05/02/15 21:28:14
だせえよな
571デフォルトの名無しさん:05/02/15 23:09:24
>>567
ttp://www.tietew.jp/cppll/archive/11286
微妙に違うけど参考に汁。
572デフォルトの名無しさん:05/02/17 12:59:16
C++のメモリ確保の方法について質問です。
例えば、UNICODEの文字列を格納するクラスustringを以下のように作ったとします。

class ustring{
wchar_t string;
public:
toSjis();
};

sjisを吐くときに、
ustring str=L"日本語";
cout << str.toSjis();
といった書き方をしたいのですが、

1)toSjis()内でchar*ポインタをmallocで確保して返値にしてもtoSjis()メソッドが終了後は値は保証されませんよね?
2)char* mbcsというフィールドを作って、mallocすればオブジェクトがある限りはメモリは確保されますが、
 呼び出し後、必要なくなってもメモリは確保されたままですよね?
 メモリを解放するstr.freeMbcs()メソッドも作って、str.toSjis()の後に呼び出すとかするのでしょうか?

JAVAだとオブジェクトをnewして返値にすればよかったのですが、C++ではどう書くのが定石なんでしょう?
573デフォルトの名無しさん:05/02/17 13:03:22
>>572
C++ならnew/deleteを使うか、std::wstringを使うかしてください。
574デフォルトの名無しさん:05/02/17 13:04:17
>>572
一番のオススメはstd::wstringかな。
575デフォルトの名無しさん:05/02/17 13:45:11
>>572
std::auto_ptrに入れて返してoperator<<をオーバーロードすればいいんじゃない?
576デフォルトの名無しさん:05/02/17 14:19:30
まったく関係ないけど、wstring 関係で質問。

任意のエンコーディングの文字列を wstring や wchar_t * に変換するのって
どうやればできる?
577デフォルトの名無しさん:05/02/17 14:24:36
>>576
キーワード

std::locale::global(std::locale("japanese"))
std::wstring wstr
std::wcin << wstr
wstr.c_str()

std::string
narrow(const std::wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
std::string result = buffer;
delete[] buffer;
return result;
}

std::wstring
widen(const std::string& input) {
wchar_t* buffer = new wchar_t[input.size() + 1];
mbstowcs(buffer, input.c_str(), input.size());
std::wstring result = buffer;
delete[] buffer;
return result;
}
578デフォルトの名無しさん:05/02/17 14:24:59
たとえば、'A'0x41 なら 0x0041にすればASCIIからウニコードになる。
規則性があるならそれに従うだろ。
579デフォルトの名無しさん:05/02/17 14:25:58
580デフォルトの名無しさん:05/02/17 14:31:42
581デフォルトの名無しさん:05/02/17 14:58:08
静的メンバ関数を複数のクラスで継承した場合、継承したクラス毎にstatic関数が用意されるの?
それも何回継承してもstatic関数は一つだけ?
582576:05/02/17 15:01:48
いや、そうじゃなくて……。

たとえば、LC_ALL=ja_JP.eucJP の時に、Shift_JIS の char 配列を
wstring に変換するにはどうすればいいのかな?と。
583デフォルトの名無しさん:05/02/17 15:06:37
あるclass Aのインスタンスを生成するとき、

A a; // デフォルトコンストラクタがある場合
A a(10); // デフォルトコンストラクタがない場合
A *a = new A; delete a;

等としますが、このうち最後のようにnew演算子を使用しなければならないのは
どういう条件のときですか?
584デフォルトの名無しさん:05/02/17 15:06:48
>>581 staticはstaticだ
585デフォルトの名無しさん:05/02/17 15:07:49
586デフォルトの名無しさん:05/02/17 15:10:15
>>582
wchar_tを使うのであれば、文字列を扱うときは始めから一貫してwchar_tを使うようにしないと無駄な処理をしなくてはいけなくなる。
587デフォルトの名無しさん:05/02/17 15:15:09
>>583
コンストラクタがpublicでないとき。
588576:05/02/17 15:39:41
>>586
内部的には wchar_t で良いのだけれど、入力や出力の時にね…。
char 配列で持って、iconv しかないのかな。
589デフォルトの名無しさん:05/02/17 16:14:07
>>587
ウソを書くな
590v(^・^)v:05/02/17 16:31:12
ウソじゃないよ
591デフォルトの名無しさん:05/02/17 16:38:59
唐突にいまさらなんだが
その昔、
http://www.kuzbass.ru/docs/isocpp/
を探してきてテンプレに加えたのは俺なんだが
これはそもそも有料なのでまずいよな
592デフォルトの名無しさん:05/02/17 16:42:41
>>583
その場でインスタンスを作りたくないとか、自分では作りたくなくて、
ポインタとして保持したいとき。
コンストラクタがどうとかは一切関係ない。
593デフォルトの名無しさん:05/02/17 16:47:24
>>592
コンストラクタがpublicでないけどoperator newがpublicになっているクラスのことも考えてみろ。
594デフォルトの名無しさん:05/02/17 16:50:41
>>591
FINAL *DRAFT* だからイイんじゃないの?
595デフォルトの名無しさん:05/02/17 16:54:54
>>593
コンストラクタがpublicじゃないとnewできないよ
596デフォルトの名無しさん:05/02/17 16:57:42
これはロシア人?
もう何年も公開しっぱなしだよな
漢だ
ISOはケチだな
597デフォルトの名無しさん:05/02/17 17:04:10
んなこたーない。

class hoge
{
    hoge(){}
    friend hoge* moge();
};

hoge* moge(){return new hoge;}
598デフォルトの名無しさん:05/02/17 17:06:53
>>595
new 限定で生成させるときの常套手段なんだが、知らないの?
599583:05/02/17 17:22:30
newで生成したインスタンスの場合は、どこかでdeleteしなければならない。
newで生成していない場合は、スコープが外れた後適度なタイミングでデストラクタが呼ばれる。

{
 A a;
 ...
} // OK, インスタンスaのデストラクタは自動で呼ばれる

{
 A *p = new A;
 ...
} // NG, pが指すインスタンスは消滅しないので、delete p;が必要

■new使用したいとき
1. その場でインスタンスを作りたくない
2. ポリモルフィズムを利用したい
3. スコープ外でもインスタンスを残したい

という感じですか?

>>598
new限定で生成させなければならないようなケースってどういうときですか?
600デフォルトの名無しさん:05/02/17 17:23:12
>>598
>>583の3つ目みたいに直接newしてないだろ。
601デフォルトの名無しさん:05/02/17 17:41:57
4. C++BuilderでVCL等Delphi型クラスを生成するとき
602デフォルトの名無しさん:05/02/17 17:42:09
MMO製作企画を立ち上げました。協力できる人はこちら
http://www112.sakura.ne.jp/~kaientai-project/creategame.htm

2chスレ
http://game10.2ch.net/test/read.cgi/mmominor/1108379282/l50

ただ今職人(プログラマ、グラフィッカー)はげしく募集中!
あなたの力を思う存分発揮してください。
603デフォルトの名無しさん:05/02/17 17:46:40
604デフォルトの名無しさん:05/02/17 18:01:56
>>597
friend 使ったら、private もなにも関係ないじゃん。
605デフォルトの名無しさん:05/02/17 18:06:10
>>593
placement new じゃない new も OK なの?知らなかった。
606デフォルトの名無しさん:05/02/17 18:11:15
解決しました
不親切なアドバイスに感謝します
607593:05/02/17 18:14:20
>>605
ごめん、それ勘違いだった。
608デフォルトの名無しさん:05/02/19 07:12:32
C++ Primer 4thが出てるな。
http://www.amazon.com/exec/obidos/tg/detail/-/0201721481/

まあ3あればいらないか。入門書の決定版であることは変わりないのかな?
609デフォルトの名無しさん:05/02/19 09:40:33
C++ Primer読んだ人いますか?
俺は買ったものの、でかすぎて読んでない orz
610デフォルトの名無しさん:05/02/19 13:08:07
>>609
3を買ったけど同じくあんまり読んでないorz
C++ Primerのいいところは細かいところまで書いてある辞書的なところだが
悪いところは辞書的なくせに章毎の最初から読まないとサンプルソースがわかりにくいところだと思う。

ところでEffective C++を読んでて
AWOV=Abstract w/o Virtualsってのがでてきたんだけど、w/oって何ですか?
611デフォルトの名無しさん:05/02/19 13:11:49
without
612610:05/02/19 13:22:39
>>611
Thank you
613デフォルトの名無しさん:05/02/19 14:06:48
douitashimashite
614デフォルトの名無しさん:05/02/19 14:08:08
ruby!
615デフォルトの名無しさん:05/02/21 14:21:14
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/index.shtml
「C++はなぜ人気がないのか」

に書かれてある、テンプレートの記述に関してなんですが

> C++では「vector」などと宣言したコレクションにはPersonクラスのオブジェクトが
> 直接格納されるのに対し,Javaでは以前のコレクションと同様にオブジェクトへの参照が格納される。
> このため,メモリー使用量が減ったりシーケンシャル・アクセスが高速になるといった効果は期待できない。

というのがわかりません。
直接格納される(値渡しのこと?)とどうしてメモリー使用量が減ったり
シーケンシャル・アクセスが高速になるのでしょうか?
コピーコンストラクタが呼ばれて余計遅くなるイメージがあるんですが。
616デフォルトの名無しさん:05/02/21 15:06:08
>>616
物理的にメモリ上で連続してればそれだけCPUのキャッシュにヒットする確率が高くなる。
最近のCPUではいかにキャッシュミスを減らすかが高速化の鍵なのでクリティカルな状況では絶望的な差になりかねない。
617デフォルトの名無しさん:05/02/21 15:11:12
>>615
> 直接格納される(値渡しのこと?)とどうしてメモリー使用量が減ったり
> シーケンシャル・アクセスが高速になるのでしょうか?
> コピーコンストラクタが呼ばれて余計遅くなるイメージがあるんですが。

直接格納だとオブジェクトだけ格納すればいいから。
オブジェクトへのポインタが要らないので、その分のメモリも要らない。

ポインタでなくオブジェクトそのものを配列に確保できると、オブジェクトが一続きの
メモリ領域に置いてあることが保証できるので、シーケンシャルアクセスするのは簡単。
ポインタだとあちこちの番地に飛ばなければならないことがあって遅い。
618デフォルトの名無しさん:05/02/21 16:36:19
教えて下さい。
クラスAを継承したクラスBがあります。
クラスAのメンバにクラスBの型の変数を指定してもいいのですか?
619デフォルトの名無しさん:05/02/21 16:38:03
>>618
だめです。
620デフォルトの名無しさん:05/02/21 16:50:44
>>618
文法的には可能だけど、設計的にはわりとうんこだと思うよ(ケース倍ケースではあるが)
621615:05/02/21 17:00:47
>>616-617
ありがd。
C++ SUGEEE。
622デフォルトの名無しさん:05/02/21 17:06:57
>>615
javaの場合
hoge* vector[100];
ができても
hoge vector[100];
ができない。
代入処理ではコピーコンストラクタが呼ばれないぶん前者が早いが、
読み出しではポインタをたどらなきゃいけないうえに実体がメモリのあちこちに点在しているので遅い。
623デフォルトの名無しさん:05/02/21 22:36:21
stlとboostを習いたいんですが、まずどの本を読めば良いですか?
それぞれ一冊ずつ推薦してください。
624デフォルトの名無しさん:05/02/21 22:37:00
>>623
Effective STL
625デフォルトの名無しさん:05/02/21 23:10:37
modern c++ design(マジレス)
626デフォルトの名無しさん:05/02/21 23:31:01
622 のような話が苦手で「隠蔽」したい人のために作られた C++ のサブセットがあるのは構わない
問題は禿がいみじくも言っていたように「言語は、それを使う人が何を考えることができるのかを決めてしまう」ことである

テンプレートという素晴らしい進歩の目先の困難に負けて逆行した DQN 言語が俺は嫌い
後でいくら訂正しても馬の糞に生クリームでトッピングするようなもので根にあるものは変わっちゃいない
627デフォルトの名無しさん:05/02/21 23:35:10
RISC に VM (プ
628デフォルトの名無しさん:05/02/21 23:46:14
>>624
Effective STLは習い始めにまず読む本じゃないだろ

>>623
個人的にオススメは「STL標準テンプレートライブラリによるC++プログラミング 第2版」かな。
これ読んで、「C++標準ライブラリチュートリアル&リファレンス」と「Effective STL」読んだらSTLは完璧だと思う。

Boostに関しては公式サイトにあるドキュメント読みんしゃい。
629デフォルトの名無しさん:05/02/21 23:54:09
boost はドキュメントが充実してる品
分かりやすい例もあるし。
Boost本を買う必要は全然無い
630デフォルトの名無しさん:05/02/22 01:48:36
派生クラスのオブジェクトは基底クラスの参照に渡せると聞いたので、
以下のコードを書いてBCCでコンパイルしようとしたら、
エラーが出てうまくいかなかったんだが、どうしてよ?


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

class DataA{
int a;
string b;

public:
DataA(int a,string b){ this->a=a; this->b=b; }
};
class DataB:DataA{
float c;

public:
DataB(int a,string b,int c):DataA(a,b){ this->c=c; }
};
void func(DataA&);
int main(void){
DataB b(3,"hoge",3.4);
func(b);
return 0;
}
void func(DataA& data){
cout<<"test"<<endl;
}
631デフォルトの名無しさん:05/02/22 01:49:31
>>630 エラーメッセージ貼れ。
632デフォルトの名無しさん:05/02/22 01:50:40
>>631
警告 W8032 派生と参照.cpp 24: 1 番目のパラメータ(func(CDataA &))のために一時変数を使用する(関数 main() )
エラー E2064 派生と参照.cpp 24: 'CDataA &' は 'CDataB' では初期化できない(関数 main() )
エラー E2340 派生と参照.cpp 24: 1 番目のパラメータは CDataA & 型として定義されているので CDataB 型は渡せない(関数 main() )
警告 W8057 派生と参照.cpp 30: パラメータ 'data' は一度も使用されない(関数 func(CDataA &) )
*** 2 errors in Compile ***
633デフォルトの名無しさん:05/02/22 01:50:56
>>630
- class DataB:DataA{
+ class DataB:public DataA{
634630:05/02/22 01:52:09
ありがとう。
すまん、うっかり忘れてた……。
635デフォルトの名無しさん:05/02/22 01:53:27
だな。private継承(デフォルト)はa-kind-ofではなくなるので、メンバのアクセスレベルが
基底クラスとは異なってきてちまいまちゅ。
636デフォルトの名無しさん:05/02/22 02:01:08
>>635 胡散臭い理解をばら撒くな。
637デフォルトの名無しさん:05/02/22 02:23:18
>>636
そう思うなら君の「胡散臭くない」private継承の意味をここに書いてみろ。
これだからOOP初心者ってのは困る。
638デフォルトの名無しさん:05/02/22 02:32:30
派生クラスのオブジェクトを渡した基底クラスの参照からは、派生クラスにのみある関数は呼べないのか?
639デフォルトの名無しさん:05/02/22 02:34:07
>>638
dynamic_castが成功すれば呼べる。もうちっと勉強せい。
640デフォルトの名無しさん:05/02/22 02:55:36
C++って想像以上に奥が深いな……。
641デフォルトの名無しさん:05/02/22 02:59:44
>>637
意味は→ttp://www.kuzbass.ru/docs/isocpp/access.html#class.access.base

>635への突っ込みとしては、結果と理由が逆だと言うことが言える。
まず private 継承を行った場合に上記のリンク先のルールがあり、
その結果として、外部から見た場合に通常の public 継承で見られる
is-a(is-a-kind-of) の関係がクラス外では使えなくなる、という話の順序が正しい。

また private 継承をした場合でも、通常の private メンバと同じく
そのクラス内に限っては is-a の関係が使える。
642デフォルトの名無しさん:05/02/22 03:06:19
>>641
結果と理由という話をしてるんじゃない。
結論だけを言いたまえ。同じ事だろ。
それに仮想関数がprivate継承でまともに使えるのかい。
現場に携わった経験がない頭でっかちはこれだから・・・・・・・
643デフォルトの名無しさん:05/02/22 03:55:50
>>642
> 結論だけを言いたまえ。同じ事だろ。
同じことを>>635にも言ってやれよ。

> それに仮想関数がprivate継承でまともに使えるのかい。
private継承に限って仮想関数が使えなくなる理由でもあるのか?
あんたの言う「まともに」っていうのがごく狭い意味なら、心当たりはあるが。

自分の知らないことは存在しないっていう思考は楽で幸せだよな。
644デフォルトの名無しさん:05/02/22 04:15:29
hemamuはDQN。
LOOPiT時代、京大中退だと嘘をついていた。
たいしたスキルのない厨房だな、ありゃ。
645デフォルトの名無しさん:05/02/22 04:16:37
>>644
C/VC以外の言語は無知に等しいしな。
646デフォルトの名無しさん:05/02/22 06:07:41
「出来る」事と
「やっていい」事は
等価ではありません
647デフォルトの名無しさん:05/02/22 11:24:35
>>643
>private継承に限って仮想関数が使えなくなる理由でもあるのか?

怒りに任せてあまりでたらめな事を書くんじゃないよ。private継承したクラスで
仮想関数をオーバーライドしようとしたら、デフォルトで基底クラスの仮想関数
は隠蔽されてしまうぞ。

もう、発言すればするほど君の無知が晒されるだけ。恥ずかしいから、どっか
他の所に行って一人でやってて下さい。
648デフォルトの名無しさん:05/02/22 11:47:07
wav→wma
ってことで悩んでおります。
どこかにソース落ちてませんかね?
649デフォルトの名無しさん:05/02/22 12:06:58
>>648
スレ違い。
650デフォルトの名無しさん:05/02/22 12:10:21
裏で WM8EUTIL.EXE 走らせたら?
651デフォルトの名無しさん:05/02/22 18:04:33
「vector」つう単語はどこから来たんだ?
数学や物理でいう「ベクトル」とは全然違うよな?
652デフォルトの名無しさん:05/02/22 18:09:41
>>651
>数学や物理でいう「ベクトル」とは全然違うよな?
ほんのちょっと似てると思わんか?
653デフォルトの名無しさん:05/02/22 18:18:34
vectorにA one-dimensional array(1次元配列)という意味があるからじゃ?
654デフォルトの名無しさん:05/02/22 19:42:20
NULLをdeleteすると弊害ありますか?
655デフォルトの名無しさん:05/02/22 19:43:52
何も起こらないと決められています
656654:05/02/22 20:05:06
>>655
ありがとう。これでタイプ数減らせるわ。
657デフォルトの名無しさん:05/02/22 21:23:26
>>647
アクセス指定子はオーバーライドのセマンティクスに影響しない
658デフォルトの名無しさん:05/02/22 21:42:41
>>657
能書きはいいから、使い方の例を一つ書いてみろよ。何の役に立つというんだ?
659デフォルトの名無しさん:05/02/22 21:54:41
>>657
「オーバライドは継承のアクセスレベルによって意味が変化する」だろ。
public継承でない継承で仮想関数を使う例はマ━(゜∀゜)━( ゜∀)━(  ゜)━(  )━(゜  )━(∀゜ )━(゜∀゜)━ダ????
660デフォルトの名無しさん:05/02/22 21:55:51
>>659
ダウンキャストはオーバーライドに至る以前の別な問題だろうがアフォ
661デフォルトの名無しさん:05/02/22 21:57:39
>>660
だから、誰もダウンキャストして使うと言ってないだろ。アホ
662デフォルトの名無しさん:05/02/22 21:58:46
糞レスでいちいちageんな。目障りだし。
663デフォルトの名無しさん:05/02/22 22:05:50
>>661
わり、アップキャストな
言い間違えた
664デフォルトの名無しさん:05/02/22 22:13:55
>>663
ふんふん、dynamic_castで派生クラスへのポインタまたはリファレンスを基底クラスの
それに変換して、それとprivate継承はどんな関係が?

当然private継承はis-a関係ではないから、下のプログラムのdynamic_castは失敗する。

#include <iostream>

class Base {
public:
virtual void f() const { std::cout << "Base" << std::endl; }
};

class Derived : private Base {
public:
void f() const { std::cout << "Derived" << std::endl; }
};

int main()
{
Base* bp;
Derived* dp = new Derived;
bp = dynamic_cast<Base*>(dp);
if (bp)
bp->f();
else
std::cout << "dynamic_cast失敗" << std::endl;
}
665デフォルトの名無しさん:05/02/22 22:14:11
>>659
class Base
{
public:
 virtual void foo() const { cout << "Base::foo()\n"; }
};
class Derived : private Base
{
public:
 void foo() const { cout << "Derived::foo()\n"; }
 static void test()
 {
  const auto_ptr<Base> test(new Derived);
  test->foo();
 }
};
666デフォルトの名無しさん:05/02/22 22:16:37
ただし、上のプログラムに

dp->f();

を加えた場合、f()は仮想関数としてオーバライドされる。静的にリンクされる事はない。
667デフォルトの名無しさん:05/02/22 22:19:14
>>664
オーバーライドできたか否かと何の関係が?
668デフォルトの名無しさん:05/02/22 22:21:59
>>624 >>625 >>628
Effective STL―STLを効果的に使いこなす50の鉄則
Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術
STL―標準テンプレートライブラリによるC++プログラミング 第2版
C++標準ライブラリチュートリアル&リファレンス

お前らありがとう。上の4冊買わせていただきました。
17000円ぐらいしたが、な、泣かないぞ。
高い金出した分は読んで取り戻す!

669デフォルトの名無しさん:05/02/22 22:22:40
>>667
オーバライドは出来るが、一般的に言う多相化原則は働かない。
670デフォルトの名無しさん:05/02/22 22:24:35
それにしても>>665のような変態的な書き方は初めて見たなあ。こういう書き方を
すれば、private継承でもポリモーフィズムが働くんだ。
671デフォルトの名無しさん:05/02/22 22:27:32
>>666>>667
あなたの方が正しいわ。頭を冷やすためにコーヒー淹れて来る。
672デフォルトの名無しさん:05/02/22 22:28:08
チゴタ
>>665>>667
673デフォルトの名無しさん:05/02/22 22:37:55
Template Methodもprivate継承でできるようだけど。

#include <iostream>
class A{
public:
void work(){
foo();
bar();
}
virtual void foo()=0;
virtual void bar()=0;
};

class B : private A{
public:
void doo(){
work();
}
virtual void foo(){
std::cout<<"foo\n";
}
virtual void bar(){
std::cout<<"bar\n";
}
};

int main(){
B b;
b.doo();
return 0;
}
674デフォルトの名無しさん:05/02/22 22:45:29
うわーこれ通る。気持ち悪い。

class Base {
public:
virtual void f() const { std::cout << "Base" << std::endl; }
};

class Derived : private Base {
public:
void f() const { std::cout << "Derived" << std::endl; }
void h() {
Base* bp = new Derived;
bp->f();
Base* bp2 = new Base;
bp2->f();
delete bp2;
delete bp;
}
};

int main()
{
Derived d;
d.h();
}
675665:05/02/22 22:48:29
しまった、Base のデストラクタが仮想じゃなかった。恥ずかしい。

ちなみに、>>665 みたいな使い方はあまりないとは思いますが、
friend を使って特定のクラス、関数内でのみ
ポリモーフィズムを使うという話はどこかで見た気がします。

class Base
{
public:
 virtual void foo() const { cout << "Base::foo()\n"; }
 virtual ~Base() {}
};
class Derived : Base
{
public:
 void foo() const { cout << "Derived::foo()\n"; }
 friend void bar();
};
void hoge(const Base& base)
{
 base.foo();
}
void bar()
{
 Derived d;
 hoge(d);
}
676デフォルトの名無しさん:05/02/22 22:52:52
>>675
なるほど、クラス内部でfriend宣言する事により、内部のスコープがそのまま
bar()にも適用可能、と。
677デフォルトの名無しさん:05/02/22 22:59:39
>>669
struct a { virtual void b() = 0; };
struct b : private a { static a* c() { return new b; } };
main()
{
a* d = b::c();
d->b();
}
多相化原則は働かない
多相化原則は働かない
多相化原則は働かない
多相化原則は働かない
678デフォルトの名無しさん:05/02/22 23:04:40
>>677
うっせハゲ。
ポール・アンダーソン+ゲイル・アンダーソン著
最新ANSI C++オブジェクト指向プログラミング11.7 非公開派生 P616に書いてあったんだYO!
文句言うならこいつらに言え。
679デフォルトの名無しさん:05/02/22 23:07:41
>>677
抽象クラスの変数は作成できません。
680デフォルトの名無しさん:05/02/22 23:11:04
>>679
すまぬ
681デフォルトの名無しさん:05/02/22 23:13:10
>>680
これならいいだろ。

struct a {
virtual void b() = 0;
virtual ~a() {}
};

struct x : private a {
static a* c() { return new x; }
void b() { std::cout << "Derived" << std::endl; }
~x() {}
};

int main()
{
a* d = x::c();
d->b();
delete d;
}
682デフォルトの名無しさん:05/02/22 23:16:04
private継承を使うより、包含を使った方が良い例がおおいけどな。
683デフォルトの名無しさん:05/02/22 23:22:25
しかし目から鱗が落ちたな。すっかり考え違いをしていたよ。
外部からは非公開になるものの、クラス内部ではprivate:以外のメンバは
そのまま使えるって事を忘れていた。もちろんもう一度継承すると、今度は
全く見えなくなってしまうが。
684デフォルトの名無しさん:05/02/22 23:22:52
>>678
このスレで「ハゲ」は褒め言葉なんじゃないの?
685デフォルトの名無しさん:05/02/22 23:30:54
>>684
実際、C++やってたら頭が禿げそうだよ・・・
686デフォルトの名無しさん:05/02/23 00:04:14
先生がどの時期に禿げ始めたのかによって
禿げるポイントが決まってくる
687641:05/02/23 01:22:29
やっとわかってもらえたのか。よかった。

>>635,>>637,>>642,>>647,>>659,>>664
↑ここらへんが全部同一人物で、且つ>>683であることを祈る。
688デフォルトの名無しさん:05/02/23 01:36:47
>>687
よくわかった。正直スマンカッタ。感情的になっていたのは俺の方でした。
689デフォルトの名無しさん:05/02/23 06:07:54
構造体の継承に関する質問です。
構造体Parentとそれを継承したChildについて、
C++の場合は
struct Child: public Parent
{
  int child_data;
};

という感じで書くわけですが、これをCの方法で

typedef struct _Child
{
  struct Parent parent;
  int child_data;
}Child;

と書いたとき、両者のメモリフィールドは同じになるのでしょうか。
gccで両フィールドをsizeofではかったところ同じでしたが、
必ず同じだという保証はありますか?
690689:05/02/23 06:11:09
gtk+というGUIライブラリを使っているのですが、
これはCで作られており、構造体の継承を後者のような形で行っています。
この場合Childのインスタンスを生成した後、Parentのメンバにアクセスするには
child.parent.parent_dataのように書く必要があり、非常に煩雑なわけです。
前者のC++の継承だと、child.parent_dataのように親クラスのメンバに直接アクセスでき、便利なわけです。
ただこのようなインフォーマルな方法がはたして保証されるかどうか心配なのです。
691デフォルトの名無しさん:05/02/23 07:50:45
>>689
保証はない。
Parent& p = child.parent;
ぐらいでがんばれ。

gtk+ のことは良く知らないけど、
Child を扱うコードがC++だけなら、
C++スタイルの継承が使えるんじゃないか?
692デフォルトの名無しさん:05/02/23 07:52:20
>>689
> typedef struct _Child
ここは _ を外して struct Child で頼む。
まず _C〜 が予約された名前であることと、
あと struct Child; で前方宣言できるように、ってことで。
693689:05/02/23 08:21:03
どうもありがとうございます。
C++からプログラミングを始めたので、Cはどうも苦手なんですよ。
それでC++風に書けないものかと思ったわけで。
694デフォルトの名無しさん:05/02/23 08:22:16
つーかgtk+をC++で使いたいなら素直にgtkmm使ってりゃいいだけだと思うんだが。
695デフォルトの名無しさん:05/02/23 13:39:57
>>694
gtkmmを使うとライブラリなどへの依存性が強すぎて配布が難しいと思う。
もっと気軽に使えるC++ラッパーってないのかな… 自分で作るぐらいならGTK+をそのまま使うし…。
696デフォルトの名無しさん:05/02/23 13:41:21
>>693
オブジェクト指向を理解していればどんな言語でもプログラミングできると思うが。
697デフォルトの名無しさん:05/02/23 15:04:56
できると面倒臭さは別物
698デフォルトの名無しさん:05/02/23 15:51:03
面倒臭さを面白臭さと読んだ俺にはできないと思う。
699デフォルトの名無しさん:05/02/23 16:05:56
>>697
大して変わらん。
700デフォルトの名無しさん:05/02/23 19:07:29
趣味でやるなら好きなもの選びんさい。
それから参考までに。

【C++】マイナーGUIツールキット
http://pc5.2ch.net/test/read.cgi/tech/1065627704/

【GUI】wxWidgets(旧wxWindows) その2【サイザー】
http://pc5.2ch.net/test/read.cgi/tech/1097524712/

[KDE/QT]QTについての疑問を教えあうスレ
http://pc5.2ch.net/test/read.cgi/tech/1047703594/
701デフォルトの名無しさん:05/02/24 11:35:37
class T{...};
T t;
delete t;
これは大丈夫ですか
702デフォルトの名無しさん:05/02/24 11:40:19
全然ダメ
703デフォルトの名無しさん:05/02/24 11:40:57
あ、delete &t;
でした
704デフォルトの名無しさん:05/02/24 11:50:08
>>703
だめ。

いったい何がしたいの?
705デフォルトの名無しさん:05/02/24 11:50:37
全然ダメ
706デフォルトの名無しさん:05/02/24 11:51:12
どうしてもdeleteしたいんです
707デフォルトの名無しさん:05/02/24 12:00:49
できません
708デフォルトの名無しさん:05/02/24 12:02:01
>>706
ぶは、人工無能吹いた
この書き込みは僕じゃないですよ

木構造のクラスをルート側のノードをdeleteすると再帰的に
葉方向のノードもdeleteされるように書いたんですが
その時にふと疑問に思ったんです
709デフォルトの名無しさん:05/02/24 12:20:20
hoge.h

inline void hoge
{
    class local {
    public:
        local() { 前処理 }
        ~local() { 後処理 }
    };

    local raii;

    return 処理;
}

のようなことをやっていたんですが、これだと hoge.h を
複数の翻訳単位で include したときにリンクエラーが
出てしまいます。何かいい回避方法はありませんでしょうか?
710デフォルトの名無しさん:05/02/24 12:38:19
inline とれ
711デフォルトの名無しさん:05/02/24 12:40:05
分割コンパイルでググれ
712デフォルトの名無しさん:05/02/24 12:44:05
>>710-711
よく嫁。

>>709
どんなリンカエラーか晒せ。
713デフォルトの名無しさん:05/02/24 12:55:50
フォルダを開くダイアログの事で質問です。
開くフォルダを指定しない状態ではうまくいったのですが(どこかのホームページから書き写した)、
開くフォルダを指定しようとすると、コールバック関数の呼び出し部分でエラーが出て困っています。
bi.lpfn = BrowseCallbackProc;←BFFCALLBACK型に変換できないと言われます。

bi.lpfn = (BFFCALLBACK)BrowseCallbackProc;これでもダメでした。
なんか方法があるのでしょうか。
714デフォルトの名無しさん:05/02/24 12:59:55
>>712
fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
です
715デフォルトの名無しさん:05/02/24 13:00:44
スレ違い
716デフォルトの名無しさん:05/02/24 13:14:02
>>714
試してみたところ、ローカルクラス自体は複数回定義されないのですが
ローカルクラスのコン(デ)ストラクタ、が複数回定義されているようです。
717デフォルトの名無しさん:05/02/24 13:15:27
>>701がしたいのはこういうの?

struct T
{
void* operator new(size_t,void* p)
{
return p;
}
};


T t;
t.~T();
new (&t)T;
718デフォルトの名無しさん:05/02/24 13:53:40
>>717
いえ、単にnewで生成してないインスタンスをdeleteできるかってことです
719デフォルトの名無しさん:05/02/24 13:58:48
局所変数のコンストラクタとデストラクタの処理でしょ。
自明
720デフォルトの名無しさん:05/02/24 14:33:05
class T{...};

void anyFunction()
{
{
T t; // ここから必要
...;
...;
} // この先不要
...;
...;
}
721デフォルトの名無しさん:05/02/24 16:19:41
>>718
できないしする必要もない
722デフォルトの名無しさん:05/02/24 17:58:36
>>718
newで生成していないインスタンスは、スコープから外れたあと、
適度なタイミングでデストラクタが呼ばれ死ぬ。

・引数で与えられる一時オブジェクトは関数から抜けるとき
・return valueで与えられる一時オブジェクトは、その呼び出し文が終わるとき
・ブロックの中で構築されたインスタンスは、ブロックが終了するとき

それぞれ消滅する。明示的にdeleteする必要はない。

> 木構造のクラスをルート側のノードをdeleteすると再帰的に
> 葉方向のノードもdeleteされるように書いたんですが

new/deleteを使うなら、ルート側のノードに、子ノードへのポインタlistを持っておく:

list<cnode *> children;
cnode* add_child() {
cnode* child = new cnode();
children.push_back(child);
return child;
}

ルートノードのデストラクタで、子ノードをdeleteする:

~cnode() {
for (list<cnode *>::iterator it = chilren.begin(); it != children.end(); ++it)
delete *it;
}

みたいにするのかな。生ポインタが危険なら、shared_ptrなどを検討。
723デフォルトの名無しさん:05/02/24 18:02:35
予想される追加質問:
以下のような場合は?

void anyFunction()
{
T t1;
...;
T t2;
...;
...;
// ここで t1 を消したい
...;
// ここで t2 を消したい
}

予想される回答:
・new/delete すればええやん
・T にデストラクタ相当のメソッドを追加して、不必要になったらそれを呼ぶ
724デフォルトの名無しさん:05/02/24 18:12:53
>>709
hogeがクラスのメソッドだったら、ローカルクラスをネストクラスに
すれば問題が回避出来るみたい。

class Hoge
{
  class nest {
  public:
    nest() { /*前処理*/ }
    ~nest() { /*後処理*/ }
  };

public:

  void hoge
  {
    nest raii;
    return 処理;
  }
}; // Hoge

今のままだと、localを外に出すしかないのかなぁ?
名前がかぶりそうだったら、namespaceに閉じ込めるとかして...
725デフォルトの名無しさん:05/02/24 20:59:43
継承とdelete周りの質問です。
クラスAとそれを継承したBがあるのですが、Bは頻繁に生成・削除されるため、
operator newとoperator deleteを書き換えようと思いました。
他にも頻繁に生成・削除されるクラスがあるために共通化したMemoryPoolクラスを
作成し、それを継承したクラスはこのメモリプールを用いてメモリを確保するようにしています。

大体下のような感じです。
template<typename T> class MemoryPool{
 void* operator new(size_t){〜〜};
 void operator delete(void*){〜〜};
};

class A{〜〜};
class B : public A , public MemoryPool<B>{〜〜};

ここで、Bのインスタンスを生成するときにはnew BとするのでMemoryPool::operator newが
呼ばれるのですが、その後ポインタをA*に代入してdeleteするとAのoperator delete(当然
何も作成してないのでデフォルトのoperator delete)が呼ばれてしまいます。

ここでMemoryPool::operator deleteによってメモリを解放させたいのですが、
何かいい方法はあるのでしょうか?


operator deleteが仮想関数として定義できないのが原因なら、
virtual void A::Delete(){ delete this;}
void B::Delete(){ ~B(); operator delete(this);}
みたいに仮想関数内でdeleteしてしまおうかと考えているのですが、delete thisが不安です。

よろしくお願いします。
726デフォルトの名無しさん:05/02/24 21:07:33
オブジェクトを複数個作れます。配列のように扱ったり?
727デフォルトの名無しさん:05/02/24 21:21:24
オブジェクトを複数個作れます?配列のように扱ったりできますか?
728デフォルトの名無しさん:05/02/24 21:24:02
配列のようにという意味次第だな。
729725:05/02/24 21:25:19
ん?俺?

MemoryPoolは
static T m_Array[10];
みたいに先に10個分ぐらいメモリを取っておいて、operator newでは
使われていないやつへのポインタを返す仕様になってます。
730デフォルトの名無しさん:05/02/24 21:25:42
delete this;
ってMFCとかCOMでは普通に使ってるけど、言語的にはどうなんだろうね?
実装依存だったりするのかな?
731725:05/02/24 21:29:57
>1にあったC++ FAQ Liteを見るとそれ以降thisを使わない(当然メンバ関数も呼ばない)
んならよさそうな感じだったんですよね>delete this
732デフォルトの名無しさん:05/02/24 22:48:29
delete thisってできないと結構不便な気がしなくもない。
733デフォルトの名無しさん:05/02/24 22:56:34
>>716
それにinlineつければいいんじゃないの
734デフォルトの名無しさん:05/02/24 23:14:40
>>730
イベントとか FIFO で管理するんならありだろ
735デフォルトの名無しさん:05/02/25 00:11:49
>>725
ttp://www.kuzbass.ru/docs/isocpp/special.html#class.free
12.5 -4- に、 virtual デストラクタを持つ型のポインタに対して delete した場合には、
派生先の operator delete が有効になるようなルールが書いてある。

おそらくこのルールのために、 gcc では
通常の破棄処理を行うだけのデストラクタと、
最後に operator delete を呼ぶデストラクタの2つがコード生成される。

A の operator delete が呼ばれると言うことは、
デストラクタに virtual が付いてないか、
::delete b; してるか、コンパイラのバグか
ってところじゃなかろうか。
736725:05/02/25 00:50:34
お、うまく行った。

もともとデストラクタをAもBもMemoryPoolも定義してないのが原因でした。
Aに仮想デストラクタを作成したところ、B内のMemoryPoolのoperator deleteが
呼ばれました。
ちなみに環境はVC++6。

どうもありがとうございました。
もっと勉強しないといかんな・・・

737デフォルトの名無しさん:05/02/25 00:58:06
>>733
試してみましたが変わらないですね。
738デフォルトの名無しさん:05/02/25 02:50:39
739デフォルトの名無しさん:05/02/25 09:03:23
ちょっと初心者的な質問なんですけど、

スレッドを作成する場合
DWORD dwID;
CreateThread(NULL,0,Threadfnc,??,0,&dwID);

void WINAPI Threadfnc(Void)
{
・・・
}

↑の簡単な作成プログラムがあったとします。
Threadfncの引数をvoidにしたい場合CreateThreadの引数??には
どんな引数を書けばいいのでしょうか?

宜しくお願いします。
740デフォルトの名無しさん:05/02/25 09:08:42
739です。
書き方に間違いがあったので訂正します。

ちょっと初心者的な質問なんですけど、

スレッドを作成する場合
DWORD dwID;
CreateThread(NULL,0,Threadfnc,??,0,&dwID);

DWORD WINAPI ThreadFunc(LPVOID)
{
・・・
}

↑の簡単な作成プログラムがあったとします。
Threadfncの引数をvoidにしたい場合CreateThreadの引数??には
どんな引数を書けばいいのでしょうか?

宜しくお願いします。
741デフォルトの名無しさん:05/02/25 09:25:03
742デフォルトの名無しさん:05/02/25 09:41:07
voidは値じゃないので渡せません
743デフォルトの名無しさん:05/02/25 09:42:53
CreateThread の引数に渡す関数の引数は void じゃありません。
744デフォルトの名無しさん:05/02/25 12:37:00
質問です。次のようなクラスがあったとします。
class Class{
  long a;
  long b;
};
このとき、&a+4は必ずbのアドレスと等しくなるという保証はありますか?
とある構造体をクラスに取り込みたいのですが、
メンバがメモリ内でどのように配置されているのかが分からないのです。
745デフォルトの名無しさん:05/02/25 12:52:28
>>744
ない。
って言うか、激しく間違った方向を向いている。
746デフォルトの名無しさん:05/02/25 13:04:49
>>744
余りにあほくさいが、&bなら&a+1だろ。
747744:05/02/25 13:33:52
すいません、char*のキャスト書くの忘れてました。
748744:05/02/25 13:38:51
もう少し詳しく教えて欲しいのですが。
構造体なら、続けて書いた二つのメンバは、メモリ上でも連続してますよね。
クラスの場合連続しない理由とかってあるんでしょうか。
たとえばCPUによってはメモリアロケーションの最適化のため、
char型でも4バイト領域を使ったりすることがあるらしいのですが、そういうことですか?
749デフォルトの名無しさん:05/02/25 13:39:14
>>747
それ以前の問題。
メモリ内の配置なんて気にする必要はない。
750デフォルトの名無しさん:05/02/25 13:40:41
>>748
構造体でも連続しているとは限らない。
751デフォルトの名無しさん:05/02/25 13:44:29
>>744
なんで配置を気にしているのか分からないけど、例えば、
ttp://www.microsoft.com/japan/msdn/vs/vc/vcconWindowsDataAlignmentOnIPFX86X86-64.asp
なんかが参考になりそう。でも環境依存だから気をつけて。
752744:05/02/25 13:49:59
どうもありがとうございます。
そこを読んで勉強します。
753デフォルトの名無しさん:05/02/25 13:52:53
>>744
メモリ内での配置を意識したプログラミングをして、コンパイラのオプションや
リビジョンの違いごとに問題が無いかを検証する手間をかけるくらいなら、
配置を意識しないプログラミングをする方がずっと効率がよい。
754744:05/02/25 14:05:22
まさしくその、違いを吸収する部分のプログラミングをしているんです。
755デフォルトの名無しさん:05/02/25 14:06:41
激しく間違えてる気がする
756デフォルトの名無しさん:05/02/25 14:09:35
ちなみにC++ではstructとclassの違いは、
無指定の場合publicになるかprivateになるかということだけ。
757デフォルトの名無しさん:05/02/25 15:16:57
>>744
悪いこと言わないから、もうちょっと冷静に考え直せ。
詳しく状況を書いてくれたら、オジサンが設計してあげるから。

君はとんでもない勘違いをしていると思うよ。
758デフォルトの名無しさん:05/02/25 15:33:59
異なるシステムでバイナリデータ交換する時以外、
変数の物理的配置なんぞ意識しちゃいけないよ。
そのための高級言語だろうが。
759デフォルトの名無しさん:05/02/25 15:43:08
>>744
class Class{
  long a;
  long b;
};

struct Struct{
  long a;
  long b;
};

なら

Class A;
Struct B;

A.a = B.a;
A.b = B.b;

OK?
760デフォルトの名無しさん:05/02/25 15:59:29
>>751
こういう人にそういうサイトを紹介すると
「理解できてないけどなんか動くモノは作れる」タイプの人間になってしまうのではないか、と
最近新人教育に携わっている者としては不安でしかたがありません。
761デフォルトの名無しさん:05/02/25 17:53:37
指定したウインドウハンドルをアクティブにするにはどの関数を
使ったらよろしいでしょうか?
762デフォルトの名無しさん:05/02/25 18:02:10
スレ違い
763デフォルトの名無しさん:05/02/25 18:05:42
>>761
スレタイ読めよ。標準C++って書いてあるだろ。
764デフォルトの名無しさん:05/02/25 18:23:01
確かに、キワドイ事をしてナントカ動いているプログラムを作成し、それがスゴイことだと勘違いされると困りますね。
余計な親切だったかしら?
でも、探そうと思えば誰でも探しだせる情報ですし、それを薬とするか毒とするかは本人次第ってことで...
765764:05/02/25 18:24:45
あ...orz >>764は、>>760へのレスでした。
766デフォルトの名無しさん:05/02/25 18:35:42
ちょいと教えて欲しいのだが。
stlの<algorithm>のfindは便利でよく使うのだが、後ろから探してくれるようなのは無いんだろうか。
reverse_copyしてからfindするのも、findを繰り返すのも無駄な気がしてね。
767デフォルトの名無しさん:05/02/25 18:42:02
>>766
find(reverse_iterator〜
768デフォルトの名無しさん:05/02/25 19:11:11
>>766
find_end()
769デフォルトの名無しさん:05/02/25 19:18:46
>>768
こらこら
770デフォルトの名無しさん:05/02/25 19:33:51
>>767
おー、面白い。reverse_iteratorを渡すと、ちゃんとreverse_iteratorが返ってくるのね。
#当たり前なんだけどさ。
名前は知ってたけど、こりゃ便利だわ。<reverse_iterator
THX!

>>768
名前が名前だからとっくに調査済み。でもありがと。
771デフォルトの名無しさん:05/02/26 01:11:34
ちょっと質問。
「タンパク質」を急いで書いたとき、間違えて
「タンパタ質」って書いちゃったことってあるよね?
772デフォルトの名無しさん:05/02/26 01:16:14
>>771
んな事ないけど、ヘモグロビンをホモグロビンと書いたことはある…
773デフォルトの名無しさん:05/02/26 01:23:06
タンパク質を急いで書いたら蛋白質になっちゃった。
#誰だ勝手に学習させたのは。
774デフォルトの名無しさん:05/02/26 03:19:11
いや、タンパク質を間違うとしたら腕白膣だろ。
775デフォルトの名無しさん:05/02/26 04:57:10
よく、お笑いの2人組みが足踏みして、

アラタケタイ!
アラタケタイ!

って言ってるけど、どういう意味?
776デフォルトの名無しさん:05/02/26 06:54:47
アルアルタンケンタイ!
アルアルタンケンタイ!
って言っているんだろ。
777デフォルトの名無しさん:05/02/26 07:02:55
ぼけろや
778デフォルトの名無しさん:05/02/26 10:21:51
>>775
「俺、アラン・ケイとしたい!」がなまったもの。
779デフォルトの名無しさん:05/02/26 16:13:19
>>778
アラン・ケイだけに雑談(small talk)したい、なんてな。

・・・すまん。どうしても言いたかったんだ・・・。
780デフォルトの名無しさん:05/02/26 18:07:18
上手いけどそれオヤジギャグなのよね…
781デフォルトの名無しさん:05/02/26 22:06:47
pictureBoxのclickイベントがありますよね。
クリックした場所の座標を調べる方法ってあるのでしょうか?
782デフォルトの名無しさん:05/02/26 22:09:48
>>781
標準C++だけではそんなこと出来ません。
783デフォルトの名無しさん:05/02/26 22:11:09
>>779
既出
784デフォルトの名無しさん:05/02/26 22:11:52
>>782
できますが、何か?
785デフォルトの名無しさん:05/02/26 22:12:04
質問です。
vptr の初期化はコンストラクタで行われると聞きました。
しかし、グローバルオブジェクトに関しては
仮想関数のアドレスはリンク時に静的に確定できるような気がします。
何故このような仕様になっていないのでしょうか?

わけあってグローバルコンストラクタが使用できない環境(.ctorがない)での開発を行っているのですが、
この場合、仮想関数を含むクラスのオブジェクトを
グローバルに置くこと (もちろんコンストラクタが呼ばれないことは承知した上で)
は禁止しなくてはならないのでしょうか?
786781:05/02/26 22:16:22
スレ間違えました…。すいませんでした。
787デフォルトの名無しさん:05/02/26 22:16:29
>>784
激しく無意味だからできないことにする
788デフォルトの名無しさん:05/02/26 22:22:29
グローバルコンストラクタってのがよくわからんが、
こういうことか?
struct base { virtual ~base() {}; virtual void foo() = 0; };
struct derived : base { void foo() {} };
base* p;
void top() { /* ... */ }
main()
{
p = new derived;
top();
delete p;
}
789デフォルトの名無しさん:05/02/26 22:53:23
>788
やはり、自前で初期化するしかないということですね。
下のように、クラスをインターフェースとして使いたかったのですが、
このときの A a; B b; の vptr くらいは
ロード時ではなくリンク時に静的に初期化されていてもよいのではないか?と思ったのです。

class Interface { public: virtual void f() = 0; };
class A : public Interface { public: void f() { /* 処理 A */ } };
class B : public Interface { public: void f() { /* 処理 B */ } };

class Character {
Interface *interface ;
public:
Character( Interface *p ) { interface = p ; }
void f() { interface->f(); }
};

A a ;
B b ;

int main() {
Character Tom( &a ), Jerry( &b ) ;
Tom.f() ;
Jerry.f() ;
}
790デフォルトの名無しさん:05/02/26 23:01:29
C++のソースを解析してUMLのクラス図を吐いてくれるフリーのツールってありませんか?
(できればWindowsはCygwinで。なければLinuxでも可。)

Doxygenでクラスの継承関係とかの図は出るんですが、図の中にメンバ関数一覧
とかの表記は入らないので。

VS.NET Ent+Visioだとできそうな感じなんですけどね…
791デフォルトの名無しさん:05/02/26 23:07:27
>>790
フリーじゃないが
VC6+Rose
VC6+Visio
はできるよ。
792デフォルトの名無しさん:05/02/27 01:09:57
>>789
その例のAクラスのオブジェクトは

基本クラスであるInterfaceクラスのコンストラクタ呼び出し
この時にIntefaceクラスの仮想関数テーブルへのポインタがvptrセットされる。

Aクラスのオブジェクト初期化
この時にAクラスの仮想関数テーブルへのポインタがvptrにセットされる。

と辿る。だからリンク時に設定されない。
793デフォルトの名無しさん:05/02/27 01:58:07
コンストラクタ/デストラクタ呼び出し中にvptrが書き換わるというのは
あんまり知られてないのかねぇ?
794デフォルトの名無しさん:05/02/27 02:22:27
>>789

A &getA(){
static A a;
return a;
}

B &getB(){
static B b;
return b;
}

int main() {
Character Tom( &getA() ), Jerry( &getB() ) ;
Tom.f() ;
Jerry.f() ;
}


とかすればいいんじゃないの?
795デフォルトの名無しさん:05/02/27 02:47:47
>>792
あっ!そうか・・・
つまり、ベースクラスのコンストラクタの中で
vptr を参照するような処理が行われる場合に問題が生じるということですね。

>>794
なるほど。
こうすると最初に getA() を呼んだ時に初めてAのコンストラクタが呼ばれるのですね。
勉強になりました。

今まで、『静的に確定できるものを実行時に代入しているなんて、なんて無駄なコードを吐くんだ…』と思っていたのですが、
これで納得できました。
ありがとうございます。
796デフォルトの名無しさん:05/02/27 21:18:27
メンバ関数をコールバックとして使用したいんだけど
使用する場合static宣言しないと使えないの?
797デフォルトの名無しさん:05/02/27 21:28:11
そう。
798デフォルトの名無しさん:05/02/27 21:37:48
>>796
非staticメンバ関数はthisポインタを受け取るため、宣言の見た目と型が違う。

staticにしてそのまま使えるならそれでもいいし、
型を合わせる為だけの関数を間にはさんでもいい。

コールバックを受け取る側もいじれるんなら、
C++的には仮想関数を使ったほうがいいだろう。
799デフォルトの名無しさん:05/02/27 21:46:57
vector<classA *> aa
for(vector<classA *>::iterator it = aa.begin(); it != aa.end(); ++it) {
 // it->foo() ?
}

vector配列がポインタの時にクラスのメンバにアクセスするにはどうしたらいいですか?
800デフォルトの名無しさん:05/02/27 21:47:26
>>796
.* とか ->* とか使う手もあるなー。
まあ、コールバック呼び出し側をいじれないことには
どうにもならんわけだが・・・。
801デフォルトの名無しさん:05/02/27 21:48:02
>>799
(*it)->foo()
802デフォルトの名無しさん:05/02/27 21:49:17
>>801
おぉ、ありがとうございました!
あほなことにit->->foo()って試してました orz
803デフォルトの名無しさん:05/02/27 22:17:28
つい最近似たような話があったと思ったら>>349-あたりか。
804デフォルトの名無しさん:05/02/27 22:39:36
>>799
mem_fun
805デフォルトの名無しさん:05/02/28 01:32:51
コールバック関数がらみの話は定期的に出るな。
806デフォルトの名無しさん:05/02/28 03:31:53
むかつくから
v(^・^)v←これを攻撃するAA誰か作って
807デフォルトの名無しさん:05/02/28 10:38:19
質問です。
ifstreamの走査位置を一定数戻すときってどうやるんですか?

std::ifstream ifs;
char buf[1024];
<--------色々ある。------
ifs >> buf;
int len=strlen(buf);
ifs.seekg(- len);

これでいけると思ったんですが、ステータスをgood()でみるとfalseになってしまいます。
どなたかご存知の方いらっしゃいませんか?
808807:05/02/28 10:54:57
>>807
環境はVC++7.1です。
809デフォルトの名無しさん:05/02/28 11:05:10
>>807
ifs.seekg( -len, ios_base::cur );
810デフォルトの名無しさん:05/02/28 11:18:14
>>809
できました。ありがとう。
811デフォルトの名無しさん:05/03/01 13:47:54
クラスを継承した子が親クラスの関数をオーバーライドした時など、
親クラスの関数を使う場合はParent::method()
のように名前の解決をしますが、Javaのsuperみたいな演算子はないのでしょうか?
812デフォルトの名無しさん:05/03/01 13:50:44
>>811
多重継承があるから、ない。
813デフォルトの名無しさん:05/03/01 14:53:02
ちわ。JAVA畑から来ました。

スレッドについてなんだけど、
クラスのメソッドをスレッドにする場合はどうしたら良いのだしょうか。

class Hoge {
unsigned __stdcall thm(void *lpx) ;/*実装省略*/
} ;

Hoge::Hoge()
{
(HANDLE)_beginthreadex(NULL, 0, thm, NULL, 0, &th);
}

これだと「3番目の引数のthmがねぇよ。」とか怒られるんだけども。
814デフォルトの名無しさん:05/03/01 15:03:49
とりあえず過去ログぐらい読め?
815デフォルトの名無しさん:05/03/01 15:04:25
質問です、friendに関してですが………

例えば、class Aとclass Bがあり、class A内にてclass Bをfriend classと指定したとします。
class Bを継承してclass Cとした場合、class Cからclass Aのprivateあるいはprotectedメンバへのアクセスは可能なのでしょうか?
816デフォルトの名無しさん:05/03/01 15:16:31
>>815
不可能。friend関係は継承されません。
817デフォルトの名無しさん:05/03/01 15:21:20
>>814
38もあって、たるい
818デフォルトの名無しさん:05/03/01 15:30:50
せめてこのスレだけでもいい。FAQすぎる話だ。
819デフォルトの名無しさん:05/03/01 15:34:16
>>818
マジごめん。有ったよ。ホントゴメン。
820デフォルトの名無しさん:05/03/01 16:38:02
まあ、過去ログ読めとか、FAQ読めとかってのは
あいさつみたいなものだからスルーで結構だよ。
821デフォルトの名無しさん:05/03/01 19:20:17
これは許されますか?
class A
{
public:
bool m_b;
A(){m_b=true;}
virtual ~A(){m_b=false;}
void Func();
};
A a;

class B
{
public:
B(){;}
virtual ~B(){if(a.m_b)a.Func();}
};

B b;

int main(){return 0:}
822デフォルトの名無しさん:05/03/01 19:25:48
同じ翻訳単位ならコンストラクタは
a->b の順
デストラクタは
b->a
の順だ。何がしたいか知らんが何も問題はない
823デフォルトの名無しさん:05/03/01 19:44:31
WM_MOUSEWHEELのwParamの上位ワードは移動量ですが、
移動量が正の場合は次のどちらなのでしょうか?

1.マウスホイールを上に(奥に)回した場合
2.マウスホイールを下に(手前に)回した場合

直感的には1だと思うのですが、自信が無く…
824デフォルトの名無しさん:05/03/01 19:47:22
自分でどっちなのか確かめればいいと言うことすら
分からないのか?
スレタイも読めないのか?
お前バカ?
825821:05/03/01 19:49:43
>>822
header.h--------------------
class A{...};
class B{...};
SourceAB.cpp----------------
#include "header.h"
A a;
B b;
SourceBA.cpp----------------
#include "header.h"
B b;
A a;
----------------------------------
どちらのソースでも問題ないですか?
826デフォルトの名無しさん:05/03/01 21:06:04
>>821
> A a;
> class B {
> virtual ~B(){if(a.m_b)a.Func();}
> };

そんなソース書くな。文法が許しても俺が許さん。問題ありまくり。何がしたいんだ!
827デフォルトの名無しさん:05/03/01 21:11:33
>>825
それでコンパイルが通るならOKだよ。
828デフォルトの名無しさん:05/03/01 21:17:09
>>821
Bが静的メンバとしてAを持つようにしたら駄目か?
829デフォルトの名無しさん:05/03/01 22:31:49
嫌です
830デフォルトの名無しさん:05/03/02 02:26:04
struct S { friend void f(); }; void g() { f(); }
このコードがエラーになったらびっくりしませんか?
831デフォルトの名無しさん:05/03/02 02:51:22
>>830
fが宣言されてないようだが?
832デフォルトの名無しさん:05/03/02 07:44:10
>>831
俺は830じゃないが、
friend は friend で指定しているターゲットの宣言を
兼ねることができちゃうぞ。
833デフォルトの名無しさん:05/03/02 08:31:24
>>832
へー
834デフォルトの名無しさん:05/03/02 11:16:55
>>830
エラーにならないことにびっくりした。
835デフォルトの名無しさん:05/03/02 12:44:54
delete this;
って可能ですか
836デフォルトの名無しさん:05/03/02 12:54:05
超スペシャルFAQですね(^^)
837デフォルトの名無しさん:05/03/02 12:59:32
どちらかといえば可能ですか
838デフォルトの名無しさん:05/03/02 14:15:53
来週からC++に取り組むことになりました。
今までVBしかやったことないのに・・。
839デフォルトの名無しさん:05/03/02 14:34:16
日記はNTEMacsにでも書いてろ
840デフォルトの名無しさん:05/03/02 14:36:08
標準C++ではNULLの定義って規定されているのでしょうか?
まずNULL自体が存在することは決められていますか?
そしてそれは0あるいは(void *)0のどちらかに必ず決まっていますか?
841デフォルトの名無しさん:05/03/02 14:51:52
>>840
0
C++ではvoid *→何か *の変換はキャストが必要になるから(void *)0は有り得ない。
842デフォルトの名無しさん:05/03/02 15:01:01
そうですか。じゃあ
#define NULL 0
は標準C++で保証されてるんですね。
でも無効ポインタについては0を使うのがセオリーですか?
それともNULLでもいいのかな(保証されてるなら)。
プログラマがポインタであることを意図してるのがわかる分
NULLでもいいような気もするのですが。
でも例の関数のオーバーロードの問題で、ポインタを渡すのか0を渡すのかで
動きが変わるとなると、NULLをキャストしなきゃいけないってのも
変ですよね。そもそもそういうオーバーロード設計がいけないのでしょうが。
843デフォルトの名無しさん:05/03/02 15:02:09
>>840
一応 <cstdldef>にあるけど。>>NULL
これは、Cとの互換のために残されているので
C++のソースでは使うべきではない。
844デフォルトの名無しさん:05/03/02 15:05:09
どうしても使いたかったら
 const int NULL = 0;
845デフォルトの名無しさん:05/03/02 15:10:18
ありがとうございました。
特にどうしてもNULLがいいというわけではないので
0で統一することにします。
846デフォルトの名無しさん:05/03/02 15:19:36
NULLがオールゼロビットでない環境でも
0がポインタとともに使われると適切な値に
変換されることが保証されている。
C++ では NULL なんか使わない。
847デフォルトの名無しさん:05/03/02 15:27:59
数値のしての0と紛らわしいからNULLを使ってるっていう俺は異端なのか
848デフォルトの名無しさん:05/03/02 15:28:25
使いたい奴は使えばいいんじゃないか?
849デフォルトの名無しさん:05/03/02 15:30:54
int *p = (int *)0;

型が合えば代入できるしポインタのつもりという主張もできますよね。
こんなことしないでしょうけど。
850デフォルトの名無しさん:05/03/02 15:32:17
前にこんなの考えたど、BCCじゃプリコンパイル済みヘッダを作れないって言われたから使っていない。
const class {
public: template <typename T> operator T *() {return 0;}
} NULL;
851デフォルトの名無しさん:05/03/02 16:37:34
テキストファイルから1行を取り出すために、

std::vector<char> arrLine;
arrLine.reserve(1024);
int c;
while (((c = fgetc(fp)) != EOF) && (c != '\n'))
 arrLine.push_back(c);

と書いたら上司に”大体1行なんて1024文字あれば足りる”だろうから
fgets(pLine, 1024, fp)
にしろと言われました。
みなさんどう思われますか?
852デフォルトの名無しさん:05/03/02 16:56:13
なぜにC言語の入出力関数をつかうのれすか?
853デフォルトの名無しさん:05/03/02 17:07:44
std::ifstream ifs;
std::string s;

std::getline(ifs, s);
854デフォルトの名無しさん:05/03/02 18:59:36
長さに制限がある文字列を使いたい。
最大サイズをオーバーしたらエラーを返すか、例外を投げるみたいな。
std::stringをラップしたりして、自作しなきゃかなあ
855デフォルトの名無しさん:05/03/02 20:20:04
サイズ調べりゃええのと違う?
856デフォルトの名無しさん:05/03/02 20:33:07
>>842
正確には「整数の型」とだけ定義されていて、int とは決まってない。処理系に
よっては0L かも。

あと gcc だと拡張機能で「任意の型のヌルポインタには暗黙の変換ができるが、
整数型には変換できない」という特殊な予約語 __null があって、

#define NULL __null

されてる。
857デフォルトの名無しさん:05/03/02 20:51:37
ヌルリンチョ
858デフォルトの名無しさん:05/03/02 20:52:33
ぬるぽ
859デフォルトの名無しさん:05/03/02 21:08:51
>>854
std::stringに限らず、size()メソッドを持ち、代入や追加のできるコンテナすべてに使えるよう
template <typename T> class size_constrainみたいにすると汎用性ありそう。そんな妄想。
860デフォルトの名無しさん:05/03/02 23:29:41
>>851
おまいのコードもおまいのコードだが、そいつもガッしてしまえ。
861デフォルトの名無しさん:05/03/02 23:47:31
>>854
basic_istream::getline

ってか、
stringに読み込んで文字数検査で何が不都合なんだ?
862デフォルトの名無しさん:05/03/03 01:03:03
こんばんわ。
夜分すいません。

ヘッダーファイルで、クラスの定義の前に、「class CExamine;」
というものがあるんですが、これは何を意味してるんでしょうか?

class 〜;というのは、何を意味してるのでしょうか?
863デフォルトの名無しさん:05/03/03 01:10:41
>>862 前方宣言(Forward declaration)
864デフォルトの名無しさん:05/03/03 01:19:32
((void*)0) から関数ポインタには暗黙の変換が効かないから、
NULLの定義に ((void*)0) が許されているCでは
関数ポインタにNULLは使っちゃいけないんだ。(初期化、代入、比較ぜんぶ)

これを知ってからはスッパリNULLは使わなくなったね。
865862:05/03/03 01:24:36
>>863さん

ご返答助かります。
ありがとうございました。
866デフォルトの名無しさん:05/03/03 01:40:32
>>851
上司も上司なら部下も部下だなぁ
867デフォルトの名無しさん:05/03/03 01:48:04
ううううううんk
868デフォルトの名無しさん:05/03/03 02:03:19
>>866
上司が部下のレベル向上のためにお題を出したと見るべきだろう。
無理にC++のSTLコンテナを使って背伸びしようとした初心者をたしなめることが目的。
869デフォルトの名無しさん:05/03/03 02:07:42
つか、
「1行が1024バイトを超えたときのパフォーマンスを考慮してないクソコードだ。」
って言いたいのを遠まわしに諭しただけだろ。

親心のある上司に感謝しないと駄目だぞ。
相手によっては助言どころか見捨てられることだってあるのだから。
870デフォルトの名無しさん:05/03/03 02:11:55
>>851
個人的にゃぁそんなコード書きたかねぇけど、
仕事として書くコードならありだと思うぞ。
1024バイトって制限がまず問題ならない状況なら
仕様として割り切ってコードをシンプルに保つのも悪くはない選択。
コードがシンプルであるほど一般的にバグも少なくなるもんだし、
複雑なバグも発生し難くなる。
開発業務って「時間との戦い」って面が結構あるし、簡素に済ます
ことが許される場面ではそうすべきだと思うぞ。
871デフォルトの名無しさん:05/03/03 02:19:04
>>870
ならなおさらgetlineでいいんじゃ・・・
872デフォルトの名無しさん:05/03/03 02:21:33
簡素に済ますのなら、そもそもスタックバッファでfgets()使っておくだろ。
873デフォルトの名無しさん:05/03/03 03:17:28
>>851
要求される仕様によるな。

> テキストファイルから1行を取り出すために、
だけが目的なら、お前も上司も回線切って首吊ったほうがよい
874デフォルトの名無しさん:05/03/03 04:42:12
>>873
なんで上司まで道づれなんだ。
上司の指示の何が問題なのかね?
875デフォルトの名無しさん:05/03/03 08:50:39
>>874 仕様に無い制限を実装の都合で作ってるわけで。
876デフォルトの名無しさん:05/03/03 09:08:26
>>875
1024文字で読み込めないファイルをあくまで正常なフォーマットのファイルとして
処理しようとすること自体がおかしいとは思わんのか?
悪意あるファイルが外部から送り込まれて、プロセスにメモリを浪費させる目的があったとしたら、
まんまと乗せられたことになるだろ。

一部の馬鹿がSTLの動的配列の恩恵を無差別に利用しようとすると、後で他の者が迷惑する。
877デフォルトの名無しさん:05/03/03 09:20:17
>>876 回線切っ以下略。
878デフォルトの名無しさん:05/03/03 09:27:59
stringって、サイズの予約とかして再割り当てを排除する
ことってできないん?いずれにせよ、Cの入出力使う必要
あるの?
879デフォルトの名無しさん:05/03/03 09:28:28
>>877=>>875
自分のレベルの低さを素直に認めるべきだろう。
経験の浅さ・思慮の浅さが露骨にネットに晒されてるだけだぞ。
880デフォルトの名無しさん:05/03/03 09:30:01
1024バイトで不安なら2048バイトにすればいいじゃない。


                    マリー‥アントワネット
881デフォルトの名無しさん:05/03/03 09:33:07
>>878
逆だよ。

C++の入出力使う必要あるの? 
という設問を常に念頭に置くべきだ。

散々Windowsのハンドルをちゃんと自力で削除しているくせに、
ファイルハンドルだけは管理できないような不思議な人は存在しない。
882デフォルトの名無しさん:05/03/03 09:44:22
私もfgets()で済ませることが多いなぁ。
但し、設定ファイルのように前方にのみ意味がある場合であって、1行を完全に読み取る必要がある場合は使わないけど。
883デフォルトの名無しさん:05/03/03 10:00:44
行という概念がある時点で(ry
884デフォルトの名無しさん:05/03/03 10:05:08
>>879
仕様に1行の長さについての制限は無いが、1行をバッファに読み込みたい。
バッファの動的確保は(悪意ある入力を考慮して)危険と判断。
そこで、
 1. 長さについての制限が仕様に欠けていることを指摘する。
 2. 1024くらいで安心だと思うから固定で取る。

経験豊富で思慮深いプログラマの選択は 2 である、と言うわけか?
885デフォルトの名無しさん:05/03/03 10:06:02
ところでvectorの型にvectorを指定して、要素のvector個々に
最適な初期容量を割り当てたいとき、個々にreserveするしか
ないのでしょうか。
886デフォルトの名無しさん:05/03/03 10:11:08
>>885
「個々に最適」である必要があるなら、そうでしょうね。
887デフォルトの名無しさん:05/03/03 10:21:51
>>884
当然だ。本格的に頭悪いのか、お前?
1行が1024バイトを超えるテキストファイルを想定する機会などない。
それはもはやバイナリファイルとして別の扱いをする必要がある。

fgets()で取得した生の文字列は、そのまま潤沢なCライブラリの恩恵を受けられる。
コンテナに入れるならその文字列編集後にヒープバッファに入れるなりすればいい。
888デフォルトの名無しさん:05/03/03 10:27:44
>>884は実務経験何年よ?
恥ずかしいぞ、お前。
889デフォルトの名無しさん:05/03/03 10:27:55
1024という数字は何か意味があるのでしょうか?
890デフォルトの名無しさん:05/03/03 10:45:09
1024=0x0400
891デフォルトの名無しさん:05/03/03 10:54:07
>>884の支持政党は民主党・社民党・共産党のいずれかだなw
892デフォルトの名無しさん:05/03/03 11:01:46
>>890
0x0400に何の意味があるのれすか?
893デフォルトの名無しさん:05/03/03 11:06:31
セキュリティホールになりそうなコードは書かない方が良いよ……
894デフォルトの名無しさん:05/03/03 11:21:50
>>893

確かにSTLやiostreamが安全だという誤解がセキュリティホールになりそうだな。
あれは便利なだけであって安全ではない。
素直に、危険と隣り合わせなことを実感できるC関数を使うべきだろう。

MSVCなら/GSオプションを使うことで、
スタックバッファオーバラン検出時に例外発生させてくれる。
STLなどが提供する機能はバッファオーバランが起きてもヒープ領域なので検出対象外。
895デフォルトの名無しさん:05/03/03 11:40:28
そうなるとSTLって結局初心者向けみたいな感じで、
使いどころないみたいな感じになってくるね。
玄人はほとんどCの機能使うってことなの?
896デフォルトの名無しさん:05/03/03 11:57:02
doubleやintをstringに変換したいのですが、どうしたらよいのでしょうか?

string x,y;
double a;
x="aaa";
a=10;
y=x+string(a);

というのはできないのでしょうか?
897デフォルトの名無しさん:05/03/03 11:57:19
グローバル関数のswap関数を使うには
何をincludeすればよかったんでしたっけ?
898デフォルトの名無しさん:05/03/03 12:27:33
>>897
template <class T> swap(T l, T r) { T temp = l; l = r; r = temp; };
899デフォルトの名無しさん:05/03/03 12:37:58
>> 897 std::swapなら、algorithm
グローバルなswapってあった?
# どこぞのヘッダで、using std::swap してあるのかな?
900デフォルトの名無しさん:05/03/03 12:59:20
ええとですね、同一コンテナ同士のスワップ関数で、
メンバ関数じゃなくてグローバル(?)な関数があるようなんです。
「標準ライブラリ チュートリアル&リファレンス」によると。
コンテナの要素をコピーせずにすむコストがかからないものの
ようですが。
901デフォルトの名無しさん:05/03/03 13:41:15
ポインタでswapすればいいじゃん
902デフォルトの名無しさん:05/03/03 14:10:46
ええと、どちらかというと解決方法というより、
リファレンスにのってたあの関数を使うには
どのヘッダファイルが必要なのかなぁ・・と。
とりあえずvectorとalgorithmはインクルードしたの
ですがswap(c1, c2)で呼び出しても、そんなものは無い
というエラーがでます。ちなみにc1とc2はどちらも同じ型の
vectorです。
903デフォルトの名無しさん:05/03/03 14:21:12
だから <algorithm> に std::swap があるっつの

904デフォルトの名無しさん:05/03/03 14:44:22
>>894
>STLやiostreamが
ぉぃ。

>>895
いんや。楽出来るところでは楽がしたい。が、
「ここはキッチリ作らないといけない」/「ここは適当に」ってのが
判断できるようじゃないといけない…んだろうなぁ。
905デフォルトの名無しさん:05/03/03 15:29:41
>>898の定義って正しいの?
906デフォルトの名無しさん:05/03/03 15:39:11
>>896
std::ostringstream
907デフォルトの名無しさん:05/03/03 15:47:28
>>905
当然引数は参照だ罠
908デフォルトの名無しさん:05/03/03 15:47:55
>>905
… void swap(…
じゃないとだめだな
909デフォルトの名無しさん:05/03/03 15:56:35
inline じゃないし、参照で受け取ってない。
全然ダメ
910デフォルトの名無しさん:05/03/03 15:58:26
参照ということは、一時変数は渡せないんだね。
そういや一時変数のアドレスなんて取り出せないんだっけか。
一時変数の参照もなんかあったようななかったような。
911デフォルトの名無しさん:05/03/03 16:47:23
>参照ということは、一時変数は渡せないんだね。
またまたご冗談を。
912デフォルトの名無しさん:05/03/03 16:51:39
BCCでは出来るけど警告が出る。
913デフォルトの名無しさん:05/03/03 16:53:11
あかんぞ。bccだけど、
int i=7;
swap(i, int(3));
これできないよね?
914デフォルトの名無しさん:05/03/03 16:55:59
const じゃないと規格じゃ許されてない。
swapの場合一次変数なんか渡しても意味内から参照で受け取るべき
915デフォルトの名無しさん:05/03/03 16:59:23
const の一時変数ってどうやってつくんの?
916デフォルトの名無しさん:05/03/03 17:01:25
>>915
変換が必要な変数、定数、リテラルは const な参照にしか渡せないという意味
917ヽ(´ー`)ノ ◆.ogCuANUcE :05/03/03 17:03:48
void func(int const & i) {}
func(int(1));

はオーケーだけど、

void func(int & i) {}
func(int(1));

は駄目ってことか。
918912:05/03/03 17:05:24
>>913
本当だ。これが警告付きで出来たもんだからリテラルも平気なのかと思っていた。
template<class T> inline void swap(T& l, T& r) {T temp = l; l = r; r = temp;}
int hoge();
int main() {
    int i = 7;
    swap(i, hoge());
    return 0;
}
919デフォルトの名無しさん:05/03/03 17:10:20
も前ら禿本くらい嫁
189ページにちゃんと書いてるぞ
920デフォルトの名無しさん:05/03/03 17:20:20
とてつもなく不満な事があるんだが聞いてくれよ。

クラスを作ったんですよ。Hogeってクラス。
それを継承してクラスSageってのを作ったんですよ。
コードを書いてるうちに、基底クラスしか扱わない場所が出てきたんで
クラスHogeのポインタにSageのポインタを入れたんですよ。
で、そのまま
delete phoge;
とか書いちゃったんですよ。
そしたら派生クラスのデストラクタが呼ばれないじゃないですか。


何で、デストラクタの属性は、virtualがデフォルトじゃねーんだ!!
派生する可能性があるのは当たり前だろ!デフォでvirtual属性にしとけ!
それぐらいのオーバヘッドは許してやれよ!
だからC言語はややこしいって言われるんだよ!ばーか、ばーか。

921デフォルトの名無しさん:05/03/03 17:25:59
派生する可能性がないことも多いと思う。
922デフォルトの名無しさん:05/03/03 17:31:40
>>921
でもさ、派生する可能性が無くても、virtualは邪魔にならんだろ?
923デフォルトの名無しさん:05/03/03 17:37:21
>>922
邪魔だよ。オブジェクトコンポジションをするたびにサイズが大きくなるなんてやってられない。
924デフォルトの名無しさん:05/03/03 17:42:08
>>920
それはC言語では無い罠。
925デフォルトの名無しさん:05/03/03 17:42:39
とりあえず、>>920 はバカでFA
926デフォルトの名無しさん:05/03/03 18:06:47
こんなあからさまな釣りに…
おまいらも暇ですね。
927デフォルトの名無しさん:05/03/03 18:15:48
>>923
関係ない話を割り込むが、オブジェクトコンポジションってそんなに多用するか?
928920:05/03/03 18:16:25
うるせぇ、ばーか。
929デフォルトの名無しさん:05/03/03 18:21:47
>>927
使うだろ。継承より見た目に解りやすい。
930デフォルトの名無しさん:05/03/03 18:32:33
俺は多重継承大好きっ子だ
931デフォルトの名無しさん:05/03/03 18:36:09
オブジェクトコンポジションって何?
932デフォルトの名無しさん:05/03/03 18:37:02
>>930
変態、
933デフォルトの名無しさん:05/03/03 18:39:51
>>932
ダイヤモンド継承をさらに発展させた、六角継承を発案したが不評
さらに発展させた亀甲模様継承を発案したが、まず俺が混乱している
934デフォルトの名無しさん:05/03/03 18:42:15
>>931
あー、いろんなクラスのインスタンスをメンバに持って、ブラックボックスを積み上げていく方法だ

>>923
そんなサイズでかくなるの?知らんかった
詳しく教えてくれ
935デフォルトの名無しさん:05/03/03 18:44:08
>>933
芸術だな
936デフォルトの名無しさん:05/03/03 18:48:01
>>934
923 ではないが、ここ読んで来い。
http://www.s34.co.jp/cpptechdoc/article/sizeof/index.html
937デフォルトの名無しさん:05/03/03 19:02:13
ここの連中は、最派生クラスしか使わない連中なのか・・・?
938デフォルトの名無しさん:05/03/03 19:46:34
  A   B   C
 /\ /\ /\
D   E   F   G
|   |  |   |
H   .I.   J   K
 \/ \/ \/
  L   M   N
 /\ /\ /\
O   P   Q   R
 \ | × | /
    S   T
     \/
      U
939デフォルトの名無しさん:05/03/03 19:51:19
ダライアスかと思った
940デフォルトの名無しさん:05/03/03 19:53:04
>>938
神の所業
941デフォルトの名無しさん:05/03/03 19:53:48
多重継承なんてまんどくさくて使えるかよ。市ね
942デフォルトの名無しさん:05/03/03 19:55:12
ATL つかってればありがたみも分かる。
943デフォルトの名無しさん:05/03/03 20:01:29
>>941
イ`
944デフォルトの名無しさん:05/03/03 20:01:29
オーバーヘッドが嫌なら最初からC++なんて使わなきゃいいのに。
945デフォルトの名無しさん:05/03/03 20:54:50
>>944
better C として重宝します。
946デフォルトの名無しさん:05/03/03 21:09:20
質問です。本のサンプルプログラムなんですけど、

classのpublic内に、
std::size_t how_many_numbers( ) const { return count; }
ってのが、もとから入っていて、それをコンパイルすると、
error C2039: 'size_t' : is not a member of 'std'
って出てくるんですけど、これって何が起こっているか分かりますか?
947デフォルトの名無しさん:05/03/03 21:15:58
C++はCみたいだけど楽ができるから使ってるんだよね。
948デフォルトの名無しさん:05/03/03 21:18:23
>>946
君が必要な#includeをしてないだけ
949デフォルトの名無しさん:05/03/03 21:26:06
>>941
iostream使ったことないの?w
950デフォルトの名無しさん:05/03/03 21:34:29
>>948
#include<iostream>
#include <cstdlib>
cstdlib は必要なの分かってて一応してるんですけど・・・。
951デフォルトの名無しさん:05/03/03 21:48:55
>>946
多分、コンパイルオプションか何かで
std 名前空間が無効化されてて size_t が
グローバルに定義されてると思うんだけど。
あるいは名前空間ができる前のヘッダ使っているとか?
952デフォルトの名無しさん:05/03/03 21:51:44
>>951
名前空間っていつ出来たのですか?
これは2001年に発行されたものなのですが…。
解決策ってありますか?
953デフォルトの名無しさん:05/03/03 21:53:11
訂正
これは2001年に発行されたものなのですが…。

じゃなくて
Microsoft Visiual C++ 6.0使ってます。古いですか?
954951:05/03/03 21:56:46
調べてみたら vc6 のせいっぽいです。

これの70番あたり。
ttp://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
955デフォルトの名無しさん:05/03/03 22:00:00
ありがとうございます。
このコンパイラでは、どうしようもないってことですよね?
956デフォルトの名無しさん:05/03/03 22:23:45
VC6用のサービスパックあててる?
957デフォルトの名無しさん:05/03/03 22:28:47
あてないと動かないもん

♪だからもっと動いて もっともっと もっともっと
958デフォルトの名無しさん:05/03/03 22:40:28
>>887
> 1行が1024バイトを超えるテキストファイルを想定する機会などない。
> それはもはやバイナリファイルとして別の扱いをする必要がある。
BBSのログファイルもバイナリファイルですかぁ?
959デフォルトの名無しさん:05/03/03 22:45:46
このエラーって、どう対処すれば良いか分かりますか?
コードはあってて、言われたとおりに動かすと、こうなったんですけど・・・。
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/washing.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
960デフォルトの名無しさん:05/03/03 22:46:29
>>959
main関数がない
961デフォルトの名無しさん:05/03/03 22:47:39
>>887
ワラタ
962デフォルトの名無しさん:05/03/03 22:54:38
俺がメモ帳を使って個人的に書いてる文章も、
40字×13行分(これで1040バイト)くらいなら改行無しで進むことはよくあるな。
俺はいつの間にか、拡張子がtxtなバイナリファイルを作ってたのか。

2chのdatは改行を<br>タグに置き換えてるから、一レスが一行だよね。
制限の甘い板だと1024バイトいくかもな。
先日13KBくらいある書き込みを某所でしたが、あのBBSのログはどんな仕様なんだろ。
963デフォルトの名無しさん:05/03/03 23:15:13
main 関数を含んだcpp file、インプリメントの cpp file と header fileがあるんだけど、
mainを含んだファイルで

using namespace main_savitch_8A;
using namespace std;
#include "washing.h"

ってやってもリンク関係のエラーがでる。
どうすればいいかわかりますか?
964デフォルトの名無しさん:05/03/03 23:18:24
デリミタ区切りの1ブロックデータを読み込む際に、
1回のgetline()・fgets()しか使わないのならテキストだろう。
複数回、getline()・fgets()関数を使って1ブロックを読み出すのなら、
それはもはやバイナリファイルとしてのファイル処理。
たまたまデリミタが'\n'だっただけ。
965デフォルトの名無しさん:05/03/03 23:19:27
一行が1024を超えるとバイナリファイル扱いって、ドアホか。

>827 は、あんな時間に書き込みしてるとこからみてもニート君だろうなぁ。
966デフォルトの名無しさん:05/03/03 23:23:22
827 :デフォルトの名無しさん :05/03/01 21:11:33
>>825
それでコンパイルが通るならOKだよ。
967デフォルトの名無しさん:05/03/03 23:26:03
>>966
コンパイルとおらないからダメってことじゃねぇの?
968デフォルトの名無しさん:05/03/03 23:27:43
いや、965がさあ、
969デフォルトの名無しさん:05/03/03 23:30:37
>>965
・文章を理解できない。
・不合理な脳内補完をしてしまう。
・ファイル読込処理の経験が浅い。

君はどれなんだ?
970デフォルトの名無しさん:05/03/03 23:30:59
971デフォルトの名無しさん:05/03/03 23:32:58
>>969
そういうキミは

・ニート君
・しったか君

どっちなの?両方?
972デフォルトの名無しさん:05/03/03 23:35:10
コードはあってるはずなのに、リンクエラーがでます。
なぜだか分かりますか?

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=232
973デフォルトの名無しさん:05/03/03 23:37:25
-cをつけろ。
974デフォルトの名無しさん:05/03/03 23:39:54
とりあえず、>>887にテキストファイルを扱うコード書かせると
とんでもないことになるのだけはわかった。

>>887と仕事する際、1行が1024byte超のテキストファイルが登場する可能性がある時は
ちゃんとバイナリファイルって言っとかないとな。
975デフォルトの名無しさん:05/03/03 23:40:37
だれだって昔はニートだった。
976デフォルトの名無しさん:05/03/03 23:45:58
>>974

>>887は正論じゃないかねぇ。
長すぎりゃ複数回fgets()呼べば良いだけだし。
>>974の会社ではpush_back()やappend()が禁止されているの?
977デフォルトの名無しさん:05/03/03 23:47:48
↑わかってねぇw
978デフォルトの名無しさん:05/03/03 23:50:59
>>976
発端らしき>851から読んでいこう。
979デフォルトの名無しさん:05/03/03 23:52:22
どの辺がわかってないの?
980v(^・^)v:05/03/03 23:53:32
じ・す・れ
981v(^・^)v:05/03/03 23:54:17
982デフォルトの名無しさん:05/03/03 23:59:11
1行のサイズがわからないからfgets()は使えない。
よって>>887は間違っている。

ということでFA?
983デフォルトの名無しさん:05/03/04 00:05:07
上司と称するヤシはfgets()を一回だけ使えとは言っていないようにも見えるが・・・。
984デフォルトの名無しさん:05/03/04 00:10:35
ほとんどの場合1行が1024バイト以下であることは事実だろ。
fgets()で使う固定バッファサイズが1024以下でもなんら問題ないのも事実だろ。
必要に応じて複数回fgets()呼べばいいのも事実だろ。
結局、>>974は何が言いたいんだ?
985デフォルトの名無しさん:05/03/04 00:25:55
んじゃあ、getline使えってことで終了。
986デフォルトの名無しさん:05/03/04 00:42:19
>>984
> ほとんどの場合1行が1024バイト以下であることは事実だろ。
>>887は「想定する機会などない」と言ってるわけだがw
お前は想定する機会が無いと思うの? あるの思うの? どっちよ。
987デフォルトの名無しさん:05/03/04 00:53:37
>>986
無いと思う。
「1行の長さは制限ないんでよろしく。」などと言われたことは一度もない。
俺の場合は全くそういう機会がなかった。
何を正常な書式のファイルとみなすかはアプリ次第・作者次第。

>>962のケースのような場合であれば、
なおのこと最大数制限ルールがしっかり行われるはずだ。
988884:05/03/04 00:56:54
>>887,>>888,>>891
わはは。びっくりした。

あー。もう。ほんと。
自分の知らないことは存在しないっていう思考は楽で幸せだよな。
989デフォルトの名無しさん:05/03/04 01:01:04
さすが自民党支持者は馬鹿だな。
990デフォルトの名無しさん:05/03/04 01:01:46
>>891へのレス
991デフォルトの名無しさん:05/03/04 01:05:42
誰か次スレ!!
992デフォルトの名無しさん:05/03/04 01:06:18
993デフォルトの名無しさん:05/03/04 01:07:26
>>989
お前、どうやら本当に野党支持者だったみたいだなw

無党派or政治無関心だったなら、
「は?何言ってんのお前?」で済ますところだったのに。
994デフォルトの名無しさん:05/03/04 01:09:52
>>993
お前は本当にニートだったようだなw
995デフォルトの名無しさん:05/03/04 01:10:12
>>993
学会員かw
996デフォルトの名無しさん:05/03/04 01:11:13
つうか、野党支持してようが、与党支持してようが関係無いだろ。バカか。
997993:05/03/04 01:12:49
さて、埋めますか。

>>995
違うよw
空論好きかどうかで判断してただけ。
998デフォルトの名無しさん:05/03/04 01:15:01
>>997
お前、どうやら本当に学会員だったみたいだなw

無党派or政治無関心だったなら、
「は?何言ってんのお前?」で済ますところだったのに。
999デフォルトの名無しさん:05/03/04 01:15:18
↓1000ゲットおめでとう
1000デフォルトの名無しさん:05/03/04 01:15:52
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。