トップページ⇒tech
1001コメント269KB

C++相談室 part16

レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)vNGNG
C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-15
0002v(^・^)vNGNG
■基本■
[Stroustrup]
禿 http://www.research.att.com/~bs/
C++に関するリンクの総本山でもあります。

[C++ Final Draft International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
規格書の重箱の隅的な話題などが読めます。

[C/C++ Users Journal]
http://www.cuj.com/
[Object Management Group]
http://www.omg.org/
[Association of C & C++ Users]
http://www.accu.org/

[news]
news:comp.lang.c++
news:comp.lang.c++.moderated

[ML]
cppll(日本語) http://www.trickpalace.net/cppll/
メインページにC++に関する良質なC++日本語リンク集があります。
0003v(^・^)vNGNG
■Document■

C++FAQ Lite http://www.parashift.com/c++-faq-lite/
C++FAQ(日本語) http://www.bohyoh.com/CandCPP/FAQ/
Cとその仕様を比較しながらの解説なので分かりやすい。
*** 質問の前に必ずこの二つに目を通してください ***

[STL]
STL Programmer's Guide http://www.sgi.com/tech/stl/
日本語としてはおそらくここ。ただしリファレンス的内容。
http://www.wakhok.ac.jp/~sumi/stl/

[boost]
これに関しては公式のドキュメント、又はソースを読むのが一番です。
ただし日本語でいくつか有益な情報が読めます。
Let's boost http://www.kmonos.net/alang/boost/
shinichiroさん http://user.ecc.u-tokyo.ac.jp/~g940455/wp/
news news:gmare.comp.lib.boost.devel
0004v(^・^)vNGNG
■Books■
amazon.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/
Effective 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/
0005v(^・^)vNGNG
■Compiler■
[GCC]
http://gcc.gnu.org/
(Windows上でのPOSIX環境構築 http://www.cygwin.com)
[Borland C++ Compiler]
http://www.borland.co.jp/cppbuilder/freecompiler/
[.NET Framework SDK]
1.0 http://www.microsoft.com/japan/msdn/netframework/downloads/sdk.asp
1.1βhttp://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/002/056/msdncompositedoc.xml
[MSVC] コンパイラ以外のツール、ドキュメントです。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
(一括ダウンロードの時は上のURLに続けてこちらを入力してください
default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm)

なお上記三者を組み合わせたプログラミングにおいてはこちらが分かりやすいです。
http://www.geocities.com/Tokyo/Ginza/5432/documents/winprog/index.html

[DigitalMars]
http://www.digitalmars.com/
[Comeau]
http://www.comeaucomputing.com/
[intel C++ Compiler]
http://www.intel.com/software/products/compilers/
[metrowerks]
http://www.metrowerks.com/mw/default.htm
0006v(^・^)vNGNG
■Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
LokiPort
MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
MSVC6.0 SP5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

ACE/TAO http://www.cs.wustl.edu/~schmidt/
Network、Thread、ORBなどのポータブルなライブラリ
Blitz++ http://www.oonumerics.org/blitz/
数値計算ライブラリとして人気がある、らしい
spirit http://spirit.sourceforge.net/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
パーサジェネレータ

他ライブラリリンク集
http://www.trumphurst.com/cpplibs/cpplibs.phtml
0007v(^・^)vNGNG
■過去スレ■
Part1 http://piza.2ch.net/tech/kako/980/980175292.html
Part2 http://pc.2ch.net/tech/kako/996/996640937.html
Part3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
Part8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
Part9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
Part10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
Part11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
part12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
part13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
part14 http://pc2.2ch.net/test/read.cgi/tech/1041328679/l50
part15 http://pc2.2ch.net/test/read.cgi/tech/1043605481/l50


■関連スレ(テンプレートを用いたライブラリ中心)■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/l50
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/
STLスレッド
part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
0008デフォルトの名無しさんNGNG
乙かれ
0009v(^・^)vNGNG
■関連スレ(環境依存の話題)■
[GCC]
GCCについて http://pc2.2ch.net/test/read.cgi/tech/1007731543/l50
祝・GCC 3.0リリース http://pc.2ch.net/test/read.cgi/unix/992942337/l50
[Digital Mars]
Code of the Nerds" Digital Mars C/C++
http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[Borland]
C++Builder相談室
part1 http://piza2.2ch.net/tech/kako/969/969458279.html
part2 http://pc.2ch.net/tech/kako/997/997074601.html
part3 http://pc3.2ch.net/tech/kako/1016/10160/1016065855.html
part4 http://pc2.2ch.net/test/read.cgi/tech/1035596146/l50
part5 http://pc2.2ch.net/test/read.cgi/tech/1045542179/l50
タダで使えるBorland C++!
part1 http://pc3.2ch.net/tech/kako/1002/10023/1002377328.html
part2 http://pc2.2ch.net/test/read.cgi/tech/1030493157/l50
[VisualC++]
VisualC++相談室
part 1 http://piza.2ch.net/tech/kako/970/970607517.html
part 2 http://piza.2ch.net/tech/kako/981/981630730.html
part 3 http://piza2.2ch.net/tech/kako/993/993186053.html
part 4 http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
part 5 http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
part 6 http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
part 7 http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
part 8 http://pc.2ch.net/tech/kako/1022/10224/1022499000.html
part 9 http://pc2.2ch.net/test/read.cgi/tech/1036897197/l50
0010v(^・^)vNGNG
VisualC++(MFC限定)相談室 MFC6.dll
http://pc2.2ch.net/test/read.cgi/tech/1039607377/l50
Windows Programing for C/C++(Not MFC)
http://pc2.2ch.net/test/read.cgi/tech/1018239290/l50
COM の世界を斬る!
http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
ATL 相談室
http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
managed C++ やろうぜ!!
http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50



>>8 連続6回までしか書けないみたい。thanks
0011デフォルトの名無しさんNGNG
v(^・^)v
0012デフォルトの名無しさんNGNG
v(^・^)v ぉっ
0013デフォルトの名無しさんNGNG
We're like morning sun〜♪
0014デフォルトの名無しさんNGNG
心擦れ鬱枯れー
0015デフォルトの名無しさんNGNG
STLつかうと一気に実行ファイルサイズが10倍に?!
0016デフォルトの名無しさんNGNG
こら!もう!すぐ調子に乗るんだから〜
0017デフォルトの名無しさんNGNG
>>15
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0018デフォルトの名無しさんNGNG
>>17
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0019仕様書無しさんNGNG
>>17
環境じゃなくて最適化の結果によるだろ。
STL のコードが全部インライン展開されるなら、オブジェクトファイルサイズは
リンクの形態と無関係に膨れ上がる。。
0020デフォルトの名無しさんNGNG
static変数を関数中で宣言すると、関数が呼び出されるたびに毎回初期化されてるか否かの条件分岐
するんだよな。
0021デフォルトの名無しさんNGNG
C++の言語仕様やライブラリは一応覚えたつもりなんですが、
次に実際のプロジェクトの設計やコードを見て勉強したいと考えています。

VC++のオープンソースプロジェクトでソースや設計が比較的綺麗なものってありませんか?
0022デフォルトの名無しさんNGNG
Apache
0023v(^・^)vNGNG
>>20
ハァ?
0024デフォルトの名無しさんNGNG
>>18>>19
いや、本当なんだってば(汗。
-vi オプションを付けるとインライン展開を使ってくれるが、
それでもファイルサイズは膨れあがったりしないよ。
ちなみに -D_RTL_DLL を外して -vi オプションを付けた時と
付けない時でファイルサイズを比較しても、そんなに大きな
差はない。
0025デフォルトの名無しさんNGNG
ところで、>>18さんの意見はどういう意味でしょうか?

> ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。

この部分がよくわかりません。DLLを使えば、元々スタティックリンクされる
はずだったコードがDLLに追い出されるので、その分ファイルサイズが
小さくなるという意味で書いたのですが。
0026デフォルトの名無しさんNGNG
std::vectorとDLLの関係もイマイチわからん
0027デフォルトの名無しさんNGNG
>>26
STLはDLLに追い出せてないと思います。何せテンプレートで、コンパイル時
にしかわからないものばかりのはずですから。

ただ、インライン展開を抑制しても有効にしても、STLを使った時と使わない時
でファイルサイズが10倍も違ったりはしません。
0028デフォルトの名無しさんNGNG
まぁ、VC++はstd::stringとかstd::wstringをDLLに置いてたりするが。
0029デフォルトの名無しさんNGNG
C++やってみたいんだけど、何がこれでできるんですか?
0030デフォルトの名無しさんNGNG
汎用的なソフトウェアの構築
0031デフォルトの名無しさんNGNG
凡庸的なソフトウェアの構築
0032デフォルトの名無しさんNGNG
>>29
物凄い気持ちいいオナニ。
辞められなくなってサルになるよ。
そして実際の子作りは永遠に遠のいた夢となります。
0033デフォルトの名無しさんNGNG
砂粒でまとめ上げて城を築けます。
0034デフォルトの名無しさんNGNG
すげえな・・・C++って・・。シェンロンみたい。
0035デフォルトの名無しさんNGNG
>>28
何度も言っているが、
「Visual C++はC++ではない。」
誤解無きよう。
0036デフォルトの名無しさんNGNG
>>35
ハァ?
0037デフォルトの名無しさんNGNG
アフォ?
0038デフォルトの名無しさんNGNG
VC++はC++のスーパーセットだ。
お分かりか?
0039デフォルトの名無しさんNGNG
VC++厨、必死だな。
0040デフォルトの名無しさんNGNG
いや、サブセットだろ。標準満たしてないし
0041デフォルトの名無しさんNGNG
標準仕様に完全準拠し、かつバグのないコンパイラなど存在しない。
0042デフォルトの名無しさんNGNG
点プレも実体化しておけばDLLに置けまっせー
0043デフォルトの名無しさんNGNG
>>41
解決努力の有無が重要だよな。
0044デフォルトの名無しさんNGNG
製品名なんだからスーパーセット、サブセットって話には
ならないと思うんだけどな。
0045デフォルトの名無しさんNGNG
この文脈ではVC++はMSの実装したコマンドラインコンパイラを意味するだろ。
0046デフォルトの名無しさんNGNG
これでいいの?
0047デフォルトの名無しさんNGNG
>>42で思い出したが、最近テンプレートの使われている
ライブラリをビルドして.lib作って普通に別のプログラムで
ヘッダだけインクルードしてそのスタティックライブラリを
リンカに読ませてビルドできるんだけど、OKなんだよね?
0048デフォルトの名無しさんNGNG
>>47
アフォですか
004947NGNG
>>48
実体化してない状況でlibはおっけー?という話なんだが
その辺を聞きたい。
0050デフォルトの名無しさんNGNG
実体化されてようがされてまいが、exportされてない限りtemplateの
実体はお前がincludeしたヘッダの中にあるだろうが。
0051デフォルトの名無しさんNGNG
47はtemplateを定義したのか、それとも使っただけなのか。
前者ならコードのサイズはゼロだからlib,a,dllは作れない。
(staticの実装は別)で後者ならもうそれは立派なクラスだから
libでも、aでも、dllでも、oでも好きにするがいい。
0052デフォルトの名無しさんNGNG
int f(){hogehoge} と int g(){hogehoge} という2つの関数があって、コンパイルした結果が同じだとしたら
最適化で f==gになるんだろうか?
0053デフォルトの名無しさんNGNG
>>52
VC6だとテンプレートの展開結果については
まとめてくれることがあるみたい。
.mapファイル吐かせたら、複数のシンボルが同じアドレスになってた。
0054デフォルトの名無しさんNGNG
C++でIEのhtmlファイルに書かれている文字列を
取得して表示させたいんだが どんな感じで書けばいいんだろう。
初心者な質問でごめんなさい・・・
0055デフォルトの名無しさんNGNG
I〜略〜2::toString();
0056デフォルトの名無しさんNGNG
クラスの生成時にmemsetを使ってメンバ変数を初期化する場合

class A
{
int hoge_a[10];
char hoge_b[20];
:
:
public:
 A(){memset( this , 0 , sizeof(A));}
:
};

このような使い方は有りでしょうか?
さらにメンバにvirtual関数があった場合も使用しても問題ないのでしょうか?
0057デフォルトの名無しさんNGNG
>>56
アァ・・・ (; ´Д`)
0058デフォルトの名無しさんNGNG
>>56
ついでに言うと、Cのお馬鹿な文化はC++には持ち込むなと。
0059デフォルトの名無しさんNGNG
>Cのお馬鹿な文化
オブジェクトインスタンスを生成時に0で埋めるのはまともなOOPLでは常識なわけだが。
0060デフォルトの名無しさんNGNG
エッ・・・ (; ゚Д゚)
0061デフォルトの名無しさんNGNG
>>56
sizeof(A)は本当にクラス内の変数の大きさだけを返すのだろうか。
0062デフォルトの名無しさんNGNG
thisやselfを0やnullで埋めてるソースなんて見た事無いが。
0063デフォルトの名無しさんNGNG
どうしてもthisを弄くりたかったら、offsetofでも使うしかないな。
0064デフォルトの名無しさんNGNG
std::vectorとか使えばよかろうに・・・
0065デフォルトの名無しさんNGNG
自分が持ってるメンバを責任持って初期化するのは当然だとは思うが。
でも、ここ1年ぐらい生の配列メンバに持ったクラスなんか書いてないな。
0066デフォルトの名無しさんNGNG
超初心者ですが、ただのC++と、Visual C++ってちがうんですか?
0067デフォルトの名無しさんNGNG
人生初心者は (・∀・) カエレ!!
0068デフォルトの名無しさんNGNG
>>61
virtual関数があるとsizeof(A)は正確な値を返さなかったね、たしか
0069デフォルトの名無しさんNGNG
>>56
C++では無理。

>>62
そりゃそうだ普通は言語レベルで勝手に0で埋めるからね。
この動作はもちろんオーバーヘッドが大きいのは間違いないけど
つまらないバグの発生を抑えてくれる。
ヒープやローカル変数の未初期化領域を参照できてしまうなんてあってはならないことだ。
0070デフォルトの名無しさんNGNG
class A {
char buf[10];
public:
virtual void func() {}
};

たとえばこれで sizeof(A) が 10 を返す処理系は少ないだろう。
memset(&a, 0, sizeof(A)); なんてしたら、とっても嫌〜なヨカン。
0071デフォルトの名無しさんNGNG
>>68
ハァ?
0072デフォルトの名無しさんNGNG
>>71
おまえが( ゚Д゚)ハァ?
0073デフォルトの名無しさんNGNG
「俺が知っている値」==「正確な値」
0074デフォルトの名無しさんNGNG
と言うわけで、C++では横着せずに、地道に各メンバーを初期化しましょう。
0075デフォルトの名無しさんNGNG
newの実装をcallocに変更







すると余計なバグが増えそうだな
0076デフォルトの名無しさんNGNG
つまり使っていいかどうか分からないでFA?
0077デフォルトの名無しさん NGNG
te
0078デフォルトの名無しさんNGNG
各メンバの初期化って基本型だけでいいだろ。
基本型以外はその型のコンストラクタで初期化されてるはず。
0079デフォルトの名無しさんNGNG
皆が使っているプログラミングソフトを教えてくれ。
0080デフォルトの名無しさんNGNG
オブジェクトのポインタを宣言して
obj *a,*b;
b->x = 1;
*a=*b;
としたとき、a->x = 1
となるのは当然として
a=b となってポインタも同じところを
指すようになりますか?

0081デフォルトの名無しさんNGNG
>>56
vtbl へのポインタを隠しメンバに持ってたりするからね。
0で埋めたらエライことに。
0082デフォルトの名無しさんNGNG
>>80
なりません
0083デフォルトの名無しさんNGNG
>>78
いやそれは分かるんだが、>>56の使い方をしてバグなんかの問題は
ないかって事に関しての答えはどうなん?
008480NGNG
>>82
どうしても、そうなっちゃうんだけど・・・。
>>80の続きで
メンバ関数が
func()
{x=2;}
として

a->func();
とするとa->x=2となってしかも
b->x=2となっちゃうんだけど、何で?


0085デフォルトの名無しさんNGNG
C++の設計思想にいたく賛同した奴が、
急にCコンパイラのみの環境に放り込まれたときに陥る罠を列挙してください。

とりあえず、スコープの途中で変数定義してエラーになるのは思い出した。
0086デフォルトの名無しさんNGNG
>>84
同じインスタンスを指してるからだろ。
0087デフォルトの名無しさんNGNG
>>85
newとコンストラクタがなくてメンバを初期化できず鬱。
0088デフォルトの名無しさんNGNG
>>85
void*の恐怖が蘇る。
008980NGNG
>>86
*a=*b
でポインタも同じところを指すようになるってこと?
0090デフォルトの名無しさんNGNG
>>85
つい struct キーワードを忘れてしまう
0091デフォルトの名無しさんNGNG
>>84
なりません。

struct A {
int x;
A() { x = 2; }
};

int main()
{
A* a = new A;
A* b = new A;

*b = *a;
a->x = 3;
std::cout << b->x << std::endl;
delete a; delete b;
}
0092デフォルトの名無しさんNGNG
>>85
//でコメントを書く、ってのはC99だと罠にならないか…

とりあえず、sizeof('a') == 2
0093デフォルトの名無しさんNGNG
>>85
スマートポインタが無くてリソースの解放し忘れ多数。
009480NGNG
>>91
確かにならんな〜。
何で俺のはなるんだ?
0095デフォルトの名無しさんNGNG
>>80 でていけ。
0096デフォルトの名無しさんNGNG
>>94
短いソースなら貼り付けてみれ。
0097デフォルトの名無しさんNGNG
>>85
STLが無くて、基本的なアルゴリズムを思い出せずに鬱
0098デフォルトの名無しさんNGNG
>>91
*b = *a;
a->x = 3;

 を

a->x = 3;
*b = *a;

にしたらどうなるかな?
009980NGNG
>>96
void main( )
{
one_image *in_image = new one_image;
one_image *noise_image;
one_image *median_image = new one_image;

in_image->load_image_data();
noise_image = in_image;
noise_image->make_noise();
*median_image = *noise_image;
int code = median_image->median();
}
最後の行をやっても*noise_imageに影響ないはずなんだけど
一緒に変わってしまう。何で?
0100デフォルトの名無しさんNGNG
>>98
そりゃ変わるっしょ。当たり前。 
0101デフォルトの名無しさんNGNG
>>99
多分コピーコンストラクタが書かれてないからだと思う。
メンバにポインタとか持ってないか?
010280NGNG
>>101
クラスの定義は下だけど、*imageに問題があるってこと?

class one_image
{
protected:
int x_size, y_size;
unsigned char *image;
public:
one_image();
one_image(int HSize, int VSize);
one_image(struct base_image *base);
virtual ~one_image();
void load_image_data();
void save_image_data();
void set_imagedata(struct base_image *base);
void make_noise();
int median();

};
010398NGNG
コピーコンストラクタじゃなくて
operator=

 ・・・だとおもう
0104デフォルトの名無しさんNGNG
>>102
その通りです。デフォルトのコピーコンストラクタは単なる
ビットのコピーなので、ポインタは考慮してくれません。
0105デフォルトの名無しさんNGNG
( ´-`).。oO(one_image・・・どこかで見た事がある・・・)
0106デフォルトの名無しさんNGNG
代入演算子が書かれてないからか。
0107デフォルトの名無しさんNGNG
これと同じことが起こっている。

struct A {
int* x;
A() { x = new int(0); }
void func() { *x = 2; }
};

int main()
{
A* a = new A;
A* b = new A;

*b = *a;
a->func();
std::cout << *a->x << std::endl;
std::cout << *b->x << std::endl;
delete a;
delete b;
}
010880NGNG
>>104
ちょっと調べてみましょう。原因が分かったことだし。
>>105
たぶん同一人物でしょう。前も書いたことあるから。
0109デフォルトの名無しさんNGNG
これで解決。めでたしめでたし。

struct A {
int* x;
A() { x = new int(0); }
void func() { *x = 2; }
int operator=(const A& a) {
return *x = *a.x;
}
};

int main()
{
A* a = new A;
A* b = new A;

*b = *a;
a->func();
std::cout << *a->x << std::endl;
std::cout << *b->x << std::endl;
delete a;
delete b;
}
0110デフォルトの名無しさんNGNG
ていうか、vector<unsigned char> を使えば万事解決じゃん?
0111デフォルトの名無しさんNGNG
デフォルトのコピーコンストラクタがビットのコピーですって?
全部の要素について operator= でしょう?
0112デフォルトの名無しさんNGNG
>>111
スマソ。コピーコンストラクタは関係ないわ。
011398NGNG
なんとなく delete する順番が気になってるのは自分だけ?
a,b って作ったら b,a って消したくなる
0114デフォルトの名無しさんNGNG
>>111
コピーコンストラクタがoperator=ですって?
0115デフォルトの名無しさんNGNG
>>113
その方が何かメリットあればそうする。何かあったっけ。
0116デフォルトの名無しさんNGNG
コピーコンストラクタが呼び出されるのはどういう場合かを述べよ。
011798NGNG
>>114
そもそもコピーコンストラクタなんて
どこでも呼ばれていないけど
0118デフォルトの名無しさんNGNG
>>115 bがaに依存する場合。
0119デフォルトの名無しさんNGNG
>>113
依存性があろうがなかろうがいちいち考えるのが面倒なのでデフォルトでそうしてる。
0120デフォルトの名無しさんNGNG
>>118
そしたらaがbに依存してたらやっぱりaを先に消すわけだね。
0121デフォルトの名無しさんNGNG
コピーコンストラクタは次のような場合呼ばれる。

A a;
A b(a); // コピーコンストラクタが呼ばれている
0122デフォルトの名無しさんNGNG
>>120
その場合b, aの順に生成するだろ。
いつも依存性と生成順序ばらばらにしてるの?
0123デフォルトの名無しさんNGNG
>>122
そうではない。俺は出てきた順にdeleteしている、ただそれだけだよん。
012498NGNG
>>121
引数が一つでexplicitが無いと
暗黙の型変換としても呼ばれるよ
0125デフォルトの名無しさんNGNG
結論。メンバにポインタを持っていたら、自前のoperator=と
コピーコンストラクタを書こう。でよろしいか?
0126デフォルトの名無しさんNGNG
> one_image(struct base_image *base);
> void set_imagedata(struct base_image *base);
こんなのがあるなら、本当は浅いコピーがやりたい可能性も十分ある。
0127デフォルトの名無しさんNGNG
operator=は次のように書いた方がいいと思うが。

struct A {
int* x;
A() { x = new int(0); }
void func() { *x = 2; }
A& operator=(const A& a) {
*x = *a.x;
return *this;
}
};

int main()
{
A* a = new A;
A* b = new A;

*b = *a;
a->func();
std::cout << *a->x << std::endl;
std::cout << *b->x << std::endl;
delete b;
delete a;
}
0128デフォルトの名無しさんNGNG
prototype pattern?
0129デフォルトの名無しさんNGNG
>>111
配列メンバも operator= なのかと小一時間
013098NGNG
>>127
受け取るのにconst付けたなら
返すのにもconst付けたら?
0131デフォルトの名無しさんNGNG
>>130
Effective C++の15項に、operator=の返り値はconstにしない方が
良いという内容があるよ。
0132デフォルトの名無しさんNGNG
>>131
constの意味わかってる?
何でわざわざ禁止にするのか
その上でもう一回読んでみて
0133デフォルトの名無しさんNGNG
>>132
A a, b, c;
(a = b) = c;
というコードが通らないようにconstをつけ人がいるらしいけど、
int i, j, k;
(i = j) = k;
は通るので、組み込み型との互換性を無くさないように、
operator=の返り値はconstにしないのだと書いてある。
0134デフォルトの名無しさんNGNG
こんな糞議論をしなきゃいけないような糞言語は今後二度とつかわねーと叫びながら町内を走り回りたい気分でいっぱいです。
0135デフォルトの名無しさんNGNG
>>134
そこが慣れるとたまらなく快感になる。
013698NGNG
>>133
スマソ
勘違いしてた
組込型は通るコードだったんだ
0137デフォルトの名無しさんNGNG
この仕様はC言語互換のためなのかな?
0138デフォルトの名無しさんNGNG
>>137
そうかもしれないが、Effective C++の著者は相当パラノイアだな(w
0139デフォルトの名無しさんNGNG
ふむ。で、その書き方は何の役に立つの?
0140デフォルトの名無しさんNGNG
>>139
役には立たんだろ。ただ意図しないエラーが出なくなる、それだけの
ような気が。
014198=137NGNG
>>139
そんなこと全然考えてなかった
何かの役に立つのかな?
0142バク転キッカー ◆O1dBMUxvmo NGNG

  ま  さ  に  本  末  転  倒
0143デフォルトの名無しさんNGNG
ぶはは。
0144デフォルトの名無しさんNGNG
>>137
少なくともVC++の場合、Cとしてコンパイルすると
>error C2106: '=' : 左のオペランドが、左辺値になっていません。

となるが。
0145デフォルトの名無しさんNGNG
>>144
VC++はANSI-Cにすら準拠してないのです。
ご愁傷様。
0146デフォルトの名無しさんNGNG
Cで=演算子は左辺値を返さない。>>144で正しい
0147デフォルトの名無しさんNGNG
>>139
void set_str( const CString& s ) {
 (m_str=s).TrimLeft()TrimRight().MakeLower();
}
とか、代入演算子に限らず自分を書き換えるだけのメソッドは全て
自分への参照を返すように決めておくと何かと便利。
0148デフォルトの名無しさんNGNG
const CString &なのに?
0149デフォルトの名無しさんNGNG
書き込んだ直後に間違いに気づく。 ●5点
0150デフォルトの名無しさんNGNG
m_strの型、というかのoperator = の結果型がわからんので何とも言えぬ気が
0151147NGNG
>>150
「operator=の結果型をconstじゃない参照にする書き方は
何の役に立つか?」 に対するレスのつもりだったので、そこんとこは
推測して頂きたいわけだが。
0152デフォルトの名無しさんNGNG
http://qb.2ch.net/test/read.cgi/accuse/1046017091/215

IDがC++
カコイイ
0153デフォルトの名無しさんNGNG
AV電話相談室
アダルトビデオについて質問のある方大募集!!
料金は無料!!
TEL 046-239-1539
0154デフォルトの名無しさんNGNG
private継承って皆さん使ってますか?
俺は使う場面がよくわからないので使ってないのですが。
0155デフォルトの名無しさんNGNG
このような事ができるとすれば、純粋仮想関数の意味が
なくなってしまうような気がするのですが・・・・・俺だけ?

struct Base {
virtual void who() = 0;
};

struct Derived : public Base {
void who() {}
};

void Base::who() {
std::cout << "純粋仮想関数のメンバ関数だよん" << std::endl;
}

int main()
{
Derived d;

d.Base::who();
}
0156デフォルトの名無しさんNGNG
>>155
Baseのインスタンスは作成できないから意味がある。
0157デフォルトの名無しさんNGNG
VC7/istream でカンマ区切りのデータを読み込もうと考えたのですが、
ロケールの関係で数字を読み込むとカンマが桁区切り記号と誤認されてしまい読み込みに失敗してしまいます。
STLのコードを見た限りではoperator>>は問答無用で桁区切りを読み込むようになっており、
動作を変更するオプションは見当たりませんでした。

,を読み込まない関数を書くのは簡単ですが毎回それではスマートさに欠けます。
何か標準で用意されている方法はあるでしょうか?
0158デフォルトの名無しさんNGNG
>>154
継承したいメンバを制限する時。
単独ではあまり役に立たないが、アクセス宣言と共に使うと
必要なメンバだけ引っ張り出せる。
0159デフォルトの名無しさんNGNG
>>157
こんなのは?

int main()
{
std::ifstream ifs("comma.txt");

while (true) {
char buf[128];
ifs.getline(buf, sizeof(buf), ',');
if (!ifs) break;
std::cout << std::atoi(buf) << std::endl;
}
}
0160デフォルトの名無しさんNGNG
>>154

例えば次のような事ができる。意味論的にどうなるのかは知らないが。

struct Base {
int i;
int j;
int k;
};

class Derived : private Base {
using Base::i;
protected:
using Base::j;
public:
using Base::k;
};
0161デフォルトの名無しさんNGNG
>>160
この場合 using Base::i; は冗長だね。
ただ次のような事をすると usingがないとエラーが出る。

struct Base {
int i;
int j;
int k;
};

class Derived : private Base {
// using Base::i;
protected:
using Base::j;
public:
using Base::k;
Derived(int ii) : i(ii) {} // エラー
Derived() { i = 1; }
};
0162デフォルトの名無しさんNGNG
using std::cout;
using std::endl;
...
みたいな感じでソースの半分以上が using文なんですが、素直に
using namespace std;
使うべきなんですかねぇ。
0163デフォルトの名無しさんNGNG
いいえ、問題ありません。そのまま続けて下さい。
0164デフォルトの名無しさんNGNG
まあ動作には問題はないよな。面倒そうなだけで。
0165デフォルトの名無しさんNGNG
init()
try{
 run();
}finally{
 done();
}
ってC++でどうやって書くの?
0166デフォルトの名無しさんNGNG
>>165
class Hoge {
Hoge() { init(); }
~Hoge() { done(); }
};

Hoge a;
run();
0167デフォルトの名無しさんNGNG
class Hoge {
Hoge() { init(); }
~Hoge() { done(); }
};

Hoge a;
run();
ってCでどうやって書くの?
0168デフォルトの名無しさんNGNG
ここはC++スレです
0169デフォルトの名無しさんNGNG
>>166
それって処理の内容毎にfinally用のクラスを興さないといけないって事?
0170デフォルトの名無しさんNGNG
>>169
そう。
むしろオブジェクト側に隠蔽できて便利ってこと。
0171デフォルトの名無しさんNGNG
>>165
処理系依存でも良ければ、__finallyキーワードを使え。
なかったら諦めろ。
0172デフォルトの名無しさんNGNG
いいじゃんこれで。

class at_exit{
public:
typedef void (*finalizer_type)();

at_exit(finalizer_type f) : finalizer(f){}
at_exit(at_exit& a){ finalizer = a.finalizer; a.finalizer = 0; }
~at_exit(){ if(finalizer != 0) finalizer(); }
protected:
finalizer_type finalizer;
};

main{
init();
trye{
at_exit(done);
run();
}catch(...){
std::cerr << "exception!" << std::endl;
}
0173デフォルトの名無しさんNGNG
at_exitだと誤解を招くか。at_endの方がよかったかな。
0174デフォルトの名無しさんNGNG
>>165
ScopeGuard
 http://www.cuj.com/experts/1812/alexandr.htm?topic=experts
 http://www.kmonos.net/alang/klx/
を使うとかいう手はある。けど、「auto_ptrみたいな汎用ルーチンに
切り出せないようなfinally処理」が発生する設計を考え直すのが先のような。
0175デフォルトの名無しさんNGNG
ダイヤログについての質問もアリですか?

ダイヤログのエディットボックスにカーソルがあるときに、
enterないし特定のキーを押すとイベントが起こるようにしたいんですがどうしたらいいですかねえ
0176デフォルトの名無しさん NGNG
Hoge &operator = (Hoge &obj);
の&って変数のアドレスを取り出すときのやつと考えて良い?
0177デフォルトの名無しさんNGNG
>>176
参照(reference)です。参照演算子とは異なります。
0178デフォルトの名無しさんNGNG
だめ
0179デフォルトの名無しさんNGNG
>>175
スレタイを良く嫁。
0180175NGNG
>>179
うー、スレ違いっすね
合うスレ探してみます
0181デフォルトの名無しさんNGNG
c++してみたいんだけど、まず何をそろえればいいの?
なるべくfreeの奴紹介してください。お願いします。
0182デフォルトの名無しさんNGNG
>>181
読め>>5
0183デフォルトの名無しさんNGNG
>>181
おまえがWindowsで貧乏人で
MFCとか完璧Unixエミュレーションとか多くを望まないなら、
cygwin別名poor man's Unixを薦める。
今ならgcc-2.95あたりがついてくる。
at your own riskで、ソースからgcc-3.xを作ることもできるはずだ。
emacsは動かんぞ。xemacsなら動くかも知らん。vi(vim)を使え。
漏れはWindowsでVMwareでLinuxだが、cygwinも重宝している。
0184デフォルトの名無しさんNGNG
>>183
cygwin の gcc も 3.x になったぞ。
emacs 互換エディタには、あとxyzzyってのがある。
0185181NGNG
いまcygwinインストールしてるんだけど、
ヒジョーに難しそう・・・・。ガン狩ります
0186デフォルトの名無しさんNGNG
>183
何故Borlandではない?
0187デフォルトの名無しさんNGNG
>>186
あれはC++に対する冒涜だから
0188184NGNG
使い方がわからん・・・・。今なんか入力できるやつが出
たんだけど、何を入力すればいいんですか?
0189デフォルトの名無しさんNGNG
>>187
それを言うならVC++もC++に対する冒涜。
0190デフォルトの名無しさんNGNG
てか Borland のどのへんが冒涜?
0191デフォルトの名無しさんNGNG
>>190
価格
0192191NGNG
>>186のいうBorlandってのはフリー版のことか・・・
0193デフォルトの名無しさんNGNG
Borland C++はテンプレート周りが少々弱いことを除けば、
標準C++に対する準拠度はほどほどに良いと思うが。
もちろんg++にはかないようがないが。
0194デフォルトの名無しさんNGNG
>>193
g++って準拠度に関してはそんなにいいの??
最適化はいまいちらしいけど。
Intelはどう?
0195デフォルトの名無しさんNGNG
>>194
Intelは準拠度に関しては糞。
0196デフォルトの名無しさんNGNG
>>195
じゃあ準拠度ならg++,bccで、最適化ならiccやVC++か。
0197デフォルトの名無しさんNGNG
template周りに限るけど、準拠度を測るには、Boostをコンパイルして
どれだけ通るか試してみればよい。
Comeauでさえ通らないものがあるからね。
0198デフォルトの名無しさんNGNG
>>196
初学者はおかしな癖を覚えないよう、最適化の性能よりも準拠度の高い
コンパイラで学習するといいかも。
0199デフォルトの名無しさんNGNG
借りているサーバーのg++は古すぎて(2.7.2)ごく簡単なソースのコンパイルさえまともに通らん(涙
カーネルもLinuxの2.0系だし(涙

2.7.2が出た当時の仕様に沿って書けばOKなんだろうけど。
0200デフォルトの名無しさんNGNG
200
0201デフォルトの名無しさんNGNG
>>199
2.7.2・・・・俺が初めてC++をやり始めた時は既に2.95.2だった。
0202デフォルトの名無しさんNGNG
std::ifstreamのインスタンスを、ファイルをオープンしたまま他の関数に
渡すにはどうすればいいでしょうか?

次のようにするとコンパイルできません。

void func(std::ifstream ifs);

int main()
{
std::ifstream ifs("ifstream_open.cpp");
std::string str;

func(ifs);
ifs >> str;
std::cout << str;
}

void func(std::ifstream ifs)
{
std::string str;

ifs >> str;
std::cout << str;
}
0203デフォルトの名無しさんNGNG
当たり前。
0204デフォルトの名無しさんNGNG
>>203
どうすればいいのでしょうか?
Cの場合だと FILE ** のようにして切り抜けていましたが。
std::ifstream * としてポインタで渡すのがいいのでしょうか。
0205デフォルトの名無しさんNGNG
void func(std::ifstream &ifs);
でいいんじゃん
0206デフォルトの名無しさんNGNG
>>205
参照か!その手がありました。
しかしその場合、関数からの返りに勝手にデストラクタが呼ばれて
ストリームがクローズしてしまうような事はありませんか?
0207デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0208デフォルトの名無しさんNGNG
>>207
どういう場合にデストラクタが呼ばれるのかよくわからないのです。
0209デフォルトの名無しさんNGNG
---質問の主旨が変わった転換点---
0210デフォルトの名無しさんNGNG
本体の生存期間は大丈夫
0211デフォルトの名無しさんNGNG
ifstreamのデストラクタが呼ばれる == ファイルがクローズする
なので、ちょっと怖いのです。
0212デフォルトの名無しさんNGNG
とりあえず、入門書を読み返しましょう。
0213デフォルトの名無しさんNGNG
>>211
参照で渡した場合はそのインスタンスに関してコンストラクタも
デストラクタも呼ばれないから安心しろ。
0214デフォルトの名無しさんNGNG
どこかにある実体を「参照」してるだけだからね。
実体そのものではない。
0215デフォルトの名無しさんNGNG
>>210-214
そうなると、参照はポインタと同じとまではいかなくても、ポインタと似た
ような考え方でよいのですね。
ありがとうございます。今までどうやってストリームを他の関数
に渡していいのかずっと悩んでいました。
入門書にはそのような例が出てなかったのです。
0216デフォルトの名無しさんNGNG
一体どんな入門書買ったんだよん?
0217デフォルトの名無しさんNGNG
>>216
ええと、手元にあるだけを列挙すると・・・・
・「独習C++/標準講座C++」(ハーバート・シルト著)
・「C++Primer 改訂3版」
・「詳説C++」(大城正典著)
こんなもんです。
0218デフォルトの名無しさんNGNG
それより ifstreamってコピーで複製できなかったのか・・・
0219デフォルトの名無しさんNGNG
>>218
コンパイルすると、「iosのコピーコンストラクタを生成できません」という
エラーが出ました。
0220デフォルトの名無しさんNGNG
コピーコンストラクタがprivateである事が原因のようです。

:/mingw/include/c++/3.2.2/bits/ios_base.h: In copy constructor
`std::basic_ios<char, std::char_traits<char> >::basic_ios(const
std::basic_ios<char, std::char_traits<char> >&)':
C:/mingw/include/c++/3.2.2/bits/ios_base.h:424: `std::ios_base::ios_base(const
std::ios_base&)' is private
C:/MinGW/Learn/Learn2/ifstream_open.cpp:12: within this context

C:/mingw/include/c++/3.2.2/streambuf: In copy constructor
`std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const
std::basic_filebuf<char, std::char_traits<char> >&)':
C:/mingw/include/c++/3.2.2/streambuf:479: `std::basic_streambuf<_CharT,
_Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&)
[with _CharT = char, _Traits = std::char_traits<char>]' is private
C:/MinGW/Learn/Learn2/ifstream_open.cpp:12: within this context
0221デフォルトの名無しさんNGNG
まあ、ストリームクラスなんかコピーしても何のメリットも無い品。
0222デフォルトの名無しさんNGNG
>>221
もしできたとしても、破棄時にデストラクタが呼ばれてストリームが
クローズしてしまうでしょうから使い物にならないでしょう。
0223デフォルトの名無しさんNGNG
ポインタや参照について書かれている本を持ってても
頭で理解したつもりになってて実際には使えなかっただけだろう。
0224デフォルトの名無しさんNGNG
>>223
そうなのです。基本型に関しては参照は理解したつもりでいまし
たが、それをライブラリと共に使う方法を知りませんでした。
0225デフォルトの名無しさんNGNG
>>224 ひとつの山を越えようとしている。ガンガレ!
0226デフォルトの名無しさんNGNG
>>225
ありがとうございます。2chにはこんな親切な人が大勢いたのですね。
なるほど、こういう事もできるから参照は便利ですね。
もうポインタからはそろそろ卒業しなければ。

void func(std::ifstream& ifs);

int main()
{
std::ifstream ifs;
std::string str;

func(ifs);
ifs >> str;
std::cout << str;
}

void func(std::ifstream& ifs)
{
std::string str;

ifs.open("ifstream_open.cpp");
ifs >> str;
std::cout << str;
}
0227デフォルトの名無しさんNGNG
?間違い探し?
0228184NGNG
 Cygwinの初期設定?が良くわからん。あの背景が黒くて・・・
誰か使ってる人、詳しく教えてください・・・
0229デフォルトの名無しさんNGNG
>>228
Cygwin使っている人いますか? part7
http://pc.2ch.net/test/read.cgi/unix/1039449446/
0230184NGNG
ありがとう。初期設定メンドクサ。
0231デフォルトの名無しさんNGNG
>>226
ポインタも参照も使えるなら、迷わず参照を使え。
参照は、ポインタと違って、インクリメント/デクリメントや添え字参照が
できない分、意図が明確になる。
漏れとしては、歴史的な理由によるが、thisが参照じゃないのが嫌。

OfficeのCOMは、アプリケーションによって、パラメータがポインタ
だったり山椒だったりして反吐。その差を変換演算子かなんか使って
隠そうとしているので余計反吐。
0232デフォルトの名無しさんNGNG
>>228 >>229
http://pc2.2ch.net/test/read.cgi/win/1023470780/
参考まで。
0233デフォルトの名無しさんNGNG
>>231
> OfficeのCOMは、アプリケーションによって、パラメータがポインタ
> だったり山椒だったりして反吐。その差を変換演算子かなんか使って
> 隠そうとしているので余計反吐。
COMは言語に依存しないというのを分かってますか?
0234デフォルトの名無しさんNGNG
WideStudioって知ってる人!
0235デフォルトの名無しさんNGNG
やっと図書館でプログラミング言語C++がみつかった・・・
0236デフォルトの名無しさんNGNG
本屋さんは?
0237デフォルトの名無しさんNGNG
>>236
高くて買えないよ(T_T)
0238デフォルトの名無しさんNGNG
>>234
スレ違い。
0239デフォルトの名無しさんNGNG
図書館に沢山置いてあるから借りてるよ
新しいものもおいてあるしね
C++ならば20冊ぐらいあった
貸し出しされているものもあるだろうから
もっと沢山蔵書があるだろうけど
0240デフォルトの名無しさんNGNG
FILE* から fstream に変換する方法を教えてください。
0241デフォルトの名無しさんNGNG
>>240
できません。
0242デフォルトの名無しさんNGNG
FILE*を捨てる。
0243デフォルトの名無しさんNGNG
FILE* -> ファイルデスクリプタ -> fstreamって無理だった?
やった事無いから知らんが。
0244デフォルトの名無しさんNGNG
>>233
COM用に拡張されたコンパイラに依存している。
0245デフォルトの名無しさんNGNG
> COM用に拡張されたコンパイラ

はつみみです
0246デフォルトの名無しさんNGNG
newの戻り値確認している?
0247デフォルトの名無しさんNGNG
>>246
なんの話をしているんだ?
0248デフォルトの名無しさんNGNG
>>246
std::bad_alloc例外をチェックすれば十分じゃないの?
0249デフォルトの名無しさんNGNG
>>246
VC++6なんか窓から投げ捨てろ。
0250デフォルトの名無しさんNGNG
なんだ、標準化する前のC++の話かよ。
確かnewに失敗したらNULLを返すんだっけ。
標準C++でも new(nothrow) とすれば互換の動作にはなるが。
0251デフォルトの名無しさんNGNG
n    e    w    な    ん    か    使    う    な
0252デフォルトの名無しさんNGNG
>>251
(゚Д゚)ハァ?
(゚Д゚)ハァ?
(゚Д゚)ハァ?
(゚Д゚)ハァ?
(゚Д゚)ハァ?
0253デフォルトの名無しさんNGNG
new 使わなきゃコンス(ry
0254デフォルトの名無しさんNGNG
n    e    w
なんか使うな。
new
を使え。
0255デフォルトの名無しさんNGNG
本とか読むと、
string str("abc");
みたいな書き方してあるけど、これをそのまま
関数に渡したりとかしたらオーバーヘッド
すごそうだけどやはり
string *str = new string("abc");
でポインタを関数に渡すべき?
0256デフォルトの名無しさんNGNG
えー、何言ってるの?
0257デフォルトの名無しさんNGNG
スマソ、自分でもわけわからん事言ってしもた。
要するに、文字列をそのまま値渡しとか
していいものか、と聞きたかったわけ。
0258デフォルトの名無しさんNGNG
山椒渡しは?
0259デフォルトの名無しさんNGNG
new しなくても &str とすればポインタで渡せる
0260デフォルトの名無しさんNGNG
>>255
受ける関数側で func(std::string& str) のように参照で受ければ?
そうすればコピーコンストラクタは発動しないからかなり速くなる。
今からベンチマークやるからちょっと待ってて。
0261デフォルトの名無しさんNGNG
関数側が const string& で受けるようにすればいい
0262デフォルトの名無しさんNGNG
結果。

func1(string with copy constructor) = 515085
func2(string with pointer) = 8990
func3(string with reference) = 8985

予想通り、std::stringをそのまま渡すとコピーコンストラクタが
発動してすごいオーバーヘッドが生じた。
ポインタと参照はほとんど差がない。
0263デフォルトの名無しさんNGNG
>>257
>>255の大ボケは無視して答えると、一般にはユーザ定義型を
渡す場合は値渡しではなくconst referenceを使用するようにすべきだろう。
もっともstringに関しては参照カウントとcopy on writeを用いて
実装されていることが多いはずなので、思ったほどの負荷は無いと思われ。
# そのお陰で
# string s("abc");
# string t(s);
# s[0] = '!';
# で t まで書き変わっちゃう実装とかが多いみたいだけどね。

ていうか、そのレベルの疑問は「Effective C++」辺りを読めば
あっさり解決する代物なので、読んでおくことを勧める。
0264デフォルトの名無しさんNGNG
みなさん、サンクス。
0265デフォルトの名無しさんNGNG
>>263
んなこたぁーない。
0266デフォルトの名無しさんNGNG
FILE*を返してくるライブラリを使っているんですが iostreamに割り当ててつかうことはできないのですか?
0267デフォルトの名無しさんNGNG
Rogue Waveだと

FILE *fp=fopen("test","r");
std::ifstream ifs(_fileno(fp));
std::cout << ifs.rdbuf();

などとできるようだが
0268デフォルトの名無しさんNGNG
>17

>俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して

このBorland-C++5.6.2ってCマガジンに付いてくるのと
違うものなの?

-D_RTLDLL オプションってCマガジンに付いてくるのでも
有効なの?というかそもそもこのオプションは何ですか?
0269244NGNG
>>245

漏れが勘違いしていたようだ。
__uuidofみたいなものが、必須なのだと思っていた。
0270デフォルトの名無しさんNGNG
>>268
多分#define _RTLDLLと同じ。
0271デフォルトの名無しさんNGNG
Visual C++.netなのだが、DOSのプログラムは作れるのか?
0272デフォルトの名無しさんNGNG
作れま千。
0273デフォルトの名無しさんNGNG
>>268
Borland-C++ 5.6.x は、C++Builder6の付属品です。
-D_RTLDLL オプションが有効なのも、それに対してです。

_RTLDLLを有効にすると、stlp45.dllなどの共有DLLを使ってくれる
ようになるので、実行ファイルのサイズが減少します。
0274デフォルトの名無しさんNGNG
初心者だけど、最初の
#include <iostream>
って何の意味があるの?
0275デフォルトの名無しさんNGNG
>>274が初心者だと分かる、という重大な意味がある。
0276デフォルトの名無しさんNGNG
それどうでも良い。
0277デフォルトの名無しさんNGNG
>>274
それh
0278デフォルトの名無しさんNGNG
今日もまたusing namespace std;を忘れた。
0279デフォルトの名無しさんNGNG
僕はセミコロンを良く忘れる。
0280268NGNG
>>270,273
> Borland-C++ 5.6.x は、C++Builder6の付属品です。
> -D_RTLDLL オプションが有効なのも、それに対してです。

そうですか、わかりました
どうもありがとうございました
0281デフォルトの名無しさんNGNG
>>274
いらないよ。coutとか使う時にいる。
0282デフォルトの名無しさんNGNG
>>247
そこからC++の世界の一部を展望できるが、それ以上先に進む事は出来ない。
本当の入り口はもっと別な場所にある。
0283デフォルトの名無しさんNGNG
>>247 -> >>274
0284デフォルトの名無しさんNGNG
「標準」C++勉強したかったらコレ嫁!とかいうソースありますか?

参考書で部分的な知識は知ったけど、実際にどういう局面でソレを使ったらいいかピンとこない状態です。
生Cだったら出てくるんですが。

公開ソースといえばunix由来のものが多いのですが、unix系だとまだ生Cが多いし、C++使ってたとしてもQt/KDEとかmozillaとか、コンパイラ/ライブラリの標準準拠度がいまいちのころ作られた代替ライブラリを使ってる。

Win系だとやはりMFCやVCLべったりなのはともかく、呼び出しだけしょーがなくC++にしてるけど本体は実は生Cとかわらん、というのも多いし。
0285デフォルトの名無しさんNGNG
>>284
そんだけ分かってれば十分なのでは?
0286姑NGNG
やはりテンプレだろう。

STL のソースを眺める。

さらに、VC なら ATL WTL を眺める。
0287デフォルトの名無しさんNGNG
質問させてください!
C++の勉強は一通りしました。
次は、VC++.NETの勉強をするか、BCB6の勉強をするか迷ってます。
どちらの方が良いでしょうか?

スレ立てるまでも・・・スレがなかったので、ここで質問させていただきます。
本気で迷ってたりするので、よろしくお願いします!
0288デフォルトの名無しさんNGNG
>C++の勉強は一通りしました。
>>4の書籍は全部読んだ?
0289287NGNG
>>288
いや・・・そんなに本は読んでないんですが・・・
まぁ、大体が分った程度でしょうか・・・
そろそろ次のステップへと考えてます。
マジで悩んでるんで、ネタナシでお願いしたいのです・・・
0290デフォルトの名無しさんNGNG
勉強して、何がしたいのかって問題やね
0291デフォルトの名無しさんNGNG
>>289
仕事するんだったらVC++.NET、趣味で使うならBCB6。以上。
0292デフォルトの名無しさんNGNG
>>289
Delphi

目的もなしにどの道具がいいと言われてもなぁ
勉強目的なら両方やっとけ、GCCモナー
というのが率直なところ
C/C++以外にも多言語やると視野が広がるよ
0293284NGNG
>>286
basic_stringからながめてみますた
gcc(3.2)はリファレンスカウント。iterator!=pointer
stlportはフツーに確保。NUL terminated.
vcもフツーに確保。
bccはリファレンスカウント

こんなかんじか。

0294デフォルトの名無しさんNGNG
つーか一般論として一通り言語の学習が終わったと思うなら、
次の段階は何か実際にプログラムを作ってみることだ。
そうすれば自分にどんな知識がかけているか分かる。
0295デフォルトの名無しさんNGNG
>>294
できればマジレスをお願いします。
0296デフォルトの名無しさんNGNG
>>294
できればどんな場合に自分に欠けているものがあるかわかるのか
具体例をお願いします。
0297デフォルトの名無しさんNGNG
>>296
日本語喋れ。
0298デフォルトの名無しさんNGNG
>>297
それが実行する場合、何、欠けるいくらかのいくらかがあるか
どうか判明するかどうか知らせてください。
0299デフォルトの名無しさんNGNG
>>298
荒らしウザイ
0300287NGNG
いろいろレスありがとうございました。
何をしたいか・・・。
とりあえず、ゲームを作ってみたいと思ってます。
それと、アーカイバとかも自作したいなぁ〜と思ってます。
プログラムを仕事としたいとは、今の所思ってないので・・・
それじゃ、BCB6が最適でしょうか?
お金貯めないと・・・高いっすね。BCB6・・・

ありがとうございました。
0301299NGNG
ほんとは私が荒らし。
0302デフォルトの名無しさんNGNG
>>297
ロシア語喋れ。
0303デフォルトの名無しさんNGNG
ゲーム作るならFreeのBorland C++とWin32SDKとDirectXSDKでいいと思う
0304デフォルトの名無しさんNGNG
vectorを使用する方法はよく学習されません。
サイズは自動的に変更されますか。
それがmallocを使用しなくても、システムは領域を自由に安全にしますか。
0305デフォルトの名無しさんNGNG
>>304
翻訳ソフトで訳したような文は気持ち悪いからやめろ。
0306デフォルトの名無しさんNGNG
>>300
Noahのソースでも見てクローン作れ。
0307名無しさんNGNG
>>304-305
禿藁
0308デフォルトの名無しさんNGNG
>>304
Since a sentence which was translated with translation software is unpleasant, stop.
0309デフォルトの名無しさんNGNG
>>308
日本語がよく見つからなかったので、それは自動翻訳へ当てはまり
翻訳しました。意味は通過しませんか。非常に、親切な人々はここに
います。私は評価します。
0310デフォルトの名無しさんNGNG
std::set, std::mutiset の必要性を教えて下さい。
0311デフォルトの名無しさんNGNG
#include <iostream>
std::cout<<311
//(↑ストリームで質問を流し込み中)
<<"Metrowerks CodeWarrior ver.8の規格準拠の程度はいかほど?"
<< std::endl
0312デフォルトの名無しさんNGNG
;
↑忘れた…鬱
0313デフォルトの名無しさんNGNG
>>304
http://www.google.co.jp/search?q=C%2B%2B+vector
0314デフォルトの名無しさんNGNG
>>310
よくこういう質問する人がいるけど、必要性がわからないなら
使わなければいいだけのような気がするんだよね。
もしよかったら何で知りたいのか教えてください。
0315デフォルトの名無しさんNGNG
>>314
単純に基礎知識として知りたいだけじゃないかなぁ。
>>310
値をポンポン放り込むだけで、重複無し&&ソート済みの状態に
なってて欲しい時にset、後者の願望だけの時にmultisetとか・・・。
0316デフォルトの名無しさんNGNG
C言語の関数はDLLとかにして、VBから使えるようにできますが、
C++のクラスをDLLにして、VBから使えるようにすることはできますか?
0317デフォルトの名無しさんNGNG
できません
0318デフォルトの名無しさんNGNG
.NETなら可能
0319デフォルトの名無しさんNGNG
便乗質問お願いします。JavaとC++で、同じ事は可能でしょうか。
よろしければ.NETは無しの場合をお願いします。
0320デフォルトの名無しさんNGNG
muri
0321デフォルトの名無しさんNGNG
>>320
ari TT
0322デフォルトの名無しさんNGNG
IEで表示されてる文字列を取得するのって
どうやればいいんですか?
0323デフォルトの名無しさんNGNG
>>322
>>55
0324デフォルトの名無しさんNGNG
>323
レスサンクスです。
〜略〜のところが・・・
0325デフォルトの名無しさんNGNG
>>322
まず取得したい文字の先頭でマウスの右ボタンを押す。
そしてそのまま指を離さずに取得したい文字の一番最後まで持っていき指を離す。
すると文字が選択状態になるので編集メニューからコピーを選択する。
0326デフォルトの名無しさんNGNG
>>325
マウス操作の基本だな。(w
0327デフォルトの名無しさんNGNG
右ボタンで文字列選択って基本か?
0328デフォルトの名無しさんNGNG
選択されないぞ
0329デフォルトの名無しさんNGNG
おいおい、お前ら相手が初心者だからってデタラメ教えるなよ!
>>322 右ボタンじゃなくて左ボタンだからな!
0330デフォルトの名無しさんNGNG
すまん、肝心なことを書き忘れてた。
1. コントロールパネルからマウスのプロパティを開いて「左きき用」を選択
0331デフォルトの名無しさんNGNG
メンバ関数へのポインタを作って呼び出そうとしましたがうまく
行きません。どこがおかしいのでしょうか。

struct A {
void func1() { std::cout << "func1()" << std::endl; }
void func2() { std::cout << "func2()" << std::endl; }
};

void (A::*func[2])() = {
&A::func1,
&A::func2,
};

int main()
{
A *a = new A;

a->func[0]();

delete a;
}
0332デフォルトの名無しさんNGNG
スンマソン。速攻解決しますた。

int main()
{
A *a = new A;

(a->*func[0])();
(a->*func[1])();

delete a;
}
0333デフォルトの名無しさんNGNG
継承を覚えたので記念カキコ
0334デフォルトの名無しさんNGNG
じゃあ漏れもoverloadとoverrideをはじめて使った記念カキコ
0335デフォルトの名無しさんNGNG
じゃあ俺漏れもクラスとかいうのを初めて使ってDLLを初めて作った記念カキコ
0336デフォルトの名無しさんNGNG
抽象クラスのコンストラクタで自分の純粋仮想関数呼んで落ちた記念カキコ
0337デフォルトの名無しさんNGNG
ぬるぽ記念カキコ
0338デフォルトの名無しさんNGNG
配列の要素の数ってどうやって調べるんですか?
0339デフォルトの名無しさんNGNG
.size();
0340244NGNG
sizeof a / sizeof *a
0341デフォルトの名無しさんNGNG
キネンニナグッテアゲルヨ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>337
0342338NGNG
すみません。聞き方がまずかったです。
char a[30]; として abcd とだけ入力したとき この4と言う数は
どうやったら分かるんですか?
0343デフォルトの名無しさんNGNG
std::char_traits<char>::length();
0344デフォルトの名無しさんNGNG
int len(char *p)
{
if (!*p) return 0;
return 1 + len(p + 1);
}
0345デフォルトの名無しさんNGNG
constを愛せよ。
0346デフォルトの名無しさんNGNG
袋クラスCFukuroとボールクラスCBallを作って
CFukuroの中にボールクラスの配列をつくりたいんですけど、
袋に入れるボールの数をあとからintを引数としたメソッドで決めたいのですが
どうやってやればいいのでしょうか?
0347デフォルトの名無しさんNGNG
std::vector<CBall> bag;
0348デフォルトの名無しさんNGNG
>>342
strlen(a);
0349デフォルトの名無しさんNGNG
>>346
袋クラスの中にボールクラスCBallのポインタをコンポジションで持ち、
後からメンバ関数内でnewする。
0350デフォルトの名無しさんNGNG
すいません、コンポジションって何ですか?
class CBall{
};

class CFukuro{
CBall *balls;
}

void CFukuro::SetBalls(int num){
balls = new CBall[num];
}

って感じですか?
0351デフォルトの名無しさんNGNG
class CFukuro
{
vector<CBall*> bag;
}

void CFukuro::SetBall(CBall* ball)
{
bag.push_back(ball);
}
とか
0352デフォルトの名無しさんNGNG
ベクターって、私みたいな初心者にはつかいやすいって聞いたのですが
できるだけ、配列でやりたいんですよね。ゲームつくるもんで。
あと、個数を設定したいのです。
0353デフォルトの名無しさんNGNG
>void CFukuro::SetBalls(int num){
>balls = new CBall[num];
>}
delete[] balls; を挟んでおかないとリークしそうな悪寒。
0354デフォルトの名無しさんNGNG
別にvectorにしたからって実行速度がめちゃくちゃ落ちる沸けでもないのに。
0355デフォルトの名無しさんNGNG
>>350
まあそういう感じ。
CFukuroのデストラクタにCBallのdeleteを入れといた方がいい。
0356デフォルトの名無しさんNGNG
ついでにCFukuroのコンストラクタではballs(0)をやっといた方がいいな。
袋にボールを入れないでデストラクタが呼び出された時のために。
0357デフォルトの名無しさんNGNG
>>352
ただ、クラスへのポインタを持った場合、Cのrealloc()に相当する
処理が面倒なので、後から袋にボールを追加するような場合は
std::vector()の方が相当使いやすいと思われる。
0358デフォルトの名無しさんNGNG
質問なのですが、

class A {
std::vector<int> v;
};

のようになっていたとして、このstd::vectorのメンバ v はAのインスタンス
を作った時にきちんと初期化され、インスタンスが破棄される時にstd::vector
の後始末もきちんとしてくれるものなんですか?
0359デフォルトの名無しさんNGNG
>>358
当然。メンバにクラス変数を持っている場合は、そのクラス自体の
コンストラクタより先にメンバのコンストラクタが呼ばれる。
解体の時は逆にクラスのデストラクタが呼ばれた後、メンバの
デストラクタが呼ばれる。

クラス変数のメンバを明示的に初期化したい場合は、クラスの
コンストラクタの初期化部分に並べて書く。
0360デフォルトの名無しさんNGNG
try,throw,catch,age!
0361デフォルトの名無しさんNGNG
fstreamを使った構造体の
バイナリデータとしての書き込みって
このようにしかできないのですか?


//以下ソース
struct record
{
  //hoge
};

int main()
{
  ofstream giko("giko.dat", ios_base::out | ios_base::binary);
  record data;
  //hogehoge
  genka.write((char*)&data, sizeof(data));
  return 0;
}
0362デフォルトの名無しさんNGNG
真っ先に>>348の答えが出ないのはC++スレだからなのか?それとも意地悪なのか?
0363デフォルトの名無しさんNGNG
すいません、ここで聞くのが妥当か分からないのですが…、

UML図を書けて、それの簡単なテンプレコード(もちろんC++で)が
吐けるようなフリーソフトってありますでしょうか?
0364デフォルトの名無しさんNGNG
>>363
gtpl
0365デフォルトの名無しさんNGNG
配列の要素数てことだと>>340氏の出したような回答しか出せないと思うけど。
0366デフォルトの名無しさんNGNG
>>361
それが嫌だったらfopen()とfwrite()を使うしかない。
0367デフォルトの名無しさんNGNG
>>365
>>342からして338は「配列の要素数」を勘違いしている。
0368デフォルトの名無しさんNGNG
>>361
自分もこれと一緒な感じでプログラムしてる

ところでfstream以外はios_base::binaryっていらないですよね?
0369デフォルトの名無しさんNGNG
strlen() が出たのは>>342の後だからね。
0370デフォルトの名無しさんNGNG
静的配列長なら、
template< typename T, size_t N >
size_t length_of( T const (&)[N] ){ return N; } とかある
0371デフォルトの名無しさんNGNG
>>365
俺が言っているのは>>343>>344のこと。
0372370NGNG
よく読んでなかった。スマソ

個人的には、>>343 にあったような char_traits<char>::length がお勧め。
char_traits<TCHAR>::length( str ) とかやると、Winでは少し幸せになれるし。
0373363NGNG
>>364
レスありがとうございます。既にございますか…。

ただ申し訳ございません、よろしければもう少し情報をいただないでしょうか。
どうもそれらしきものが引っかからなくて…。
gplではないですよね…ってあれはライセンスか…うーん。
0374デフォルトの名無しさんNGNG
C++でstructを使う時は、構造体(かそれへのポインタ)を要求するCの関数を呼び出すときくらい?
0375デフォルトの名無しさんNGNG
>>371
>>343のどこが意地悪だ?
0376デフォルトの名無しさんNGNG
>>375
C++スレだから?とも聞いているんだけど。
0377376NGNG
何を言いたいのかというと、C++ではCの関数は使わないのが文化かマナーなのかなと。
0378デフォルトの名無しさんNGNG
そういうのはないんじゃない。単純にCのより安全で便利なのが
あるから積極的に使ったらどうって話なのでは。
0379デフォルトの名無しさんNGNG
>>378
なるほど。安全か。
確かにCの関数は丁寧に扱わないと危険だな。
ありがとう。
0380デフォルトの名無しさんNGNG
>>370
上手い。だが、VC++ 6.0は
: error C2265: '<Unknown>' : サイズが 0 の配列への参照は不正です。
: error C2266: '<Unknown>' : 非定数の大きさの配列への参照は、不正です。
とか、とんまなこと言いやがる。
0381デフォルトの名無しさんNGNG
>>374
traitsで使うで初?
0382373NGNG
ダメだ…これだけ探しても分からない…。
どなたか、gtplについてご存じの方は、いらっしゃいませんでしょうか。
0383デフォルトの名無しさんNGNG
>>374
単なるデータ構造のばあいはstruct。つーか全てのメンバがpublicならstruct。
標準ライブラリでも、pair<>やnumeric_limits<>はstructである場合が多かろう。


ま、ぶっちゃけstructだろうがclassだろうが関係ないんだが。
0384デフォルトの名無しさんNGNG
VisualC++のコンパイルするコマンドってどうするんでしょうか?
やったことないので困っています。
0385デフォルトの名無しさんNGNG
cl.exeだよ!なんでそんな事も分からないの?
邪魔なんですよ!
0386デフォルトの名無しさんNGNG
>>382
んなもんない。

>>384
cl
0387386NGNG
・・・の前にvcvars32.batを実行しておいた方がいいか。
0388デフォルトの名無しさんNGNG
>>385
あんたは何も教わらずに生まれてきたときから知ってたのかよ?
偶然思いついたのかよ?こんなくだらない決まり事知ってるくらいで偉そうにすんな
0389デフォルトの名無しさんNGNG
>>350
コピーコンストラクタと代入演算子は最低いるよ。
0390385NGNG
>>388
生まれたときから無敵だったよ、俺は。
0391デフォルトの名無しさんNGNG
俺は生まれる前から
0392デフォルトの名無しさんNGNG
俺は逝った後から
0393デフォルトの名無しさんNGNG
どっちが本物の無敵なんだよ。
0394デフォルトの名無しさんNGNG
mapってハッシュ?
0395デフォルトの名無しさんNGNG
お馬鹿なC++は任意の型からハッシュ値を算出することができないのでそれはない。
0396デフォルトの名無しさんNGNG
ああそうか。文字列とはかぎらないよな。
0397デフォルトの名無しさんNGNG
すいません、コンパイルした跡に出来る.exeファイルで
プログラムを実行すると、コマンド入れた後に即座に終了するんですが。
なんでですか?
0398デフォルトの名無しさんNGNG
>>397
何も言わずにmainの最後にgetchar();
0399デフォルトの名無しさんNGNG
>>398 すまん、もう少し場所を詳しく教えて。申し訳ない。
0400デフォルトの名無しさんNGNG
>>399
#include <cstdio>

int main()
{
/*
  いろいろ
*/
getchar();
return 0;
}
0401デフォルトの名無しさんNGNG
>>400 ありがとう!
0402デフォルトの名無しさんNGNG
>397
DOS窓開いてそこから実行すれば閉じない。
0403デフォルトの名無しさんNGNG
ところで、俺の参考書には
using namespace std;

ってあるんだけど、これはいらないの?
0404デフォルトの名無しさんNGNG
>>403
それを忘れるようでは立派なプロフェッショナルにはなれないぞ。
つかその本古杉。新しいの買え。
0405デフォルトの名無しさんNGNG
>>403
標準ライブラリを使わなければいらないでしょ。
Cの標準ライブラリもC++ではstd名前空間にあるんだっけ?
0406デフォルトの名無しさんNGNG
ごめん、2000年出版物。3ねんまえだす!
0407デフォルトの名無しさんNGNG
2000年なら一番新しい仕様でしょ。
0408デフォルトの名無しさんNGNG
>>407
最近の流行は
using namespace System;
なわけだが。
0409デフォルトの名無しさんNGNG
>>402 XPはコマンドプロントってでるけど、いっしょでしょ?
    俺の場合それでやると認識されてないって言われるんです。
0410デフォルトの名無しさんNGNG
>>406
バイブルなんか1998年だぜ
0411デフォルトの名無しさんNGNG
>>403
ヘッダでそれを書くのは望ましくない。
0412デフォルトの名無しさんNGNG
そのまえにusing〜ってなんのいみがあるんですか?
0413デフォルトの名無しさんNGNG
>>405
#include <cstdio>ってしてあるならstd名前空間にある
#include <stdio.h>ってしたならstd名前空間に無い

だからstd::getchar()が正しい。
けどコンパイラによっては正しくないから不思議
0414デフォルトの名無しさんNGNG
>>408
まるで標準ライブラリが既に時代遅れだと言っているようだな。
0415デフォルトの名無しさんNGNG
>>412
usingしないと
std::cout << "hello,world" << std::endl;
のように見るに耐えないコードになってしまう。
0416デフォルトの名無しさんNGNG
>>413
その代表がVC++6.0だっけ?
0417デフォルトの名無しさんNGNG
でgetchar() いれてみたが、未定義の関数を呼び出したってことで
エラー。くそぉー・・・・たすけて。
0418デフォルトの名無しさんNGNG
ネームスペースを明示的に指定した方が名前の衝突もなくて良いと思うわけだが。
0419デフォルトの名無しさんNGNG
>>417
#include <cstdio>
std::getchar();
0420デフォルトの名無しさんNGNG
>>418
std"だけ"はusingした方がいいと思う。
0421デフォルトの名無しさんNGNG
>>418
衝突してから明治すればいいじゃん
ふつークラス名が衝突するなんてありえねー
0422デフォルトの名無しさんNGNG
大変御恥ずかしながら、スペルミスでした。
しかし、1回目は終わらなかったけど2回目はだめですた。
もうだめ?
0423デフォルトの名無しさんNGNG
>>420 なぜ?
0424デフォルトの名無しさんNGNG
標準ライブラリでstd以外のnamespaceってないの?
0425デフォルトの名無しさんNGNG
>>424
見苦しくなるから。
ちなみに標準ライブラリと同じクラス名のクラスをつくるなんて阿呆だ。
0426デフォルトの名無しさんNGNG
あるよ。いっぱい。
0427425NGNG
誤爆った。

>>423へ。
0428デフォルトの名無しさんNGNG
using namespace std;に反対する奴は
人の名前を常にフルネームで呼ぶんだよな?
0429デフォルトの名無しさんNGNG
標準じゃないけど、using namespaceのおかげで、WTLのCStringとATLのCStringが衝突事故を起こしたよ。
0430デフォルトの名無しさんNGNG
>>482
C++相談室の426さん。
2番受付までお越しください。
0431デフォルトの名無しさんNGNG
string s;だと組込型を使っているような気分だけど、std::string s;だとやっぱり所詮はクラスなんだなと思ってしまう。
0432デフォルトの名無しさんNGNG
標準ライブラリってクラスだけだと思ってる?
0433デフォルトの名無しさんNGNG
>>432
いや?
現にcoutはクラスじゃないでしょ?
0434433NGNG
s/クラス/クラス名/
0435デフォルトの名無しさんNGNG
>>431
std::size_tの立場はどうなるのですか
0436デフォルトの名無しさんNGNG
だったらクラス以外にも定数や関数名と衝突する可能性あるでしょ。
0437デフォルトの名無しさんNGNG
標準は別格なんだからNS使わずに衝突を回避するのが人間の知恵ってもんだろ。
0438デフォルトの名無しさんNGNG
using反対派は本当にstd::を書いているの?
もしかしてスタンダード?
0439デフォルトの名無しさんNGNG
全言語のページからstd::coutを検索しました。 約20,500件中1 - 10件目 ・検索にかかった時間0.10秒
全言語のページからcout -std::coutを検索しました。 約206,000件中1 - 10件目 ・検索にかかった時間0.23秒
0440デフォルトの名無しさんNGNG
>>438
std::書いてるよ。それが当然だと思ってるから。
0441デフォルトの名無しさんNGNG
人間だから、回避しそこねる可能性がるから名前空間があるんじゃないの?
0442デフォルトの名無しさんNGNG
>>440
coutやendlで面倒だと思わない??
0443デフォルトの名無しさんNGNG
面倒だが、std::を含めて名前と考える
0444デフォルトの名無しさんNGNG
そりゃ、クソ長いネームスペースだったら、関数内でusing〜する事はある。
しかし、そういうケースはほとんど無い。
0445デフォルトの名無しさんNGNG
#include <iostream>
namespace std{
int cout;
}

error C2371: 'cout' : 再定義されています。異なる基本型です。
0446デフォルトの名無しさんNGNG
ペゾルトのサンプルコードなんですが、

#define DIVISIONS 5
int x, y;
x = (x + DIVISIONS) % DIVISIONS;
y = (y + DIVISIONS) % DIVISIONS;

これって
x = x % DIVISIONS;
y = y % DIVISIONS;
と等価じゃないですか?
どうでせう?

なんで、わざわざ加算してるんだろ。


0447デフォルトの名無しさんNGNG
妥協案としてusing std::cout;とかいうのもあるわけだが。

つーか、windows.hをincludeしてるとminやmaxがマクロと
被って死ぬほうがよっぽど……
0448デフォルトの名無しさんNGNG
てかusingして誤動作したケースなんてあるか?
俺は一度もないぞ。妄想で物言うなよ。
0449デフォルトの名無しさんNGNG
>>448
俺も無い・・が
それは他人のライブラリをちゃんと活用してないだけなのかもしれない罠
0450デフォルトの名無しさんNGNG
誤動作はないが、コンパイルエラーはある。
0451デフォルトの名無しさんNGNG
#define cout std::cout
#define endl std::endl

これでいいじゃん(^-^)v
0452デフォルトの名無しさんNGNG
>>446
xやyが-DIVISIONSの値になる時があるなら意味があるかも。
0453デフォルトの名無しさんNGNG
>>446
符号の問題かね?
0454デフォルトの名無しさんNGNG
>>451
最悪の解決方法発見!!
0455デフォルトの名無しさんNGNG
>>450
コンパイルエラーが出たら修正すればいいだけだろ。

アンチは費用対効果をもう一度考えてみろ。
0456デフォルトの名無しさんNGNG
>>454
うるせー!!
確かに問答無用で置き換えてしまうけどよ・・・
0457デフォルトの名無しさんNGNG
修正するくらいなら最初からNameSpace::ClassNameって書きますよ?
0458デフォルトの名無しさんNGNG
だからローカルでusing使えばいいって
0459デフォルトの名無しさんNGNG
ここでよかったのか迷いましたが、書きます。

#pragma once

というのは、積極的に使っていっていいものなんでしょうか?
それとも

#define _FUNC_H_
#ifdef _FUNC_H_

というかんじにdefineを使って2重インクルードを防止したほうがいいのでしょうか?
0460デフォルトの名無しさんNGNG
>>457
じゃあ今まで衝突したのが何回でusingしても衝突しないのが何回かカウントしてその比率を出してみろ。
0461デフォルトの名無しさんNGNG
>>459
断然後者でしょ。

ちなみに
#ifndef FUNC_H_
#define FUNC_H_
だよ・・・
0462デフォルトの名無しさんNGNG
>>459
両方書けばいい
#ifdef HAS_PRAGMA_ONCE
#pragma once
#endif
とやってコンパイラによってHAS_PRAGMA_ONCEを定義すればいい
0463デフォルトの名無しさんNGNG
>>452-453
なるほど。
0464 ◆cq./suWZSk NGNG
>>461-462
即効での回答ありがとうございます。
ifdefを使っていこうと思います。
0465デフォルトの名無しさんNGNG
if'n'defだっつーの
0466デフォルトの名無しさんNGNG
>>460
そんなバカな事言ってないで、ちゃんと名前空間を指定しなさい。
それでも面倒くさくて using namespace を使いたかったら、関数内とか限られた場所に
しなさい。グローバルでこれを書くのは止めなさい。
貴方が良くても他のプログラマが迷惑を被ります。

快適な開発環境作りに皆様のご理解とご協力をお願い致します。
0467デフォルトの名無しさんNGNG
>>466
ひとつのファイルは一人で書かないかい?そこまで細かくモジュール化しない?
まさかヘッダーファイル内でusing namespaceなんて馬鹿なことはしないだろうし。
0468デフォルトの名無しさんNGNG
原理主義者の思考停止っぷりはある意味感動的だな。
0469デフォルトの名無しさんNGNG
そのうち万に一つの誤作動を防げるとか言い出しそうだけど
そしたらそもそもC++使うのが間違いだよな(藁
0470デフォルトの名無しさんNGNG
おまえらusing namespaceが死滅寸前に追い込まれたときどうするよ?

ちゃんと対策とってるかよ
死滅対策をよ
死滅後の行動とってるかよ
0471 ◆cq./suWZSk NGNG
>>465

くっ謎のコンパイルエラーが・・・

ん?
おお!
nが足りなかったのね

またまた助かりました
0472デフォルトの名無しさんNGNG
このスレにしては珍しく論争が起きたな。
まあ結論としては標準ライブラリは使うなということだな。
0473デフォルトの名無しさんNGNG
おまえら470が死滅寸前に追い込まれたときどうするよ?

ちゃんと対策とってるかよ
死滅対策をよ
死滅後の行動とってるかよ




別に放っておいてもいいか
0474 NGNG
おまえらboostが死滅寸前に追い込まれたときどうするよ?

ちゃんと対策とってるかよ
死滅対策をよ
死滅後の行動とってるかよ
0475デフォルトの名無しさんNGNG
おまえら474が死滅寸前に追い込まれたときどうするよ?

ちゃんと対策とってるかよ
死滅対策をよ
死滅後の行動とってるかよ




別に放っておいてもいいか
0476デフォルトの名無しさんNGNG
>>467
> まさかヘッダーファイル内でusing namespaceなんて馬鹿なことはしないだろうし。
俺は傍観者だが、てっきりこのケースも込みで話してるんだとばかり。
0477デフォルトの名無しさんNGNG
>>451

using std::cout
using std::endl

にしとけ。
0478デフォルトの名無しさんNGNG
あ、セミコロン忘れた。

using std::cout;
using std::endl;
0479デフォルトの名無しさんNGNG
とりあえず、アンチ using namespace std; 派は、using namespace std; 派を
説得するに足りる理由をまだ出してないな。
0480デフォルトの名無しさんNGNG
ライブラリの実装の詳細まで表に晒してしまうという問題点がある寝。
0481デフォルトの名無しさんNGNG
ハァ?
0482デフォルトの名無しさんNGNG
だからローカルですりゃいいじゃん
0483デフォルトの名無しさんNGNG
そうそう、グローバルでしかもヘッダに書く奴はDQN
0484デフォルトの名無しさんNGNG
グローバルでヘッダ以外ってなんですか?
0485デフォルトの名無しさんNGNG
そもそもグローバルなんてものが存在する時点で言語としておかしいだろ。
0486デフォルトの名無しさんNGNG
>>484
???
0487デフォルトの名無しさんNGNG
>そうそう、グローバルでしかもヘッダに書く奴はDQN

というやつがいるからusing namespace std;しないのだが
実際理由がわからん。ひょっとしておまえも?
0488デフォルトの名無しさんNGNG
そのヘッダをインクルードしたファイル全てに名前空間の中身を
さらしてしまうからでは。
0489デフォルトの名無しさんNGNG
namespaceの存在意義とは何ですか?
0490デフォルトの名無しさんNGNG
でその実害は?ということをアンチは一言も説明していないのだね。
0491デフォルトの名無しさんNGNG
名前の重複だよ。
重複が発生したら書き換えれば良いてのは無しね。そんなブサイクなソース見たくないから。
0492デフォルトの名無しさんNGNG
>>491
で、その不細工なソースの実害は?ということをアンチは一言も説明していないのだね。
0493デフォルトの名無しさんNGNG
回数や割合って話も出たが、出来得る限りそうならんように、
未然に回避しようという試みだろう名前空間の導入は。何も
自分が書いたソースだけじゃなく他人が書いたライブラリを
利用するときも衝突は起こる可能性はあるだろ。
0494デフォルトの名無しさんNGNG
自分のネームスペースの中でusing namespace std;するのはありですか?

namespace my_ns
{
using namespace std;
void print()
{ cout<<"pu"<<endl; }
}
0495デフォルトの名無しさんNGNG
>>496
0496デフォルトの名無しさんNGNG
int n;

int foo(int x)
{
 int n;
 ...
}
たとえば上のコードでローカル変数nを宣言し忘れた場合誤動作してしまう。
それを未然に防ぐためにはすべての変数名の重複をなくせば良いわけだが
それをしないのはどうしてだ?
0497デフォルトの名無しさんNGNG
>>492
std::〜を何回も書くブサイクなソースが嫌だからusing使うんじゃなかったのか
0498デフォルトの名無しさんNGNG
>>497
すべてに毎回書くのは明らかに「非効率」だからusingを使うんだよ。
重複箇所を括りだすのは当たり前だろう。
0499474NGNG
boost から stl に採用されて移植、みたいなクラスがあったとして、
boost::shared_ptr とか書いてたのを std::shared_ptr って書き直すのってけっこう大変。
using してると 一行書きかえるだけで対応できる。
移植は滅多にないかもしれないけれど、
std → stlport ( __STLPORT_NAMESPACE ? ) はやった事がある人結構居るんじゃない?
面倒だったでしょ?

つまり、自作名前空間や支持されていないライブラリの名前空間は
using しないのが良いのではないだろうか。
0500デフォルトの名無しさんNGNG
だからローカルにすりゃどっち派も丸くおさまるって。おっちゃんの言うこと聞いとけって。
0501デフォルトの名無しさんNGNG
>>499
boost::shared_ptrを一括置換したらいかんのか
0502デフォルトの名無しさんNGNG
using namespace std;に反対する奴は
もちろんthis->を省略したりはしないんだよな?
0503デフォルトの名無しさんNGNG
>>502
論点がちがうよう
0504デフォルトの名無しさんNGNG
>>502みたいな子は両派から嫌われる
0505デフォルトの名無しさんNGNG
アンチは説明責任をはたせ〜〜〜〜〜〜〜
0506デフォルトの名無しさんNGNG
>>504
んで、しばらくして「釣りでした」とか言い訳して
もっといじめられるのな(藁
0507 NGNG
float f;
double d;

f=100/3;
d=100/3;

cout << setprecision(15) << f << endl;
cout << setprecision(15) << d << endl;

では、33と33。


f=100.0/3;
d=100.0/3;
では、少数以下も表示されます。

左辺の型に合わせて、右辺もキャストされるんじゃなかったっけ?
0508502NGNG
いや、俺は激しくまじめなんだけど。
this->を省略しないことで未然に防げる不具合が現実のコードの中に現れることがある。
いや、実際には誤動作ないしはビルドエラーが出てからthis->を明示することが多い。
でもわざわざ毎回は書かない。それは面倒だし上の問題は比較的容易に発見・修正できるから。
つまりやらなかった場合のメリットとデメリットとやった場合のメリットとデメリットを比較して
やらないほうが賢明であると(半ば無意識に)判断したから。

このことと上で議論されているnamespaceの問題との類似性に全く気がつかないとしたら
ちょっとプログラミングの適正に問題があるんじゃないのとか思ってしまうよ。
0509デフォルトの名無しさんNGNG
100/3 のほうは結果の 33が float や double に変換される
0510デフォルトの名無しさんNGNG
だからローカルに書いとけって。
0511デフォルトの名無しさんNGNG
ローカルってどこよ?
0512デフォルトの名無しさんNGNG
>>508
thisを省略しないことで防げる不具合とは?
引数とかグローバル変数とかぶっちゃうってこと?

そんなあなたにはグローバル変数にg_と付けたりメンバ変数の末尾に_をつけることをお勧めします
0513 NGNG
>>509
そうやったね。
5ヶ月ぶりにプログラムやったもんだから・・・。
もしかしてほかにもいろいろと忘れてしまってるかも・・・。
やべーなこりゃ。
0514デフォルトの名無しさんNGNG
>>508
そりゃthis->を書かなきゃならないところで書かないおまえが悪いって話だろ。
明示的にthis->しなきゃならない場所がわからずプログラミング
してる方がよっぽど問題ある奴だと思うが。
0515デフォルトの名無しさんNGNG
this-> を書かなきゃいけないのってメンバ関数をポインタを使って
呼び出す時以外にあったっけ?
0516デフォルトの名無しさんNGNG
>>514
std:: についてもしかり。

>>515
ネタですか?
0517デフォルトの名無しさんNGNG
>>514
というか、this->を書かなきゃならないところはどこっ?
わからん、教えて、変数名がかぶることじゃないの?
0518502NGNG
プププッ
たくさん釣れましたな(藁
0519デフォルトの名無しさんNGNG
まず、ヘッダでusingするのがダメなのは異論無いな。
そんなわけで、インライン関数やテンプレート関数の定義をヘッダに書く場合に、
名前空間の指定は、ローカルスコープでusing(namespace)することになるわけよ。

で、「ヘッダでなければ、usingを関数外に置いてよい」なんてことにすると、
ヘッダかそうでないかでコーディングスタイルを分けなきゃいけなくなるだろ。
インラインにするかしないか迷ってるときなんか、悩ましい話だな。
めんどくさいから関数外でusingするのはやめとけって結論に、ならないか?
0520デフォルトの名無しさんNGNG
>>519
ならないだろ。もちっと文法のおさらいが必要だな。
0521デフォルトの名無しさんNGNG
>>516
だからつけなきゃいけないところでつけるのは当たり前じゃん。
今そんな話じゃないだろ。
0522デフォルトの名無しさんNGNG
>今そんな話じゃないだろ。
省略可能なところは省略すべきって事で意見の一致を見たという話だよな。
0523デフォルトの名無しさんNGNG
大体な、全角文字の後に半角の?使う時点でキモイんだよ。
0524デフォルトの名無しさんNGNG
ふう。アンチは敗北したようだな。
これからはヘッダにバシバシusing namespaceしろよ。
0525デフォルトの名無しさんNGNG
もうどうでもいいよ
0526デフォルトの名無しさんNGNG
>>522
>>508は単に省略不可能なところで省略したって話。
本人は省略不可能だと気づかなかっただけ。
0527デフォルトの名無しさんNGNG
結論:馬鹿ほど良く吠える。
0528デフォルトの名無しさんNGNG
じゃ、ローカル派大勝ってことで一件落着ですな。
0529519NGNG
え?文法?どういうこと?
0530デフォルトの名無しさんNGNG
>>528
C++といえどもグローバルは実質存在しないんだから
ローカルもまたその言葉の意味を失うだろ。
0531デフォルトの名無しさんNGNG
>>530
意味わかんねーよ。
0532デフォルトの名無しさんNGNG
便宜的表現にかみつくなよ。
ローカル変数、グローバル変数くらい聞いたことあるだろ。
0533デフォルトの名無しさんNGNG
C++厨って普段重箱の隅をつつきまくってる割に
どうしてこんなに重要で根本的な所を理解していないんだろう?
0534479NGNG
で、アンチ using namespace std; 派は、using namespace std; 派を
説得するに足りる理由をまだ出してないな。
0535デフォルトの名無しさんNGNG
>>532
ありませんが何か?
private, protected, publicと何か関係がありますか?
0536デフォルトの名無しさんNGNG
ぶっちゃけた話、必ず .cpp ファイルで using namespace std; してる人は
それをヘッダに移動しても何も変わらないと思うよ。
0537デフォルトの名無しさんNGNG
>>536
それでキムタクになったつもりか
0538デフォルトの名無しさんNGNG
てかアンチは自前のnamespace作らないのか?
0539デフォルトの名無しさんNGNG
>>533、>>535
>>523
0540536NGNG
>>537
すまん、公用語をしゃべってくれ。
0541デフォルトの名無しさんNGNG
てかアンチは自前のclass作らないのか?
0542デフォルトの名無しさんNGNG
てかアンチは自前のぬるぽ作らないのか?
0543デフォルトの名無しさんNGNG
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        / ←>>542
0544デフォルトの名無しさんNGNG
反応はえぇ・・・
0545デフォルトの名無しさんNGNG
要するにアンチは文法を理解していないと。
0546デフォルトの名無しさんNGNG
ぐっじょぶ
0547519NGNG
>>545
漏れか?漏れのことか?
いまだに>>520で何を突っ込まれてるのか理解してないぞ。
誰か解説
0548デフォルトの名無しさんNGNG
ヘッダでも
namespace MyLib
{
 using namespace std;
 ...
}
ってやればMyLib.hをインクルードしてもstdで汚染されないって話だろ。
0549デフォルトの名無しさんNGNG
using namespace MyLib; した瞬間に・・・。


つーか、標準でそろっているものに名前空間なんて要らないと思うんだけど、
何でそれを 「汚染」 と呼ぶんだろう。
0550デフォルトの名無しさんNGNG
たしか、関数を呼ぶときの引数って
途中でいじってはいけないというか、
どんなコードを吐かれも文句を
いえないことになっているよね?
こんなの。
  f(x, ++x);

それでは、キャストはどうなの?
  g(lparam, reinterpret_cast<HWND>(lparam));
こういうのは?
0551デフォルトの名無しさんNGNG
>>550
副作用のあるものと無いものを比べてどうしようというのだ?
0552デフォルトの名無しさんNGNG
f(x, x+1)といっしょ。
0553デフォルトの名無しさんNGNG
>>550
じってはいけないんじゃなくて、参照している変数の内容が変わるような事を
してはいけないという話。
キャストは、++ 演算子と違って変数の値を変更するわけではないので OK。
副作用完了点で調べてくれ。
0554デフォルトの名無しさんNGNG
キャストによって lparam 自体の値が変わる訳ではないから問題ない。
0555デフォルトの名無しさんNGNG
お前らまとめてケコーン
0556デフォルトの名無しさんNGNG
>f(x,x+1)
とは違うと思うな。
引数の評価順が決められていないので ++x が先に評価されるか
後に評価されるかで結果が違ってくるという話だと思う。
0557デフォルトの名無しさんNGNG
>>552
引数の解釈順序は処理系依存じゃなかったっけ?
0558デフォルトの名無しさんNGNG
昨晩はC厨がネームスペースに嫉妬してたようで。
0559デフォルトの名無しさんNGNG
スマートポインタtypedefして使うべき?orんなことねぇ?

typedef SmartPtr< A > A_ptr;したら、
typedef SmartPtr< const A > const_A_ptr;もしないとキビしいと思うけど、
こういうことしてる人いる?

0560デフォルトの名無しさんNGNG
using をかたくなに拒んで std:: つけまくる人に VB 触らせたら、えらい事になりそうな・・・
0561デフォルトの名無しさんNGNG
JavaやC#でも可。
0562デフォルトの名無しさんNGNG
NameSpace1NameSpace2:NameSpace3::NameSpace4::HogeHoge hoga(NameSpace1::NameSpace2::NameSpace3::NameSpace4::MageMage("age"));
0563デフォルトの名無しさんNGNG
ネストが深いときは別名を使う手もある
namespace TempHoge = Hoge1::Hoge2::Hoge3::Hoge4;
TempHoge::〜;
0564デフォルトの名無しさんNGNG
Withのネストなんてあったっけ?
0565デフォルトの名無しさんNGNG
それはシングルトンのクラスを作るが、これは建設者をセットします、
に、個人、また静止のメンバー変数からそれを単に呼ぶべきであるか?糞?
0566デフォルトの名無しさんNGNG
間違えてありました。
それはシングルトンのクラスを作るが、これはコンストラクタをセットします、
に、private、またstaticのメンバー変数からそれを単に呼ぶべきである?
0567デフォルトの名無しさんNGNG
>>566
それをシングルトンのデザインパターンにするために、
コンストラクタはprivateのことへの第1のセットです。
次に、必要なことはprivateのメンバー関数からコンストラクタにちょうど電話することです。
0568デフォルトの名無しさんNGNG
で、結局using namespace stdの結論は何ですか?
分かりやすく説明してください。
0569デフォルトの名無しさんNGNG
コーディングスタイルに結論は無し、って結論。
0570デフォルトの名無しさんNGNG
>>568
usingを十分に使用して使用しない人々は、単に怠惰であると考えられます。
役立たない所有は、C++が多くの問題で準備したメカニズムを利用しません。
0571デフォルトの名無しさんNGNG
個人的に
using std::cout;
using std::endl;
using std::vector;
(略)

これで妥協。
0572デフォルトの名無しさんNGNG
また半角?くんの登場か。
0573デフォルトの名無しさんNGNG
いやー、もうすっかり春だなあ。
0574デフォルトの名無しさんNGNG
最近C++厨みないな。
0575550NGNG
引数の件だけど
みなさん、ありがとね。
やっぱり大丈夫ですか
0576デフォルトの名無しさんNGNG
最近、次のようなコードを見ました。

class B{
 virtual void f() = 0;
};

class X : public B{
 const B* b;
public:
 X(const B* c):b(c){}
 virtual ~X(){
  delete const_cast<B*>(b);
 }
void f(){}
};

C/C++ UserJournalにあったコードを簡単化したものです。
疑問は、

1 ~Xのconst_castに何か意味があるか?
2 なんでBに仮想デストラクタを置かないか?

です。どうも変なコードなんですが、CUJの記事だし。
と悩んでます。
0577デフォルトの名無しさんNGNG
>>576
なんてタイトルの記事?
0578デフォルトの名無しさんNGNG
>>576
それコンパイルできないでしょ。Xのデフォルトコンストラクタがない。
0579デフォルトの名無しさんNGNG
>>550
f(x,x++)はまずいが、f(x,y++)なら問題ない。
だから++を使ってはならないというわけじゃない。
0580デフォルトの名無しさんNGNG
>>576
X(const B* C) にBへのポインタを渡そうにも、Bは抽象クラスだから
インスタンス作れないし、どこか移し間違えてない?
0581デフォルトの名無しさんNGNG
B から派生したクラスのインスタンスが渡される可能性もあるよ。
0582576NGNG
うろおぼえで書いちまってごめんなさい。
記事はテンプレートを使ってコンパイル時に計算を済まそうってやつで、
俺がひっかかったのは、テンプレートを使わない、普通のコードの方。

も一度思い出して、コンパイルできるのをウプしま。
0583デフォルトの名無しさんNGNG
>>581
その場合でも、Bから派生したクラスがデフォルトコンストラクタを
持つと、Xにもデフォルトコンストラクタが必要だと言われる。
卵が先か鶏が先かみたいな問題になってる。
0584デフォルトの名無しさんNGNG
>>583
ああごめん、X は Bから派生してたのか。
何か変だな。
0585デフォルトの名無しさんNGNG
というか、デフォルトコンストラクタは無くてもいいだろ
0586576NGNG
コードを簡単にしようと思ったんですが、なんだか長くなりました。
こんな感じです。

class B{
public:
virtual void f() = 0;
};

class D : public B{
public:
void f(){}
};

class X : public B{
const B *b1, *b2;
public:
X(const B* c1, const B* c2):b1(c1), b2(c2){}
~X(){
delete const_cast<B*>(b1);
delete const_cast<B*>(b2);
}
};

class Y : public X{
public:
Y(const B* c1, const B* c2):X(c1, c2){}
void f(){}
};
0587576NGNG
で、デザパタのCompositeだそうです。
DがリーフでYがコンポジットですね。
でも、>>576のような疑問がわくのです。
メインのコードでないので手を抜いたのかとも思うのですが、
なんか、ものすごくいやな感じがするんです。
0588576NGNG
タイトルわかりました。
March号のC++ Expression Templates
です。記事そのものにはあんまり興味ないんですが。
0589デフォルトの名無しさんNGNG
>1 ~Xのconst_castに何か意味があるか?
deleteはvoid *を受け取るconst void *じゃない

>2 なんでBに仮想デストラクタを置かないか?
bug
0590550NGNG
>>579
> >>550
> f(x,x++)はまずいが
あ、はい、「大丈夫」と書いたのは
キャストの方についてです
++xはまずいですよね
0591デフォルトの名無しさんNGNG
>>587
const_castそのものは*b1と*b2のconst性を取り除くものだろうが、
delete時にはconst性を取り除く必要はないので冗長だね。
Xが仮想デストラクタを持っていないのは、すぐにでも問題になりそうだ。

class B{
public:
virtual void f() = 0;
};

class D : public B{
public:
void f() { }
};

class X : public B{
const B *b1, *b2;
public:
X(const B* c1, const B* c2):b1(c1), b2(c2) {}
~X(){
delete const_cast<B*>(b1);
delete const_cast<B*>(b2);
std::cout << "~X()" << std::endl;
}
void f() {}
};
0592デフォルトの名無しさんNGNG
class Y : public X{
B* b;
public:
Y(const B* c1, const B* c2) : X(c1, c2) { b = new X(0, 0); }
void f() {}
};

int main()
{
D d1, d2;
X* xp = new Y(&d1, &d2);
delete xp;
}
0593デフォルトの名無しさんNGNG
しっかしBorland-C++5.6.4だと>>591>>592のコードコンパイルすると
コンパイラがあぼ〜んするね。具体的にはリンカ起動してくれない
のでexeができない。
0594デフォルトの名無しさんNGNG
>D d1, d2;
>X* xp = new Y(&d1, &d2);

X *xp=new Y(new D,new D);
0595576NGNG
>>589
>deleteはvoid *を受け取るconst void *じゃない
たしかにそうですね。でも、>>591さんが言うように、必要あるのか
わからんのです。
コンパイラが警告すら出さないので。
しかし、constを簡単にはずせるのも不思議でつ。

Bに仮想デストラクタがないのは、バグということで、よさそうですね。

>>586には、

int main()
{
Y y(new D, new D);
}

つけて、BC5.6でコンパイルできます。

人と話して、少し気がすみました。
みなさま、ありがとうです。
0596595NGNG
>コンパイラが警告すら出さないので。
キャストしなくても、警告を出さないという意味です。
ためしたのは、BC5.6っす。
0597デフォルトの名無しさんNGNG
>>593です。
スマソです。コンパイラがあぼ〜んしていたように見えたのは、いつのまにか
コンパイラオプションに-Sがついてアセンブリ出力していたせいでした。
取ったらちゃんと無事コンパイルできました。

g++もいいが、日本語でエラーを出してくれるBCCはやはり手放せない。
0598デフォルトの名無しさんNGNG
憂鬱本やら、デザパタの本やらを揃え、
これでおいらも設計厨とばかりに、意気込んでみたのですが…。

いざ設計とやらを初めてみると、WndProcに縛られたり、
ライブラリの関係で理想通り出来なかったりと、色々参っています。
そもそも独学のせいか、どうも設計の方法って言うのが良く分からなくて…。

ここからもう一歩踏み出すには、どんな努力が必要でしょうか…。
自分でも曖昧な上、お馬鹿な質問だとは思うのですが、結構真剣でして…よろしくお願いします。
0599デフォルトの名無しさんNGNG
>>598
富士の樹海を歩いてみるとか。人生違ってくるかも。
0600デフォルトの名無しさんNGNG
嫌なAPIは、素敵な自作クラスでWrapしろ
0601598NGNG
うーん、やっぱり質問が曖昧すぎたようで…。

設計が上手い方って言うのは、どうやって腕を上げたんだろう…。
やはりこのまま、数をこなすしかないのかな…スレ汚し失礼しました。

>>600
どうもです…
0602デフォルトの名無しさんNGNG
>>601
ガンバレ!
0603デフォルトの名無しさんNGNG
>>598
Java や Python でしばらく遊んでみてから C++ に戻ってみたら?
0604デフォルトの名無しさんNGNG
WindowsのAPIは全部ラップして目の前から消したくなる。
0605仕様書無しさんNGNG
  ∧_∧
 ( ´∀`)< サランサップ
0606デフォルトの名無しさんNGNG
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ >>605
 (_フ彡        /
0607デフォルトの名無しさんNGNG
>>598
同士よ。ともに頑張ろうぞ。
0608名無しさんNGNG
  ∧_∧
 ( ´∀`)< 「ぬるぽ」と言ってみるテスト
0609デフォルトの名無しさんNGNG
サセルカ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ >>608
 (_フ彡        /
0610デフォルトの名無しさんNGNG
double linked listでqueueを実装する。
一方のスレッドが要素をpushしていき
他方のスレッドが要素をpopしていくとした時、
要素の数が3以上の時はスレッドセーフであり
3未満の時はpush()/pop()内の処理を
mutexなどで保護しなければならない。
なお、要素数のインクリメント・デクリメントのタイミングは
push()では処理の最初、pop()では処理の最後とする。

これであってる?(厳密にはpushは3,popは2と安全な数は変わってくるけど
とりあえず両方安全な数を調べたい)

図解
 A→B→C→
←A←B←C
要素Aはpush専用スレッドからのみアクセスされる
要素Cはpop専用スレッドからのみアクセスされる
要素Bは両方のスレッドからアクセスされる可能性がある。
0611デフォルトの名無しさんNGNG
要素の数が何個だろうがmutexを使うべきだと思う
個の処理は
0612610NGNG
マルチスレッドかつパフォーマンス最優先なんで
べきとかいわれても困るんだけど。

実際の運用時にはqueueはだいぶ長くなるはずだから(短ければ暇だろうし)
実質mutexなしで動くんじゃないかと期待してる。
0613デフォルトの名無しさんNGNG
>>612
ソフトの名前を言って下さい。買いませんから。
0614デフォルトの名無しさんNGNG
>>598
知識、経験、センス、バランス感覚、といった要素のどれが欠けても
良い設計者にはなれない。ので、
> やはりこのまま、数をこなすしかないのかな…
が正しいと思われ。
ただ、意識してそれをやり、いろいろな観点から評価する、それを
反復的に繰り返す、ということが大事だと思う。

0615デフォルトの名無しさんNGNG
>610
現在要素数5個->push処理に入る->競合を防がないpush処理を始めようとしたその時!
pop->pop->pop->pop->pop
さあ、push処理の続きだ->どかん!

と俺の脳内で実行されたけどどうですか?
0616デフォルトの名無しさんNGNG
要は要素数のテストとロックをatomicに実行できなければそういう
危険があり、atomicにしたければそれをcritical sectionに
しなければならないという当たり前の話だよな。
まあ「性能最優先」であって「たまに落ちてもよい」んであれば
「どかん!」がめったに発生しないのであればかまわん気もするが
後で保守担当者が泣きそうな予感。
0617610NGNG
>>615
そりゃまずい・・・
ではこれを追加したらよいかな?

volatile bool entering_push;

void push()
{
 entering_push = true;
 ...
 entering_push = false;
}

void *pop()
{
 if(entering_push && size() < 3)
  return 0;
 ...
}
0618デフォルトの名無しさんNGNG
保守担当「このコードあやしいんですけど〜」
610「何が言いたいの?パフォーマンス最優先なんで
  あやしいなんていわれても困るんだけど。」
0619デフォルトの名無しさんNGNG
ヴォヴォヴォvoidの大爆笑〜♪
0620デフォルトの名無しさんNGNG
>>617
ゼロで戻ったときは永久ループかい。
0621デフォルトの名無しさんNGNG
現在要素数5個->push処理に入る->entering_push = true;をする直前で
pop->pop->pop->pop->popの途中で
さあ、push処理の続きだ->どかん!
0622デフォルトの名無しさんNGNG
pushもpopもスレッドセーフになってないんですけど。
0623610NGNG
これで完璧?
pushに失敗するのが笑えるけど実際には
OSのタイムスライスはpush/popより十分大きいから最悪のケースは発生しなさそうだ。

volatile bool entering_push;
volatile bool entering_pop;

bool push()
{
 entering_push = true;
 if(entering_pop && size() < 2)
  return false;
 ...
 entering_push = false;
}

void *pop()
{
 entering_pop = true;
 if(entering_push && size() < 3)
  return 0;
 ...
 entering_pop = false;
}
0624デフォルトの名無しさんNGNG
>>623
if(entering_pop の直後に entering_pop = true; が実行されたら?

会費操作にアトミックなコードを書けない限り、mutex のたぐいを使うしかない。
mutex を使う事の何がイヤなんだ?
0625デフォルトの名無しさんNGNG
> 会費操作

これ何だかイヤだ・・・
0626デフォルトの名無しさんNGNG
>>623
フラグの変更はクラスでラップしてコンストラクタ・デストラクタ内で行え。
そしたら例外が発生しても大丈夫だから。
0627デフォルトの名無しさんNGNG
パフォーマンス最優先なんでクラスでラップなんていわれても困るんだけど。
0628デフォルトの名無しさんNGNG
え?pop()だとかsize()だとかはクラスのメンバ関数じゃないのか?
0629デフォルトの名無しさんNGNG
というか、void*かよ。
0630598NGNG
>>602 >>607
がんばります、がんばりましょう(´Д⊂

>>603
話を聞くとJavaは随分素直みたいですねぇ。元々興味ありましたし…。
早速SDKを落としてみました。この際なんでもやってみたいと思います。アドバイス感謝です。

>>614
真摯なご忠告ありがとうございます。思ってた以上に困難な道のりなんですねぇ…。
仰るとおり自省を忘れずに、こなしていきたいと思います。なんだか絵の上達法に似てますねぇ。
0631デフォルトの名無しさんNGNG
何だ、半角?くんか
0632デフォルトの名無しさんNGNG
生産者と消費者の計2threadの競合を回避したいだけなら、
以下に示すPetersonのアルゴリズムが使えるはず。
# TanenbaumのModern Operating Systemsなどに載っている。
だが、本当にこんなことをやる必要が有るのか測定してからに
したほうがよいと思われ。

volatile int turn;
volatile int interested[2];

/* which is 0 or 1, indicating the caller thread */
void EnterCriticalSection(int which)
{
  int other = 1 - which;
  interested[which] = 1;
  turn = which;
  while (turn == which && interested[other] == 1)
    /* busy wait */;
}

void LeaveCriticalSection(int which)
{
  interested[which] = 0;
}
0633デフォルトの名無しさんNGNG
>>627
クラスでラップしても下手なコード組まなきゃパフォーマンスは一切落ちんぞ。
0634デフォルトの名無しさんNGNG
パフォーマンスはもっと別のところがネックになると思われ
0635デフォルトの名無しさんNGNG
>>634
激しく同意。
0636デフォルトの名無しさんNGNG
ttp://www.emit.jp/prog/prog_opt0.html の解説の意味がわかりません
なぜメンバ変数よりもその場で定義した変数(ローカル変数とでも言うのかな?)の方が早いのですか?

解説には
>「ループ内で書き込んでいるバッファ中に、参照しているメンバ変数が存在しているかもしれない」
>つまり、「ループ内の書き込みにより、メンバ変数の値が書き換えられ、ループの条件が変わるかもしれない」
>ことをコンパイラは考慮しているのである
とありますが、いったん代入しても同じだと思うのと、
forのカウンタにメンバ変数を使わないのはセオリーだとわかっていますが、
なぜメンバ変数を使うと速度が遅くなるのでしょうか?
まったく理由がわかりません。ご存知でしたら教えてください。
0637デフォルトの名無しさんNGNG
ポインタのアドレスが変更されているときの対応。
0638デフォルトの名無しさんNGNG
RMP4のソースを使って、デコードついでにストリーム再生
させる物作れと言われたが、わけわかめです。。。
DirectShow自体わからんのに。。。
どなたか見本を作ってください。。。
0639デフォルトの名無しさんNGNG
>>636
勘違いしないでね、メンバ変数が×なのではないのよ。
改悪例をみてね。
0640デフォルトの名無しさんNGNG
> なぜメンバ変数を使うと速度が遅くなるのでしょうか?

直接の理由は、最適化が難しくなるから。
難しくなるだけであって、遅くなるかどうかは別問題。

constでないメンバ変数はthis経由でいつでも書き換えられる可能性があるので、
これを最適化時に完全に把握するのは困難あるいは不可能。
ローカル変数は生死のスコープが極めて短く、ポインタ経由で参照される
ことが少ないので、安全な最適化が実用的な時間で行えることが期待できる。

要するに、最適化時に値の変化を把握できるかできねえか、という話。
完全に把握できれば、たとえばレジスタに載せることができる。

環境依存なネタとしては、ローカル変数が取られるであろうスタック
はキャッシュに乗ってる可能性が高い、というのもあるけど・・・
そんな低レベルな話じゃないよね。
0641636NGNG
>ポインタのアドレスが変更されているときの対応

>constでないメンバ変数はthis経由でいつでも書き換えられる可能性がある
ここがよくわからないのです。
マルチスレッドでもあるまいし、forループ中に書き換えられるってことはあるのですか?
0642デフォルトの名無しさんNGNG
struct Test
{
int m;
void foo()
{
for(int i=0; i<m; i++)
bar();//メンバ関数の中でメンバ変数mが変わるよね
     //この関数がインラインなら最適化できるかもしれないけど
}
void bar();
};
void Test::bar()
{
m--;
}
0643デフォルトの名無しさんNGNG
ぬるPO!
0644デフォルトの名無しさんNGNG
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>643
0645string勉強中NGNG
引数に文字列バッファのアドレスを渡して何らかの文字列をセットしてもらう関数ってあるよね。

文字列はstringを使うとします。
この場合、いったん仮のバッファで文字列を取得してstringオブジェクトに代入するしかないんでしょうか?
0646デフォルトの名無しさんNGNG
>>645
そりゃそうです。
0647デフォルトの名無しさんNGNG
>>641
そのコンテクストにおいてマルチスレッドであるかないかを判定できるくらい上等なCコンパイラって少ないと思います。
0648デフォルトの名無しさんNGNG
>>646
無いのかYO!


なっかりだ
0649デフォルトの名無しさんNGNG
  ∋8ノノハ.∩
   川o・-・)ノ <先生!こんなのがありました!
__/ /    /   
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/shinagawa/
0650小西プロデューサーNGNG
ナイクもってきて!ナイク。
0651デフォルトの名無しさんNGNG
>>648
std::strstream使えば、ほとんど事足りるでしょ。
sprintf()からはおさらばしよう。
0652デフォルトの名無しさんNGNG
>>648
スマソstd::stringstreamね。
いまだにtypoする。
0653デフォルトの名無しさんNGNG
>>651
たぶん問題を勘違いしてるとおもふ…
0654デフォルトの名無しさんNGNG
とりあえずvector<char>で受けてstringにassignなりするという奴だな、この場合。
0655デフォルトの名無しさんNGNG
cin とか std::getline() から直接 string に
読み込んだら?って俺も勘違い?
0656デフォルトの名無しさんNGNG
具体的に文字列をセットする関数とはどのような関数を指すのか
言ってもらわないと答えにくい。
0657デフォルトの名無しさんNGNG
int hoge(char* buffer, size_t len);
みたいなCの関数の結果をstringに格納する方法についてだろ?
0658645NGNG
>>657 そう
例えば

void WINAPI ListView_GetItemText(
HWND hwnd,
int iItem,
int iSubItem,
LPSTR pszText, <-- これ!
int cchTextMax
);

>>654 みたいにワンクッション入れるしかないんでしょうか?
わたしの脳内ではstringから書き込み可能なポインタがサックリ
とれたりするんですが。
0659デフォルトの名無しさんNGNG
APIならしょうがないな。すなおにTCHARで取ってきてstringにコピー。
0660デフォルトの名無しさんNGNG
vector<char>のまんまでもいいんじゃないの、別に
0661デフォルトの名無しさんNGNG
>>660はウィンドウズフォルダをc:\windowsときめ打ちして後に禍根を残すタイプ。
0662デフォルトの名無しさんNGNG
やっぱり昔懐かしのchar(TCHAR)配列を使うしかないんじゃないのかなー
0663デフォルトの名無しさんNGNG
C++の議論って傍から見てるとギャグにしか見えないんだけど
当事者はいたってまじめだから倍笑えるよね(藁藁
0664デフォルトの名無しさんNGNG
>>663
まぁ、確かにそういう面はあるわな。
やたらめったら何重にもラップしたがるし。
0665デフォルトの名無しさんNGNG
開発者がギャグで作った言語だからな。
0666デフォルトの名無しさんNGNG
へんなJava厨が来た
0667665NGNG
でもあたしは C++ 好きだよ。キスしたいくらいに。
0668デフォルトの名無しさんNGNG
いいかげんstdからchar*を追放しろよ・・・
0669デフォルトの名無しさんNGNG

template <class F>
void AAA(const std::string& s, const std::string& d, F f)
{
    while(...略...){
        ...
        f(s.substr(...略...));
    }
}
とした時、
void Print(std::string& s)
{
    cout << s;
}
で、
AAA(s, d, &Print);
はできるのですが、


class CCC
{
public:
    Print(std::string& s){cout << s;}
}
で、
AAA(s, d, std::mem_fun_ref(&CCC::Print));
とやってみましがC2784でコンパイルがとおりません.(vc6です)
色々調べて見たのですが何が間違っているのがさっぱりわかりません.
何か根本的に間違っているのでしょうか?
0670デフォルトの名無しさんNGNG
書き間違いました.
class CCC
{
public:
    Print(std::string& s){cout << s;}
    do{AAA(s, d, std::mem_fun_ref(&CCC::Print)); }
}
の
AAA(s, d, std::mem_fun_ref(&CCC::Print));
でエラーが出ます
0671デフォルトの名無しさんNGNG
>Print(std::string& s){cout << s;}

とりあえず、ここは
Print(const std::string& s){cout << s;}
こうしなさい
0672デフォルトの名無しさんNGNG
void もつけて
0673デフォルトの名無しさんNGNG
クラススコープの中で do{} ?
0674デフォルトの名無しさんNGNG
>>673
書き間違えました.メンバ関数です
do(){AAA(s, d, std::mem_fun_ref(&CCC::Print)); }
0675デフォルトの名無しさんNGNG
do はキーワードだから関数名として使えないんじゃない?
0676デフォルトの名無しさんNGNG
あーすいません、実際には別の名前使ってます
0677デフォルトの名無しさんNGNG
BCC5.5.1では通った。
#include <iostream>
#include <functional>

#pragma argsused
template <class F>
void AAA(const std::string& s, const std::string& d, F f)
{
;
}

void Print(std::string& s)
{
std::cout << s;
}


class CCC {
public:
void Print(std::string& s) { std::cout << s;}
void hoge() { AAA("hoge0", "hoge1", std::mem_fun_ref(&CCC::Print)); }
};

int main()
{
return 0;
}
0678デフォルトの名無しさんNGNG
std::mem_fun_ref(&CCC::Print));
は第一引数にCCCの参照を受け取る関数オブジェクトを作ります
一方グローバルのほうのPrintは引数を受け取らない関数です
引数がいる関数といらない関数をそれぞれ渡しているわけで
関数AAA内でf()と呼ばれていたらだめだよね

というか、俺の説明がだめか・・・後はよろしく
0679デフォルトの名無しさんNGNG
VC++ 7.0を使っています。以下のコードでエラーC2327
[data2 : 外側のクラスのメンバは型名、スタティック、または列挙子ではありません。]
が発生します。struct中の宣言を一つだけにすればコンパイルは通るのですが、
二つにしたとたんエラーが出ます。これは私が悪いのでしょうか?
コンパイラが悪いのでしょうか?

class C
{
   static const intwidth=64;
   static const intheight=64;

   struct
   {
      float data1[width][height];
      int data2[width][height]; //ここでエラー
   }S;
};
・補足
struct{ //これでコンパイルは通ります
   float data1[width][height];
   //int data2[width][height];
}S;
struct{ //これでも通ります
   //float data1[width][height];
   int data2[width][height];
}S;
struct{ //これでもなぜか通ります
   int data2[width][height];
   float data1[width][height];
}S;
0680679NGNG
すみません、>>679のコードでは再現できませんでした。
再現するための最小のコードを訂正として乗せます。

class C
{
public:
   static const intwidth=64;
   static const intheight=64;

   struct S
   {
      float height[C::height][C::width];//この行と下の行の順番を入れ替えるとなぜかコンパイルできる
      intdata[C::height][C::width];//
   }
};

heightの名前がかぶっているのが直接の原因だと思いますが、
別の名前空間に存在するはずなんです・・・
私が悪いのか、コンパイラが悪いのか。教えてください。
0681デフォルトの名無しさんNGNG
enum を使ったほうが。const であっても静的メンバは配列のサイズ指定に
使えなかったような気が。

class C
{
public:
   enum { width=64, height=64 };

   struct S
   {
      float height[C::height][C::width];//この行と下の行の順番を入れ替えるとなぜかコンパイルできる
      intdata[C::height][C::width];//
   }
};

0682デフォルトの名無しさんNGNG
>>680
あのう、intwidth、intheightというのがいけないのだと思いますが。
VC++7.0で下記のコードちゃんと通りましたよ。
>>681
static constなデータメンバに限って、クラスボディで初期化していれば
配列のサイズを指定するのに使えるよ。

class C
{
static const int width = 64;
static const int height = 64;

struct {
float data1[width][height];
int data2[width][height];
} S;
};

int main()
{
C c;
}
0683681NGNG
>static constなデータメンバに限って、クラスボディで初期化していれば
あれそうなの?VC++の独自拡張とかでなくて規格でも許されてるのかな。
0684デフォルトの名無しさんNGNG
>>683
C++Primerには書いてあった。ちょっと待って、refman.pdfの
該当部分探してみるから。
0685デフォルトの名無しさんNGNG
>>683
あった。規格書pdfのP158の項目4。
選択してコピペする事はpdfビューアではできないらしいので場所だけ
書いておくね。
0686デフォルトの名無しさんNGNG
>>682
そのdata1という変数名をheightにしたら…
という話では。そのためにC::をつけてるんだろうし。
0687デフォルトの名無しさんNGNG
>>686
そうか?俺はてっきり int height と書くべき所を intheight と
くっつけて書いてるせいだと思ってたが・・・・・
0688デフォルトの名無しさんNGNG
そんなのただの写し間違いだと思うけど…
intdataにもなってるし、順番かえるとコンパイル通るって言ってるし。
0689679NGNG
みなさん、お返事ありがとうございます。

>>687
すんません、その間にはtabが入っていて、コピペで削除されてしまいました。

class C
{
public:
   static const int width=64;
   static const int height=64;

   struct S
   {
      float height[C::height][C::width];//この行と下の行の順番を入れ替えるとなぜかコンパイルできる
      int data[C::height][C::width];
   }
};
>>682さん、このコードでコンパイルが通るかもう一度確かめていただけないでしょうか?

>>685さんによればこのコードは大丈夫なはずなんですが・・・
これはVC++ 7.0のバグということでよろしいんでしょうか?
回避策はenumを使うことでしょうかね?
0690681NGNG
>>685
どうもお手数かけまして、9.4.2 Static data members にちゃんと
書いてあるね。こんな変則的な技があったとわ。
0691デフォルトの名無しさんNGNG
bccは通ったから、バグかモナー
0692679NGNG
すみません、>>689のstruct Sの最後の「;」が抜けてました。
0693デフォルトの名無しさんNGNG
>>688
本当だね。C::とクラス名を限定しなければエラーにならないが、
C::heightとかと書くと、順番を入れ替えないとエラーになる。
0694デフォルトの名無しさんNGNG
>>689
やってみました。確かにVC++7.0では通りません。バグっぽいですね。
Updateを待つか、.NET2003を待ちましょう。取り敢えずMicrosoftには
フィードバックしておきましょう。
0695デフォルトの名無しさんNGNG
あの、今、VC++6.0使ってるんですけど、.NET(VC++7.0?)の使い勝手と比べて、
どのくらい違いますか?
6.0使っていれば、そのまま.NETもすんなり使えるでしょうか?
バージョンアップしようかどうしようか迷っています。
0696デフォルトの名無しさんNGNG
質問です。

std::fstream でファイルを開いたとき、
そのファイルはロックされますか?
0697デフォルトの名無しさんNGNG
>>695
操作面だけの話しですが、
細かいところけっこう違うけど、カンでいけます。
(最初、プロジェクトプロパティが見つからなくて悩んだ)
MSDNが統合されて、俺的には便利です。
あと、クソ6.0ように何の理由もなく落ちたりしてません。今のところ俺の環境では。

ところでWinSock関連のスレないですかねぇ?
0698デフォルトの名無しさんNGNG
ネットワークプログラミング相談室 Port5
http://pc2.2ch.net/test/read.cgi/tech/1040220302/
0699デフォルトの名無しさんNGNG
>695
ただしクラスウィザードが無くなるので
そのあたり激しく使い勝手悪い所感。
0700デフォルトの名無しさんNGNG
>あと、クソ6.0ように何の理由もなく落ちたりしてません

自分の環境ではコード補間などの機能をオンにしておくと
突然コンソールが立ち上がって、落ちます

込み入ったテンプレートを書いてるときによくなりました
0701名無しさんNGNG
     __,,,,_   
   /´      ̄`ヽ,
  / 〃  _,ァ---‐一ヘヽ
  i  /´       リ}
  |   〉.   -‐   '''ー {!
  |   |   ‐ー  くー |
  ヤヽリ ´゚  ,r "_,,>、 ゚'} < ぬるぽマンセー!  
  ヽ_」     ト‐=‐ァ' ! 
   ゝ i、   ` `二´' 丿
    r|、` '' ー--‐f 
   _/ | \    /|\
/ ̄/  | /`又´\|  |  ̄\
0702デフォルトの名無しさんNGNG
コウタイシサマトテヨウシャシナイゾ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >
  _/し' //. V
 (_フ彡/´ ̄ ̄   ̄`ヽ,
     / 〃  _,ァ---‐一ヘヽ
     i  /´       リ}
     |   〉.   -‐   '''ー {!
     |   |   \   /  |
     ヤヽリ ´゚  ,r "_,,>、 ゚'}  
     ヽ_」     ト‐=‐ァ' !      ∩∩∩
      ゝ i、   ` `二´' 丿     │  │
       r|、` '' ー--‐f       │  /
      _/ | \    /|\      │ │
   / ̄/  | /`又´\|  |  ̄\ /  /
0703デフォルトの名無しさんNGNG
VC6.0ProからVC7のアップグレードっていくら?
0704デフォルトの名無しさんNGNG
お願いします。

vector<X*> v;
v.push_back(new X);

ってやると警告がでます。
何がいけないんでしょう?
それともコンパイラが悪いの?
BC5.5です。
0705デフォルトの名無しさんNGNG
>>704
BCC5.6.4ですが警告出ません。
確か5.6.2の時までは警告が出てたように記憶しています。
0706デフォルトの名無しさんNGNG
C++をやってみたいのですがエディタはどれがいいのでしょうか?
やっぱWordですか?MSのオフィス系なら使った事があるのですが・・・
あと初心者にお勧めの本を教えてください。
0707デフォルトの名無しさんNGNG
なんていう警告?
0708デフォルトの名無しさんNGNG
>>706
メモ帳とプログラミング言語C++第3版
0709704NGNG
>>705
ありがとうございます。私はフリー版使ってますので。

>>707
すみません。今、別のマシンからなので、正確には再現できません。
xがどうしたとかいう不思議な警告です。
もちろん、xなんて変数は使っていません。
(>>704ではクラス名にXを使いましたが、実際は別の名前です。
それでも、xがなんたらとでるのです。)

結論は、BC5.5の問題ですね。
0710デフォルトの名無しさんNGNG
>>707
std::vectorのために一時変数を使用するとかいう警告が出てた。
push_backがconstでない参照型で受けていたからのような記憶が。
0711デフォルトの名無しさんNGNG
>>709
http://www2.justnet.ne.jp/~tyche/bcbbugs/bcc32-option.html
の 8028から8038当たりの警告オプション見て、警告を抑制しる。
それしかない。
0712709NGNG
>>710
>>711
ありがとうございます。
たしかに、参照型がどうのだったと思います。
push_backの受け取る型がconst参照なんですよね。
しかし、それなら、問題ないはずですよね。

void func(const A& a){
 なんちゃら
}
にたいして、
func(A());
みたいなことしてもよいはずなので。
違うでしょうか?

警告が出ても、間違いがないなら、別にかまわないのです。
0713デフォルトの名無しさんNGNG
>>712
逆、逆。const「でない」参照で受けていたように思う。
0714デフォルトの名無しさんNGNG
>>713
えーと。それだとコンパイラ通らないような。
言葉遣いの問題かな。push_backの宣言は、
void push_back(const T& x);
でわ?
0715デフォルトの名無しさんNGNG
>>714
だとすれば、それで警告でるならBCCのバグ。
gccやVC++では出ない。
0716デフォルトの名無しさんNGNG
>>715
ありがとうございます。
>だとすれば、それで警告でるならBCCのバグ。
そんな気がします。
0717デフォルトの名無しさんNGNG
void push_back(const X** x) てことだよね。最終的には
const X* へのポインタを受け取るのだから、

X* tmp = new X
v.push_back(&tmp);

みたいな一時変数を用意しますよという旨の警告じゃないのかな。
0718デフォルトの名無しさんNGNG
>>717
どんなコンパイラもだいたいそうしてそう。
void push_back(const X** x) よりも void push_back(const X*& x)
のような気もするが。

それは良いとして、それを警告として出すか出さないかの違いだけだ
ろう。BCCは細かすぎたので5.6.4からこの警告を消してしまったのでは?
0719デフォルトの名無しさんNGNG
警告を出すか出さないかはバグとは言わなそう。
処理系依存という事でどう?
0720デフォルトの名無しさんNGNG
ISOで問題ないコードで警告を出すなら、バグと言えるかもしれない。
しかし、もうどうでもよいことではあるな。
0721デフォルトの名無しさんNGNG
俺は逆に BCC のうるさいのに慣れてしまっているから、逆に
何も言われないと不安になる
0722 ◆mx1DoE6qEk NGNG
エディットボックスが一個だけあるダイアログがあります。
このダイアログからデータを取るメソッドを作るとしたら、
std::string CMyDialog::GetDialogData()
とするべきか、それとも
void CMyDialog::GetDialogData(std::string& outString)
とするべきかどっちでしょうか。
参照で受けても、どうせ文字列をコピーするんだったら、式の中に組み込める
上のタイプの方が便利な気がするんですが、今後もしかしたらダイアログに
アイテムが増えるかもしれません。先のことを見越して下のタイプにする方が
いいのでしょうかどうなんですか
0723デフォルトの名無しさんNGNG
両方用意したらどうでしょうか
0724デフォルトの名無しさんNGNG
>>720
それは結構あるでしょ。
無限ループで警告を出したり、if(a=func())こんな構文でも警告を出したりするし(ただし警告レベルを高く設定した場合)。
0725 ◆mx1DoE6qEk NGNG
>>722
正直めんどくさいです
0726 ◆mx1DoE6qEk NGNG
× >>722
○ >>723
0727デフォルトの名無しさんNGNG
BOOL CMyDialog::GetDialogData(CDialogItem& item)
0728 ◆mx1DoE6qEk NGNG
>>727
正直よく意味がわかりません
0729デフォルトの名無しさんNGNG
cost std::string& CMyDialog::GetDialogData()
でしょ普通は。
0730デフォルトの名無しさんNGNG
costって何だ…
const std::string& CMyDialog::GetDialogData()
0731 ◆mx1DoE6qEk NGNG
>>729
メンバを返すわけじゃないので、参照は返せないんです。
というより、引き数で返すか返り値で返すかDOTCHが良いんでしょうか
0732デフォルトの名無しさんNGNG
>>731
返り値で返すってえと、関数内部のstaticな変数でも返すのか。
0733デフォルトの名無しさんNGNG
返り値で返そうとすると関数の成否が分かりにくいので俺は引数で返すが。
0734デフォルトの名無しさんNGNG
返り値で返す場合は否の場合0(NULL)を返せばOKでは?
0735 ◆mx1DoE6qEk NGNG
>>732
だから、たとえば
std::string CMyDialog::GetDialogData()
{
  return ((CEditBox*)GetItemByID())->GetString();
}
みたいなのと
void CMydialog::GetDialogData(std::string& outString)
{
  outString = ((CEditBox*)GetItemByID())->GetString();
}
みたいなのとドッチがいいのかって事です
あとアイテムが増えた場合、アクセッサ関数を増やすのか、GetDialogDataの引き数を増やすのかも
どっちがいいのかわかりません。
0736デフォルトの名無しさんNGNG
>>734
否の場合は例外を投げる方が良かれ。
0737デフォルトの名無しさんNGNG
>>735
だから、>>727 のようにダイアログデータを構造体かクラスにして単一のアクセサで
やり取りして、成否を BOOL で返せばええんちゃうかと。
0738デフォルトの名無しさんNGNG
>735
おれもそんなことで悩んだことがあるが、これに正解は無い、どっちもある意味いい
マジで悩むぐらいだったら面倒でも2つ用意したら?
0739デフォルトの名無しさんNGNG
ちなみに俺は、
bool hoge(std::string& buffer);
inline std::string hoge()
{
  std::string buffer;
  hoge(buffer);
  return buffer;
}
的なことをしたりするが。
0740 ◆mx1DoE6qEk NGNG
>>737
それも手だと思いますが、例えばGetじゃなくてSetの場合、このやり方だと
特定アイテムだけセットするのがメンドイとか、あとダイアログごとに構造体
作ってたらメンドクサイなーとか思ってしまいます

>>738
二つ用意ってのはなんだか嫌な感じです。EffectiveC++には、最小で十分な
インターフェースを持たせろとか書いてありますが、なんか重複してる時点で
嫌な気分になります。あとアイテムが増えたときの解決方法はどうしたらいいですか
0741デフォルトの名無しさんNGNG
どういう方向への拡張を想定するのかにもよると思うなあ
それが決まってないならイイもワルイも無いっしょ
0742デフォルトの名無しさんNGNG
>>740
じゃあ引数から取るほうにしれ。
アイテムが増えたときのためにアイテムIDとstd::stringを引数にしる。
0743 ◆mx1DoE6qEk NGNG
>>741
ダイアログはちょっと例が悪かったかもしれないです。
ダイアログに限らず、アクセッサはどういう場合に値をreturnする事が許されるのか?
アクセスしたいデータごとにアクセッサメソッドを付けるのが正しいのか?
引き数をたくさん持ったメソッド一つを付けるのがいいのか、あるいは構造体でゴソッと
やるのがいいのか?
なんというか、アクセッサメソッドの設計自体に関する疑問といいますか・・・

>>742
増えたアイテムがstring系のアイテムじゃなかった場合はどうすればいいですか。
0744デフォルトの名無しさんNGNG
>>743
文字列と関係ないのであればそれ用のメソッドを用意しる。
0745 ◆mx1DoE6qEk NGNG
>>744
ごめんなさい、ダイアログを引き合いに出したのはマズかったです。
アイテムIDとかが使えない場合を考えてください。例えば
class CPerson
{
protected:
  std::string name;
  std::string address;
  int age;
};
とあった場合、アクセッサは
std::string GetName();
std::string GetAddress();
int GetAge;
とするのか
void GetPersonData(std::string& name, std::string& address, int& age);
とした方がいいのか、どう思いますか
0746デフォルトの名無しさんNGNG
std::string GetName();
std::string GetAddress();
int GetAge;
ふつうこっちだろ
0747デフォルトの名無しさんNGNG
>>745
void GetPersonData(std::string& name, std::string& address, int& age);
は明らかにおかしい。

せめて
void GetPersonData(const std::string& name, const std::string& address, int age);
だろ。
0748デフォルトの名無しさんNGNG
そもそもCPersonにデータを操作するメソッドを集約して外に出さない。
0749デフォルトの名無しさんNGNG
>>747は勘違いだから無視してね。

0750デフォルトの名無しさんNGNG
なんとなくいいたいことはわかる。
JavaのBeanだと、アクセッサは決められた命名規則に従って定義して、
操作はアクセッサメソッドを直截呼んでもいいが、より汎用的に
取り扱いたい場合はReflectionを用いることが出来る。
HashMapに保持しているkey=value形式のデータと相互変換したい場合など
だな。
C++でどうするのが「美しい」かは知らないが、少なくともReflectionは
使えないので、利便性を重視するなら、多少直交性を欠く設計になっても
やむを得ないと思われ。
利便性と直交性は対立することが多いし、mx1DoE6qEkはその両方を
求めている気がするが、それは無いものねだりだろう。
0751デフォルトの名無しさんNGNG
std::pair<std::pair<const std::string&, const std::string&>, int> GetPersonData()
0752デフォルトの名無しさんNGNG
>>751
boost::tuple<std::string, std::string, int> GetPersonData()
0753 ◆mx1DoE6qEk NGNG
なんかケースバイケースにやるしかないのかなあって気がしてきました。
std::string GetPersonName();
も式の中に組み込めるから便利だし、
void GetPersonData(struct PERSONDATA& outData);
これもデータが一発で取れて便利

ドッチを使うかは一概には言えんと
0754デフォルトの名無しさんNGNG
プログラムなんて書くから悩むんだよ。
0755 ◆mx1DoE6qEk NGNG
結論:仕事を変えろ
0756デフォルトの名無しさんNGNG
どんどん登録してください!!
緊急大募集  http://kgy999.net/yhst/st.php
0757デフォルトの名無しさんNGNG
こんなのは?
class CPerson {
public:
 struct PERSONDATA {
  std::string name;
  std::address;
  int age;
 };
private:
 PERSONDATA persondata;
public:
 const PERSONDATA* GetPersonData() const { return &persondata; }
};
0758デフォルトの名無しさんNGNG
>std::address
なんだこれ(w
std::string address;
0759デフォルトの名無しさんNGNG
>>757
いつでも使えるわけじゃないが、それはそれで面白いな・・・
0760デフォルトの名無しさんNGNG
VC++でSTL使う時、警告レベル4にするとやたらワーニングでるのは仕方がないの?
0761デフォルトの名無しさんNGNG
>>760
C4786だろ。デバッグモードで出る。
#pragma warning( disable : 4786 ) 入れとけ。
0762デフォルトの名無しさんNGNG
>>761
それはもう止めてます.
その他に
デバッグモードで4100 4511 4512 4663 4018 4511 4146 4245 4244 4071
リリースモードでは、800個以上出て調べる気も起きません.
いくら動くとはいえ、これじゃあんまりだと思いまして・・・
0763デフォルトの名無しさんNGNG
いましらべてみたらリリースモードで出ている警告のほとんどが
4710: ・・・・・はインライン関数ではありません
4702: 制御が渡らないコードです。
でした.
0764デフォルトの名無しさんNGNG
デバッグモードだと40個程度なのに・・・

ちなみに
4702: 制御が渡らないコードです。
はthrowを書いた行で7個ずつ出ています
0765デフォルトの名無しさんNGNG
VC++のSTLの警告の件。
ついさっき知った方法。
#pragma warning(push,3)

VisualC++.NETのSTLはこれで警告を止めてある。
0766デフォルトの名無しさんNGNG
c/c++の質問なんですが
関数を作る時、
仮引数でその値を変更する必要が無い時は、
constをつけますよね。
こんなかんじで abc(const int a){ return a };
このconstをつけるとどんな得なことおきるんですか
0767デフォルトの名無しさんNGNG
>>766
関数 abc 内において、a の変更を禁止する。
a への代入はできず、a へのポインタを非 const のポインタ変数に代入することも
できない。
得なのかどうかは場合によるけど、a を変更してはいけないということを関数 abc()
のコーダーやメンテの中の人に伝える事ができる。
0768デフォルトの名無しさんNGNG
>>767
> コーダーやメンテの中の人に伝える事ができる
とりあえずこれはわかりやすい利点だよね。
0769デフォルトの名無しさんNGNG
>>768
&がついてないけど…
引数ってコピーだろ?

なにかの本で「まぎらわしいから
const付けるな」といっている人も
いたが…
いちおう区別がついているつもりの
私はconstをつけれるときはつけるが…
0770デフォルトの名無しさんNGNG
>>769
コピーだからこそ変更できないようにする
という意味もある
参照だと思っていた変数が実はコピーだったなんて状況を防ぐためにね
案外見つかりにくいもんだよ、こういうバグは
0771デフォルトの名無しさんNGNG
ほとんどの引数にconstをつけて回るのは無駄だろ。
その点constを廃止して変更可のout/refを導入したC#は合理的。
0772デフォルトの名無しさんNGNG
それを変更してはいけないというのは、それがコピーか参照かは全く関係無いと
思うんだけど。
0773デフォルトの名無しさんNGNG
コピーの変更をわざわざ禁止する理由は?
いちいちローカル変数にコピーするなんてばかげてるよ。
0774デフォルトの名無しさんNGNG
void foo(const int *p);
void foo(int* const p);
の違いが判ってればいいんじゃないでしょーか
0775デフォルトの名無しさんNGNG
>>774
上・・・ポインタは変更不可、ポインタが指すアドレスの内容は変更可。
下・・・ポインタは変更可、ポインタが指すアドレスの内容は変更不可。
ということでいいのですか?
0776デフォルトの名無しさんNGNG
>>775
ぎゃく
0777デフォルトの名無しさんNGNG
日本語で考えると良いよ

コンストイントを指すポインタ
イントを指すコンストポインタ
0778デフォルトの名無しさんNGNG
なるほど。
関数定義に律儀にconstつけて回ってたらほとんどconstになってしまいますよね?
値を返す引数は参照渡しにする、constは即値のみに使うというのは邪道ですか?
0779デフォルトの名無しさんNGNG
>>778
> 関数定義に律儀にconstつけて回ってたらほとんどconstになってしまいますよね?

?????????
0780デフォルトの名無しさんNGNG
値を返す引数、という表現はおかしいか。
なんと表現したらいいんだろう?
・・・というもやもやをはっきりさせるためにconstがあったりして。
0781デフォルトの名無しさんNGNG
>>abc(const int a){ return a };

これ、俺がconst覚えた時によくやった
参照やポインタでも無いのにconstつけたりして

関数を使う側から見ると、このconstにはまるで意味が無いから
しないほうがいいと思う。混乱の元
0782デフォルトの名無しさんNGNG
constをつけることで参照渡しだと早とちりするヴァカもいる
0783デフォルトの名無しさんNGNG
個人的には"値を返す引数"には参照渡しよりポインタ渡しを使いたい。
0784デフォルトの名無しさんNGNG
const foo & hoge ( const foo &bar ) const { return bar; }
0785デフォルトの名無しさんNGNG
関数内で引数の値を変更したくないならconstつけてもいいと思うが。
0786デフォルトの名無しさんNGNG
なんかこのpart16スレは、いつもより宗教論争的なことが
起こりやすいね。
0787デフォルトの名無しさんNGNG
>個人的には"値を返す引数"には参照渡しよりポインタ渡しを使いたい。

内の会社でもC上がり先輩にそういわれた
でも、参照で渡されたやつはほぼNULLじゃ無いので
NULLチェックが要らないという利点があるんだよなー

まあ、先輩に従ってますが
0788デフォルトの名無しさんNGNG
最近では使うようにしてる
int main(const int argc, const char* const* const argv)
0789デフォルトの名無しさんNGNG
int &n = (int&)0;
if(n) n = 0;
これをサポートすればC++から90%のポインタを削減できるだろうな。
0790783NGNG
Cとか関係なくて、受け取るのか、渡すだけなのかという意図が
明確になるから。こういうのはNULLチェックしない。受け取る
関数にNULL渡す方が悪い(w
0791デフォルトの名無しさんNGNG
>>765
やっぱりそれしかないんですか・・・・
しかたがないからデバックモードで自分の書いたヘッダ、ソースで出ている警告を取り終わったら
#pragma warning(push,3)
するようにします.
0792デフォルトの名無しさんNGNG
>>790
せめてassertくらいはいれといてよ。

C/C++でassert使ってる人って意外と少なくない?
俺の周りでは一人しかいなかったよ。
0793デフォルトの名無しさんNGNG
>>792
そんなこと言ったら
俺の近くにはSTLを使ってる人すら少ない
0794デフォルトの名無しさんNGNG
>>793
今いるところは try ... catch 禁止だ。(w
0795デフォルトの名無しさんNGNG
うちはfor禁止。ループはwhileでかけだとさ。
0796デフォルトの名無しさんNGNG
templateはCあがりには一番とっつきにくいのです・・・
try-catch禁止なら例外スルーするライブラリなど使うなってことか。
for禁止に至ってはまったくもって意図不明。
0797デフォルトの名無しさんNGNG
>>796
例外スルーって何?
0798デフォルトの名無しさんNGNG
例外スルーに該当するページが見つかりませんでした。

全言語のページから例外スローを検索しました。約44件中1 - 10件目
0799デフォルトの名無しさんNGNG
例外を全くcatchしないんじゃないか?
0800デフォルトの名無しさんNGNG
>>799 ワロタ
0801デフォルトの名無しさんNGNG
プロは大変だなぁ。
趣味だと好き勝手できるから、もうすっかり
テンプレート無しには生きられない体だよ。
0802デフォルトの名無しさんNGNG
>>801
Cを使って不自由しましょう。
0803デフォルトの名無しさんNGNG
>>796
STLはtemplateの知識を基本的に必要としないし。
STL拡張するなら別だけど。
実務で直接template使ったことはまだないな。
0804デフォルトの名無しさんNGNG
template は STL でしかお世話になってないな。今のところ。
0805804NGNG
このかぶりかたは恐い。
0806デフォルトの名無しさんNGNG
Cだとテンプレートがないからvoid *使ったり関数を分けたり・・・・結構不細工だな。
0807デフォルトの名無しさんNGNG
複雑なマクロを定義してみて結局罠にハマったりな。
0808デフォルトの名無しさんNGNG
>>783
> 個人的には"値を返す引数"には参照渡しよりポインタ渡しを使いたい。

渡す側もポインタであることを明示するし、
受けた側もポインタ経由での代入操作になるから、
(参照ならconstが付くはず)
値を操作するという意図が明確に伝わるんだよね。

ついこないだもこういう指導をしてさしあげたが、イマイチ理解して
もらえなかったようだ。俺はC/C++どっちも使うんだが、片方しか使わ
ない人と話すと苦労するよ・・・
0809デフォルトの名無しさんNGNG
>801
おれも前までそうだった・・・

就職してあまりに理不尽なこと言われて頭がクラクラした
それはおまえの勉強不足の認識違いだろと、何度も思った
0810デフォルトの名無しさんNGNG
ポインタと参照の機能を明確に区別しなかったストラップがすべての元凶。
0811デフォルトの名無しさんNGNG
boostにATL/WTLも使ってやれよ
0812デフォルトの名無しさんNGNG
>>795
そのwhile、ひょっとしてwhile (true)じゃなくて、while (TRUE)か?
0813デフォルトの名無しさんNGNG
BOOL B = TRUE;
bool b = B;
ってあり?
0814デフォルトの名無しさんNGNG
C++3rdにはこう書いてあるよ。
>整数は暗黙のうちに bool値に変換できる。0以外の整数は true、
>0は falseに変換される。
0815デフォルトの名無しさんNGNG
makeで
main.exe : pro1.obj pro2.obj;
link pro1.obj pro2.obj
pro1obj : pro1.cpp pro1.h;
cl pro1pp

pro2obj : pro2.cpp pro2.h;
cl pro2.cpp
としたときpro2.objができないのですがどこがいけないのでしょう?


0816デフォルトの名無しさんNGNG
つか、C++の参照は、演算子オーバライドしたときに
変にならないように導入されただけのものだからなぁ。
0817デフォルトの名無しさんNGNG
>>815
-c オプション。
0818デフォルトの名無しさんNGNG
最後のセミコロンは要らない気がするけど。
clなら/cつけないといろいろうるさいし。
0819デフォルトの名無しさんNGNG
catch(...)
で、受け取った例外が何かを調べる方法はありますか?
0820デフォルトの名無しさんNGNG
ない
0821815NGNG
>>817
−cオプションってHELP見てもよく分からないんだけど。
どうすればいいの?
0822デフォルトの名無しさんNGNG
g++とオプションが同じなら・・・
cl -c -o main.obj main.cpp
これでmain.cppがコンパイルされてmain.objができるんじゃない?
0823デフォルトの名無しさんNGNG
メンバ関数を指すポインタの配列を作りたいのですが、
エラーになります。
何かこれに変わるような方法はないでしょうか。

j = fcn[i]();

のように使いたいのです。
0824デフォルトの名無しさんNGNG
>>823
Borland C++の__closureが便利だが標準C++にはない。
0825デフォルトの名無しさんNGNG
>>823

struct A {
virtual void func1() { std::cout << "A::func1()" << std::endl; }
virtual void func2() { std::cout << "A::func2()" << std::endl; }
};

struct B : public A {
void func1() { std::cout << "B::func1()" << std::endl; }
void func2() { std::cout << "B::func2()" << std::endl; }
void func3() { std::cout << "B::func3()" << std::endl; }
void (*func4[3])();
};

void (A::*func[])() = {
&A::func1,
&A::func2,
};

void (B::*func2[])() = {
&B::func1,
&B::func2,
&B::func3,
};

void (B::*func4[])() = {
&B::func1,
&B::func2,
&B::func3,
};
0826デフォルトの名無しさんNGNG
int main()
{
A *a = new B;
B *b = new B;

(a->*func[0])();
(a->*func[1])();

(b->*func2[0])();
(b->*func2[1])();
(b->*func2[2])();

int i = 2;
(b->*func2[i])();

(b->*func4[1])();

std::cout << sizeof(func[0]) << std::endl;
std::cout << sizeof(func2[0]) << std::endl;

delete b;
delete a;
}
0827デフォルトの名無しさんNGNG
>>821
>>822さんがほとんど答えてくれたけど、-cオプションというのは、
コンパイラに *.obj または *.o を生成した時点でストップせよと
いう指令。
0828初心者NGNG
ポインターについて聞きたいんですけど、

#include<iostream.h>

void sub(char *[]);

int main()
{
  char *G[] ={"あけぼの","わかのはな"};

  sub(&*G);

  cout<<G[0]<<endl;
  return 0;
}

void sub(char *g[])
{
  g[0] = "たかのはな";
  return;
}

一応「たかのはな」が表示されるのですが、
sub関数内ではgはポインターに見えないです。タブーなんでしょうか?
ダメな場合、どうするのがベターなんでしょうか?
よろしくおねがいいたします。
0829デフォルトの名無しさんNGNG
なんでsub(G);にしないんだろう。
0830初心者NGNG
>829
・・(汗
そうですね。

ポインターがうまくいかないので、
*やら&やらいろいろつけてたらこうなりました。

他は問題はないのでしょうか?
0831デフォルトの名無しさんNGNG
>>830
> sub関数内ではgはポインターに見えないです。

どうしてそういう結論に至ったの?
ポインタになっているはずだけど。
0832初心者NGNG
猫にでもわかる〜で
tp://www.kumei.ne.jp/c_lang/cpp/cpp_06.htm

エイリアスとポインターの部分があったんですが、
*がついてないのは「かんちがいするからダメ」
みたいに読めたので、

てっきりこれじゃダメなのかと思ったんです。
0833デフォルトの名無しさんNGNG
>>825-826
即レス有難うございます。まだわからないところがあるので質問させてください。
そのコードにある、

void (A::*func[])()

というのは、Aのメンバ関数へのポインタの配列、という宣言でしょうか。 だとすると、

(a->*func[0])();

を

(a->(*func[0]))();

とするとエラーになるのはなぜですか? また、

void (A::*func[])();
void (B::*func2[])();
void (B::*func4[])();

これらはグローバル変数なのでしょうか。
0834デフォルトの名無しさんNGNG
>>833
->* で一つの演算子だから、 -> と * に分けるとエラーになる。

また、

void (A::*func[])();
void (B::*func2[])();

はグローバル変数だが、もしメンバ関数が private とか protected で
宣言されてたら

void (B::*func4[])();

のようにメンバでポインタを持つしかない。
0835デフォルトの名無しさんNGNG
>>832
それってプログラマがきちんと関数の引数の型を把握しておかないと、値渡しなのか参照渡しなのか区別がつかないってことじゃないの?
void func1(int a,int b)という関数とvoid func2(int &a,int &b)という関数があり、呼び出し側にint x,yという変数があるとする。
それらを引数にfunc1,func2を呼び出した場合はどちらも引数リストが(x,y)になるでしょ。
0836デフォルトの名無しさんNGNG
>>833
もう少し具体的に書くと、メンバ関数へのポインタというのは、純粋な
意味での関数へのポインタとは違う。

static なメンバ関数へのポインタ以外は、必ず this がないと
呼び出せない特殊なオフセットのようなものだと考えてくれ。

static なメンバ関数なら this 無しで呼び出せる。これはシングルトン
デザインを実現するのによく使われる。
0837835NGNG
ポインタを使う場合はfunc2がvoid func2(int *a,int *b)という形になって、
呼び出すときの引数リストは(&x,&y)になるから区別がつくってこと。
0838初心者NGNG
>>832
たぶんおっしゃる通りなんだと思います。

参照というのがまだ良く分かってないので、
半分ぐらいしか理解できてませんが(汗

ちゃんと理解できるように、続きやってみます。
答えていただいてありがとうございました。
0839デフォルトの名無しさんNGNG
>>834
> ->* で一つの演算子だから、 -> と * に分けるとエラーになる。
よくわかりました。有難うございました。
ですが、Bを class として宣言すると

void (B::*func4[])();

が、Bの private メンバにアクセスできないと言われるのですが。
0840デフォルトの名無しさんNGNG
>>839
スマソ。俺が勘違いしてたようだ。

void (B::*func4[])();

もグローバル変数変数だ。
今試してるからしばらく待ってくだされ。
0841デフォルトの名無しさんNGNG
>>839
俺は今まで勘違いしてたようだ。どうもクラス内部にメンバ関数への
ポインタを持つことはできないらしい。
0842839=823NGNG
>>840-841
今調べて来ました。

public: static void (B::*func4[3])(); /* 宣言 */
void (B::*B::func4[])()....        /* 定義 */
(b->*B::func4[1])();                    /* 実行 */

とすればよいようです。
丁寧にお答えいただき、どうもありがとうございました。
0843デフォルトの名無しさんNGNG
>>842
そうか、staticなメンバならメンバ関数へのポインタを保持する
事ができるのか。初めて知った。
勉強になりました。
0844デフォルトの名無しさんNGNG
結構初心者が多いんだな
0845デフォルトの名無しさんNGNG
クラスのstaticメソッドはCのコールバック関数として登録することもできるよ。
0846デフォルトの名無しさんNGNG
クラスのstaticメソッドはメンバ変数、メソッドにアクセスできないよ。
0847デフォルトの名無しさんNGNG
>>846
そこら辺はやり方しだい。Cのラッパークラスでは二通りの方法がある。
class Wrapper
{
 static Wrapper *This;

 static Callback(void *p)
 {
  This->bar = This->foo();
  とか
  Wrapper *self = (Wrapper*)p;
 }
}
0848デフォルトの名無しさん NGNG
error C2679: 二項演算子 '=' : 型 'unsigned char' の右オペランドを扱う演算子は定義されていません
とエラーが出るのは何ででしょうか?
0849デフォルトの名無しさんNGNG
その行クリックしてF1押すか前後のソースを晒せ
0850848NGNG
>>849

for(j=0; j<=base1->y; j++){
  for(i=0; i<=base1->x; i++){
k1 = j*base1->x + i;
h[k1] = base1->sh[k1];
  }
}
0851デフォルトの名無しさんNGNG
・・・・?!なんだこりゃーーーー!!!!バタッ
0852デフォルトの名無しさんNGNG
class Giko {};
class FusaGiko : public Giko {};

Giko g;
FusaGiko fg;

で、fg = g; みたいなのをやりたい場合の
一般的なやりかたをおながいします。
0853デフォルトの名無しさんNGNG
ところどころに全角文字が入ってるのは関係あるの?
0854デフォルトの名無しさんNGNG
>>850
これだけでは、base1、h、i、j、k1 の正体さらしてくれないとわからん。
どの行がエラーになったんだよ。
つーか変数名に全角使うな。

849 の前者の方を実行してみたか?
0855848NGNG
>>854
エラー行はh[k1] = base1->sh[k1];
変数定義はint i,j,k1; base1は構造体baseの変数。
struct base
{
int x, y;
unsigned char *sh;
};
class c
{
protected:
unsigned char *h;
}
helpを見たら次が出てきたけど、どうすればいいのやら。
class C
{
public:
C(); // int を引数にとるコンストラクタはありません
} c;
class D
{
public:
D( int );
D();
} d;
void main()
{
c = 10; // エラー
d = 10; // OK
}
0856デフォルトの名無しさんNGNG
日下部mainキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0857デフォルトの名無しさんNGNG
> c = 10; // エラー
> d = 10; // OK

当たり前じゃん。何を訴えたいの?
0858デフォルトの名無しさんNGNG
polynomial("2x^5-2x^3-7"): ()の中はstring型でこれを動的配列を用いて係数だけを下のように
確保するにはどうすればいいんでしょうか?
-2 0 -2 0 0 -7 :-x^5の係数は2, x^4の係数は0, x^3の係数は-2, x^2の係数は0,
xの係数は-7
0859852NGNG
あと、派生クラスの中で、基底クラスの部分を分けて扱うことはできるんでしょうか?

>>852 だと、FusaGiko の中で Giko の部分だけをファイルに保存するとか。
fwrite( &Giko , 1 , sizeof(Giko) , fp );
みたいな感じで。
0860デフォルトの名無しさんNGNG
>>855
結論を言おう。
850 が class c のメンバ関数の一部なら、850 のコードできコンパイルエラーは出ない。
0861デフォルトの名無しさんNGNG
inline関数について質問です。
inline関数は、通常の関数と違って呼び出される位置より前に関数の
定義がないといけないということがPrimerに書いてあったのですが、
べつにプロトタイプ宣言がされていれば、コンパイルエラーはでません。
なぜでしょうか?これってちゃんとinline展開されてる
のでしょうか?
0862デフォルトの名無しさんNGNG
>>861

コンパイラによるんじゃない?
0863デフォルトの名無しさんNGNG
>>861
プロトタイプ宣言に inline と書いてあったとしても、定義部分が実際に
呼び出す部分より後にあったらまず100%インライン展開はされない。
0864デフォルトの名無しさんNGNG
例えば、int配列
id[15]とかそういうのがあって
int j=2;
int point = id [ j & 1];
とかいう記述が出てきたのですが、このj & 1というのは何を表すのですか?
論理式とかのたぐいですか?
0865デフォルトの名無しさんNGNG
>>863
コンパイラによるんじゃない?
VC7はリンク時にinline展開することもできるし。
0866デフォルトの名無しさんNGNG
プロトタイプ宣言に inline と書いてあったとしても、定義部分が実際に
呼び出す部分より後にあったらまず100%インライン展開はされないという
動作をコンパイラがしたら、それは単にソースの先読みとかコンパイル順の
やりくりができないショボイ実装だからだと思われ。
0867デフォルトの名無しさんNGNG
>>864
j が奇数だったら id[1] 、偶数だったら id[0] をアクセスするだけだろ。
0868861NGNG
となるとですね、自分はVC++.NETを使っていますが、
コンパイルがOKだということは、ちゃんと展開されていると
解釈していいのですか?
展開されない処理系ならエラーや警告を出してくれれば問題無いの
ですが・・・。
0869デフォルトの名無しさんNGNG
Standardだと問答無用で展開してくれない。
0870861NGNG
その展開するしないはどうやって判断できるんですか?
コンパイラから知らされるのですか?
0871デフォルトの名無しさんNGNG
コンパイル後のアセンブラのリストを出力させて確認する。
0872デフォルトの名無しさんNGNG
>>867
そうなんですか。ありがとうございます。
0873デフォルトの名無しさんNGNG
VC++.NETで/Oxオプションでコンパイルしてみたら、inlineの
プロトタイプ宣言をして、関数本体を呼び出した後で定義したら、
ちゃんとインライン展開されていた。
0874デフォルトの名無しさんNGNG
>>873
スタンダード版で?
0875デフォルトの名無しさんNGNG
まあ、VCは-Ob2, __forceinlineなんてのがあるから、
このくらいでは根を上げないだろう。
0876デフォルトの名無しさんNGNG
>>874
ちがう。Pro版。
0877デフォルトの名無しさんNGNG
VB だとどうですか?
0878デフォルトの名無しさんNGNG
マジレス。

>>877
コンパイル通りません。
0879765NGNG
>>791
すっかり流れちゃったけど。
んなことしなくたって
#pragma warning(pop)
で自分のソース部分だけ警告レベル4にできるでしょ。
0880デフォルトの名無しさんNGNG
移植性を考えると、やはりinline関数は先に定義しとけば
間違いないという考えでやったほうがいいのかなぁ・・・。
0881デフォルトの名無しさんNGNG
inlineにこだわりすぎるのもどうかと・・・
0882デフォルトの名無しさんNGNG
別にinlineじゃなくても動作変わんないしね
0883デフォルトの名無しさんNGNG
むしろinline展開させないキーワードが欲しい。
0884デフォルトの名無しさんNGNG
短くて頻繁に呼び出すメンバ関数なんか、inlineに
しとかないとオーバーヘッドもバカにならんでしょ。
inlineにこだわるべきかは、作るモノによるんだろうけどね。
だからこだわる時はこだわらなきゃいけないんだから、
そういうのは、はっきりさせておいたほうがいいと思うけど。
0885デフォルトの名無しさんNGNG
最適化オプションなどによるパフォーマンスチューニングは後回し、
というのは半ば常識かと思ってたが、いまだに>>884みたいなのが
いるんだねえ。
0886デフォルトの名無しさんNGNG
短いのはヘッダに書いてインライン
長いのはソースに書いてアウトライン
0887デフォルトの名無しさんNGNG
>>885
意味不明。後回しっていずれやんじゃねぇか。
コンパイラによる差もあるのに。
0888デフォルトの名無しさんNGNG
>>887
>>885は正しくない。
後回しじゃなくて、やる必要がない、だ。
0889デフォルトの名無しさんNGNG
やる事無くなったら他人の仕事まで押しつけられるよりは
コンパイラオプションを弄って仕事してるフリをすべきだと思う。
0890デフォルトの名無しさんNGNG
そりゃ、特定のコンパイラを前提にした話か
0891デフォルトの名無しさんNGNG
釣りっぽいが、マジレスすると >>885 が前半で言ってることはまさに
その通りだが、inline ぐらいは始めから意識しとけ。
0892デフォルトの名無しさんNGNG
そだね
もしSTLがinline化されなかったら誰も使わんし
0893デフォルトの名無しさんNGNG
>>892
そんなことないよ。
0894デフォルトの名無しさんNGNG
C/C++の真偽の評価について質問なのですが
( i == 0 || data[i-1] == hoge )
で i == 0 の部分で真が確定した場合は
data[i-1]は評価されないことが保障されているのでしょうか?
0895デフォルトの名無しさんNGNG
されてます
0896デフォルトの名無しさんNGNG
保障はされないけど保証はされている。
0897894NGNG
即レスありがとうございます!誤変換の訂正も…
0898デフォルトの名無しさんNGNG
>>894
蛇足だが、|| 演算子をオーバーロードしたら短絡評価は再現できない
ので両方とも評価してしまう。だからEffective C++には || 、 &&、, は
オーバーロードしないようにしようと書いてある。
0899デフォルトの名無しさんNGNG
しもた、More Effective C++ ね。
0900デフォルトの名無しさんNGNG
ほほう。そうなのか・・・
まー俺は演算子なんて=とかしかオーバーロードしないですが、
こーゆー細かい情報知らないとハマるんだよなぁ。
0901デフォルトの名無しさんNGNG
はじめまして

C++ではJAVAのようにパッケージングすることができないので
関連あるクラス同士を整理しやすいようにするには頭文字を
そろえるなどとするしかないのかなと思っています。

実際にはパッケージングのかわりにdll化をするのが正しいのでしょうか?
0902デフォルトの名無しさんNGNG
>>901
namespaceを使うのも手。
0903デフォルトの名無しさんNGNG
>>902
そうなんですか
namespaceについてはあまりよくわからないので調べてみます。
どうもありがとうございました。
0904デフォルトの名無しさんNGNG
おまえら知ってましたか!

string str()//こんな関数があったとして

const string &s=str();//これが正しいことを!!

最近知りました
0905デフォルトの名無しさんNGNG
なぜ正しく動くのか説明できるか?
0906デフォルトの名無しさんNGNG
>>904
だうと!って言いそうになっちまうんだけど、正しいんだよなぁ。
便利な機能ではあるんだけど、どうにも紛らわしい。
0907デフォルトの名無しさんNGNG
あったなそういうの。3rd のどこかに書いてあった。
0908デフォルトの名無しさんNGNG
これが正しいおかげでconstの参照で返すことに戸惑いがなくなりました

const string &str();
この関数を

string str();
にこっそり置き換えても安全なんですよね?

メンバ変数で持っていたけど 将来的にはそうじゃなくなる場合よくあるので
0909デフォルトの名無しさんNGNG
>>908
それはまた違う話だろ。
0910デフォルトの名無しさんNGNG
>>904
それをさらに他のconstに代入して使うこともできる。

const std::string& s = func();
const std::string& t = s;

こういう芸当ができるのはconstのリファレンスだけだ。
0911デフォルトの名無しさんNGNG
>>904
いや、普通に使ってたけど・・・
>>905-906
そんなに特殊なことなの?
0912デフォルトの名無しさんNGNG
s が生きてるうちは参照先が死なないことが保証されているんだっけ。
0913906NGNG
>>911
このパーシスタンスに関する規則はやっぱり特殊だと思うが。
他に似たようなパーシスタンスに関する規則ってあったか?
0914デフォルトの名無しさんNGNG
あった、3rd の「5.5 リファレンス」(邦訳本では135ぺージ)。
0915デフォルトの名無しさんNGNG
おれはこのやり方に対して一時変数の参照だからだめだよ、これ
とかなんとか知ったかぶっちゃって大恥じかきました
0916デフォルトの名無しさんNGNG
>>915
この規則があまりに特殊であるが為に人から説明を受けても
すぐには信じることができなくて、大恥をかく羽目になりやすいんだろうな。(w
0917デフォルトの名無しさんNGNG
>>916
そのとおり
関数内のローカル変数を参照で返したらだめなのと理由一緒だろ?と言ってしまった

これにこりて、もう二度と知ったかぶらないようにしようと自戒
0918デフォルトの名無しさんNGNG
安全とは言えどこか気持ちが悪いな。
0919デフォルトの名無しさんNGNG
Visual C++ 6.0 と.NETと使い勝手ってどのくらい違いますか?
6.0使っていれば、.NETもすぐ慣れますか?
0920デフォルトの名無しさんNGNG
>>919
ガイシュツ
0921デフォルトの名無しさんNGNG
春になって随分と厨房臭いスレになったな
0922デフォルトの名無しさんNGNG
>>904
関数から返される(本来なら無名のはずの)一時変数に名前を付けるから、
と考えると、分かりやすいかも。
でも、おそらくコンパイルされたコードは、

const string s = str();

と同じになりそうな気がする。
0923デフォルトの名無しさんNGNG
>>904
例外を参照でうけるようなものだろうか…?
0924デフォルトの名無しさんNGNG
C++用のリファクタリングツールとか
メトリクス測定ツールとかってどんなのがありますか。
できればフリーのもので。
Java用なら腐るほど見つかるんだけどなあ…
0925デフォルトの名無しさんNGNG
>>924
リファクタリングツールは Eclipse/CDT がもう少し動くようになれば。
メトリクスは製品なら割とあるけど。

cppll で調べて/訊ねてみると良いかも。
http://www.tietew.jp/cppll/
0926デフォルトの名無しさんNGNG
const リファレンスはオブジェクトの寿命を延すために使うものではない。
const リファレンスでオブジェクトの延命をしようなんて馬鹿げてる。
0927デフォルトの名無しさんNGNG
なにこのひと
0928デフォルトの名無しさんNGNG
このeの参照先のインスタンスを直下のブロックの外に持ち出すことはできませんか?

catch(MyException &e)
{
}
// ここでeのインスタンスを参照したい。

0929デフォルトの名無しさんNGNG
>>928
悪いことはいわないから、自分が何をしようとしているのか良く考えなさい。
0930デフォルトの名無しさんNGNG
C#のException.InnerExceptionを実装したいだけなんですが。
0931デフォルトの名無しさんNGNG
>>926
IS 12.2 の 5項に一時オブジェクトの寿命について記述されているように
関数のリファレンス引数にバインドされた一時オブジェクトは、関数呼びだしを含む
式が完了(complete)するまで存続することになっている。
それ以上に長生きさせることはできないのだよ。

A temporary bound to a reference parameter in a function call (5.2.2) persists
until the completion of the full expression containing the call.

0932デフォルトの名無しさんNGNG
>>931
同じIS12.2の5項には、こうも書いてある。
コンストラクタの初期化子でリファレンスメンバ(変数)にバインドされた一時オブジェクトは
そのコンストラクタが終了するまで存続する。

A temporay bound to a reference member in a constructor's ctor-initializer(12.6.2)
persists until the constructor exits.
0933デフォルトの名無しさんNGNG
>>927
cppll方面におばかなことを考えているやつがいるらしい。
0934デフォルトの名無しさんNGNG
C++ は影でコソコソこういうことやってたりするからね。でも
こんなトリッキーなコード書かずに済むようにしてほしい。
0935デフォルトの名無しさんNGNG
>>928
参照じゃなくてコピーを取るんでは駄目なの?
0936デフォルトの名無しさんNGNG
>>935
どうやって?
例外クラスすべてにコピー用のメソッド書いて回るの?
0937デフォルトの名無しさんNGNG
コピーできる例外ならコピーして保存しておけばいいんではない?
C#のException.InnerException てのがどんなのなのか分からない
ので勘違いならスマソ。
0938デフォルトの名無しさんNGNG
>>937
こんな感じでeをe2の補助的な情報として取っておきたいんだよね。
なので最上位クラスExceptionへのコピーでは情報が欠落してしまう。
try{
 try{
  ...
 }catch(MyLibException &e){
  throw MyAppException("アプリの例外として再throw。eも取っておく", e);
 }
}catch(MyAppException &e2){
 cout << "例外の直接の原因は" << e.InnerException().ClassName() << "である" << endl;
}

実行結果
例外の直接の原因はMyLibExceptionである
0939デフォルトの名無しさんNGNG
そもそも e の参照先のインスタンスというのも、元の
(throw したインスタンス) のコピーかもしれんし。
0940916NGNG
>>931-932
おー、サンクス。12 Special member functions のとこかよ。
やっぱり、そういう仕様ってことなのね。
んー、やっぱ人伝いに聞いた仕様は気をつけんとな。
0941デフォルトの名無しさんNGNG
前スレ追い越しage
0942デフォルトの名無しさんNGNG
const std::string& CNumber::GetValueAsString()
{
 char buff[256];
 mprintf(buff, "%d"m_intValue);
 return std::string(buff);
}

こういうのってやっても大丈夫なんですか。
0943デフォルトの名無しさんNGNG
大丈夫
0944デフォルトの名無しさんNGNG
何で何で意味不明理解不能!じゃあこの返り値の寿命は?ってそうか、一時オブジェクトか。
コピー返しするよりも効率が良いと。
じゃあこれは?
const std::string& CNumber::GetValueAsString()
{
 std::string ret;
 char buff[256];
 mprintf(buff, "%d"m_intValue);
 ret = buff;
 return ret;
}

あと、constにしないとダメなん
0945デフォルトの名無しさんNGNG
駄目
0946デフォルトの名無しさんNGNG
>>945
駄目ってどっちが?
ローカルオブジェクトを返すのが駄目か、constでないと駄目なのか
0947デフォルトの名無しさんNGNG
>>942
>>944
両方駄目
定数参照されることで一時変数が生成された式を越えて有効性を保証されるだけで
ローカル変数がスコープを越えて生存できるわけではない
0948デフォルトの名無しさんNGNG
じゃあ参照をreturnしようと思ったら、メンバ変数とかグローバル変数みたに、
GetValueAsStringよりも寿命が長いやつを返すか、>942みたいにその場で
作ってreturnするしか無いって事?
アクセッサとして値を返すのに使うんだったら、>>942みたいな事が出来ない
ケースもあるわけ?
例えばstd::strinにstring(const char*)みたいなコンストラクタが無い時とか。
0949デフォルトの名無しさんNGNG
だから>>942はダメだと言っとろーが。
0950デフォルトの名無しさんNGNG
じゃ参照で返せるのはGetValueAsStringよりも寿命が長いやつのみって事ね。
アクセッサとかでこれやると、後で中の仕様が変わったときにインターフェースまで
変わっちゃうからイヤだ
0951デフォルトの名無しさんNGNG
const std::string& CNumber::GetValueAsString(std::string &ret = std::string())
{
 char buff[256];
 sprintf(buff, "%d", m_intValue);
 ret = buff;
 return ret;
}
0952デフォルトの名無しさんNGNG
駄目
0953デフォルトの名無しさんNGNG
偶蹄目
奇蹄目
馬犬目
0954デフォルトの名無しさんNGNG
>>952
お前まさか、デフォルト引数のオブジェクトが
呼び出される側のスコープに含まれるとでも
思ってんのか?
0955デフォルトの名無しさんNGNG
>>954
お前まさか、>>951のソースがコンパイルできるとでも
思ってんのか?
0956デフォルトの名無しさんNGNG
>>955
コンパイルできますが、なにか?
0957デフォルトの名無しさんNGNG
>>956
貴様、MSVCだな!
0958デフォルトの名無しさんNGNG
>>957
Quick-C です。
0959デフォルトの名無しさんNGNG
あ、ごめん。BCC じゃないとだめぽ。
g++ だとエラーになんね。
VC でも動くかどうか知らんけど、g++ なら

const std::string& CNumber::GetValueAsString(std::string &ret = demi<std::string>())

とかって、やればOKだべ。
demi に関しては cppll を漁ってくれ。
0960デフォルトの名無しさんNGNG
>>959
覚えたてor見慣れない機能を好んで使う悪い例だな。
あれだ、えーと、Write only codeってやつだろ。

人に見せるコードなら、こんなんになるかの。
std::string CNumber::GetValueAsString();
void CNumber::GetValueInto(std::string& storage);
0961デフォルトの名無しさんNGNG
>>960
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      ヌルポ  .  ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎
0962デフォルトの名無しさんNGNG
ショウガナイヤツダナ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>961
0963デフォルトの名無しさんNGNG
じゃあreturnで値を返したい場合はコピーを返すのがいいのね。
0964デフォルトの名無しさんNGNG
今まで局所的にdynamic_castを使っていたのですが、
それすらネックになってしまい、やむを得ずstaticなダウンキャストに切り替えた所、
実行速度が全体で20倍近く速まりました。

…は、いいのですが、これいうダウンキャストは合法なんでしょうか?
型チェックは一応問題ないと思います。
0965デフォルトの名無しさんNGNG
>>964
内部で閉じた処理に使うならダウンキャストもOKと思われ
理より速度を選んだってことだよ
行儀良くないけどなー
やむをえないって、コメントは入れとこう
0966デフォルトの名無しさんNGNG
>>965
ありがとうございます。おかげで、びくびくしてたとこへオーソライズされた気分です。
禿本貸し出し中で、処理系依存かなぁとか、その辺も心配だったので…。

目立つコメントいれておきます。レス感謝です。
0967デフォルトの名無しさんNGNG
void* に dynamic_cast した場合は、もう dynamic_cast で元に戻すことはできないの?
0968デフォルトの名無しさんNGNG
void*にdynamic_castって意味有るの?
普通void*にキャストする場合static_castじゃないの?
0969デフォルトの名無しさんNGNG
void* にならキャストは要らないんでわ。
0970デフォルトの名無しさんNGNG
void*には単なる代入でOK。
void*から元のクラスに戻すにはreinterpret_castが必要。
0971デフォルトの名無しさんNGNG
スマソstatic_castでいいです。
0972デフォルトの名無しさんNGNG
Σ(д`≡;´Д) part17 はどこ?
0973デフォルトの名無しさんNGNG
>>972
http://pc3.2ch.net/test/read.cgi/tech/1019372139/
0974デフォルトの名無しさんNGNG
reinterpret_cast も static_cast も 不正な型変換があっても bad_cast例外をなげてくれませんよね。


やっぱ共通ベースクラスをつくって dynamic_cast かなぁ。
0975デフォルトの名無しさんNGNG
>>974
ポインタをdynamic_castしても例外を投げてくれませんよね。
リファレンスの場合だけです。
0976デフォルトの名無しさんNGNG
#include <iostream>
using namespace std;
int main()
{
cout << "abc";





return 0;
}
error LINK 2019 未解決の外部シンボル
fatal error LINK 1120 外部参照が未解決です。
と出て本文にはフォーカスがかからないのですが、どういうエラーなのでしょうか?
0977デフォルトの名無しさんNGNG
コンパイラオプションが間違ってる
0978デフォルトの名無しさんNGNG
int i = 30;
ostringstream s; s << i; s.str();
これもっと短くかけませんか。
0979デフォルトの名無しさんNGNG
>>978
int i=30;ostringstream s;s<<i;s.str();
0980デフォルトの名無しさんNGNG
ostringstream s; s << int(30); s.str();
0981デフォルトの名無しさんNGNG
boost::lexical_cast<std::string>(30);
0982v(^・^)vNGNG
C++相談室 part17
http://pc2.2ch.net/test/read.cgi/tech/1047560042/
0983デフォルトの名無しさんNGNG
使いきりage
0984デフォルトの名無しさんNGNG
1000!!
0985デフォルトの名無しさんNGNG
埋め
0986デフォルトの名無しさんNGNG
このスレッドは1000を超えますた。
またのお越しをお待ちしておりまつ。

0987デフォルトの名無しさんNGNG
1001!!
0988デフォルトの名無しさんNGNG
5670000000!!!
0989デフォルトの名無しさんNGNG
まったり1000!!
0990デフォルトの名無しさんNGNG
千!
0991デフォルトの名無しさんNGNG
千尋!
0992デフォルトの名無しさんNGNG
一回だけ手伝うよ。
0993デフォルトの名無しさんNGNG
>>1000
ぬるぽ?
0994デフォルトの名無しさんNGNG
throw NullPointerException;
0995デフォルトの名無しさんNGNG
throw new NullPointerException;
0996デフォルトの名無しさんNGNG
ぬるぽ言うならいまのうち
0997仕様書無しさんNGNG

 | ̄ ̄ ̄|___
 |        ヌノ|
 |______|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
0998仕様書無しさんNGNG
 ________
 |___        |
     |レポ     |
     |_____|
        || ∧∧
         ||(゚д゚,,)
        Φ⊂ ヽ
0999仕様書無しさんNGNG
      ________
 | ̄ ̄ ̄|___       |
 |        ヌノ|レポ     |
 |______|_____|
    ∧∧ ||     || ∧∧
    ( ゚д゚)||      ||(゚д゚,,)
    / づΦ     Φ⊂ ヽ
1000デフォルトの名無しさんNGNG
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。