【標準C++】C++相談室 part39【STL含む】
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
05/01/23 16:45:03ただし質問の前にはFAQに一通り目を通してください。
boost,loki,テンプレートメタプログラミング等に関する質問は
専用の別スレにお願いッス。
前スレ part38
http://pc5.2ch.net/test/read.cgi/tech/1096304546/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002v(^・^)v
05/01/23 16:45:372 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003v(^・^)v
05/01/23 16:46:4017 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
0004v(^・^)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/ (日本語)
0005v(^・^)v
05/01/23 16:48:20amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0006v(^・^)v
05/01/23 16:49:00Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0007v(^・^)v
05/01/23 16:49:39[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
ACE http://www.cs.wustl.edu/~schmidt/
Blitz++ http://www.oonumerics.org/blitz/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
http://www.trumphurst.com/cpplibs/cpplibs.phtml
(日本語) http://www.kmonos.net/alang/cpp/lib.html
0008v(^・^)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/
0009デフォルトの名無しさん
05/01/23 16:55:04_ , ― 、
,−' `  ̄ヽ_
,' ヽ
( `ー'ー'ヽ`ー'ー'ヽ )
( ノ '''''' '''''':::::::ヽ )
( . )(●), 、(●)、.:( ) +
( ) ,,ノ(、_, )ヽ、,, .::::( ) <ヨン様が華麗に4get!
. ヽ ) `-=ニ=- ' .:::::::|ノ +
\ `ニニ´ .:::::/ +
,,.....イ.ヽヽ、ニ__ ーーノ゙-、.
: | '; \_____ ノ.| ヽ i
0010デフォルトの名無しさん
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/
0011v(^・^)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/
0012v(^・^)v
05/01/23 16:57:070013v(^・^)v
05/01/23 16:57:40環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0014デフォルトの名無しさん
05/01/23 16:58:16すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0015v(^・^)v
05/01/23 16:58:49とかいうエラーが出るんだけどこれってどうすればいいの?
0017デフォルトの名無しさん
05/01/23 16:59:36言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0018デフォルトの名無しさん
05/01/23 17:00:43>>9 計1件
今回のテンプレにマジレス
0件
0019デフォルトの名無しさん
05/01/23 17:05:00C++相談室 part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/
0020デフォルトの名無しさん
05/01/23 17:07:10Class階層として
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になって、エラーになります。
どうしてなのでしょうか?
これは、基底クラスから呼び出した派生クラスメソッド内で、基底クラスのメンバ変数を呼び出すとエラーになるということでしょうか?
002120
05/01/23 17:09:02(CFirst*) pF = (CFirst*) pThirdObject;
のpThirdObject; は、CThird ThirdObject; として作られたオブジェクトのポインタなもの、
pThirdObject = &ThirdObject;
です。
0022デフォルトの名無しさん
05/01/23 17:12:15環境非依存のC++に関する事,STL…C++相談室
STL以外のtemplate全般(boost,loki,メタプログラミング)…template統合スレ
コンパイラ依存…>>10
開発環境依存…>>11
002320
05/01/23 17:15:48(CFirst*) pF = (CFirst*) pThirdObject;
int value = pF->a;
は、MFCのCViewクラスから派生されたクラス内のメソッド内でインプリメントされたものです。
0024デフォルトの名無しさん
05/01/23 17:17:39【標準C++】C++相談室【STL含む】
標準C++ライブラリ(STL,stream,locale)以外のライブラリ全部
C++非標準ライブラリ相談室【Boost/Lokiなど】
(現テンプレート統合スレ)
コンパイラ依存
>>10
開発環境依存
>>11
こうでしょ?
0025デフォルトの名無しさん
05/01/23 17:18:10MFCはスレ違い
0026デフォルトの名無しさん
05/01/23 17:18:28static_cast<CFirst*>(pThirdObject)だとどうなる?
0027デフォルトの名無しさん
05/01/23 17:19:48じゃあライブラリじゃない生templateの話もこっちのスレ?
0028デフォルトの名無しさん
05/01/23 17:22:08そうだよ。
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/7-45
ちなみにMFCとかWTLとかの環境依存ライブラリは非標準ライブラリとは更に別のスレになる。
0029デフォルトの名無しさん
05/01/23 17:26:32標準C++ライブラリ以外に依存しないtemplateの話
【標準C++】C++相談室【STL含む】
標準C++ライブラリ(STL,stream,locale)以外の環境非依存ライブラリ全部
(lib*やらlokiやらboostやらcrypto++やらBlitz++やらACEやらSDLやら)
C++非標準ライブラリ相談室【Boost/Lokiなど】
(現テンプレート統合スレ)
コンパイラ依存
>>10
開発環境・実行環境依存(環境依存ライブラリ含むWTLやらMFCやら)
>>8,11
0030デフォルトの名無しさん
05/01/23 17:39:04CThird::function() はいつ呼ばれてるの?
0031デフォルトの名無しさん
05/01/23 17:57:38>(CFirst*) pF = (CFirst*) pThirdObject;
なぜ明示的にキャストをしている?
003220
05/01/23 18:13:13です。
今、自己作成のシステムを最初から作り直してます。
すいません。
0033デフォルトの名無しさん
05/01/23 18:16:330034デフォルトの名無しさん
05/01/23 18:22:40今のままやってもどうせまたすぐどこかで詰まるよ
推薦図書/必読書のためのスレッド PART 22
http://pc5.2ch.net/test/read.cgi/tech/1106175218/
こういうスレもあるから、一から入門書見てやり直した方が
ためになると思う
0035デフォルトの名無しさん
05/01/23 18:47:54> CFirst* pF = (CFirst*) pThirdObject;
CFirst* pF = pThirdObject;
で済むのだが・・・
0036デフォルトの名無しさん
05/01/23 18:49:550037デフォルトの名無しさん
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が欲しいのですが。
0038デフォルトの名無しさん
05/01/23 20:32:54Cstructクラスにコピーコンストラクタを作ればいいんじゃね?
つか、作らないとまずいだろう
0039デフォルトの名無しさん
05/01/23 20:41:520040デフォルトの名無しさん
05/01/23 20:48:33コピーコンストラクタ?operator=(Cstruct)のことですか?
コピー禁止にして、なおかつ各Cstructは別々の値が入るようにしたいのですが。
ひょっとして、vector内部ではそれで初期化しているのでしょうか?
(コピー禁止は省略しました。情報不足すみません。)
違うのならば、調べます。
0041デフォルトの名無しさん
05/01/23 20:50:38コピー禁止したクラスは vector には入れらんないよ。
0042デフォルトの名無しさん
05/01/23 20:51:060043デフォルトの名無しさん
05/01/23 20:57:39コピーコンストラクタはCstruct(const Cstruct&);みたいなコンストラクタのこと
0044デフォルトの名無しさん
05/01/23 20:59:46こちらは知らなかったので、もう一度調べなおします。
ありがとうございました。
>>41
利用側でする、つまり実質何もしなかったので、気付きませんでした。
0045デフォルトの名無しさん
05/01/23 21:07:25News 2005-01-22: C++ Standard Core Language Issues List (Revision 33) is available
0046デフォルトの名無しさん
05/01/23 23:04:45{
class_a* ptr = (class_a*)pclass_a;
ptr->hoge = 1; ←★
ptr->foo(); ←★
}
こんな風にptrにはclass_aのポインタを入れてclass_aのメンバ、メンバ関数にアクセスしてますが、
数が多いと、"ptr->" の部分が冗長で面倒なのです。
スコープがまるでclass_aの中にいるときのように省略する手段などありませんか?
0047デフォルトの名無しさん
05/01/23 23:12:320048デフォルトの名無しさん
05/01/23 23:21:00スイマセン、詳細をお願いします。C++全然知らずに使ってるもので。
class_cをclass_aから継承して作るということでしょうか?
0049デフォルトの名無しさん
05/01/23 23:21:58{
return m_pBitmap;
}
GetBitmap()=new CBitmap();
error C2106: '=' : 左のオペランドが、左辺値になっていません。
関数の返り値がポインタで、そのポインタをnewすることってできないんですか?
やっぱ無理ですか?
初心者質問でスマソ
0050デフォルトの名無しさん
05/01/23 23:23:12> CFirst* pF = (CFirst*) pThirdObject;
pThirdObject;はCThirdObjectだから、キャストしてるんだと思われ。
0051デフォルトの名無しさん
05/01/23 23:35:01CBitmap*& CXSFrm::GetBitmap()
{
return m_pBitmap;
}
GetBitmap() = new CBitmap();
あまりお勧めはしないけど
0052デフォルトの名無しさん
05/01/23 23:40:22pThirdObject;はCThirdObjectだから、キャストしなくてもいいと指摘してるんだと思われ。
0053デフォルトの名無しさん
05/01/23 23:45:58ゲーム開発は主にC言語がメインですが、
C++で開発はしないのでしょうか?
何かデメリットでも?
C++で開発できたほうが、楽だと思うんですが。。。
0054デフォルトの名無しさん
05/01/23 23:50:10C++も使われてるわけだが
0055デフォルトの名無しさん
05/01/23 23:51:310056デフォルトの名無しさん
05/01/23 23:54:57C++を知らない人が多かったらCを使うんでしょう。
でも、そういうところは全体的に低レベルなところ。
0057デフォルトの名無しさん
05/01/23 23:56:56例外処理やRTTIの実装が重いのがデメリット。
そいつらをコンパイルオプションで無効にすれば問題ない。
最近はコンパイラの実装が洗練されたり、
環境自体がリッチになってきたりといった理由で、
フルのC++でも大丈夫な環境も増えているだろう。
0058デフォルトの名無しさん
05/01/24 00:04:45その後、どうなります?
class_cのインスタンスを作って、class_bに渡してもあまり進展がない気がします。
0059デフォルトの名無しさん
05/01/24 00:07:53おまいさんはカプセル化というものを意識してるかい?
0060デフォルトの名無しさん
05/01/24 00:11:50つまり、こういうことですか?
class class_c : public class_a {
public:
class_b class_b_instance;
};
もしこれでしたら、これはできないんです・・・。多分。
0061デフォルトの名無しさん
05/01/24 00:12:520062デフォルトの名無しさん
05/01/24 00:14:49> ゲーム開発は主にC言語がメインですが、
ダウト。というか、そういう話をどこから仕入れてきたのか気になるな。
0063デフォルトの名無しさん
05/01/24 00:16:10なるほど!そういうことですか。
そのメンバ関数は非常に大きい上に、class_b固有の処理の色が強いので、class_cに含めづらいっす。
ただ、非常に参考になりました。
0064デフォルトの名無しさん
05/01/24 00:19:28もしかして良くわかってないだけかも知れませんが。
0065デフォルトの名無しさん
05/01/24 00:24:15C++で組んでるなんて聞いたことねーぞ。
0066デフォルトの名無しさん
05/01/24 00:26:030067デフォルトの名無しさん
05/01/24 00:27:030068デフォルトの名無しさん
05/01/24 00:27:09君が無知なだけ。
0069デフォルトの名無しさん
05/01/24 00:27:45おめでとう!!!!!!!!!!!
さぁ!うんこトークの時間です!!!!
0070デフォルトの名無しさん
05/01/24 00:27:49クラス分けに失敗してる可能性が高いな。
可能なら class_a/class_b の役割を再考したほうがいい。
0071デフォルトの名無しさん
05/01/24 00:27:510072デフォルトの名無しさん
05/01/24 00:28:42ゲーム製作に最適な言語
http://pc5.2ch.net/test/read.cgi/tech/1071176841/
0073デフォルトの名無しさん
05/01/24 00:29:17007465
05/01/24 00:29:58そりゃもう、普段からコードなんてぐだぐだで、しかも、C++なんて高等言語が理解
できるはずないじゃないですかー
0075デフォルトの名無しさん
05/01/24 00:32:410076デフォルトの名無しさん
05/01/24 00:37:51それはありますね。デザインパターンなんか1つも知らないですし。
class_a はフレームワークなのでみんなが共通でアクセスしたい情報を集中的に持っていて、
class_p、class_q、class_r がその情報にアクセスしたいときに、一番最初のコードを使ってるんです。
class_p,q,rのインスタンスは、class_aのメンバ変数になってる class_x がnewでインスタンスを生成して
そのポインタだけ保持してる形です。・・・こんなの書いてもわからないですよね・・・。
0077デフォルトの名無しさん
05/01/24 00:40:23externで共有という最後の奥義を使うべきか使わざるべきか迷うところです。
0078デフォルトの名無しさん
05/01/24 00:40:39変わらないレベルになってるんじゃないの?
そこまでひどいならCで書いた方が余計な事書かなくていい分まだマシだよ。
0079デフォルトの名無しさん
05/01/24 00:42:10カプセル化あたりから勉強し直してみたら?
0080デフォルトの名無しさん
05/01/24 00:43:02CやC++で簡単なゲームくらい作れるようになりたいと最近思っているのですが
なんかいい参考書とかないでしょうか?(Webサイトでもいいんですがやっぱり書籍にはかなわないと思っているので・・・)
自分のレベル的にCでプログラムの基本文法をやったくらいでC++は未経験です。
ツールはVisualStudio.netを持っているのでそれを使おうかと思っています。
初心者に毛が生えたような僕に最適な書籍が何かあれば紹介してください。
宜しくお願いします。
0081デフォルトの名無しさん
05/01/24 00:43:110082デフォルトの名無しさん
05/01/24 00:52:06「C言語の場合、例外処理あたりで問題がおきてるでつ」
というから、
「C言語に例外処理はないよ」
と突っ込んだら、10分間のブランクの後に、
「そうでつた、エラーシーケンスと例外処理とを勘違いしてまつたニヤ。」
と返事きたので失笑した。
0083デフォルトの名無しさん
05/01/24 00:53:08この形を崩すとなると、本当に1から書き直しになるので、現状維持で行ってみます。
>>81 機会があれば読んでみます。
0084デフォルトの名無しさん
05/01/24 00:53:460085デフォルトの名無しさん
05/01/24 00:55:12グランツーリスモなんて何百台あるわけだろ。
それはクラスで管理したらスゲー開発楽そうだが。
実際はどんな言語で組んでるんだろ?
0086デフォルトの名無しさん
05/01/24 00:55:35エラーシーケンスを例外処理と言おうが構わない。
0087デフォルトの名無しさん
05/01/24 00:57:22ゲ制作板でも行って勉強してください。
0088デフォルトの名無しさん
05/01/24 00:57:32C言語に無いのは、言語に組み込まれた例外処理機構。
0089デフォルトの名無しさん
05/01/24 00:58:160090デフォルトの名無しさん
05/01/24 01:01:57そんな事言ったらきりがない。
基本的に(一般的に)C言語は例外処理が扱えない。
0091デフォルトの名無しさん
05/01/24 01:03:04C言語ではエラーは全部無視するのか?
0092デフォルトの名無しさん
05/01/24 01:12:010093デフォルトの名無しさん
05/01/24 01:13:020094デフォルトの名無しさん
05/01/24 01:13:52だから、>>88でいいだろ。
0095デフォルトの名無しさん
05/01/24 01:23:43ゴメン、トライキャッチスルーって言いたかっただけ。スロウちゃうんかと。
ああもう明日も会社で鬱だから寝るわ。
0096デフォルトの名無しさん
05/01/24 01:54:27http://amanoudume.s41.xrea.com/images/hanko.jpg
0097デフォルトの名無しさん
05/01/24 13:57:140098デフォルトの名無しさん
05/01/24 13:59:210099デフォルトの名無しさん
05/01/24 16:43:55JavaのAPIとかよくわからんが
C++でスレッド使うんなら、Boostライブラリとか・・・
0100100get!
05/01/24 17:15:010101デフォルトの名無しさん
05/01/24 17:15:490102デフォルトの名無しさん
05/01/24 17:53:12「構造体のポインタを渡す」って言われても、ちんぷんかんぷんです。
本を読んでも意味不明です。
どなたかこれに関して俺みたいに相当のアホにでもわかるような
説明できる方はいませんか?
0103デフォルトの名無しさん
05/01/24 17:55:440104デフォルトの名無しさん
05/01/24 17:58:360105デフォルトの名無しさん
05/01/24 18:05:45Task.hで
class Task{
....};
Task.cppで定義します。
このTaskクラスを2つの・・・.hファイルで継承して
使いたい時には、それぞれでTask.hをインクルードすれば
いいんでしょうか?2重定義みたいじゃないっすかね?
ヘッダファイルが分かってないのかな・・・
0106デフォルトの名無しさん
05/01/24 18:07:23インクルードガード、でググれ
0107デフォルトの名無しさん
05/01/24 18:13:55二重宣言かどうかはコンパイル単位で決まる。クラス宣言中のメンバ関数定義はinline化されるので気にしない。
二重に#incされるのを避けたいなら、ヘッダーの内部か外部を#ifndef..#define..#endifで囲む必要。
0108105
05/01/24 18:29:36おかげで無事解決しました!
インクルードガードっていうんだぁ・・・
ところで、個人が趣味程度でゲーム作るとかに
分割ファイルしていいんでしょうか?無意味?
0109デフォルトの名無しさん
05/01/24 18:40:010110デフォルトの名無しさん
05/01/24 18:42:42#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";
}
0111デフォルトの名無しさん
05/01/24 18:56:32レベル2 関数を使い出す。ただし基本的にグローバル変数
レベル3 auto変数を使い出す
レベル4 ポインタを使い出す
レベル5 構造体を使い出す。構造体へのポインタも。
・・・先が長ぇw
0112デフォルトの名無しさん
05/01/24 19:00:32もっと分割しろ!
一行一ファイルにしろ
0113デフォルトの名無しさん
05/01/24 19:07:27まともなIDEや解説本ならサンプルコードも実行結果も関数の使い方も載ってるけど
0114help
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__
0115help
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:
構文のエラーとは、なぜでしょうか。よろしくお願い致します。
0116デフォルトの名無しさん
05/01/24 23:30:290117デフォルトの名無しさん
05/01/24 23:37:280118デフォルトの名無しさん
05/01/24 23:41:33ありえなーい!
>>114
とりあえず
bcc32 field.cpp
0119デフォルトの名無しさん
05/01/24 23:48:53ヘッダはヘッダ。
ソースはソース。
0120デフォルトの名無しさん
05/01/25 00:10:47古い本ですが「ロールプレイングゲーム プログラミング」を入手したものの、
デバックの仕方が全然わからなくて止まっています
どなたか教えて下さいませんか
当方超初心者ですorz
0121デフォルトの名無しさん
05/01/25 00:12:150122help
05/01/25 00:18:08bcc32ってヘッダファイルなくていいんですね?
というかbcc32の仕組み分かってなかったのかな・・・
nasm?かLsi食べるなんとかってのだと、.hもコンパイルするときファイル列挙しないと
だめだったきがしたので、ついやってしまいました。
ありがとうございました・・・感謝
0123デフォルトの名無しさん
05/01/25 01:07:45おーい、勘違いしてるぞ。
field.hはfield.cppがインクルードしている。
つまりコンパイル時にはfield.hの内容はfield.cppに挿入されてんだよ。
>bcc32ってヘッダファイルなくていいんですね?
んなわけねえだろ。
>というかbcc32の仕組み分かってなかったのかな・・・
んなわけねぇ。おまえが#includeの意味を知らなかっただけ。
0124デフォルトの名無しさん
05/01/25 03:08:500125デフォルトの名無しさん
05/01/26 02:10:13TestB b;
};
class TestB : public TestA {
};
という具合にTestAを継承したTestBクラスをメンバに持つクラスTestAを作りたい場合どうすればいいですか?
0126デフォルトの名無しさん
05/01/26 02:18:54自分が何をしようとしているのか冷静に考えて味噌
0127デフォルトの名無しさん
05/01/26 13:33:18CRTPなんかはどう?
ttp://www.informit.com/articles/article.asp?p=31473&seqNum=3
0128デフォルトの名無しさん
05/01/26 16:22:26それが必要になる状況について詳しく
0129ヽ(´ー`)ノ ◆.ogCuANUcE
05/01/26 16:46:44TestA が持ってる TestB のメンバがポインタでいいのなら、
class B;
class A {
class B * b;
};
class B : public A {};
もしくは参照を使って、
class B;
class A {
A();
class B& b;
};
class B : public A {};
コンパイル通ったから動くんじゃない?(´σД`)ホジホジ
ただ、サブクラスのインスタンスをスーパークラス側で持ちたいってのは、
どう考えても設計ミスなので、オススメはしない。
0130デフォルトの名無しさん
05/01/26 16:49:01> どう考えても設計ミスなので、オススメはしない。
C++じゃないけど、java.lang.Object#toString はどうなんだ、という、
0131ヽ(´ー`)ノ ◆.ogCuANUcE
05/01/26 16:58:47あれは、java 自体が java.lang.String を特別扱いしてるところがあるので
例えとしてはどうかと…。「インスタンスを保持」しているわけでもないし。
どう考えても設計ミスだと断言したのは、そういうケースでは
自クラスのインスタンスを保持して polymorphism しないの?って話。
class A {
class A * a;
};
わざわざ「サブクラス」に限定する意図が分からん。
0132デフォルトの名無しさん
05/01/26 21:48:20stdにはsprintf以外で変換する方法はあるんでしょうか?
今のところCの関数使ってない分sprintf入れると見栄えが
悪くなるんで使いたくない・・・
0133デフォルトの名無しさん
05/01/26 22:03:38std::stringstream ss;
ss << std::hex << a;
std::cout << ss.str() << std::endl;
0134デフォルトの名無しさん
05/01/26 22:13:52#include <sstream>
int main()
{
int a = 1000;
std::cout << dynamic_cast<std::ostringstream&>(std::ostringstream() << std::hex << a).str() << std::endl;
}
0135デフォルトの名無しさん
05/01/26 22:24:55boost::lexical_cast
0136デフォルトの名無しさん
05/01/27 00:01:08どうもありがとうございました。
0137デフォルトの名無しさん
05/01/27 00:05:22つまらないからもう逝っていいよ。
っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。
勝手にそんな事ができない場合だってあるだろうに。
BOOSTで用意された機能すらも自分で実装できないようなへたれか?
0138デフォルトの名無しさん
05/01/27 00:07:340139デフォルトの名無しさん
05/01/27 00:12:22なにいってんのこの人。
貴方が2chでよく書き込みされている池沼さんですか?
0140デフォルトの名無しさん
05/01/27 00:15:44そいつは使えるものは使えってひねくれて言ったんだろ。人違い。いい加減にID見ないとヤるぞ!
0141デフォルトの名無しさん
05/01/27 00:17:15IDなんて出てないもん! にゃんにゃん
0142デフォルトの名無しさん
05/01/27 00:42:2613.9 12.5
の様な入力を簡単に配列に代入する方法はありますか?
0143デフォルトの名無しさん
05/01/27 00:48:00それをどういう規則で配列に入れるかによる
0144デフォルトの名無しさん
05/01/27 00:49:02std::vector<int> v;
std::copy(std::istream_oprator<int>(std::cin), std::istream_operator<int>(), std::back_inserter(v));
とか。
試してないから動くかどうかわからん。
0145デフォルトの名無しさん
05/01/27 00:50:01×std::istream_operator
○std::istream_iterator
0146ヽ(´ー`)ノ ◆.ogCuANUcE
05/01/27 00:51:47インスコしなくても、*.hpp コピってくればとりあえずは使えるぞ。
regex とかは無理だけど。
>>142
istream_iterator
0148デフォルトの名無しさん
05/01/27 01:30:52>っていうか、よく平気で追加ライブラリをインストールしろと言えるもんだな。
>勝手にそんな事ができない場合だってあるだろうに。
できる場合だってあるので
解決法の1つとしてここで提案するのはいいのでは?
もし標準ライブラリの範囲で回答を限定したければ
そういう風に質問すればいいでしょうし
0149デフォルトの名無しさん
05/01/27 01:37:04ないだろうか。俺はどっちでもいいと思っているけど。
0150デフォルトの名無しさん
05/01/27 01:49:42厨が勝手につけただけ
0151デフォルトの名無しさん
05/01/27 01:55:48それはスレ乱立防ぐためじゃなかった?
0152デフォルトの名無しさん
05/01/27 02:09:08それは【STL含む】では?
0153デフォルトの名無しさん
05/01/27 03:11:00public:
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 で定義されています。
とエラーになります、どこが悪いのでしょうか?
0154デフォルトの名無しさん
05/01/27 10:42:00二重定義のためリンク時エラー。
構築がprivateでいいの?
0155デフォルトの名無しさん
05/01/27 10:46:49Singleton Singleton::mSingleton; をヘッダに書いてるんじゃないか?
>>154
コンストラクタ private にしないと、 new Singleton がエラーにならない。
0156デフォルトの名無しさん
05/01/27 10:57:30> 勝手にそんな事ができない場合だってあるだろうに。
こっちの主張は一理あるが、
> BOOSTで用意された機能すらも自分で実装できないようなへたれか?
こっちは馬鹿丸出しだな
0158デフォルトの名無しさん
05/01/27 11:06:17そのヘッダファイルを2つのソースファイルでインクルードしてたら、
Singleton::mSingleton の定義が2つリンクされるだろ?
C/C++には定義は一つでなければならないというルール(One definition rule: ODR)がある。
0159153
05/01/27 11:10:530160デフォルトの名無しさん
05/01/27 12:18:45そういうものですか?
(Cのopen() / read()では普通に読めるんですが)
0161デフォルトの名無しさん
05/01/27 12:21:13C++のfopen()/fread()では如何ですか?
0162デフォルトの名無しさん
05/01/27 13:43:20fopen() / fread()でも読めませんでした。
読めないというか、書き込み側のプログラムを終了させた途端、一気に溜まっていたものが読み出されました。
名前つきパイプのファイルは普通のファイルとは違うので、システムコールのopen()/read()じゃないと、
fifoとしての読み込みは出来ないということでしょうか?
0163デフォルトの名無しさん
05/01/27 13:51:580164デフォルトの名無しさん
05/01/27 14:39:41fread()でも普通に読めるようになりました。
が、std::ifstreamでは相変わらず読めません。read()で1バイトずつ読もうとしてますが、
そこで止まったままです。
(書き込み側は同じプログラムです)
0165デフォルトの名無しさん
05/01/27 21:57:35listとかvectorとか色々便利そうなんですけど、
使い方がいまいちわかりません。
関数とか色々用意されているようですが、
どんな関数があるのか調べる方法はありませんか?
色々ググってみてるんですが、
どうもうまいことひっかかりません。
0166デフォルトの名無しさん
05/01/27 22:04:08>>7
0167デフォルトの名無しさん
05/01/27 22:05:54ぐぐってC++をマスターするのはほとんど無理。
どうしてもと言うなら、
ttp://www.cc.nao.ac.jp/fsunman/japanese/C++_new/index.html
当たりを印刷して、じっくり眺めるんだな。
初心者が陥りやすい落とし穴などは、Effective C++とかC++ FAQのような
本を買って読む方がはるかに良い。
0168デフォルトの名無しさん
05/01/27 22:06:19テンプレにありましたか・・・申し訳ありませんでした…。
6らへんまで読んで英語で挫折してました・・・・。
0169デフォルトの名無しさん
05/01/27 22:38:320170デフォルトの名無しさん
05/01/27 23:02:10Effective C++
More Effective C++
Effective STL
を買ってそれを枕がわりにして寝るとよい
0171デフォルトの名無しさん
05/01/27 23:09:51明日にでも本屋行ってきます。
英語も頑張ります。
0172デフォルトの名無しさん
05/01/28 00:13:05これだな。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=5799
fstream "named pipe" でぐぐれば見つかったぞ。
0173デフォルトの名無しさん
05/01/28 00:49:03その前に「プログラミング言語C++ 第3版」読めよ。
0174デフォルトの名無しさん
05/01/28 01:05:26その前に規格票だろw
0175デフォルトの名無しさん
05/01/28 03:29:490176デフォルトの名無しさん
05/01/28 03:56:56無知な奴はすっこんでろ
0177デフォルトの名無しさん
05/01/28 05:27:32間違いに気付かない奴はぬっこんでろ
0178デフォルトの名無しさん
05/01/28 08:37:03俺は使わないけど。
0179デフォルトの名無しさん
05/01/28 08:39:39これもおすすめ
ttp://www.seshop.com/detail.asp?pid=888
0180デフォルトの名無しさん
05/01/28 11:50:06普通、「規格書」 って呼ぶよな。
「票」 では意味が合わない。
ttp://dictionary.goo.ne.jp/search.php?MT=%C9%BC&kind=jn&mode=0
ひょう へう 【票】
1.(名)
選挙で投票する紙片。また、その数。
「―を投ずる」「―を読む」「―が伸びる」「浮動―」
2.(接尾)
助数詞。投票数を数えるのに用いる。
「わずか五―差で敗れた」
〔上に来る語によって、「びょう」「ぴょう」ともなる〕
――が開(あ)・く
選挙で、開票が始まる
0181デフォルトの名無しさん
05/01/28 12:04:320182デフォルトの名無しさん
05/01/28 12:25:48選挙に関係なく、票とは、何かが書いてある紙きれとかいう意味があるよ。
0183デフォルトの名無しさん
05/01/28 12:33:10と考えるのがよいと思いました。
0184デフォルトの名無しさん
05/01/28 13:03:48求人票とか。
0185デフォルトの名無しさん
05/01/28 13:57:42広辞苑の場合、
1.ふだ。紙片
2.中国で証書・証券、また手紙、紙幣
3.選挙・採決などで意思を表示したふだ
となってるわけだが。ま、いらん恥かいたな
0186デフォルトの名無しさん
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]
のような表記ができるようなコードは、どう書けばいいのでしょうか?
0187デフォルトの名無しさん
05/01/28 19:57:33つMore Effective C++
ただ禿はこういうときは[]なんか使わずに()を使え
0188187
05/01/28 19:58:390189デフォルトの名無しさん
05/01/28 20:00:59んなもん誰が信じるかってーのwwww
0190デフォルトの名無しさん
05/01/28 20:46:00こんな感じかなぁ
添字の指定順序を逆にするともう少しシンプルになる
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);}
};
0191デフォルトの名無しさん
05/01/28 21:32:00template<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_の役割を交換するともっとシンプルになりそうな気がするが・・・
0192デフォルトの名無しさん
05/01/28 23:39:44C++ではどうなりますか?そのまま使えますか?
0193デフォルトの名無しさん
05/01/28 23:40:330194デフォルトの名無しさん
05/01/28 23:44:03そのまま使えます
0195デフォルトの名無しさん
05/01/28 23:44:470196デフォルトの名無しさん
05/01/28 23:49:43どうもです。
0197デフォルトの名無しさん
05/01/28 23:54:38つまらん。なぜ過去スレを見ないのか。
0198デフォルトの名無しさん
05/01/29 00:21:400199デフォルトの名無しさん
05/01/29 01:01:15C++2年やってるけど未だにテンプレートが原因で出たエラーメッセージは分かりにくい。
0200デフォルトの名無しさん
05/01/29 01:04:47> テンプレートクラス
クラステンプレートだ。間違えるな。
クラスのテンプレートなんだよ?そのテンプレートを元にいろんな種類のクラスを作る
ものだ。
0201デフォルトの名無しさん
05/01/29 01:32:46class 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()そのものは呼び出せると
思っていたのですがダメなんでしょうか?
0202デフォルトの名無しさん
05/01/29 01:34:250203201
05/01/29 01:43:350204デフォルトの名無しさん
05/01/29 01:47:350205201
05/01/29 03:29:40ありがとうございます。
英語苦手なのですがこんな感じであってますか?
派生クラスのフレンド関数またはメンバ関数が基底クラスのstaticでない
プロテクトメンバを参照するとき、追加のアクセスチェックがclass.accessで
述べられているものより先に適用されます。
(注:この追加のチェックは他のメンバ、例えばstaticなメンバ変数や列挙された
メンバ定数には適用されません)
メンバへのポインタを生成するときを除いて、派生クラス自身(またはそのクラスからの派生クラス)のオブジェクトやポインタ、参照を通してアクセスしなければなりません。
もしそのアクセスがメンバへのポインタを生成することならば、
nested-name-specifier が派生クラスを明示するものとします。
うーん、へなちょこ訳では理解に苦しむ・・・
とりあえず、例を見る限りではできないのがokということみたいですね。。。うむむ。。。
0206デフォルトの名無しさん
05/01/29 03:34:45CはAを継承しているが、Bを継承してはいない。
従って、CからはA::Hoge()は見えるが、B::Hoge()は見えない。
それだけの事だ。
0207201
05/01/29 03:47:07すばやい回答ありがとうございます。
でも、
void C::Func(B& b)
{
A& b2 = b;
b2.Hoge();
}
たぶんこれもダメっぽかったんですが・・・CはAを継承してるので
A::Hoge()はよびだせてもよさげなのに・・・納得いきません
0208デフォルトの名無しさん
05/01/29 03:52:06本当か?public Aをpublic Bにしてもエラーは変わらないぞ。
0209201
05/01/29 04:02:38C::Func() を 207のように変えてもダメだったというのは確かだと思います。
(今手元にコンパイラがないので記憶頼りのカキコですが。。。)
>public Aをpublic Bにしてもエラーは変わらない
class A;
class B : public A;
class C : public B;
と変更しても、やっぱりC::Func() はエラーになる、ということですか?
うーん、このルールを理解しにくいのは、
おいらの理解しようとする方向がずれてるだけなのかな・・・ムー
0210デフォルトの名無しさん
05/01/29 04:04:49おそらく>>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; // エラー
}
};
0211デフォルトの名無しさん
05/01/29 04:06:16class 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; // エラー
}
};
0212デフォルトの名無しさん
05/01/29 04:18:01基底クラスAをpublic継承した派生子クラスBをpublic継承した派生孫クラスC
のthisポインタからは、AとBのすべてのprotectedメンバ、publicメンバが見える。
しかし、void Func(B& b)のようなメンバ関数の引数bにはthisポインタが適用さ
れていないので、派生ではない通常の関数のようなアクセス制限を受ける。
但し、特別な例外があり、派生クラス内もしくは基底クラスでfriend宣言された
関数またはクラスからは、staticメンバーのみこの制限が適用されない。
という事か。
0213201
05/01/29 04:21:38例のコードは理解できます(というかそういうルールがあるのを今学んだんですが)。
でも、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(); //<--- これはどうなるんでしょう・・・・?????
}
};
なんか、アタマが寝てるかもしれないので、今日はいったん落ちます。
アドバイスしてくれた方々、ありがとです。
あ、レスがついてるみたいなので、まだ起きてます。
0215201
05/01/29 04:33:04なるほど。すっきりしたルールっぽいですね。
でも、やっぱり、thisからしか非静的protectedメンバにアクセスできない
というのがひっかかるので、明日フリーコンパイラでも入れて検証してみます。
いろいろすみませんでした。寝まする・・・
0216デフォルトの名無しさん
05/01/29 04:37:08寝られましたか。
>>212もまだ間違えてるっぽい。
というのは、>>213のソースをコンパイルしたら、b.Hoge()が通るからです。
どうして>>211のb.Hoge()がだめで、>>213のb.Hoge()はよいのか。まだわかりません。
でも私も頭が寝てきたので寝ます・・・・・
0217デフォルトの名無しさん
05/01/29 06:40:31何度見てもおもしろい。
0218デフォルトの名無しさん
05/01/29 08:20:55protectedメンバにアクセスできるのは
自分自身と同じ型のポインタ(暗黙のthisを含む)か
参照を介したときのみ。
だから>>213は
class B : public A
{
public:
void Func(B& b) {
Hoge(); // thisを通しての Hoge() ヲケ
b.Hoge(); // b を通してのHoge()。 ヲケ
A& a = b;
a.Hoge(); //<--- これはどうなるんでしょう・・・・????? ダメ
}
};
0219デフォルトの名無しさん
05/01/29 08:21:40class 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指定だから
}
};
0220デフォルトの名無しさん
05/01/29 08:48:10>b.Hoge(); // b を通してのHoge()。ok(のはず・・・) →NGだよ! Aクラスでprotected指定してるから
これはヲケなの。一辺コンパイルしてみ。
//これがOKだったらメンバカプセル化が出来ないことになる
//そしてどのクラスからでもprotected指定のメンバが見えてしまう
//ことになる
きみ、protectedの意味知ってる?
0221デフォルトの名無しさん
05/01/29 11:08:30class A {
protected:
void Hoge() {}
};
class B : public A {
public:
void Func(B& b) {
b.Hoge(); // OK
}
};
int main()
{
B b;
b.Func(b);
}
が良くて、
0222デフォルトの名無しさん
05/01/29 11:09:50protected:
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と同じ型でないからダメだという理解であってるでしょうか?
0223デフォルトの名無しさん
05/01/29 11:13:59そう。継承関係はあるけどA, B, Cはそれぞれ別のクラスだから他のクラスのprotectedは見えない。
0224デフォルトの名無しさん
05/01/29 11:33:07ありがとうございました。これでようやく頭の中が整理できました。
0225デフォルトの名無しさん
05/01/29 12:03:58横から済みませんが
エラー出るんですが
0226225
05/01/29 12:06:20エラー出てたのb.Hoge(); の方でした
失敬
0227225
05/01/29 12:07:270228デフォルトの名無しさん
05/01/29 12:59:11>>222のクラス宣言で、
int main()
{
C c1,c2;
c1.func(c1); //これは>>221と同じでOK
c1.func(c2); //ここ
}
が、エラーになるような気がするんだが、記憶違いか?
0229デフォルトの名無しさん
05/01/29 13:09:14そりゃぁ、エラーになるわなぁ。どこにfunc()があるんだ?
0230デフォルトの名無しさん
05/01/29 14:03:20もともと>>222はダメなケースのサンプルだぞなもし。
それは無視した上で、
もしc1.func(c1)が通るならc1.func(c2)も当然通る罠。
通らんと思う理由は?
0231デフォルトの名無しさん
05/01/29 14:10:57float型をcoutでsetprecisionを使って15桁表示すると、
7桁の制度しかないのに15桁分表示されます
8桁から15桁までの数字はどこを参照して表示しているのでしょうか?
また、7桁の制度しかないものを15桁表示しても問題ないのでしょうか?
0232デフォルトの名無しさん
05/01/29 14:27:11int main(){
printf("%.30f", 0.1);
return 0;
}
0233デフォルトの名無しさん
05/01/29 14:48:19もともとfloatに精度なんて期待するな。
0235デフォルトの名無しさん
05/01/29 15:41:240236デフォルトの名無しさん
05/01/29 16:01:580237デフォルトの名無しさん
05/01/29 16:06:110238デフォルトの名無しさん
05/01/29 16:06:250239デフォルトの名無しさん
05/01/29 16:10:190240デフォルトの名無しさん
05/01/29 16:14:590241デフォルトの名無しさん
05/01/29 16:17:040242デフォルトの名無しさん
05/01/29 16:19:250243デフォルトの名無しさん
05/01/29 16:19:540244デフォルトの名無しさん
05/01/29 16:20:470245デフォルトの名無しさん
05/01/29 16:21:18アセンブラならdoubleよりfloatの方が全然速いのに、
Cで書くと逆になるんだもん。
0246デフォルトの名無しさん
05/01/29 16:39:36でもなぜロンgどうbぇが無いのか不思議なのですが。
0247デフォルトの名無しさん
05/01/29 16:40:41だからdoubleしか使ったことありません。
でもなぜlong doubleが無いのか不思議なのですが。
0248デフォルトの名無しさん
05/01/29 17:45:34途中でdoubleに拡張されているから
0249デフォルトの名無しさん
05/01/29 18:07:10だからなに?
0250デフォルトの名無しさん
05/01/29 18:08:01printfだとそうなるけど、iostreamでもそうなの?
0251デフォルトの名無しさん
05/01/29 19:39:070252デフォルトの名無しさん
05/01/29 19:41:12要素へのアクセス法にもよると思うけどbitsetが速いんじゃない?
0253デフォルトの名無しさん
05/01/29 19:51:47bool[]: メモリ位置の算出→メモリからのロード→決定
bitset<>: メモリ位置の算出→メモリからのロード→ビット位置によるマスク→決定
ライトアクセス
bool[]: メモリ位置の算出→データのライト
bitset<>: メモリ位置の算出→データのロード→ビット位置によるマスク→データのライト
bool[] のほうが速いんじゃないだろうか。
0254デフォルトの名無しさん
05/01/29 19:53:36がvector<bool>と比べるんならbitsetの方がはやいんじゃねーかな
0255デフォルトの名無しさん
05/01/29 19:55:560256デフォルトの名無しさん
05/01/29 19:59:09bitsetが速いんじゃないかな?
ちょっと取り込んでるので誰か測定をよろしく
0257デフォルトの名無しさん
05/01/29 20:01:49質問には「個々の要素へのアクセス」と書いてあるのだ。
0258デフォルトの名無しさん
05/01/29 20:16:30まぁそうだね
0259デフォルトの名無しさん
05/01/29 22:08:50LinuxとWindows間でportableなライブラリって何が有名ですか?
0260186
05/01/30 08:29:06Proxy Classというテクニックがあるんですねえ。勉強になりました。
0261デフォルトの名無しさん
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();
}
そのような仕様でもあるのでしょうか
0262デフォルトの名無しさん
05/01/30 11:15:07はい。
0263デフォルトの名無しさん
05/01/30 11:18:03まずバイナリモードで開いていない。
ifstream in("bb.swf", ios_base::binary);
あと確かoperator >>は空白文字を読み飛ばす仕様だったはず。メンバのget()を使え。
さらに言えばいったんdustsに出力しなくても直接outに吐けば良いと思うのだが。
0264デフォルトの名無しさん
05/01/30 11:27:100265デフォルトの名無しさん
05/01/30 12:00:170266デフォルトの名無しさん
05/01/30 12:01:29具体的に。
0267デフォルトの名無しさん
05/01/30 13:32:45そうですねぇ、例えばtxtファイルで、数字がスペース以外で区切られている物を
数値へパースする時に、Cなら一発だなぁ…とか良く思います。いや使えば良いんだけど。
0268デフォルトの名無しさん
05/01/30 13:37:42漢は黙って#include <stdio.h>
0269デフォルトの名無しさん
05/01/30 14:34:23漢なら他人が作ったライブラリすらも使わずにつくれや。
0270デフォルトの名無しさん
05/01/30 14:44:41車輪の再生産をするやつぁタダのアフォ。漢ではない。
0271デフォルトの名無しさん
05/01/30 14:53:42お前は漢を全然理解できてない
0272デフォルトの名無しさん
05/01/30 15:01:11そんな変態的な漢ならば意味を理解したいとは思わない。
0273デフォルトの名無しさん
05/01/30 15:02:560274デフォルトの名無しさん
05/01/30 15:09:07標準ライブラリやシステムコールのライブラリ抜きに
標準入出力書くのは、かなり困難な上に移植性ゼロではないか。
0275デフォルトの名無しさん
05/01/30 15:11:090276デフォルトの名無しさん
05/01/30 15:26:21cstdioインクルードファイルがCだとでも?
0277デフォルトの名無しさん
05/01/30 15:28:050278デフォルトの名無しさん
05/01/30 15:29:31アホな奴だな。
現代の自動車のタイヤは平安時代の牛車の車輪と同じか?
0279デフォルトの名無しさん
05/01/30 15:30:34オマエガナー
バカは漢ではない。文(既存の資産の活用)武(自分でガシガシ書く)両道してこそ漢。
0280デフォルトの名無しさん
05/01/30 15:33:55既存の資産の活用を蓑に着て勉強を疎かにする大学生ですか?(藁
0281デフォルトの名無しさん
05/01/30 15:37:46無駄についてる機能を性能と勘違いする池沼はこれだから困っちゃうよ。
0282デフォルトの名無しさん
05/01/30 15:38:29青木敦さんのセミナーでも受けてこい。
ちょっとはマシになるかもしれないから。
0283デフォルトの名無しさん
05/01/30 15:45:16おいおい、なにが無駄についている機能だって?ww
0284デフォルトの名無しさん
05/01/30 15:57:150285デフォルトの名無しさん
05/01/30 15:59:07では、どこからがC++?
0286デフォルトの名無しさん
05/01/30 16:03:35存在自体が無駄。使わないと出来ない要件などない。
よって>>278は妄想乙
0287デフォルトの名無しさん
05/01/30 16:06:51なんとも苦々しい反論だなww
まぁ、どちらが妄想癖を持っているか、他の人は解かっていると思うが。
0288デフォルトの名無しさん
05/01/30 16:08:11もう説得力もなにもあったものじゃないよ。
0289デフォルトの名無しさん
05/01/30 16:11:04iostreamじゃないと出来ないことを言ってみろよ池沼
現代の自動車のタイヤなんだろ?w
0290デフォルトの名無しさん
05/01/30 16:14:34ははwwww
こいつは真性か?!
>>269-289の流れではiostreamの話は既に終わってる事だということにまだ気づいて
いない。
読解力も無いのか…お前は哀れだな。
0291デフォルトの名無しさん
05/01/30 16:20:10それともこれは降参の意思表示なんだろうか・・・。
0292デフォルトの名無しさん
05/01/30 16:20:240293デフォルトの名無しさん
05/01/30 16:21:42なんだ、まだいたの?
もう説得力無いんだからさ。
レスすんなよ。な?
0294デフォルトの名無しさん
05/01/30 16:23:39流れがメチャクチャ。>>287から>>290の間が抜けてる。
脳に障害のある人なんですかね。それとも別人が混ざってるのか。
0295デフォルトの名無しさん
05/01/30 16:28:190296デフォルトの名無しさん
05/01/30 16:29:390297デフォルトの名無しさん
05/01/30 16:30:47stdioではiostreamの代わりにはならないという >>278
大して代わらねーよという俺
0298デフォルトの名無しさん
05/01/30 16:35:22次の話題どうぞ↓
0299デフォルトの名無しさん
05/01/30 16:35:35俺って言われてもだれかわかんねーよ。
「たいして変わらない」ということは、同じではないことは知ってるんだよな。
その違いが大きいか小さいかは人やプログラムによって違うのが当たり前。
自分と違う答えを認めることができない奴は池沼と言われてもしかたがない。
0301デフォルトの名無しさん
05/01/30 16:40:10また自演ですか?
0302デフォルトの名無しさん
05/01/30 16:43:50俺は自演などしない。お前と違って自信があるからな。
それと、お前のmail欄は sage じゃなくて age だろ? age厨君。
0303デフォルトの名無しさん
05/01/30 16:45:31次の話題どうぞ。↓
0304デフォルトの名無しさん
05/01/30 16:46:05また妄想ですか?
0305デフォルトの名無しさん
05/01/30 16:50:43実は僕様チャン、学校でいじめられて、ついカッとなって、2chに八つ当たりでレス
つけちゃったんだ。
ごめんなさい…
0306デフォルトの名無しさん
05/01/30 18:00:22親クラス名::メンバ名
0307デフォルトの名無しさん
05/01/30 18:11:490308デフォルトの名無しさん
05/01/30 21:01:58『C++の設計と進化』 13.6参照
0309デフォルトの名無しさん
05/01/30 22:53:420310デフォルトの名無しさん
05/01/30 22:55:200311デフォルトの名無しさん
05/01/30 23:43:460312デフォルトの名無しさん
05/01/31 07:06:470313デフォルトの名無しさん
05/01/31 09:09:46たかが言語をそんなにこわがる必要は無いと思いますが :-P
0314デフォルトの名無しさん
05/01/31 09:37:45ビヤーソの気まぐれ?
frontは別にいらんけどbackは有った方が便利でない?
s[s.size()-1]よりはs.back()の方が便利でしょ?
0315デフォルトの名無しさん
05/01/31 10:27:23それ、s.size() == 0のときにアウトですけど。
で、s.size() == 0のときにs.back()はどうなって欲しい?
s.back() == s.end()になるんだったらどっちみち使い難いし、例外吐くのも違う気がするでしょ?
だから敢えて実装しなかったんでない?
0316デフォルトの名無しさん
05/01/31 10:31:050317デフォルトの名無しさん
05/01/31 14:33:09vec.insert(vec.end(), datastart, dataend);
copy(datastart, dataend, back_inserter(vec));
どちらが効率がいいですか?
0318デフォルトの名無しさん
05/01/31 14:35:581種受けようとしたらなくなっていました。
次に情報処理技術者試験受けるなら何が良いでしょうか?
0319デフォルトの名無しさん
05/01/31 15:23:35std::back_inserterは内部でpush_backを呼んでるから、
insertの方が最適化の余地が大きいとはいえると思う。
効率気にするならreserveを試してみたらどうだろう。
0320デフォルトの名無しさん
05/01/31 15:52:50結局コンパイラとライブラリの実装によるんじゃね?
0321デフォルトの名無しさん
05/01/31 16:19:320322デフォルトの名無しさん
05/01/31 18:13:57sourceがrandom access iteratorの場合にはinsertが領域確保を
1度で行っている可能性があるから、insertの方がマシそう。
0323デフォルトの名無しさん
05/01/31 18:16:13std::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です。
お願いします。
0324デフォルトの名無しさん
05/01/31 18:23:13vectorは要素を追加したり削除するとそれまでのイテレータは無効になる。
0325デフォルトの名無しさん
05/01/31 18:24:13erase(it)の後はitが無効になるから、
it = erase(it);
とすると良い。
それから、eraseによってendが変化するかも知れないのでので、
itendも無効になる可能性がある。
よって、
for(it=vec.begin(); it != vec.end(); ++it)
{
it = vec.erase(it);
}
0326ヽ(´ー`)ノ ◆.ogCuANUcE
05/01/31 18:24:25erase したら it 使ったらアカンよ。
vec.clear();
vec.erase(vec.begin(), vec.end());
0327デフォルトの名無しさん
05/01/31 18:47:56皆さんありがとうございました。
0328デフォルトの名無しさん
05/01/31 20:41:22何いってんの?
vectorでもlistでもs.size() == 0の時アウトだろ。でも実装はされてる。
0329デフォルトの名無しさん
05/01/31 21:14:46無条件に++したらだめだよ
0330デフォルトの名無しさん
05/01/31 21:49:16例えば、
int a[50];
を
vector<int> b;
のbに入れるための最も効率的な方法は何ですか?
0331デフォルトの名無しさん
05/01/31 22:04:25b.resize(50);
memcpy(&b[0], a, sizeof(int)*50);
0332デフォルトの名無しさん
05/01/31 22:06:480333デフォルトの名無しさん
05/01/31 22:08:32insertじゃ元のが消えないからassignな。
0334デフォルトの名無しさん
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);
0335デフォルトの名無しさん
05/01/31 22:42:38教えてくださってどうもありがとうございます。
b.assign(a, a + 50);
が一番自然な気がしました。
これが思い付かなかったのですorg
0336デフォルトの名無しさん
05/01/31 22:43:17effective stl読んだ方がいいかと
0337デフォルトの名無しさん
05/01/31 22:51:07一応持っているのですが、第16項にそれらしいことが書いてありますね。
0338デフォルトの名無しさん
05/01/31 22:53:430339デフォルトの名無しさん
05/01/31 23:04:59なるほど。
実装上はイテレータがポインタは同じものである、ということを知った上で
第5項を読めば良いわけですね。
初心者にご丁寧にしていただきありがとうございました。
0340デフォルトの名無しさん
05/01/31 23:13:320341デフォルトの名無しさん
05/01/31 23:16:28どういうこと?
イテレータの実装にポインタ使ってるんだろ。
0342デフォルトの名無しさん
05/01/31 23:19:480343デフォルトの名無しさん
05/02/01 00:11:01その通り。
0344デフォルトの名無しさん
05/02/01 00:20:290345デフォルトの名無しさん
05/02/01 00:38:42両者それぞれのオブジェクトでpush_backとpop_backをたくさん繰り返して時間を計測してみると、
明らかにvectorの方が速いようなんですが、これはどういうことなんですか?
0346デフォルトの名無しさん
05/02/01 00:41:05末尾への追加削除はvectorの方が早い
0347デフォルトの名無しさん
05/02/01 00:44:07ありがとうございます。
0348デフォルトの名無しさん
05/02/01 00:54:580349デフォルトの名無しさん
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
);
・・・
};
ちなみに、このスレッド処理関数をクラスの外(グローバル)で定義した場合は、問題なくコンパイルでき実行できます。
0350デフォルトの名無しさん
05/02/01 02:57:10ThreadFuncをstaticにするか、beginthreadexを諦めてboost::threadでも使え
0351デフォルトの名無しさん
05/02/01 02:59:24{
return reinterpret_cast<ClassA*>(Param)->ThreadFunc(Param);
}
void ClassA::ThreadStart()
{
hThread = (HANDLE)_bebinthreadex(NULL, 0, &DummyFunc, (void*)this, ...);
}
メンバ関数ポインタを直接コールバック関数として渡すことは出来ない。
0353デフォルトの名無しさん
05/02/01 12:54:54function<void (const T &)> f; は function1<void, const T &> f;
function<void (int, int)> g; は function2<void, int, int> g;
というように、templateの数に応じて別のクラスに置き換える方法ってどうやるの?
0354デフォルトの名無しさん
05/02/01 13:17:500355デフォルトの名無しさん
05/02/01 13:37:08boostのソース嫁
0356デフォルトの名無しさん
05/02/01 13:57:41一度読もうとして挫折したorz
もう一度tryしてみるか……
0357デフォルトの名無しさん
05/02/01 14:43:21ttp://www.boost.org/boost/function/function_template.hpp
0358デフォルトの名無しさん
05/02/01 15:44:43変態だ、わはは
0359デフォルトの名無しさん
05/02/01 16:02:360360デフォルトの名無しさん
05/02/01 16:03:100361デフォルトの名無しさん
05/02/01 16:17:120362デフォルトの名無しさん
05/02/01 17:05:29知っている方、教えてください。お願いします。
0363デフォルトの名無しさん
05/02/01 17:16:40自分で作っちゃったら?
0364デフォルトの名無しさん
05/02/02 10:37:510365デフォルトの名無しさん
05/02/02 11:51:330366デフォルトの名無しさん
05/02/02 11:53:06仕様上、大丈夫です。
0367デフォルトの名無しさん
05/02/02 11:56:47ウソ書くな。
0368デフォルトの名無しさん
05/02/02 11:58:42なんだとこのやろ
0369デフォルトの名無しさん
05/02/02 13:29:510370デフォルトの名無しさん
05/02/02 13:37:05そういう物じゃない。
0371デフォルトの名無しさん
05/02/02 13:53:58標準ライブラリのデフォはスレッドセーフ。
0372デフォルトの名無しさん
05/02/02 14:02:07んなことない。実装依存。
0373デフォルトの名無しさん
05/02/02 14:05:380374デフォルトの名無しさん
05/02/02 14:11:230375デフォルトの名無しさん
05/02/02 14:16:14自分が使ってる処理系のマニュアル読むか、ソース辿れ。
0376デフォルトの名無しさん
05/02/02 14:23:48#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
0377デフォルトの名無しさん
05/02/02 14:26:050378デフォルトの名無しさん
05/02/02 16:00:41激しく実装依存。つまりスレ違い。
0379デフォルトの名無しさん
05/02/02 16:09:53private継承というのは、継承元クラスでpublic/protectedだったメンバが、継承先では
privateメンバとなる継承だと勉強しました。
ところが実際にコードを書いてみると、private継承をした場合に、
継承先のメンバ関数から、継承元のpublic/protectedだったメンバにアクセスできるのです。
これはどういうことなのでしょうか、教えてください・・・。
環境は、VC++.NET2003です。
0380デフォルトの名無しさん
05/02/02 16:15:47オマイさんの中で何がどう矛盾してるんだ?
継承先ではprivateにちゃんとなってる。
何が疑問なんだよ
0381デフォルトの名無しさん
05/02/02 16:17:12考えてみて笑ってもらいたいんだが、「private継承をした場合に、継承先の
メンバ関数から、継承元のpublic/protectedだったメンバにアクセスでき」
なかったとしたら、派生元のクラスはどうやって使われることになるんだい?
0382デフォルトの名無しさん
05/02/02 16:20:25何で、親から親のPrivateを覗けるんだ?失礼だろう、
friendの使い方をまちがっとる、友達は親だけの関係だよ、
0383379
05/02/02 16:30:21継承元でprivateだったメンバには、継承先からはアクセスできないと思っているのですが、、、
(a)継承元でprivateで、継承先でprivate
(b)継承元でpublicで、継承先でprivate
の2つのメンバがあって、(a)はアクセスできず、(b)はアクセスできるのは変だなと。
>>381
そのことも頭をよぎったのですが、まだ自分の知らない謎の機能で何とかなるのかなと思ってました。
0384デフォルトの名無しさん
05/02/02 16:37:570385デフォルトの名無しさん
05/02/02 16:43:45君が「習った」と言っているのは外から見たaccessibilityの話だよ。
0386デフォルトの名無しさん
05/02/02 16:53:28class 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も同様。
}
0387379
05/02/02 17:20:28外から見たaccessibilityと、中から見たaccessibilityがあるのですか!
ありがとうございました、なんとなく分かりかけてきました。
>>386
> b.x = 1; //これも当然エラーになる
b.xは、外から見たaccessibilityはpublicなので、エラーにはならないのでは?
0388デフォルトの名無しさん
05/02/02 17:24:51ごめん。b.xは通る。脳内ではHogeのつもりだった。
0389デフォルトの名無しさん
05/02/02 17:24:53VC7.1で混ざったぞ。どうしてくれる。
0390デフォルトの名無しさん
05/02/02 17:30:02push_backしたいのですが、スレッドセーフでありません。
LONGならInterlockedとかがありますが、std::vectorの場合は
どうすればスレッドセーフになりますか?
std::vector<int> g_vec;
・・・
HRESULT WINAPI MsgHandler(・・・)
{
int i;
・・・
g_vec.push_back(i);
・・・
}
ご助言お願いします。
0391デフォルトの名無しさん
05/02/02 17:33:59ぬるぽ
ガッ
ガッ
ぬるぽ
ぬるぽガッ
ガッ
ぬるぽ
ガッぬるぽ
・
・
・
VC7.1だとこんな感じで改行が連続したりするのでロックしないと駄目
0392デフォルトの名無しさん
05/02/02 17:34:29クリティカルセッションとかは?
0393デフォルトの名無しさん
05/02/02 17:34:29スレッドは標準じゃないからスレ違い
0394デフォルトの名無しさん
05/02/02 17:35:38クリティカルセッション…324件
クリティカルセクション…856件
0395デフォルトの名無しさん
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が正解ですね。
正誤表に入れておきます。
まったく、思い込みというのは恐ろしいものです。ご指摘ありがとう
ございました。
0396デフォルトの名無しさん
05/02/02 17:37:24オマイな、クリティカルセッションを真顔で言う香具師がいると本気で信じてんのかと
0397デフォルトの名無しさん
05/02/02 17:46:11了解しました!ありがとうございました。
0398デフォルトの名無しさん
05/02/02 17:53:32#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<<はアトミックってこと?
0399デフォルトの名無しさん
05/02/02 17:57:210400デフォルトの名無しさん
05/02/02 18:00:280401デフォルトの名無しさん
05/02/02 18:09:260402デフォルトの名無しさん
05/02/02 18:10:230403デフォルトの名無しさん
05/02/02 18:16:560404デフォルトの名無しさん
05/02/02 18:19:280405デフォルトの名無しさん
05/02/02 18:20:36ISO C++ 標準規格で指定されている C++ 言語。
0406デフォルトの名無しさん
05/02/02 18:23:500407デフォルトの名無しさん
05/02/02 23:26:03VC6 でMSXML使ってます。
XML形式の書き出しは何とかできたんだけど、出力が1行になっちゃいます。
複数行に出力されるようなフラグとかあるんですか?
現状
<?xml 略?>
<root><a><b>text</b></a></root>
理想
<?xml 略?>
<root>
タブ1個<a>
タブ2個<b>text</b>
タブ1個</a>
</root>
0408デフォルトの名無しさん
05/02/02 23:31:460409デフォルトの名無しさん
05/02/03 00:38:23C++標準ライブラリではファイル検索はサポートされているのでしょうか?
#つまりC++標準ライブラリで移植性が得られるのでしょうか
0410デフォルトの名無しさん
05/02/03 00:42:56いいえ。
ファイルシステム関連は環境依存です。
なぜなら、実行環境がファイルシステムを持たない場合も考えられるからです。
0411デフォルトの名無しさん
05/02/03 00:45:160412デフォルトの名無しさん
05/02/03 00:46:37○また
0413デフォルトの名無しさん
05/02/03 00:49:31なるほど。ありがとうございます。
0414407
05/02/03 01:00:540415デフォルトの名無しさん
05/02/03 01:12:270416407
05/02/03 01:20:53さんく。行ってくる
0417デフォルトの名無しさん
05/02/03 11:54:070418デフォルトの名無しさん
05/02/03 13:19:25各メンバのoperator=を呼ぶコードをコンパイラが勝手に作ってくれるから。
0419デフォルトの名無しさん
05/02/03 13:37:340420417
05/02/03 14:28:04コピーコンストラクタが書いてある理由は何でしょうか?
試しにコピーコンストラクタとテンプレート版コピーコンストラクタ?を消してみて、
pair<int, ini> pair1(0,0);
pair<int, int> pair2(pair1);
とやってみたところ、問題なく動いてるように見えるのですが・・
0421デフォルトの名無しさん
05/02/03 14:46:48> 問題なく動いてるように見えるのですが・・
本当に?嘘付いたら10000回殴って針を1000本飲んでもらうよ?
0422デフォルトの名無しさん
05/02/03 17:39:18コピーコンストラクタがないと、デフォルトコンストラクタ→operator=と呼ばれて無駄ができるからだろ、多分。
0423デフォルトの名無しさん
05/02/03 18:04:570424デフォルトの名無しさん
05/02/03 18:21:34おいおい(w
0425デフォルトの名無しさん
05/02/03 18:45:17さあコピーコンストラクタ消して使いまくってくれ
0426デフォルトの名無しさん
05/02/03 18:52:26class 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+ を持ってた場合とかは
どう対応すればいいんでせう?
0427デフォルトの名無しさん
05/02/03 19:30:08うまくいえないんだけど、なんだかひどく間違っているような気がする
0428417
05/02/03 20:39:17そ、そこまで言われると自信ないです。
>>425
ポインタの場合、同じ領域を2つのpairが持つことになってまずいということでしょうか?
でもpairのコピーコンストラクタって、
pair(const pair& p)
: first(p.first), second(p.second)
{ ; }
これだけなんですよね。
これでは、書かない場合と同じだと思うのですが、私の理解が間違っているのでしょうか?
0429デフォルトの名無しさん
05/02/03 21:07:24コンストラクタのない、あるいはprivate/protectedになっていて呼び出せないクラスが
要素になることを防止する、というのはどうだろう?
0430デフォルトの名無しさん
05/02/03 21:07:32ちなみに vc7.1 についてる stl だと、
std::pair のコピーコンストラクタはコンパイラ自動生成のものですよ。
0431417
05/02/03 21:39:00なるほど。
>>430
環境によって違うんですね。
ちなみにbcc5.5でした。
あまり気にしなくて良さそうですね。
皆様ありがとうございました。
0432デフォルトの名無しさん
05/02/03 22:25:59おいおい(w
0433デフォルトの名無しさん
05/02/03 22:43:250434デフォルトの名無しさん
05/02/03 23:02:40解説キボン
0435デフォルトの名無しさん
05/02/04 02:02:50早く謝れよ
0436デフォルトの名無しさん
05/02/04 02:20:04マジで出島?
0437デフォルトの名無しさん
05/02/04 02:23:030438デフォルトの名無しさん
05/02/04 05:06:530439マイク ◆yrBrqfF1Ew
05/02/04 05:55:090440デフォルトの名無しさん
05/02/04 07:09:35ファイルローカルと言う意味なら、基本は無名namespace。
内部リンケージであることが重要ならばstatic。
0441デフォルトの名無しさん
05/02/04 08:29:03なんでそんな使い分けが必要?
0442デフォルトの名無しさん
05/02/04 09:30:550443デフォルトの名無しさん
05/02/04 10:19:13ていうか若い!
0444デフォルトの名無しさん
05/02/04 10:45:440445デフォルトの名無しさん
05/02/04 12:40:44無名namespaseにするのが原則。
staticを関数・クラス内の静的変数・関数の指定の役割だけにするために無名namespaseが作られたのだから。
0446デフォルトの名無しさん
05/02/04 15:37:460447デフォルトの名無しさん
05/02/04 15:45:41無理。
代わりにvoid *を引数に取るとか、テンプレートにした上でtypeidで照合するとかをやりな。
0448デフォルトの名無しさん
05/02/04 16:23:460449デフォルトの名無しさん
05/02/04 16:27:110450デフォルトの名無しさん
05/02/04 17:02:33bool b_;
public:
_???_ operator=(const T &_)
{
if (b_)
return (T型オブジェクトへの参照);
else
return (S型オブジェクト実体);
};
};
演算子のオーバーロードを行うとき、メンバ変数i_の値に応じて
返値の型を変えたい(参照かポインタか実体かも)。
templateの特殊化だと、Tの型に応じて(template<> class A<int>など)
オーバーロードしたメソッド内での挙動を変えることができるという認識なんだけど
こういう、変数値に応じて返値の型が変わる場合にも使えるの?
0451デフォルトの名無しさん
05/02/04 17:05:13一週間くらい悩んでいるので意味不明なことをほざいてるかもしれません
0452デフォルトの名無しさん
05/02/04 17:57:58MSX ML
に見えて(・∀・)と思った
MS XMLね。
0453デフォルトの名無しさん
05/02/04 18:17:48前置き:
file1にはテキストが80行
file2にはテキストが60行
file3にはテキストが30行
処理:
ファイルのテキストを1行ずつ読み込んでstringのvectorに追加。
読み込み終わったらそのデータに3行新たなテキストを追加し、
file1_1として出力。file2,3も同様にこれを行なう。
この処理をやろうとすると、
file2_1にfile1の内容が一緒に追加されてしまうのです。
つまりfile2_1の内容が
---
file1の内容
file2の内容
追加テキスト
---
になってしまうのです。
ループごとにclear()をし、追加にはpush_back()を使っています。
なぜこうなってしまうのでしょう?
0454デフォルトの名無しさん
05/02/04 18:20:13ソースがないと解からない。
0455デフォルトの名無しさん
05/02/04 18:22:23streamをcloseしてないとか。
0456453
05/02/04 19:10:27オブジェクトの初期化をし忘れているという
単純なミスでした。解決しました。
>>454
>>455
本当にごめんなさい。ありがとうございました。
0457デフォルトの名無しさん
05/02/04 20:07:1744歳のおったんだが、プログラム大好きです。
仕事ではコボラーだったが、VB、Java、C、C++を
自学した。
でもって、C++をこれから先専門にやろうと思って
IT企業の中途採用を訪ね歩くが、44歳からでは
無理でしょうと冷たい。
それで、独立してやろうと思うが、一人で受けら
れるようなC++の仕事ってどんなのがある。
なんでもいいからヒントになるようなこと教えてください。
0458デフォルトの名無しさん
05/02/04 20:12:24仕事に従って言語選べるやつじゃないと使えない。
0459デフォルトの名無しさん
05/02/04 20:18:45そうだな、お前は入力でもやってろ。
0460デフォルトの名無しさん
05/02/04 20:56:37m9(^Д^)プギャー
0461デフォルトの名無しさん
05/02/04 21:40:15マ板へどうぞ
0462デフォルトの名無しさん
05/02/04 21:49:03シェアウェア作家
0463デフォルトの名無しさん
05/02/04 22:35:35ロートルになるまでガンバレ
0464デフォルトの名無しさん
05/02/04 23:34:32あんたが使い物になるならうちの会社で面倒見てやる。
雇用でも契約でもいいぞ。だが、言語知識しかアピールできないなら門前払いだ。
44歳なら44歳なりのアピールの仕方があるだろ?
0465デフォルトの名無しさん
05/02/05 00:03:09NEET乙
0466デフォルトの名無しさん
05/02/05 00:09:27俺超エリート中学生。お前なら俺の子分にしてやってもいいぞ。
0467デフォルトの名無しさん
05/02/05 00:12:40細木数子乙
0468デフォルトの名無しさん
05/02/05 00:15:37ずばり言うわよ
0469デフォルトの名無しさん
05/02/05 00:15:40動的に切り替えるのは無理だし,operator=のオーバーロードもあいまいなので無理。
どういうことがしたいのかもっと具体的に例をあげて言ってみ。
0470デフォルトの名無しさん
05/02/05 00:17:480471デフォルトの名無しさん
05/02/05 00:48:530472デフォルトの名無しさん
05/02/05 02:12:220473デフォルトの名無しさん
05/02/05 03:07:23おながいします
0474デフォルトの名無しさん
05/02/05 07:06:00そのboolをテンプレート引数にして特殊化する、ってのはだめ?
0475デフォルトの名無しさん
05/02/05 10:30:55コンパイル時に決定するならいいけど、動的には無理だお。
0476デフォルトの名無しさん
05/02/05 12:42:31> あるいは、protected かつ非 virtual であるべき。
ってどういうことですか?
0477デフォルトの名無しさん
05/02/05 12:44:08デストラクタ virtual
で具ぐれ。
死ぬほど出てくるから。
0478デフォルトの名無しさん
05/02/05 13:07:04現状、無名namespaceとC言語の(C++が継承している)staticは同じ意味にはならず、
大きな違いがリンケージであるから、です。
0479476
05/02/05 13:07:45死ぬほど出てきました。
デストラクタが virtual でない基底クラスのポインタが
派生クラスを指す時に delete するとやばいから、
デストラクタを virtual にしてそんな時も安心にするか、
もともと delete 禁止にしておけってことだったんですね。
ありがとうございました。
0480マイク ◆yrBrqfF1Ew
05/02/05 13:13:180481デフォルトの名無しさん
05/02/05 13:29:320482マイク ◆yrBrqfF1Ew
05/02/05 13:34:230483デフォルトの名無しさん
05/02/05 13:41:560484デフォルトの名無しさん
05/02/05 18:05:31namespace名の一文字目は大文字か小文字かどちらがいいでしょうか?
0485デフォルトの名無しさん
05/02/05 18:17:26クラスの命名で大文字を使っているなら、大文字で良いと思う。
0486デフォルトの名無しさん
05/02/05 18:27:250487デフォルトの名無しさん
05/02/05 18:30:53レスサンクスです、クラスは大文字なので、そろえた方がいいですよね。
>>486
JavaやDは小文字なのですか、サンクスです。
0488デフォルトの名無しさん
05/02/05 18:42:05頼むから、大文字Cで始めるのだけはやめてくれ。
#CWindowPosって名前のnamespaceを作った香具師がいるんだ。
##恐らく元はクラスのつもりだったのだろう。
0489デフォルトの名無しさん
05/02/05 18:47:23>>488
ハンガリアン恐るべし……
0490デフォルトの名無しさん
05/02/05 18:59:230491デフォルトの名無しさん
05/02/05 22:12:42Microsoft のライブラリでも、さすがに namespace まではハンガリアンしてない。
代わりに using namespace しちゃってるから意味ないが(例: WTL)
0492デフォルトの名無しさん
05/02/06 00:45:02nsHoge ジャマイカ
0493デフォルトの名無しさん
05/02/06 00:54:42MSってまだハンガリアンなの?
0494デフォルトの名無しさん
05/02/06 01:30:380495デフォルトの名無しさん
05/02/06 02:52:04別案件が一段落したらまた考え直します(´д`)
0496デフォルトの名無しさん
05/02/06 07:39:43> 返値の型を変えたい(参照かポインタか実体かも)。
なんでそんなことをせねばならない状況になったのか詳しく
0497デフォルトの名無しさん
05/02/06 16:57:260498デフォルトの名無しさん
05/02/07 09:24:18とは、口が裂けてもいえない。
0499デフォルトの名無しさん
05/02/07 09:25:090500デフォルトの名無しさん
05/02/07 13:29:06車輪の再発明をやろうとしてました。
↑の方か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にすればいいという気がしてきた……。
0501デフォルトの名無しさん
05/02/07 14:39:19http://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 にアクセスする手法が一通りじゃないってのがすごく気持ち悪いんだけど…。
0502デフォルトの名無しさん
05/02/07 15:01:26そのpdfとは実装がだいぶ違うけれど自分のコードでは
template <typename T>
ostream& operator<< (ostream &os, property<T>& t)
{
return os << T(t);
};
のように、propertyに指定した型のoperator<<を利用しています。
0503デフォルトの名無しさん
05/02/07 18:53:15>現状、無名namespaceとC言語の(C++が継承している)staticは同じ意味にはならず、
は理解しているつもりなのですが
>大きな違いがリンケージであるから、です。
具体的にどういう違いが出てくるのかが良く分からないので
良い例があったら挙げてもらえないでしょうか?
0504デフォルトの名無しさん
05/02/07 20:25:02CRTP 使って、property<T>::operator OP() を T::operator OP() に委譲できないかな。
0505デフォルトの名無しさん
05/02/07 23:40:05namespace { void external() {} }
static void internal() {}
template< void (&Function)() >
void call_twice() { Function(); Function(); }
int main()
{
call_twice< external >();
call_twice< internal >();
}
0506デフォルトの名無しさん
05/02/08 00:12:35こびへつらうのって馬鹿らしい。
0507デフォルトの名無しさん
05/02/08 01:29:050508デフォルトの名無しさん
05/02/08 01:41:10そんな上司に仕える自分の能力の無さを嘆いているんだと思う
0509デフォルトの名無しさん
05/02/08 02:01:19マ板逝け ウザイ
0510デフォルトの名無しさん
05/02/08 02:07:20非型テンプレート引数には外部リンケージを持つものしか指定できないので
その違いが出ることは理解できるのですが,
その例を見てもやはり無名名前空間だけで事足りるような気がします.
440で指摘されるような使い分けがなぜ必要なのかがやはり分かりません.
内部リンケージであることが積極的に必要な状況が知りたいです.
0511デフォルトの名無しさん
05/02/08 03:03:42propertyクラス自身を返すようにすればできるかもしれませんねえ。検討してみます。
ただ、operator[]の最後の1回は参照を返すが、それまではインスタンスを返す実装なので
(Boost.Functionの定義がfunction<T ()>かfunction<T& ()>で異なるため)
見直しが必要かもしれません。
CRTP?
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-selfref-template-2.html
0512デフォルトの名無しさん
05/02/08 07:09:50void 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
0513デフォルトの名無しさん
05/02/08 07:46:43f<int&>(n);
解決!
0514デフォルトの名無しさん
05/02/08 08:02:290515デフォルトの名無しさん
05/02/08 15:06:01完全に C のライブラリを隠蔽してしまいたいのですが、mylib/types.h で
typedef int my_char_t; みたいなことをされています。
C++ 側のヘッダで my_char_t を使うには mylib/types.h を隠蔽してしまうしか
無いのでしょうか?
構造体みたいに
extern "C" {
my_char_t;
}
みたいな事はできない?
0516デフォルトの名無しさん
05/02/08 15:35:29そのままC++側でもtypedef int my_char_t;って書けばいいだけじゃないのか?
0517デフォルトの名無しさん
05/02/08 15:48:04それしかないんですね。了解しました。
ありがとうございます。
0518デフォルトの名無しさん
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*
}
0519デフォルトの名無しさん
05/02/08 21:16:12> C のライブラリを C++ で書いてます。
> 完全に C のライブラリを隠蔽してしまいたいのですが、
????
何をしてるって?
0520デフォルトの名無しさん
05/02/08 21:54:40部分特殊化?
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 */ }
};
0521コマンドラインオプションの処理
05/02/08 21:57:29http://www.gnu.org/software/commoncpp/
コマンドラインオプションのパースに便利らしいクラスライブラリが
含まれているのですが、まともなドキュメントがなく使い方が分かりません。
もし他にコマンドラインオプションの処理に便利なクラスライブラリがあったら
それを使うことも検討しています。皆さん、コマンドラインオプションの
処理ってどうやってらっしゃいます?やはり独自のパーサを作ってますか?
0522デフォルトの名無しさん
05/02/08 22:00:55レスthx
main()
{
dipshit<int, int> a;
a.jerk();
// a.airhead();
}
小出しになって申し訳ないがこれもしたい
0523デフォルトの名無しさん
05/02/08 22:01:28template <typename wanker, typename bore>
struct dipshit
{
void jerk();
void airhead() { }
};
0524デフォルトの名無しさん
05/02/08 22:09:03僕らの boost があるじゃないか。
http://www.boost.org/doc/html/program_options.html
0525デフォルトの名無しさん
05/02/08 22:10:04struct 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 */ }
};
0526デフォルトの名無しさん
05/02/08 22:22:06うん、そーだよな・・・・thx
0527デフォルトの名無しさん
05/02/08 22:22:550528デフォルトの名無しさん
05/02/09 01:05:10ありがとうございます.Cとの後方互換性ということをすっかり失念してました.
そこにある2番目の理由はいまいちピンと来ないですが.
0529デフォルトの名無しさん
05/02/11 15:21:38std::locale loc( std::locale::classic(), facet );
この場合 *facet を削除するのは loc になりますが、loc の生成時に例外が発生した
場合は誰が *facet を削除しなければいけないのでしょうか?
0530デフォルトの名無しさん
05/02/11 15:42:270531デフォルトの名無しさん
05/02/11 16:00:20を実行するやつって auto_ptr 版ないの?
デストラクタで勝手に呼び出すためだけにshared_ptr使うのは
必要以上に重いから使いたくないんだけど
0532ヽ(´ー`)ノ ◆.ogCuANUcE
05/02/11 16:27:58> を実行するやつって auto_ptr 版ないの?
何言ってるか分からん……。
> デストラクタで勝手に呼び出すためだけにshared_ptr
??(´Д`)
boost::scoped_ptr のことか?
0533デフォルトの名無しさん
05/02/11 16:40:38ttp://www.boost.org/libs/smart_ptr/sp_techniques.html#encapsulation
こういうのだろ。
shared_ptr<X> px(CreateX(), DestroyX);
0534デフォルトの名無しさん
05/02/11 17:48:39>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のフォルダ漁れば実装が掘り出せると思います.
0535デフォルトの名無しさん
05/02/11 18:14:34サンクスコ
さっそく見てみます
0536デフォルトの名無しさん
05/02/11 18:43:40VC++ 7.1 のソースを見ると std::locale のコンストラクタで例外が起きたときは
ファセットを削除する処理をしていないようなので
std::auto_ptr<MyFacet> facet(new MyFacet);
std::locale loc( std::locale::classic(), facet.get() );
facet.release(); // このメソッドは例外が発生しない
でメモリリークは起きないと思います。
0537532
05/02/11 19:10:13ドキュメントと実装を見る限り、どうやらこの move_ptr で
目的を達成できそうです。感謝。
しかしなんでこれが boost にまだ入ってないんだろう…便利なのに
0538デフォルトの名無しさん
05/02/11 20:08:17typedef 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つになってしまって済みません。
0539デフォルトの名無しさん
05/02/11 21:05:00float を double にするだけで多少は早くならない?
C/C++ 上での float はウンコだよ。
0540デフォルトの名無しさん
05/02/11 21:10:580541538
05/02/11 21:13:42DirectXでFLOAT多用しているから速いものだと思ってました・・・
書き損じましたが、typedef std::multimap<float,Sprite*> SPRITESの
floatはZオーダーというかdepth値です。
depthをキーとしてレイヤー1個を描画したら次のレイヤーを上書きする
という感じでやっています。
0542538
05/02/11 21:15:270543デフォルトの名無しさん
05/02/11 21:16:590545デフォルトの名無しさん
05/02/11 21:42:380546538
05/02/11 22:04:51insertのソートに時間を大幅に食って
参照自体の時間はあまり変わりませんでした。
0547デフォルトの名無しさん
05/02/11 22:13:180548デフォルトの名無しさん
05/02/11 22:16:06環境やプログラムによるだろ。一概には言えない。
0549デフォルトの名無しさん
05/02/11 22:17:31DirectXでしょ? まずは描画方面から疑ってみれ。他スレで。
0550デフォルトの名無しさん
05/02/13 09:22:43こういうのって include するだけで使えるように
実装を全てヘッダファイルに書いた方が良いのでしょうか?
0551デフォルトの名無しさん
05/02/13 09:57:300552デフォルトの名無しさん
05/02/13 09:58:04他人も使うなら定石に従って作る
0553デフォルトの名無しさん
05/02/13 10:07:210554デフォルトの名無しさん
05/02/13 11:40:10全部inlineにするとか?
0555デフォルトの名無しさん
05/02/13 12:53:39それだと static データメンバがどーしよーもなくなる
こんな理由で使うのを勧めたくはないが、使うなら template だな
0556デフォルトの名無しさん
05/02/13 13:01:00int f() {}
f();
とかは
template <int> f() {}
f<0>();
とか?激しく汚いな…
boost とかはこの辺どうなってんだろ
0557デフォルトの名無しさん
05/02/13 13:23:39そのテクニックはstlportで使われてた。
template <int __Inst = 0> class...
みたいに。
ちなみにその例は、f<0>をラップするinline非template関数を使えば
それなりに使えるようになると思う。
>boost とかはこの辺どうなってんだろ
boostの大部分は最初からtemplateだから問題ない。
そうじゃないところは普通のライブラリ(配布はソースで)。
0558デフォルトの名無しさん
05/02/13 13:32:30>それなりに使えるようになると思う。
あーホントだ。頭が固いせいか思いつかなかった。
確かにinlineでラップすりゃ全然問題ないですね。
stlportで使われてるってことは結構有名なのかな?
何にせよすごい勉強になった。トンクス
0559デフォルトの名無しさん
05/02/13 14:16:12{
//static float b;
static float& b() { static float c; return c; }
};
0560& ◆leAf1aNbyo
05/02/15 00:05:09std::vector のシーケンシャルアクセスを行う場合
iterator による走査と添字による走査とではどちらかが速度的に有利になるんでしょうか?
添字の方がソース書く上では楽だけど,若干不利な気がしてます…
0561デフォルトの名無しさん
05/02/15 00:10:38化けた文字列が名前欄に残ってたせいでトリップができちゃった
0562デフォルトの名無しさん
05/02/15 00:34:15最適化によっては全く同じコードになることもある。
それを気にするよりも、他に気を遣うべきかと。
0563デフォルトの名無しさん
05/02/15 00:34:36for_eachを使うと内部実装に適した走査が行われる、かもしれない、
てなことがどっかに書いてあった気がする。
どっちみちvecotorなら関係ないかも。
0564デフォルトの名無しさん
05/02/15 00:42:36�dx 気にせず状況に合わせて書いていきます(`・ω・´)
0565デフォルトの名無しさん
05/02/15 00:42:48iterator の場合は current,end のふたつ。
添え字の場合は top,index,num のみっつ。
というわけで iterator のほうが有利といえるだろう。
極端な例じゃないと実際に差は出ないだろうけどな。
0566デフォルトの名無しさん
05/02/15 00:46:050567デフォルトの名無しさん
05/02/15 16:45:50例えば
int func()
{
struct Sorter : std::...{
bool operator()(..., ...) const { ... }
};
std::sort(.begin(), .end(), Sorter());
}
ってやるとエラーが出るんですが…(VC7.1)
何かいい方法はないでしょうか?(boost::lambda以外で)
0568デフォルトの名無しさん
05/02/15 16:50:250569デフォルトの名無しさん
05/02/15 17:21:59できませんよ。
0570デフォルトの名無しさん
05/02/15 21:28:140571デフォルトの名無しさん
05/02/15 23:09:24ttp://www.tietew.jp/cppll/archive/11286
微妙に違うけど参考に汁。
0572デフォルトの名無しさん
05/02/17 12:59:16例えば、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++ではどう書くのが定石なんでしょう?
0573デフォルトの名無しさん
05/02/17 13:03:22C++ならnew/deleteを使うか、std::wstringを使うかしてください。
0574デフォルトの名無しさん
05/02/17 13:04:17一番のオススメはstd::wstringかな。
0575デフォルトの名無しさん
05/02/17 13:45:11std::auto_ptrに入れて返してoperator<<をオーバーロードすればいいんじゃない?
0576デフォルトの名無しさん
05/02/17 14:19:30任意のエンコーディングの文字列を wstring や wchar_t * に変換するのって
どうやればできる?
0577デフォルトの名無しさん
05/02/17 14:24:36キーワード
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;
}
0578デフォルトの名無しさん
05/02/17 14:24:59規則性があるならそれに従うだろ。
0579デフォルトの名無しさん
05/02/17 14:25:580580デフォルトの名無しさん
05/02/17 14:31:42ここかな
0581デフォルトの名無しさん
05/02/17 14:58:08それも何回継承してもstatic関数は一つだけ?
0582576
05/02/17 15:01:48たとえば、LC_ALL=ja_JP.eucJP の時に、Shift_JIS の char 配列を
wstring に変換するにはどうすればいいのかな?と。
0583デフォルトの名無しさん
05/02/17 15:06:37A a; // デフォルトコンストラクタがある場合
A a(10); // デフォルトコンストラクタがない場合
A *a = new A; delete a;
等としますが、このうち最後のようにnew演算子を使用しなければならないのは
どういう条件のときですか?
0584デフォルトの名無しさん
05/02/17 15:06:480585デフォルトの名無しさん
05/02/17 15:07:49http://tricklib.com/cxx/ex/babel/
0586デフォルトの名無しさん
05/02/17 15:10:15wchar_tを使うのであれば、文字列を扱うときは始めから一貫してwchar_tを使うようにしないと無駄な処理をしなくてはいけなくなる。
0587デフォルトの名無しさん
05/02/17 15:15:09コンストラクタがpublicでないとき。
0589デフォルトの名無しさん
05/02/17 16:14:07ウソを書くな
0590v(^・^)v
05/02/17 16:31:120591デフォルトの名無しさん
05/02/17 16:38:59その昔、
http://www.kuzbass.ru/docs/isocpp/
を探してきてテンプレに加えたのは俺なんだが
これはそもそも有料なのでまずいよな
0592デフォルトの名無しさん
05/02/17 16:42:41その場でインスタンスを作りたくないとか、自分では作りたくなくて、
ポインタとして保持したいとき。
コンストラクタがどうとかは一切関係ない。
0593デフォルトの名無しさん
05/02/17 16:47:24コンストラクタがpublicでないけどoperator newがpublicになっているクラスのことも考えてみろ。
0594デフォルトの名無しさん
05/02/17 16:50:41FINAL *DRAFT* だからイイんじゃないの?
0595デフォルトの名無しさん
05/02/17 16:54:54コンストラクタがpublicじゃないとnewできないよ
0596デフォルトの名無しさん
05/02/17 16:57:42もう何年も公開しっぱなしだよな
漢だ
ISOはケチだな
0597デフォルトの名無しさん
05/02/17 17:04:10class hoge
{
hoge(){}
friend hoge* moge();
};
hoge* moge(){return new hoge;}
0598デフォルトの名無しさん
05/02/17 17:06:53new 限定で生成させるときの常套手段なんだが、知らないの?
0599583
05/02/17 17:22:30newで生成していない場合は、スコープが外れた後適度なタイミングでデストラクタが呼ばれる。
{
A a;
...
} // OK, インスタンスaのデストラクタは自動で呼ばれる
{
A *p = new A;
...
} // NG, pが指すインスタンスは消滅しないので、delete p;が必要
■new使用したいとき
1. その場でインスタンスを作りたくない
2. ポリモルフィズムを利用したい
3. スコープ外でもインスタンスを残したい
という感じですか?
>>598
new限定で生成させなければならないようなケースってどういうときですか?
0600デフォルトの名無しさん
05/02/17 17:23:12>>583の3つ目みたいに直接newしてないだろ。
0601デフォルトの名無しさん
05/02/17 17:41:570602デフォルトの名無しさん
05/02/17 17:42:09http://www112.sakura.ne.jp/~kaientai-project/creategame.htm
2chスレ
http://game10.2ch.net/test/read.cgi/mmominor/1108379282/l50
ただ今職人(プログラマ、グラフィッカー)はげしく募集中!
あなたの力を思う存分発揮してください。
0603デフォルトの名無しさん
05/02/17 17:46:400604デフォルトの名無しさん
05/02/17 18:01:56friend 使ったら、private もなにも関係ないじゃん。
0605デフォルトの名無しさん
05/02/17 18:06:10placement new じゃない new も OK なの?知らなかった。
0606デフォルトの名無しさん
05/02/17 18:11:15不親切なアドバイスに感謝します
0608デフォルトの名無しさん
05/02/19 07:12:32http://www.amazon.com/exec/obidos/tg/detail/-/0201721481/
まあ3あればいらないか。入門書の決定版であることは変わりないのかな?
0609デフォルトの名無しさん
05/02/19 09:40:33俺は買ったものの、でかすぎて読んでない orz
0610デフォルトの名無しさん
05/02/19 13:08:073を買ったけど同じくあんまり読んでないorz
C++ Primerのいいところは細かいところまで書いてある辞書的なところだが
悪いところは辞書的なくせに章毎の最初から読まないとサンプルソースがわかりにくいところだと思う。
ところでEffective C++を読んでて
AWOV=Abstract w/o Virtualsってのがでてきたんだけど、w/oって何ですか?
0611デフォルトの名無しさん
05/02/19 13:11:490613デフォルトの名無しさん
05/02/19 14:06:480614デフォルトの名無しさん
05/02/19 14:08:080615デフォルトの名無しさん
05/02/21 14:21:14「C++はなぜ人気がないのか」
に書かれてある、テンプレートの記述に関してなんですが
> C++では「vector」などと宣言したコレクションにはPersonクラスのオブジェクトが
> 直接格納されるのに対し,Javaでは以前のコレクションと同様にオブジェクトへの参照が格納される。
> このため,メモリー使用量が減ったりシーケンシャル・アクセスが高速になるといった効果は期待できない。
というのがわかりません。
直接格納される(値渡しのこと?)とどうしてメモリー使用量が減ったり
シーケンシャル・アクセスが高速になるのでしょうか?
コピーコンストラクタが呼ばれて余計遅くなるイメージがあるんですが。
0616デフォルトの名無しさん
05/02/21 15:06:08物理的にメモリ上で連続してればそれだけCPUのキャッシュにヒットする確率が高くなる。
最近のCPUではいかにキャッシュミスを減らすかが高速化の鍵なのでクリティカルな状況では絶望的な差になりかねない。
0617デフォルトの名無しさん
05/02/21 15:11:12> 直接格納される(値渡しのこと?)とどうしてメモリー使用量が減ったり
> シーケンシャル・アクセスが高速になるのでしょうか?
> コピーコンストラクタが呼ばれて余計遅くなるイメージがあるんですが。
直接格納だとオブジェクトだけ格納すればいいから。
オブジェクトへのポインタが要らないので、その分のメモリも要らない。
ポインタでなくオブジェクトそのものを配列に確保できると、オブジェクトが一続きの
メモリ領域に置いてあることが保証できるので、シーケンシャルアクセスするのは簡単。
ポインタだとあちこちの番地に飛ばなければならないことがあって遅い。
0618デフォルトの名無しさん
05/02/21 16:36:19クラスAを継承したクラスBがあります。
クラスAのメンバにクラスBの型の変数を指定してもいいのですか?
0619デフォルトの名無しさん
05/02/21 16:38:03だめです。
0620デフォルトの名無しさん
05/02/21 16:50:44文法的には可能だけど、設計的にはわりとうんこだと思うよ(ケース倍ケースではあるが)
0622デフォルトの名無しさん
05/02/21 17:06:57javaの場合
hoge* vector[100];
ができても
hoge vector[100];
ができない。
代入処理ではコピーコンストラクタが呼ばれないぶん前者が早いが、
読み出しではポインタをたどらなきゃいけないうえに実体がメモリのあちこちに点在しているので遅い。
0623デフォルトの名無しさん
05/02/21 22:36:21それぞれ一冊ずつ推薦してください。
0624デフォルトの名無しさん
05/02/21 22:37:00Effective STL
0625デフォルトの名無しさん
05/02/21 23:10:370626デフォルトの名無しさん
05/02/21 23:31:01問題は禿がいみじくも言っていたように「言語は、それを使う人が何を考えることができるのかを決めてしまう」ことである
テンプレートという素晴らしい進歩の目先の困難に負けて逆行した DQN 言語が俺は嫌い
後でいくら訂正しても馬の糞に生クリームでトッピングするようなもので根にあるものは変わっちゃいない
0627デフォルトの名無しさん
05/02/21 23:35:100628デフォルトの名無しさん
05/02/21 23:46:14Effective STLは習い始めにまず読む本じゃないだろ
>>623
個人的にオススメは「STL標準テンプレートライブラリによるC++プログラミング 第2版」かな。
これ読んで、「C++標準ライブラリチュートリアル&リファレンス」と「Effective STL」読んだらSTLは完璧だと思う。
Boostに関しては公式サイトにあるドキュメント読みんしゃい。
0629デフォルトの名無しさん
05/02/21 23:54:09分かりやすい例もあるし。
Boost本を買う必要は全然無い
0630デフォルトの名無しさん
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;
}
0631デフォルトの名無しさん
05/02/22 01:49:310632デフォルトの名無しさん
05/02/22 01:50:40警告 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 ***
0633デフォルトの名無しさん
05/02/22 01:50:56- class DataB:DataA{
+ class DataB:public DataA{
0634630
05/02/22 01:52:09すまん、うっかり忘れてた……。
0635デフォルトの名無しさん
05/02/22 01:53:27基底クラスとは異なってきてちまいまちゅ。
0636デフォルトの名無しさん
05/02/22 02:01:080637デフォルトの名無しさん
05/02/22 02:23:18そう思うなら君の「胡散臭くない」private継承の意味をここに書いてみろ。
これだからOOP初心者ってのは困る。
0638デフォルトの名無しさん
05/02/22 02:32:300639デフォルトの名無しさん
05/02/22 02:34:07dynamic_castが成功すれば呼べる。もうちっと勉強せい。
0640デフォルトの名無しさん
05/02/22 02:55:360641デフォルトの名無しさん
05/02/22 02:59:44意味は→ttp://www.kuzbass.ru/docs/isocpp/access.html#class.access.base
>635への突っ込みとしては、結果と理由が逆だと言うことが言える。
まず private 継承を行った場合に上記のリンク先のルールがあり、
その結果として、外部から見た場合に通常の public 継承で見られる
is-a(is-a-kind-of) の関係がクラス外では使えなくなる、という話の順序が正しい。
また private 継承をした場合でも、通常の private メンバと同じく
そのクラス内に限っては is-a の関係が使える。
0642デフォルトの名無しさん
05/02/22 03:06:19結果と理由という話をしてるんじゃない。
結論だけを言いたまえ。同じ事だろ。
それに仮想関数がprivate継承でまともに使えるのかい。
現場に携わった経験がない頭でっかちはこれだから・・・・・・・
0643デフォルトの名無しさん
05/02/22 03:55:50> 結論だけを言いたまえ。同じ事だろ。
同じことを>>635にも言ってやれよ。
> それに仮想関数がprivate継承でまともに使えるのかい。
private継承に限って仮想関数が使えなくなる理由でもあるのか?
あんたの言う「まともに」っていうのがごく狭い意味なら、心当たりはあるが。
自分の知らないことは存在しないっていう思考は楽で幸せだよな。
0644デフォルトの名無しさん
05/02/22 04:15:29LOOPiT時代、京大中退だと嘘をついていた。
たいしたスキルのない厨房だな、ありゃ。
0645デフォルトの名無しさん
05/02/22 04:16:37C/VC以外の言語は無知に等しいしな。
0646デフォルトの名無しさん
05/02/22 06:07:41「やっていい」事は
等価ではありません
0647デフォルトの名無しさん
05/02/22 11:24:35>private継承に限って仮想関数が使えなくなる理由でもあるのか?
怒りに任せてあまりでたらめな事を書くんじゃないよ。private継承したクラスで
仮想関数をオーバーライドしようとしたら、デフォルトで基底クラスの仮想関数
は隠蔽されてしまうぞ。
もう、発言すればするほど君の無知が晒されるだけ。恥ずかしいから、どっか
他の所に行って一人でやってて下さい。
0648デフォルトの名無しさん
05/02/22 11:47:07ってことで悩んでおります。
どこかにソース落ちてませんかね?
0649デフォルトの名無しさん
05/02/22 12:06:58スレ違い。
0650デフォルトの名無しさん
05/02/22 12:10:210651デフォルトの名無しさん
05/02/22 18:04:33数学や物理でいう「ベクトル」とは全然違うよな?
0652デフォルトの名無しさん
05/02/22 18:09:41>数学や物理でいう「ベクトル」とは全然違うよな?
ほんのちょっと似てると思わんか?
0653デフォルトの名無しさん
05/02/22 18:18:340654デフォルトの名無しさん
05/02/22 19:42:200655デフォルトの名無しさん
05/02/22 19:43:520657デフォルトの名無しさん
05/02/22 21:23:26アクセス指定子はオーバーライドのセマンティクスに影響しない
0658デフォルトの名無しさん
05/02/22 21:42:41能書きはいいから、使い方の例を一つ書いてみろよ。何の役に立つというんだ?
0659デフォルトの名無しさん
05/02/22 21:54:41「オーバライドは継承のアクセスレベルによって意味が変化する」だろ。
public継承でない継承で仮想関数を使う例はマ━(゜∀゜)━( ゜∀)━( ゜)━( )━(゜ )━(∀゜ )━(゜∀゜)━ダ????
0660デフォルトの名無しさん
05/02/22 21:55:51ダウンキャストはオーバーライドに至る以前の別な問題だろうがアフォ
0661デフォルトの名無しさん
05/02/22 21:57:39だから、誰もダウンキャストして使うと言ってないだろ。アホ
0662デフォルトの名無しさん
05/02/22 21:58:460663デフォルトの名無しさん
05/02/22 22:05:50わり、アップキャストな
言い間違えた
0664デフォルトの名無しさん
05/02/22 22:13:55ふんふん、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;
}
0665デフォルトの名無しさん
05/02/22 22:14:11class 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();
}
};
0666デフォルトの名無しさん
05/02/22 22:16:37dp->f();
を加えた場合、f()は仮想関数としてオーバライドされる。静的にリンクされる事はない。
0667デフォルトの名無しさん
05/02/22 22:19:14オーバーライドできたか否かと何の関係が?
0668デフォルトの名無しさん
05/02/22 22:21:59Effective STL―STLを効果的に使いこなす50の鉄則
Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術
STL―標準テンプレートライブラリによるC++プログラミング 第2版
C++標準ライブラリチュートリアル&リファレンス
お前らありがとう。上の4冊買わせていただきました。
17000円ぐらいしたが、な、泣かないぞ。
高い金出した分は読んで取り戻す!
0669デフォルトの名無しさん
05/02/22 22:22:40オーバライドは出来るが、一般的に言う多相化原則は働かない。
0670デフォルトの名無しさん
05/02/22 22:24:35すれば、private継承でもポリモーフィズムが働くんだ。
0671デフォルトの名無しさん
05/02/22 22:27:32あなたの方が正しいわ。頭を冷やすためにコーヒー淹れて来る。
0672デフォルトの名無しさん
05/02/22 22:28:08>>665>>667
0673デフォルトの名無しさん
05/02/22 22:37:55#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;
}
0674デフォルトの名無しさん
05/02/22 22:45:29class 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();
}
0675665
05/02/22 22:48:29ちなみに、>>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);
}
0676デフォルトの名無しさん
05/02/22 22:52:52なるほど、クラス内部でfriend宣言する事により、内部のスコープがそのまま
bar()にも適用可能、と。
0677デフォルトの名無しさん
05/02/22 22:59:39struct a { virtual void b() = 0; };
struct b : private a { static a* c() { return new b; } };
main()
{
a* d = b::c();
d->b();
}
多相化原則は働かない
多相化原則は働かない
多相化原則は働かない
多相化原則は働かない
0678デフォルトの名無しさん
05/02/22 23:04:40うっせハゲ。
ポール・アンダーソン+ゲイル・アンダーソン著
最新ANSI C++オブジェクト指向プログラミング11.7 非公開派生 P616に書いてあったんだYO!
文句言うならこいつらに言え。
0679デフォルトの名無しさん
05/02/22 23:07:41抽象クラスの変数は作成できません。
0680デフォルトの名無しさん
05/02/22 23:11:04すまぬ
0681デフォルトの名無しさん
05/02/22 23:13:10これならいいだろ。
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;
}
0682デフォルトの名無しさん
05/02/22 23:16:040683デフォルトの名無しさん
05/02/22 23:22:25外部からは非公開になるものの、クラス内部ではprivate:以外のメンバは
そのまま使えるって事を忘れていた。もちろんもう一度継承すると、今度は
全く見えなくなってしまうが。
0684デフォルトの名無しさん
05/02/22 23:22:52このスレで「ハゲ」は褒め言葉なんじゃないの?
0685デフォルトの名無しさん
05/02/22 23:30:54実際、C++やってたら頭が禿げそうだよ・・・
0686デフォルトの名無しさん
05/02/23 00:04:14禿げるポイントが決まってくる
0687641
05/02/23 01:22:29>>635,>>637,>>642,>>647,>>659,>>664
↑ここらへんが全部同一人物で、且つ>>683であることを祈る。
0688デフォルトの名無しさん
05/02/23 01:36:47よくわかった。正直スマンカッタ。感情的になっていたのは俺の方でした。
0689デフォルトの名無しさん
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ではかったところ同じでしたが、
必ず同じだという保証はありますか?
0690689
05/02/23 06:11:09これはCで作られており、構造体の継承を後者のような形で行っています。
この場合Childのインスタンスを生成した後、Parentのメンバにアクセスするには
child.parent.parent_dataのように書く必要があり、非常に煩雑なわけです。
前者のC++の継承だと、child.parent_dataのように親クラスのメンバに直接アクセスでき、便利なわけです。
ただこのようなインフォーマルな方法がはたして保証されるかどうか心配なのです。
0691デフォルトの名無しさん
05/02/23 07:50:45保証はない。
Parent& p = child.parent;
ぐらいでがんばれ。
gtk+ のことは良く知らないけど、
Child を扱うコードがC++だけなら、
C++スタイルの継承が使えるんじゃないか?
0692デフォルトの名無しさん
05/02/23 07:52:20> typedef struct _Child
ここは _ を外して struct Child で頼む。
まず _C〜 が予約された名前であることと、
あと struct Child; で前方宣言できるように、ってことで。
0693689
05/02/23 08:21:03C++からプログラミングを始めたので、Cはどうも苦手なんですよ。
それでC++風に書けないものかと思ったわけで。
0694デフォルトの名無しさん
05/02/23 08:22:160695デフォルトの名無しさん
05/02/23 13:39:57gtkmmを使うとライブラリなどへの依存性が強すぎて配布が難しいと思う。
もっと気軽に使えるC++ラッパーってないのかな… 自分で作るぐらいならGTK+をそのまま使うし…。
0696デフォルトの名無しさん
05/02/23 13:41:21オブジェクト指向を理解していればどんな言語でもプログラミングできると思うが。
0697デフォルトの名無しさん
05/02/23 15:04:560698デフォルトの名無しさん
05/02/23 15:51:030699デフォルトの名無しさん
05/02/23 16:05:56大して変わらん。
0700デフォルトの名無しさん
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/
0701デフォルトの名無しさん
05/02/24 11:35:37T t;
delete t;
これは大丈夫ですか
0702デフォルトの名無しさん
05/02/24 11:40:190703デフォルトの名無しさん
05/02/24 11:40:57でした
0704デフォルトの名無しさん
05/02/24 11:50:08だめ。
いったい何がしたいの?
0705デフォルトの名無しさん
05/02/24 11:50:370706デフォルトの名無しさん
05/02/24 11:51:120707デフォルトの名無しさん
05/02/24 12:00:490708デフォルトの名無しさん
05/02/24 12:02:01ぶは、人工無能吹いた
この書き込みは僕じゃないですよ
木構造のクラスをルート側のノードをdeleteすると再帰的に
葉方向のノードもdeleteされるように書いたんですが
その時にふと疑問に思ったんです
0709デフォルトの名無しさん
05/02/24 12:20:20inline void hoge
{
class local {
public:
local() { 前処理 }
~local() { 後処理 }
};
local raii;
return 処理;
}
のようなことをやっていたんですが、これだと hoge.h を
複数の翻訳単位で include したときにリンクエラーが
出てしまいます。何かいい回避方法はありませんでしょうか?
0710デフォルトの名無しさん
05/02/24 12:38:190711デフォルトの名無しさん
05/02/24 12:40:050712デフォルトの名無しさん
05/02/24 12:44:05よく嫁。
>>709
どんなリンカエラーか晒せ。
0713デフォルトの名無しさん
05/02/24 12:55:50開くフォルダを指定しない状態ではうまくいったのですが(どこかのホームページから書き写した)、
開くフォルダを指定しようとすると、コールバック関数の呼び出し部分でエラーが出て困っています。
bi.lpfn = BrowseCallbackProc;←BFFCALLBACK型に変換できないと言われます。
bi.lpfn = (BFFCALLBACK)BrowseCallbackProc;これでもダメでした。
なんか方法があるのでしょうか。
0714デフォルトの名無しさん
05/02/24 12:59:55fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
です
0715デフォルトの名無しさん
05/02/24 13:00:440716デフォルトの名無しさん
05/02/24 13:14:02試してみたところ、ローカルクラス自体は複数回定義されないのですが
ローカルクラスのコン(デ)ストラクタ、が複数回定義されているようです。
0717デフォルトの名無しさん
05/02/24 13:15:27struct T
{
void* operator new(size_t,void* p)
{
return p;
}
};
T t;
t.~T();
new (&t)T;
0718デフォルトの名無しさん
05/02/24 13:53:40いえ、単にnewで生成してないインスタンスをdeleteできるかってことです
0719デフォルトの名無しさん
05/02/24 13:58:48自明
0720デフォルトの名無しさん
05/02/24 14:33:05void anyFunction()
{
{
T t; // ここから必要
...;
...;
} // この先不要
...;
...;
}
0721デフォルトの名無しさん
05/02/24 16:19:41できないしする必要もない
0722デフォルトの名無しさん
05/02/24 17:58:36newで生成していないインスタンスは、スコープから外れたあと、
適度なタイミングでデストラクタが呼ばれ死ぬ。
・引数で与えられる一時オブジェクトは関数から抜けるとき
・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などを検討。
0723デフォルトの名無しさん
05/02/24 18:02:35以下のような場合は?
void anyFunction()
{
T t1;
...;
T t2;
...;
...;
// ここで t1 を消したい
...;
// ここで t2 を消したい
}
予想される回答:
・new/delete すればええやん
・T にデストラクタ相当のメソッドを追加して、不必要になったらそれを呼ぶ
0724デフォルトの名無しさん
05/02/24 18:12:53hogeがクラスのメソッドだったら、ローカルクラスをネストクラスに
すれば問題が回避出来るみたい。
class Hoge
{
class nest {
public:
nest() { /*前処理*/ }
~nest() { /*後処理*/ }
};
public:
void hoge
{
nest raii;
return 処理;
}
}; // Hoge
今のままだと、localを外に出すしかないのかなぁ?
名前がかぶりそうだったら、namespaceに閉じ込めるとかして...
0725デフォルトの名無しさん
05/02/24 20:59:43クラス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が不安です。
よろしくお願いします。
0726デフォルトの名無しさん
05/02/24 21:07:330727デフォルトの名無しさん
05/02/24 21:21:240728デフォルトの名無しさん
05/02/24 21:24:020729725
05/02/24 21:25:19MemoryPoolは
static T m_Array[10];
みたいに先に10個分ぐらいメモリを取っておいて、operator newでは
使われていないやつへのポインタを返す仕様になってます。
0730デフォルトの名無しさん
05/02/24 21:25:42ってMFCとかCOMでは普通に使ってるけど、言語的にはどうなんだろうね?
実装依存だったりするのかな?
0731725
05/02/24 21:29:57んならよさそうな感じだったんですよね>delete this
0732デフォルトの名無しさん
05/02/24 22:48:290733デフォルトの名無しさん
05/02/24 22:56:34それにinlineつければいいんじゃないの
0734デフォルトの名無しさん
05/02/24 23:14:40イベントとか FIFO で管理するんならありだろ
0735デフォルトの名無しさん
05/02/25 00:11:49ttp://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; してるか、コンパイラのバグか
ってところじゃなかろうか。
0736725
05/02/25 00:50:34もともとデストラクタをAもBもMemoryPoolも定義してないのが原因でした。
Aに仮想デストラクタを作成したところ、B内のMemoryPoolのoperator deleteが
呼ばれました。
ちなみに環境はVC++6。
どうもありがとうございました。
もっと勉強しないといかんな・・・
0737デフォルトの名無しさん
05/02/25 00:58:06試してみましたが変わらないですね。
0738デフォルトの名無しさん
05/02/25 02:50:39ttp://www.tietew.jp/cppll/archive/11490
0739デフォルトの名無しさん
05/02/25 09:03:23スレッドを作成する場合
DWORD dwID;
CreateThread(NULL,0,Threadfnc,??,0,&dwID);
void WINAPI Threadfnc(Void)
{
・・・
}
↑の簡単な作成プログラムがあったとします。
Threadfncの引数をvoidにしたい場合CreateThreadの引数??には
どんな引数を書けばいいのでしょうか?
宜しくお願いします。
0740デフォルトの名無しさん
05/02/25 09:08:42書き方に間違いがあったので訂正します。
ちょっと初心者的な質問なんですけど、
スレッドを作成する場合
DWORD dwID;
CreateThread(NULL,0,Threadfnc,??,0,&dwID);
DWORD WINAPI ThreadFunc(LPVOID)
{
・・・
}
↑の簡単な作成プログラムがあったとします。
Threadfncの引数をvoidにしたい場合CreateThreadの引数??には
どんな引数を書けばいいのでしょうか?
宜しくお願いします。
0741デフォルトの名無しさん
05/02/25 09:25:030742デフォルトの名無しさん
05/02/25 09:41:070743デフォルトの名無しさん
05/02/25 09:42:530744デフォルトの名無しさん
05/02/25 12:37:00class Class{
long a;
long b;
};
このとき、&a+4は必ずbのアドレスと等しくなるという保証はありますか?
とある構造体をクラスに取り込みたいのですが、
メンバがメモリ内でどのように配置されているのかが分からないのです。
0745デフォルトの名無しさん
05/02/25 12:52:28ない。
って言うか、激しく間違った方向を向いている。
0746デフォルトの名無しさん
05/02/25 13:04:49余りにあほくさいが、&bなら&a+1だろ。
0747744
05/02/25 13:33:520748744
05/02/25 13:38:51構造体なら、続けて書いた二つのメンバは、メモリ上でも連続してますよね。
クラスの場合連続しない理由とかってあるんでしょうか。
たとえばCPUによってはメモリアロケーションの最適化のため、
char型でも4バイト領域を使ったりすることがあるらしいのですが、そういうことですか?
0749デフォルトの名無しさん
05/02/25 13:39:14それ以前の問題。
メモリ内の配置なんて気にする必要はない。
0750デフォルトの名無しさん
05/02/25 13:40:41構造体でも連続しているとは限らない。
0751デフォルトの名無しさん
05/02/25 13:44:29なんで配置を気にしているのか分からないけど、例えば、
ttp://www.microsoft.com/japan/msdn/vs/vc/vcconWindowsDataAlignmentOnIPFX86X86-64.asp
なんかが参考になりそう。でも環境依存だから気をつけて。
0752744
05/02/25 13:49:59そこを読んで勉強します。
0753デフォルトの名無しさん
05/02/25 13:52:53メモリ内での配置を意識したプログラミングをして、コンパイラのオプションや
リビジョンの違いごとに問題が無いかを検証する手間をかけるくらいなら、
配置を意識しないプログラミングをする方がずっと効率がよい。
0754744
05/02/25 14:05:220755デフォルトの名無しさん
05/02/25 14:06:410756デフォルトの名無しさん
05/02/25 14:09:35無指定の場合publicになるかprivateになるかということだけ。
0757デフォルトの名無しさん
05/02/25 15:16:57悪いこと言わないから、もうちょっと冷静に考え直せ。
詳しく状況を書いてくれたら、オジサンが設計してあげるから。
君はとんでもない勘違いをしていると思うよ。
0758デフォルトの名無しさん
05/02/25 15:33:59変数の物理的配置なんぞ意識しちゃいけないよ。
そのための高級言語だろうが。
0759デフォルトの名無しさん
05/02/25 15:43:08class Class{
long a;
long b;
};
と
struct Struct{
long a;
long b;
};
なら
Class A;
Struct B;
A.a = B.a;
A.b = B.b;
OK?
0760デフォルトの名無しさん
05/02/25 15:59:29こういう人にそういうサイトを紹介すると
「理解できてないけどなんか動くモノは作れる」タイプの人間になってしまうのではないか、と
最近新人教育に携わっている者としては不安でしかたがありません。
0761デフォルトの名無しさん
05/02/25 17:53:37使ったらよろしいでしょうか?
0762デフォルトの名無しさん
05/02/25 18:02:100763デフォルトの名無しさん
05/02/25 18:05:42スレタイ読めよ。標準C++って書いてあるだろ。
0764デフォルトの名無しさん
05/02/25 18:23:01余計な親切だったかしら?
でも、探そうと思えば誰でも探しだせる情報ですし、それを薬とするか毒とするかは本人次第ってことで...
0766デフォルトの名無しさん
05/02/25 18:35:42stlの<algorithm>のfindは便利でよく使うのだが、後ろから探してくれるようなのは無いんだろうか。
reverse_copyしてからfindするのも、findを繰り返すのも無駄な気がしてね。
0767デフォルトの名無しさん
05/02/25 18:42:02find(reverse_iterator〜
0768デフォルトの名無しさん
05/02/25 19:11:11find_end()
0769デフォルトの名無しさん
05/02/25 19:18:46こらこら
0770デフォルトの名無しさん
05/02/25 19:33:51おー、面白い。reverse_iteratorを渡すと、ちゃんとreverse_iteratorが返ってくるのね。
#当たり前なんだけどさ。
名前は知ってたけど、こりゃ便利だわ。<reverse_iterator
THX!
>>768
名前が名前だからとっくに調査済み。でもありがと。
0771デフォルトの名無しさん
05/02/26 01:11:34「タンパク質」を急いで書いたとき、間違えて
「タンパタ質」って書いちゃったことってあるよね?
0772デフォルトの名無しさん
05/02/26 01:16:14んな事ないけど、ヘモグロビンをホモグロビンと書いたことはある…
0773デフォルトの名無しさん
05/02/26 01:23:06#誰だ勝手に学習させたのは。
0774デフォルトの名無しさん
05/02/26 03:19:110775デフォルトの名無しさん
05/02/26 04:57:10アラタケタイ!
アラタケタイ!
って言ってるけど、どういう意味?
0776デフォルトの名無しさん
05/02/26 06:54:47アルアルタンケンタイ!
って言っているんだろ。
0777デフォルトの名無しさん
05/02/26 07:02:550778デフォルトの名無しさん
05/02/26 10:21:51「俺、アラン・ケイとしたい!」がなまったもの。
0779デフォルトの名無しさん
05/02/26 16:13:19アラン・ケイだけに雑談(small talk)したい、なんてな。
・・・すまん。どうしても言いたかったんだ・・・。
0780デフォルトの名無しさん
05/02/26 18:07:180781デフォルトの名無しさん
05/02/26 22:06:47クリックした場所の座標を調べる方法ってあるのでしょうか?
0782デフォルトの名無しさん
05/02/26 22:09:48標準C++だけではそんなこと出来ません。
0783デフォルトの名無しさん
05/02/26 22:11:09既出
0784デフォルトの名無しさん
05/02/26 22:11:52できますが、何か?
0785デフォルトの名無しさん
05/02/26 22:12:04vptr の初期化はコンストラクタで行われると聞きました。
しかし、グローバルオブジェクトに関しては
仮想関数のアドレスはリンク時に静的に確定できるような気がします。
何故このような仕様になっていないのでしょうか?
わけあってグローバルコンストラクタが使用できない環境(.ctorがない)での開発を行っているのですが、
この場合、仮想関数を含むクラスのオブジェクトを
グローバルに置くこと (もちろんコンストラクタが呼ばれないことは承知した上で)
は禁止しなくてはならないのでしょうか?
0786781
05/02/26 22:16:220787デフォルトの名無しさん
05/02/26 22:16:29激しく無意味だからできないことにする
0788デフォルトの名無しさん
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;
}
0789デフォルトの名無しさん
05/02/26 22:53:23やはり、自前で初期化するしかないということですね。
下のように、クラスをインターフェースとして使いたかったのですが、
このときの 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() ;
}
0790デフォルトの名無しさん
05/02/26 23:01:29(できればWindowsはCygwinで。なければLinuxでも可。)
Doxygenでクラスの継承関係とかの図は出るんですが、図の中にメンバ関数一覧
とかの表記は入らないので。
VS.NET Ent+Visioだとできそうな感じなんですけどね…
0791デフォルトの名無しさん
05/02/26 23:07:27フリーじゃないが
VC6+Rose
VC6+Visio
はできるよ。
0792デフォルトの名無しさん
05/02/27 01:09:57その例のAクラスのオブジェクトは
基本クラスであるInterfaceクラスのコンストラクタ呼び出し
この時にIntefaceクラスの仮想関数テーブルへのポインタがvptrセットされる。
↓
Aクラスのオブジェクト初期化
この時にAクラスの仮想関数テーブルへのポインタがvptrにセットされる。
と辿る。だからリンク時に設定されない。
0793デフォルトの名無しさん
05/02/27 01:58:07あんまり知られてないのかねぇ?
0794デフォルトの名無しさん
05/02/27 02:22:27A &getA(){
static A a;
return a;
}
B &getB(){
static B b;
return b;
}
int main() {
Character Tom( &getA() ), Jerry( &getB() ) ;
Tom.f() ;
Jerry.f() ;
}
とかすればいいんじゃないの?
0795デフォルトの名無しさん
05/02/27 02:47:47あっ!そうか・・・
つまり、ベースクラスのコンストラクタの中で
vptr を参照するような処理が行われる場合に問題が生じるということですね。
>>794
なるほど。
こうすると最初に getA() を呼んだ時に初めてAのコンストラクタが呼ばれるのですね。
勉強になりました。
今まで、『静的に確定できるものを実行時に代入しているなんて、なんて無駄なコードを吐くんだ…』と思っていたのですが、
これで納得できました。
ありがとうございます。
0796デフォルトの名無しさん
05/02/27 21:18:27使用する場合static宣言しないと使えないの?
0797デフォルトの名無しさん
05/02/27 21:28:110798デフォルトの名無しさん
05/02/27 21:37:48非staticメンバ関数はthisポインタを受け取るため、宣言の見た目と型が違う。
staticにしてそのまま使えるならそれでもいいし、
型を合わせる為だけの関数を間にはさんでもいい。
コールバックを受け取る側もいじれるんなら、
C++的には仮想関数を使ったほうがいいだろう。
0799デフォルトの名無しさん
05/02/27 21:46:57for(vector<classA *>::iterator it = aa.begin(); it != aa.end(); ++it) {
// it->foo() ?
}
vector配列がポインタの時にクラスのメンバにアクセスするにはどうしたらいいですか?
0800デフォルトの名無しさん
05/02/27 21:47:26.* とか ->* とか使う手もあるなー。
まあ、コールバック呼び出し側をいじれないことには
どうにもならんわけだが・・・。
0801デフォルトの名無しさん
05/02/27 21:48:02(*it)->foo()
0802デフォルトの名無しさん
05/02/27 21:49:17おぉ、ありがとうございました!
あほなことにit->->foo()って試してました orz
0803デフォルトの名無しさん
05/02/27 22:17:280804デフォルトの名無しさん
05/02/27 22:39:36mem_fun
0805デフォルトの名無しさん
05/02/28 01:32:510806デフォルトの名無しさん
05/02/28 03:31:53v(^・^)v←これを攻撃するAA誰か作って
0807デフォルトの名無しさん
05/02/28 10:38:19ifstreamの走査位置を一定数戻すときってどうやるんですか?
std::ifstream ifs;
char buf[1024];
<--------色々ある。------
ifs >> buf;
int len=strlen(buf);
ifs.seekg(- len);
これでいけると思ったんですが、ステータスをgood()でみるとfalseになってしまいます。
どなたかご存知の方いらっしゃいませんか?
0809デフォルトの名無しさん
05/02/28 11:05:10ifs.seekg( -len, ios_base::cur );
0810デフォルトの名無しさん
05/02/28 11:18:14できました。ありがとう。
0811デフォルトの名無しさん
05/03/01 13:47:54親クラスの関数を使う場合はParent::method()
のように名前の解決をしますが、Javaのsuperみたいな演算子はないのでしょうか?
0812デフォルトの名無しさん
05/03/01 13:50:44多重継承があるから、ない。
0813デフォルトの名無しさん
05/03/01 14:53:02スレッドについてなんだけど、
クラスのメソッドをスレッドにする場合はどうしたら良いのだしょうか。
class Hoge {
unsigned __stdcall thm(void *lpx) ;/*実装省略*/
} ;
Hoge::Hoge()
{
(HANDLE)_beginthreadex(NULL, 0, thm, NULL, 0, &th);
}
これだと「3番目の引数のthmがねぇよ。」とか怒られるんだけども。
0814デフォルトの名無しさん
05/03/01 15:03:490815デフォルトの名無しさん
05/03/01 15:04:25例えば、class Aとclass Bがあり、class A内にてclass Bをfriend classと指定したとします。
class Bを継承してclass Cとした場合、class Cからclass Aのprivateあるいはprotectedメンバへのアクセスは可能なのでしょうか?
0816デフォルトの名無しさん
05/03/01 15:16:31不可能。friend関係は継承されません。
0817デフォルトの名無しさん
05/03/01 15:21:2038もあって、たるい
0818デフォルトの名無しさん
05/03/01 15:30:500819デフォルトの名無しさん
05/03/01 15:34:16マジごめん。有ったよ。ホントゴメン。
0820デフォルトの名無しさん
05/03/01 16:38:02あいさつみたいなものだからスルーで結構だよ。
0821デフォルトの名無しさん
05/03/01 19:20:17class 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:}
0822デフォルトの名無しさん
05/03/01 19:25:48a->b の順
デストラクタは
b->a
の順だ。何がしたいか知らんが何も問題はない
0823デフォルトの名無しさん
05/03/01 19:44:31移動量が正の場合は次のどちらなのでしょうか?
1.マウスホイールを上に(奥に)回した場合
2.マウスホイールを下に(手前に)回した場合
直感的には1だと思うのですが、自信が無く…
0824デフォルトの名無しさん
05/03/01 19:47:22分からないのか?
スレタイも読めないのか?
お前バカ?
0825821
05/03/01 19:49:43header.h--------------------
class A{...};
class B{...};
SourceAB.cpp----------------
#include "header.h"
A a;
B b;
SourceBA.cpp----------------
#include "header.h"
B b;
A a;
----------------------------------
どちらのソースでも問題ないですか?
0826デフォルトの名無しさん
05/03/01 21:06:04> A a;
> class B {
> virtual ~B(){if(a.m_b)a.Func();}
> };
そんなソース書くな。文法が許しても俺が許さん。問題ありまくり。何がしたいんだ!
0827デフォルトの名無しさん
05/03/01 21:11:33それでコンパイルが通るならOKだよ。
0828デフォルトの名無しさん
05/03/01 21:17:09Bが静的メンバとしてAを持つようにしたら駄目か?
0829デフォルトの名無しさん
05/03/01 22:31:490830デフォルトの名無しさん
05/03/02 02:26:04このコードがエラーになったらびっくりしませんか?
0831デフォルトの名無しさん
05/03/02 02:51:22fが宣言されてないようだが?
0832デフォルトの名無しさん
05/03/02 07:44:10俺は830じゃないが、
friend は friend で指定しているターゲットの宣言を
兼ねることができちゃうぞ。
0833デフォルトの名無しさん
05/03/02 08:31:24へー
0834デフォルトの名無しさん
05/03/02 11:16:55エラーにならないことにびっくりした。
0835デフォルトの名無しさん
05/03/02 12:44:54って可能ですか
0836デフォルトの名無しさん
05/03/02 12:54:050837デフォルトの名無しさん
05/03/02 12:59:320838デフォルトの名無しさん
05/03/02 14:15:53今までVBしかやったことないのに・・。
0839デフォルトの名無しさん
05/03/02 14:34:160840デフォルトの名無しさん
05/03/02 14:36:08まずNULL自体が存在することは決められていますか?
そしてそれは0あるいは(void *)0のどちらかに必ず決まっていますか?
0841デフォルトの名無しさん
05/03/02 14:51:520
C++ではvoid *→何か *の変換はキャストが必要になるから(void *)0は有り得ない。
0842デフォルトの名無しさん
05/03/02 15:01:01#define NULL 0
は標準C++で保証されてるんですね。
でも無効ポインタについては0を使うのがセオリーですか?
それともNULLでもいいのかな(保証されてるなら)。
プログラマがポインタであることを意図してるのがわかる分
NULLでもいいような気もするのですが。
でも例の関数のオーバーロードの問題で、ポインタを渡すのか0を渡すのかで
動きが変わるとなると、NULLをキャストしなきゃいけないってのも
変ですよね。そもそもそういうオーバーロード設計がいけないのでしょうが。
0843デフォルトの名無しさん
05/03/02 15:02:09一応 <cstdldef>にあるけど。>>NULL
これは、Cとの互換のために残されているので
C++のソースでは使うべきではない。
0844デフォルトの名無しさん
05/03/02 15:05:09const int NULL = 0;
0845デフォルトの名無しさん
05/03/02 15:10:18特にどうしてもNULLがいいというわけではないので
0で統一することにします。
0846デフォルトの名無しさん
05/03/02 15:19:360がポインタとともに使われると適切な値に
変換されることが保証されている。
C++ では NULL なんか使わない。
0847デフォルトの名無しさん
05/03/02 15:27:590848デフォルトの名無しさん
05/03/02 15:28:250849デフォルトの名無しさん
05/03/02 15:30:54型が合えば代入できるしポインタのつもりという主張もできますよね。
こんなことしないでしょうけど。
0850デフォルトの名無しさん
05/03/02 15:32:17const class {
public: template <typename T> operator T *() {return 0;}
} NULL;
0851デフォルトの名無しさん
05/03/02 16:37:34std::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)
にしろと言われました。
みなさんどう思われますか?
0852デフォルトの名無しさん
05/03/02 16:56:130853デフォルトの名無しさん
05/03/02 17:07:44std::string s;
std::getline(ifs, s);
0854デフォルトの名無しさん
05/03/02 18:59:36最大サイズをオーバーしたらエラーを返すか、例外を投げるみたいな。
std::stringをラップしたりして、自作しなきゃかなあ
0855デフォルトの名無しさん
05/03/02 20:20:040856デフォルトの名無しさん
05/03/02 20:33:07正確には「整数の型」とだけ定義されていて、int とは決まってない。処理系に
よっては0L かも。
あと gcc だと拡張機能で「任意の型のヌルポインタには暗黙の変換ができるが、
整数型には変換できない」という特殊な予約語 __null があって、
#define NULL __null
されてる。
0857デフォルトの名無しさん
05/03/02 20:51:370858デフォルトの名無しさん
05/03/02 20:52:330859デフォルトの名無しさん
05/03/02 21:08:51std::stringに限らず、size()メソッドを持ち、代入や追加のできるコンテナすべてに使えるよう
template <typename T> class size_constrainみたいにすると汎用性ありそう。そんな妄想。
0860デフォルトの名無しさん
05/03/02 23:29:41おまいのコードもおまいのコードだが、そいつもガッしてしまえ。
0861デフォルトの名無しさん
05/03/02 23:47:31basic_istream::getline
ってか、
stringに読み込んで文字数検査で何が不都合なんだ?
0862デフォルトの名無しさん
05/03/03 01:03:03夜分すいません。
ヘッダーファイルで、クラスの定義の前に、「class CExamine;」
というものがあるんですが、これは何を意味してるんでしょうか?
class 〜;というのは、何を意味してるのでしょうか?
0863デフォルトの名無しさん
05/03/03 01:10:410864デフォルトの名無しさん
05/03/03 01:19:32NULLの定義に ((void*)0) が許されているCでは
関数ポインタにNULLは使っちゃいけないんだ。(初期化、代入、比較ぜんぶ)
これを知ってからはスッパリNULLは使わなくなったね。
0866デフォルトの名無しさん
05/03/03 01:40:32上司も上司なら部下も部下だなぁ
0867デフォルトの名無しさん
05/03/03 01:48:040868デフォルトの名無しさん
05/03/03 02:03:19上司が部下のレベル向上のためにお題を出したと見るべきだろう。
無理にC++のSTLコンテナを使って背伸びしようとした初心者をたしなめることが目的。
0869デフォルトの名無しさん
05/03/03 02:07:42「1行が1024バイトを超えたときのパフォーマンスを考慮してないクソコードだ。」
って言いたいのを遠まわしに諭しただけだろ。
親心のある上司に感謝しないと駄目だぞ。
相手によっては助言どころか見捨てられることだってあるのだから。
0870デフォルトの名無しさん
05/03/03 02:11:55個人的にゃぁそんなコード書きたかねぇけど、
仕事として書くコードならありだと思うぞ。
1024バイトって制限がまず問題ならない状況なら
仕様として割り切ってコードをシンプルに保つのも悪くはない選択。
コードがシンプルであるほど一般的にバグも少なくなるもんだし、
複雑なバグも発生し難くなる。
開発業務って「時間との戦い」って面が結構あるし、簡素に済ます
ことが許される場面ではそうすべきだと思うぞ。
0871デフォルトの名無しさん
05/03/03 02:19:04ならなおさらgetlineでいいんじゃ・・・
0872デフォルトの名無しさん
05/03/03 02:21:330873デフォルトの名無しさん
05/03/03 03:17:28要求される仕様によるな。
> テキストファイルから1行を取り出すために、
だけが目的なら、お前も上司も回線切って首吊ったほうがよい
0874デフォルトの名無しさん
05/03/03 04:42:12なんで上司まで道づれなんだ。
上司の指示の何が問題なのかね?
0875デフォルトの名無しさん
05/03/03 08:50:390876デフォルトの名無しさん
05/03/03 09:08:261024文字で読み込めないファイルをあくまで正常なフォーマットのファイルとして
処理しようとすること自体がおかしいとは思わんのか?
悪意あるファイルが外部から送り込まれて、プロセスにメモリを浪費させる目的があったとしたら、
まんまと乗せられたことになるだろ。
一部の馬鹿がSTLの動的配列の恩恵を無差別に利用しようとすると、後で他の者が迷惑する。
0877デフォルトの名無しさん
05/03/03 09:20:170878デフォルトの名無しさん
05/03/03 09:27:59ことってできないん?いずれにせよ、Cの入出力使う必要
あるの?
0879デフォルトの名無しさん
05/03/03 09:28:28自分のレベルの低さを素直に認めるべきだろう。
経験の浅さ・思慮の浅さが露骨にネットに晒されてるだけだぞ。
0880デフォルトの名無しさん
05/03/03 09:30:01マリー‥アントワネット
0881デフォルトの名無しさん
05/03/03 09:33:07逆だよ。
C++の入出力使う必要あるの?
という設問を常に念頭に置くべきだ。
散々Windowsのハンドルをちゃんと自力で削除しているくせに、
ファイルハンドルだけは管理できないような不思議な人は存在しない。
0882デフォルトの名無しさん
05/03/03 09:44:22但し、設定ファイルのように前方にのみ意味がある場合であって、1行を完全に読み取る必要がある場合は使わないけど。
0883デフォルトの名無しさん
05/03/03 10:00:440884デフォルトの名無しさん
05/03/03 10:05:08仕様に1行の長さについての制限は無いが、1行をバッファに読み込みたい。
バッファの動的確保は(悪意ある入力を考慮して)危険と判断。
そこで、
1. 長さについての制限が仕様に欠けていることを指摘する。
2. 1024くらいで安心だと思うから固定で取る。
経験豊富で思慮深いプログラマの選択は 2 である、と言うわけか?
0885デフォルトの名無しさん
05/03/03 10:06:02最適な初期容量を割り当てたいとき、個々にreserveするしか
ないのでしょうか。
0886デフォルトの名無しさん
05/03/03 10:11:08「個々に最適」である必要があるなら、そうでしょうね。
0887デフォルトの名無しさん
05/03/03 10:21:51当然だ。本格的に頭悪いのか、お前?
1行が1024バイトを超えるテキストファイルを想定する機会などない。
それはもはやバイナリファイルとして別の扱いをする必要がある。
fgets()で取得した生の文字列は、そのまま潤沢なCライブラリの恩恵を受けられる。
コンテナに入れるならその文字列編集後にヒープバッファに入れるなりすればいい。
0888デフォルトの名無しさん
05/03/03 10:27:44恥ずかしいぞ、お前。
0889デフォルトの名無しさん
05/03/03 10:27:550890デフォルトの名無しさん
05/03/03 10:45:090891デフォルトの名無しさん
05/03/03 10:54:070892デフォルトの名無しさん
05/03/03 11:01:460x0400に何の意味があるのれすか?
0893デフォルトの名無しさん
05/03/03 11:06:310894デフォルトの名無しさん
05/03/03 11:21:50確かにSTLやiostreamが安全だという誤解がセキュリティホールになりそうだな。
あれは便利なだけであって安全ではない。
素直に、危険と隣り合わせなことを実感できるC関数を使うべきだろう。
MSVCなら/GSオプションを使うことで、
スタックバッファオーバラン検出時に例外発生させてくれる。
STLなどが提供する機能はバッファオーバランが起きてもヒープ領域なので検出対象外。
0895デフォルトの名無しさん
05/03/03 11:40:28使いどころないみたいな感じになってくるね。
玄人はほとんどCの機能使うってことなの?
0896デフォルトの名無しさん
05/03/03 11:57:02string x,y;
double a;
x="aaa";
a=10;
y=x+string(a);
というのはできないのでしょうか?
0897デフォルトの名無しさん
05/03/03 11:57:19何をincludeすればよかったんでしたっけ?
0898デフォルトの名無しさん
05/03/03 12:27:33template <class T> swap(T l, T r) { T temp = l; l = r; r = temp; };
0899デフォルトの名無しさん
05/03/03 12:37:58グローバルなswapってあった?
# どこぞのヘッダで、using std::swap してあるのかな?
0900デフォルトの名無しさん
05/03/03 12:59:20メンバ関数じゃなくてグローバル(?)な関数があるようなんです。
「標準ライブラリ チュートリアル&リファレンス」によると。
コンテナの要素をコピーせずにすむコストがかからないものの
ようですが。
0901デフォルトの名無しさん
05/03/03 13:41:150902デフォルトの名無しさん
05/03/03 14:10:46リファレンスにのってたあの関数を使うには
どのヘッダファイルが必要なのかなぁ・・と。
とりあえずvectorとalgorithmはインクルードしたの
ですがswap(c1, c2)で呼び出しても、そんなものは無い
というエラーがでます。ちなみにc1とc2はどちらも同じ型の
vectorです。
0903デフォルトの名無しさん
05/03/03 14:21:120904デフォルトの名無しさん
05/03/03 14:44:22>STLやiostreamが
ぉぃ。
>>895
いんや。楽出来るところでは楽がしたい。が、
「ここはキッチリ作らないといけない」/「ここは適当に」ってのが
判断できるようじゃないといけない…んだろうなぁ。
0905デフォルトの名無しさん
05/03/03 15:29:410906デフォルトの名無しさん
05/03/03 15:39:11std::ostringstream
0907デフォルトの名無しさん
05/03/03 15:47:28当然引数は参照だ罠
0908デフォルトの名無しさん
05/03/03 15:47:55… void swap(…
じゃないとだめだな
0909デフォルトの名無しさん
05/03/03 15:56:35全然ダメ
0910デフォルトの名無しさん
05/03/03 15:58:26そういや一時変数のアドレスなんて取り出せないんだっけか。
一時変数の参照もなんかあったようななかったような。
0911デフォルトの名無しさん
05/03/03 16:47:23またまたご冗談を。
0912デフォルトの名無しさん
05/03/03 16:51:390913デフォルトの名無しさん
05/03/03 16:53:11int i=7;
swap(i, int(3));
これできないよね?
0914デフォルトの名無しさん
05/03/03 16:55:59swapの場合一次変数なんか渡しても意味内から参照で受け取るべき
0915デフォルトの名無しさん
05/03/03 16:59:230916デフォルトの名無しさん
05/03/03 17:01:25変換が必要な変数、定数、リテラルは const な参照にしか渡せないという意味
0917ヽ(´ー`)ノ ◆.ogCuANUcE
05/03/03 17:03:48func(int(1));
はオーケーだけど、
void func(int & i) {}
func(int(1));
は駄目ってことか。
0918912
05/03/03 17:05:24本当だ。これが警告付きで出来たもんだからリテラルも平気なのかと思っていた。
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;
}
0919デフォルトの名無しさん
05/03/03 17:10:20189ページにちゃんと書いてるぞ
0920デフォルトの名無しさん
05/03/03 17:20:20クラスを作ったんですよ。Hogeってクラス。
それを継承してクラスSageってのを作ったんですよ。
コードを書いてるうちに、基底クラスしか扱わない場所が出てきたんで
クラスHogeのポインタにSageのポインタを入れたんですよ。
で、そのまま
delete phoge;
とか書いちゃったんですよ。
そしたら派生クラスのデストラクタが呼ばれないじゃないですか。
何で、デストラクタの属性は、virtualがデフォルトじゃねーんだ!!
派生する可能性があるのは当たり前だろ!デフォでvirtual属性にしとけ!
それぐらいのオーバヘッドは許してやれよ!
だからC言語はややこしいって言われるんだよ!ばーか、ばーか。
0921デフォルトの名無しさん
05/03/03 17:25:590922デフォルトの名無しさん
05/03/03 17:31:40でもさ、派生する可能性が無くても、virtualは邪魔にならんだろ?
0923デフォルトの名無しさん
05/03/03 17:37:21邪魔だよ。オブジェクトコンポジションをするたびにサイズが大きくなるなんてやってられない。
0924デフォルトの名無しさん
05/03/03 17:42:08それはC言語では無い罠。
0925デフォルトの名無しさん
05/03/03 17:42:390926デフォルトの名無しさん
05/03/03 18:06:47おまいらも暇ですね。
0927デフォルトの名無しさん
05/03/03 18:15:48関係ない話を割り込むが、オブジェクトコンポジションってそんなに多用するか?
0928920
05/03/03 18:16:250929デフォルトの名無しさん
05/03/03 18:21:47使うだろ。継承より見た目に解りやすい。
0930デフォルトの名無しさん
05/03/03 18:32:330931デフォルトの名無しさん
05/03/03 18:36:090932デフォルトの名無しさん
05/03/03 18:37:02変態、
0933デフォルトの名無しさん
05/03/03 18:39:51ダイヤモンド継承をさらに発展させた、六角継承を発案したが不評
さらに発展させた亀甲模様継承を発案したが、まず俺が混乱している
0934デフォルトの名無しさん
05/03/03 18:42:15あー、いろんなクラスのインスタンスをメンバに持って、ブラックボックスを積み上げていく方法だ
>>923
そんなサイズでかくなるの?知らんかった
詳しく教えてくれ
0935デフォルトの名無しさん
05/03/03 18:44:08芸術だな
0936デフォルトの名無しさん
05/03/03 18:48:01923 ではないが、ここ読んで来い。
http://www.s34.co.jp/cpptechdoc/article/sizeof/index.html
0937デフォルトの名無しさん
05/03/03 19:02:130938デフォルトの名無しさん
05/03/03 19:46:34/\ /\ /\
D E F G
| | | |
H .I. J K
\/ \/ \/
L M N
/\ /\ /\
O P Q R
\ | × | /
S T
\/
U
0939デフォルトの名無しさん
05/03/03 19:51:190940デフォルトの名無しさん
05/03/03 19:53:04神の所業
0941デフォルトの名無しさん
05/03/03 19:53:480942デフォルトの名無しさん
05/03/03 19:55:120943デフォルトの名無しさん
05/03/03 20:01:29イ�`
0944デフォルトの名無しさん
05/03/03 20:01:290945デフォルトの名無しさん
05/03/03 20:54:50better C として重宝します。
0946デフォルトの名無しさん
05/03/03 21:09:20classのpublic内に、
std::size_t how_many_numbers( ) const { return count; }
ってのが、もとから入っていて、それをコンパイルすると、
error C2039: 'size_t' : is not a member of 'std'
って出てくるんですけど、これって何が起こっているか分かりますか?
0947デフォルトの名無しさん
05/03/03 21:15:580948デフォルトの名無しさん
05/03/03 21:18:23君が必要な#includeをしてないだけ
0949デフォルトの名無しさん
05/03/03 21:26:06iostream使ったことないの?w
0950デフォルトの名無しさん
05/03/03 21:34:29#include<iostream>
#include <cstdlib>
cstdlib は必要なの分かってて一応してるんですけど・・・。
0951デフォルトの名無しさん
05/03/03 21:48:55多分、コンパイルオプションか何かで
std 名前空間が無効化されてて size_t が
グローバルに定義されてると思うんだけど。
あるいは名前空間ができる前のヘッダ使っているとか?
0952デフォルトの名無しさん
05/03/03 21:51:44名前空間っていつ出来たのですか?
これは2001年に発行されたものなのですが…。
解決策ってありますか?
0953デフォルトの名無しさん
05/03/03 21:53:11これは2001年に発行されたものなのですが…。
じゃなくて
Microsoft Visiual C++ 6.0使ってます。古いですか?
0954951
05/03/03 21:56:46これの70番あたり。
ttp://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
0955デフォルトの名無しさん
05/03/03 22:00:00このコンパイラでは、どうしようもないってことですよね?
0956デフォルトの名無しさん
05/03/03 22:23:450957デフォルトの名無しさん
05/03/03 22:28:47♪だからもっと動いて もっともっと もっともっと
0958デフォルトの名無しさん
05/03/03 22:40:28> 1行が1024バイトを超えるテキストファイルを想定する機会などない。
> それはもはやバイナリファイルとして別の扱いをする必要がある。
BBSのログファイルもバイナリファイルですかぁ?
0959デフォルトの名無しさん
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.
0960デフォルトの名無しさん
05/03/03 22:46:29main関数がない
0961デフォルトの名無しさん
05/03/03 22:47:39ワラタ
0962デフォルトの名無しさん
05/03/03 22:54:3840字×13行分(これで1040バイト)くらいなら改行無しで進むことはよくあるな。
俺はいつの間にか、拡張子がtxtなバイナリファイルを作ってたのか。
2chのdatは改行を<br>タグに置き換えてるから、一レスが一行だよね。
制限の甘い板だと1024バイトいくかもな。
先日13KBくらいある書き込みを某所でしたが、あのBBSのログはどんな仕様なんだろ。
0963デフォルトの名無しさん
05/03/03 23:15:13mainを含んだファイルで
using namespace main_savitch_8A;
using namespace std;
#include "washing.h"
ってやってもリンク関係のエラーがでる。
どうすればいいかわかりますか?
0964デフォルトの名無しさん
05/03/03 23:18:241回のgetline()・fgets()しか使わないのならテキストだろう。
複数回、getline()・fgets()関数を使って1ブロックを読み出すのなら、
それはもはやバイナリファイルとしてのファイル処理。
たまたまデリミタが'\n'だっただけ。
0965デフォルトの名無しさん
05/03/03 23:19:27>827 は、あんな時間に書き込みしてるとこからみてもニート君だろうなぁ。
0966デフォルトの名無しさん
05/03/03 23:23:22>>825
それでコンパイルが通るならOKだよ。
0967デフォルトの名無しさん
05/03/03 23:26:03コンパイルとおらないからダメってことじゃねぇの?
0968デフォルトの名無しさん
05/03/03 23:27:430969デフォルトの名無しさん
05/03/03 23:30:37・文章を理解できない。
・不合理な脳内補完をしてしまう。
・ファイル読込処理の経験が浅い。
君はどれなんだ?
0970デフォルトの名無しさん
05/03/03 23:30:590971デフォルトの名無しさん
05/03/03 23:32:58そういうキミは
・ニート君
・しったか君
どっちなの?両方?
0972デフォルトの名無しさん
05/03/03 23:35:10なぜだか分かりますか?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=232
0973デフォルトの名無しさん
05/03/03 23:37:250974デフォルトの名無しさん
05/03/03 23:39:54とんでもないことになるのだけはわかった。
>>887と仕事する際、1行が1024byte超のテキストファイルが登場する可能性がある時は
ちゃんとバイナリファイルって言っとかないとな。
0975デフォルトの名無しさん
05/03/03 23:40:370976デフォルトの名無しさん
05/03/03 23:45:58>>887は正論じゃないかねぇ。
長すぎりゃ複数回fgets()呼べば良いだけだし。
>>974の会社ではpush_back()やappend()が禁止されているの?
0977デフォルトの名無しさん
05/03/03 23:47:480978デフォルトの名無しさん
05/03/03 23:50:59発端らしき>851から読んでいこう。
0979デフォルトの名無しさん
05/03/03 23:52:220980v(^・^)v
05/03/03 23:53:320981v(^・^)v
05/03/03 23:54:17http://pc5.2ch.net/test/read.cgi/tech/1108924728/
0982デフォルトの名無しさん
05/03/03 23:59:11よって>>887は間違っている。
ということでFA?
0983デフォルトの名無しさん
05/03/04 00:05:070984デフォルトの名無しさん
05/03/04 00:10:35fgets()で使う固定バッファサイズが1024以下でもなんら問題ないのも事実だろ。
必要に応じて複数回fgets()呼べばいいのも事実だろ。
結局、>>974は何が言いたいんだ?
0985デフォルトの名無しさん
05/03/04 00:25:550986デフォルトの名無しさん
05/03/04 00:42:19> ほとんどの場合1行が1024バイト以下であることは事実だろ。
>>887は「想定する機会などない」と言ってるわけだがw
お前は想定する機会が無いと思うの? あるの思うの? どっちよ。
0987デフォルトの名無しさん
05/03/04 00:53:37無いと思う。
「1行の長さは制限ないんでよろしく。」などと言われたことは一度もない。
俺の場合は全くそういう機会がなかった。
何を正常な書式のファイルとみなすかはアプリ次第・作者次第。
>>962のケースのような場合であれば、
なおのこと最大数制限ルールがしっかり行われるはずだ。
0989デフォルトの名無しさん
05/03/04 01:01:040990デフォルトの名無しさん
05/03/04 01:01:460991デフォルトの名無しさん
05/03/04 01:05:420992デフォルトの名無しさん
05/03/04 01:06:18http://pc5.2ch.net/test/read.cgi/tech/1108924728/
0993デフォルトの名無しさん
05/03/04 01:07:26お前、どうやら本当に野党支持者だったみたいだなw
無党派or政治無関心だったなら、
「は?何言ってんのお前?」で済ますところだったのに。
0994デフォルトの名無しさん
05/03/04 01:09:52お前は本当にニートだったようだなw
0995デフォルトの名無しさん
05/03/04 01:10:12学会員かw
0996デフォルトの名無しさん
05/03/04 01:11:130998デフォルトの名無しさん
05/03/04 01:15:01お前、どうやら本当に学会員だったみたいだなw
無党派or政治無関心だったなら、
「は?何言ってんのお前?」で済ますところだったのに。
0999デフォルトの名無しさん
05/03/04 01:15:181000デフォルトの名無しさん
05/03/04 01:15:5210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。