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

C++相談室 part31

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-9 あたり
0002デフォルトの名無しさんNGNG
  1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
  2 http://pc.2ch.net/tech/kako/996/996640937.html
  3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
  4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
  5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
  6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
  7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
  8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
  9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
 10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
 11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
 12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
 13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
 14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
 15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
 16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
 17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
 18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
 19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
 20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
 21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
 22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
 23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
 24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
 25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
 26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
 27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
 28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
 29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
 30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0003デフォルトの名無しさんNGNG
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

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

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
0004デフォルトの名無しさんNGNG
4 G E T
0005デフォルトの名無しさんNGNG
■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/
0006デフォルトの名無しさんNGNG
6 G E T
0007デフォルトの名無しさんNGNG
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
 (日本語) http://www.kmonos.net/alang/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html
0008デフォルトの名無しさんNGNG
8 G E T
0009デフォルトの名無しさんNGNG
■関連スレ■
- 【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/l50
- C/C++の宿題をやらせて、お兄ちゃん 23代目
http://pc5.2ch.net/test/read.cgi/tech/1085149383/l50
- C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/l50
- managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/l50
- ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/l50
- COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/l50
0010デフォルトの名無しさんNGNG
■コンパイラスレ■
- タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50
- GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
- タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
- タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/l50
- OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/l50
- Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/l50
0011デフォルトの名無しさんNGNG
■開発環境スレ■
- ★初心者にVisual C++を教えるスレ★ Part12
http://pc5.2ch.net/test/read.cgi/tech/1083585833/l50
- ■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/l50
- C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
- Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50

/**************** テンプレここまで ****************/
0012デフォルトの名無しさんNGNG
>>1
乙です!
0013デフォルトの名無しさんNGNG
Z
0014デフォルトの名無しさんNGNG
前スレのclassとstructだけど、javaからきた人(?)はinterfaceのかわりにstructとか
使ったりするのかな?
0015デフォルトの名無しさんNGNG
>>14
逆に聞くがインターフェイスでprivateにすべきメンバとは?
0016デフォルトの名無しさんNGNG
>>1 の名前が・・・
0017デフォルトの名無しさんNGNG
95 名無しでいいとも! 04/06/03 00:13 ID:c++9JSEr
このIDマ板いけば神か?

http://live8.2ch.net/test/read.cgi/livecx/1086186992/
0018デフォルトの名無しさんNGNG
以下のコードをコンパイルすると、
g++-2.95 (gcc 2.95.4 20011002 Debian)ではエラーなしでコンパイルされるけれど、
g++-3.2 (gcc 3.2.3 Debian) では最後につけたエラーになります。
これは、どうなるのが正しいのでしょうか?
(ちなみに TestBuilder というツールで発生するコンパイルエラーのエッセンスです。)
----- tst.cpp
#include <iostream>
using namespace std;
typedef int PLI_INT32;
typedef struct t_vc_record { PLI_INT32 vc_reason; } s_vc_record, *p_vc_record;
extern "C" int chpiPliValueCBF(p_vc_record vcRecordP);
extern "C" { typedef int chpiPliValueCBFT(); }
void acc_vcl_delete (int * object_p, PLI_INT32 (*)(p_vc_record), char *user_data, PLI_INT32 vcl_flags);
int main() {
char* ch;
acc_vcl_delete(NULL, (chpiPliValueCBFT*)chpiPliValueCBF, ch, 2); }
int chpiPliValueCBF(p_vc_record vcRecordP) { cout << "chpiPliValueCBF" << endl; }
---- エラーメッセージ
g++ -c -o tst.o tst.cpp
tst.cpp: function 内の `int main()':
tst.cpp:18: error: invalid conversion from `int (*)()' to `PLI_INT32
(*)(t_vc_record*)'
0019デフォルトの名無しさんNGNG
>>18
肝心の18行目がないな。
002018NGNG
ごめんなさい。
以下のようにするとコンパイルが通りました。
typedef int chpiPliValueCBFT(p_vc_record);
ということは、2.95 は、(C っぽく)ポインタを自動変換するけど、
3.2 では、(C++ らしく)ポインタを自動変換しないので、
エラーになるということでしょうか?
002118NGNG
>>19
改行が多すぎるといわれたので、つめてしまってました。
実際には、以下の行でエラーになってました。
acc_vcl_delete(NULL, (chpiPliValueCBFT*)chpiPliValueCBF, ch, 2); }
0022デフォルトの名無しさんNGNG
STLつかうと一気に実行ファイルサイズが10倍に?!
0023デフォルトの名無しさんNGNG
>>22
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0024デフォルトの名無しさんNGNG
>>1
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0025デフォルトの名無しさんNGNG
はいはい、スレ1つにつき1回だけだよ。
このスレじゃもう終わりだよ。
0026デフォルトの名無しさんNGNG
>>24
1は言ってねぇだろ
0027デフォルトの名無しさんNGNG
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいのですか?
0028デフォルトの名無しさんNGNG
>>27
#include "stdafx.h"

後死ね。
0029デフォルトの名無しさんNGNG
>>28
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0030デフォルトの名無しさんNGNG
つりはよそでやれ。あとググれ。
0031デフォルトの名無しさんNGNG
ググレカレー
0032デフォルトの名無しさんNGNG
ファイルからMD5ハッシュ値を計算して16進表示させたいんですが
CryptCreateHashは使えるでしょうか。
文字列のハッシュ値は求めれるようですが、サイズの大きなファイルから
求めるにはどうしたらいいのでしょうか。
0033デフォルトの名無しさんNGNG
>>32
このスレのタイトルを声に出して10回嫁。
0034デフォルトの名無しさんNGNG
>>32
そのファイルが読み込めるだけの記憶域を取得できれば可能。
だがその前にスレタイ読んで回線切って(tbs
0035デフォルトの名無しさんNGNG
fopen系、fstream系、CreateFile系
みんなさんはファイル入出力どれ使ってますか!
(というかどれが好み?)

最近ftream系を使い出して機能豊富に脱毛してたんだが、
いかんせん使い方にクセがあって戸惑ってますよ。
0036デフォルトの名無しさんNGNG
>>35
そりゃ、fstream。C++スレだしな。
0037デフォルトの名無しさんNGNG
個人的にはCStdioFileがおすすめだよ。
0038デフォルトの名無しさんNGNG
>>35
iostreamが楽

#DirectXのファイル入力これにしてくれよ〜>MS
0039デフォルトの名無しさんNGNG
>>35
ライブラリを使わない時は API。それ以外は fstream。
fopen は間違っても使わない。

取り合えず禿になる前に慣れろ。
0040デフォルトの名無しさんNGNG
便乗で質問なんですが
FILE構造体とかストリームオブジェクトが管理する入出力バッファって、
どこら辺に配置されているんでしょうか?
まぁ、そうそう手が出せない領域に置かれるとは思うんですが
0041デフォルトの名無しさんNGNG
>>40
手の出せない領域ってなんだ?
例えばVC++6.0の標準ライブラリならソース追っかければ分かるが、最終的にFILE構造体を
確保してるのはただのmallocだが。
0042いちごあめNGNG
はじめまして、こんにちは!

VC++ 6.0 で CrystalReports 10 を使って帳票を印刷
するプログラムを作りたいと考えています。
でも、いくら探しても方法やサンプルコード等どこに
も載っていません。
どなたかご存知の方いらっしゃいませんか?
よろしくお願い致します。
0043デフォルトの名無しさんNGNG
>>42
このスレのタイトルを声に出して10回嫁。

と言っても理解できそうにないな。
スレ違いだ。VCスレに逝け。>>11
0044デフォルトの名無しさんNGNG
Win32APIスレだと思うが
004535NGNG
意外とfstream使ってる人多いんだな!
慣れるまで我慢して使ってみる事にします。

所でfstream::read()でバッファに読んだ時に
実際に読んだサイズってどこから取ってくるんでしょう?
読む前と後でtellp()って事はないですよね・・・。
0046いちごあめNGNG
>>43
お口は悪いようですが、親切なんですね。
教えていただいたところを見てみます。
ありがとうございます。
0047デフォルトの名無しさんNGNG
>>45
int basic_istream::gcount( );
0048デフォルトの名無しさんNGNG
>>40
C++ の場合、basic_filebuf がソレ
0049デフォルトの名無しさんNGNG
>>45
fstreamなんて糞だから間違っても使うな。
fopen系で処理しとけば問題ない。
0050デフォルトの名無しさんNGNG
std::stringの後ろ1文字削るのにresizeとeraseどっちがいいと思う?
0051デフォルトの名無しさんNGNG
どちらも使わずそのまま使う。
0052デフォルトの名無しさんNGNG
例外について教えてください。とある関数が

void f() throw(std::bad_exception)
{
...
 throw int();
}

とあったとすると、int型は関数の例外指定に無いので、throwすると
代わりにbad_exceptionが投げられると本にあったのですが、これだと
throw int()の時点で強制終了されてしまいます。
throw std::bad_exception() とすると、外側の関数でbad_exceptionが
キャッチできるのですが・・・。ちなみにVC.NETです。
なぜ終了してしまうのでしょうか?
0053デフォルトの名無しさんNGNG
>>52
ISOでもJISでもいいが規格票の 15.4 の 8 を読んでみれ
0054デフォルトの名無しさんNGNG
横槍でスマンがもまいらひとつ教えてくれ。
規格表、規格表ってよく出てくるけど、あんなもの
カネ出して本当に買ってるのか?
コンパイラ作るワケじゃないし、禿の本で十分
だと思って漏れは買ってないのだが、何かお得
な情報が詰まってるのか??
005552NGNG
>>53
うぅ・・・もってません
0056デフォルトの名無しさんNGNG
>>55
スレタイの少し下にリンクが貼ってあるよ。
ttp://www.kuzbass.ru/docs/isocpp/except.html#except.spec
0057デフォルトの名無しさんNGNG
>>52
>とあったとすると、int型は関数の例外指定に無いので、throwすると
>代わりにbad_exceptionが投げられると本にあったのですが、

どんな本だ?(((( ;゜Д゜)))ガクガクブルブル
0058デフォルトの名無しさんNGNG
>>57
こういう事だろう。VC++6.0のような古い処理系では動くかどうか知らんが。

#include <iostream>
#include <exception>

void my_unexpected_handler()
{
 throw 1234;
}

void f() throw(std::bad_exception)
{
 throw int();
}

int main()
{
 std::set_unexpected(my_unexpected_handler);
 try {
  f();
 }
 catch (const std::bad_exception& e) {
  std::cout << e.what() << std::endl;
 }
 catch (int i) {
  std::cout << "User defined unexpected hadler threw " << i << std::endl;
 }
}
0059デフォルトの名無しさんNGNG
>>50
pop_backみたいな、ぴったり合う操作が無いな。push_backはあるのに。
resize(size()-1)のほうが効率はよさそう。
erase(end()-1)のほうがソース上に突然現れたときに意味がとりやすそう。

まじめなソースなら、
inline void pop_back(std::string& s){ resize(s.size()-1); }
と定義してしまうのが最善手かと思う。
006052NGNG
レスありがとうございます。
私の説明がおかしかったようで、もう少し正確に書くと、本には

class A;
class B;

void f() throw(A)
{
throw A(); //A型例外を送出
throw B(); //unexpected()を呼ぶ→unexpeted()がterminate()を呼ぶ
}

bad_exceptionをした場合・・・
void f() throw(A, std::bad_exception)
{
throw A(); //A型例外を送出
throw B(); //unexpected()を呼ぶ→unexpected()がbad_exceptionを送出
}

とまぁこういったことが書いてありましたので、たとえばint()をスローする
と当然bad_exceptionが投げられて、外側でbad_exception型の例外がキャッチ
できるのかと思ったのですが・・・違いますか?

0061デフォルトの名無しさんNGNG
>>54
俺は買ってるが。プログラミング言語 C++ は言語制作者の手による本だとは
言っても、結局、微妙なところになると載ってないし。

JIS から買うと高いが ANSI から PDF で買えば US$20 しないぞ。
0062デフォルトの名無しさんNGNG
ISO で規格制定した C++ をJIS/ANSIから買えるって?
0063デフォルトの名無しさんNGNG
1000ページの解説本ですら解説しきれない仕様そのものが問題だな。
006454NGNG
>>61
レス�dクス。
ANSIのページにいったら
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003
US$281と出てるんだが...orz
0065デフォルトの名無しさんNGNG
>>60
違う。unexpected()関数はデフォルトでは常にterminate()しか呼び出さない。
set_unexpected()でunexpected()の代わりに呼び出す関数を入れ替えた時のみ、
その入れ替えられた関数がstd::bad_exceptionを投入する。§15.5.2.2
0066デフォルトの名無しさんNGNG
あるクラスAが、別のクラスBのインスタンスへのポインタを
シングルトンで取得する場合、クラスBのコンストラクタ、デストラクタ
は発動するのでしょうか?その場合、発動タイミングはいつですか?
0067デフォルトの名無しさんNGNG
>>64
ISO/IEC 14882:1998なら>>3のpdf

006864NGNG
>>67
サンクスコ。2003の最新のですた。
でも1998のpdfは今はもうタダなんでつか?>61さんは
$20って書いてましたが。。。
0069デフォルトの名無しさんNGNG
>>66
それだけじゃだれにもわからない。
自分で使っている「シングルトン」の実装を調べれ。
0070デフォルトの名無しさんNGNG
質問おながいします。
会社の規約でグローバル関数をcallするときは、クラスのメンバと
見分けやすくするために :: を明記するように言われてます。
でc++コード中でよくcの標準関数をつかうのですが、getcharを
::getchar()
と書いたらコンパイルが通りません。(その他の関数は知っている限り
とおります)
なんか問題があるのでしょうか?
VC6でもVS7.1でも同様の結果ですた。
0071デフォルトの名無しさんNGNG
>>70
C++なら<cstdio>をインクルードしてstd::getcharが正解。
でも、VC6では通らないかもしれない。
0072デフォルトの名無しさんNGNG
>>71
レスどうもです。
#include <cstdio> はできないんでつ。というかなぜか
全部のコードがstdio.hなんでつ。(単に古いからだと思うんでつが)
先輩はgetchar()でええやないかって言うんですけど、なんで
::が付けられないのか気になって仕方ないもんで。
007371NGNG
>>70
ごめんVCのgetcharはマクロでも定義されてるみたい。

#include <cstdio>
#ifdef getchar
#undef getchar
#endif

これでstd::getcharでいけるようになる。
どっちがいいかは微妙。

規格はこのマクロ定義を許しているんだろうか?
007471NGNG
gccのcstdioでstdio.hのマクロは全部#undefされてた。
やっぱ規格としては、std::getcharで使えないとダメなんだろうな。
007570NGNG
>>71
調べててレス遅れました。
「VCのgetcharはマクロでも定義されてるみたい」でハッとして
VCのソース見たら
#define getchar() getc(stdin)
とされてて、これはまあいいのですが、次に
#define getc(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
とマクロ展開されてました。
これでは ::getchar() が通るわけないでつ。スッキリしますた(´・∀・`)
どうもありがとう。。。 それにしてもvcってへんな実装でつ。
0076デフォルトの名無しさんNGNG
getcはマクロで実装してもよかったような希ガス。
0077デフォルトの名無しさんNGNG
>>64
個人で使うならこっち買え。利用規定が違うだけで、中身は変わらん(むしろ、
しおり入ってる分だけ使いやすい)

INCITS/ISO/IEC 14882-2003
$18.00
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D2003
007864NGNG
>>77
たった今DLしますた。なんかわからんけど
ディスカウントが効いて$13.5ですた。
サンクスコですた(・∀・)!!


0079デフォルトの名無しさんNGNG
runtime_errorクラスの派生クラスでrange_errorっていうのが
標準でありますよね。内部演算の範囲エラーということのようですが
これってどういうことでしょうか?オーバーフローやアンダーフローは
わかるのですが。
0080デフォルトの名無しさんNGNG
vector<int> v(10);
v[15]=5;

bitset<16> bs;
bs[20]=true;
0081デフォルトの名無しさんNGNG
>>54
52のような質問をする必要がなくなるという事例を現に目撃しながら、何が聞きたいんだ?
0082デフォルトの名無しさんNGNG
>>80
それっていわゆるout_of_rangeという例外クラスにあたるんじゃ
ないですかね・・。つまりロジックで回避できるものという。

runtime_errorというのは、プログラムのスコープの外で単純に回避
できないイベントを通知するのだそうです。
派生クラスは
range_error
overflow_error
underflow_error

このrange_errorというのがよくわからないんです。
0083デフォルトの名無しさんNGNG
>>82
overflow, underflow と並んでるってことは、その手の「範囲外」を通知するのに
使うことを想定してるんじゃないの?

有効な値の範囲が連続なら underflow, overflow だけで表現できるけど、
とびとびだったりすると、どっちとも言えんよね。
0084デフォルトの名無しさんNGNG
リファレンスカウントを作りたくて
練習で書いたソースですが、思わぬところで躓き
知り合いの先輩に聞いたら、こんな現象を見つけました
なぜ、そうなるのかわかりません、
理由がわかる方がいましたら、教えてください。
推測でもよいので
・・・

やはりVテーブルの話になるのでしょうか?

http://www.lenis.info/~forget-me/Toukou.txt

0085デフォルトの名無しさんNGNG
>>84
vtblは関係ないよ

いいから、言うとおりの順に紙に図かいてみろ
・Object型のオブジェクト1個(仮にaと名づける)
・aへのポインタ1個(仮にpaと名づける)
・paへのポインタ1個(仮にppaと名づける)
・Test型オブジェクト1個(仮にbと名づけ、aがbの部分オブジェクトになるように)
・bへのポインタ1個(仮にpbと名づける)
・pbへのポインタ1個(仮にppbと名づける)

おまいさんがやろうとしていることは、
reinterpret_cast<Object**>(ppb)だ
0086デフォルトの名無しさんNGNG
>>84
Test **t=0;
Object **o=t;

これが出来ないから
008784NGNG
>>85
指摘ありがとうございます。
ネットで調べたら
reinterpret_castは単なる型変更であり、たとえ派生関係があったとしてもポインタのアドレス自体はキャスト前と変わりません。
その意味でreinterpret_castは非常に危険なキャストといえるでしょう。
とありました。正直Castについて、完全に理解してないもので、とりあえずCastの部分が私が間違っていたということでしか、まだ理解できてません
が、返事が遅くなるといけないから、一応レスを書きました。Castについて勉強して、もう一度検討してみたいと思います。
せっかくレスを頂いたのに、まだ理解できなくてすいません。

>>86
なるほど、わたしのしてたことは、それに似たことだったのですね、上で書いたように、もう一度じっくり検討してみます。
どこに着目すればよいかわかりましたので、大変助かりました。ありがとうございます
0088デフォルトの名無しさんNGNG
>>80
vectorは確かoperator[]で範囲外アクセスした場合、未定義だったと思う。
vector<int> v(10);
v[15]=5;
v.at(15);
でatの方は例外を投げたと思うけど。
bitsetの方は覚えてない。
0089デフォルトの名無しさんNGNG
>>88
std::bitsetも[]による範囲外アクセスは未定義のふるまい。
0090デフォルトの名無しさんNGNG
>>89
s/ふるまい/動作/
0091デフォルトの名無しさんNGNG
std::bitsetの要素は1bitですが、要素がN bitのものはありませんか?
0092デフォルトの名無しさんNGNG
>>91
それじゃあビットとは言えないな。
0093デフォルトの名無しさんNGNG
>>91
vector<bitset(ry
0094デフォルトの名無しさんNGNG
Nの大きさに合わせてvectorを使ったりbitsetを使ったりする
ラッパーを作ればよい
0095デフォルトの名無しさんNGNG
ちょっと質問なんですが、
#include <iostream>
class A {
public:
int& test;
A(int& a):test(a){};
};

int main(int argc, char *argv[]){
A *p;
{
int c = 1;
p = new A(c);
std::cout << p->test << std::endl;
}
std::cout << p->test << std::endl;

return 0;
}
2回目のp->testは安全ですか?
一応大丈夫みたいなんですが。
0096デフォルトの名無しさんNGNG
>>95
あんま安全じゃない。
0097デフォルトの名無しさんNGNG
>>95
ポインタを返す関数の戻り値に、
その関数のローカル変数のポインタを使うようなもんだ
009895NGNG
>>96 >>97
やっぱそうですか。
じゃあ int& を const int& にした場合どうなりますかね?
一時オブジェクトをconstリファレンスで受けると寿命が延びますよね。
その例として型がintなのはよろしくないかもしれませんが。
0099デフォルトの名無しさんNGNG
>>98
延びないってば
0100デフォルトの名無しさんNGNG
>一時オブジェクトをconstリファレンスで受けると寿命が延びますよね。
ソースきぼんぬ
010195NGNG
http://www.google.co.jp/search?q=%E4%B8%80%E6%99%82%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88+%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&ie=UTF-8&hl=ja&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

というか他の型でデストラクタが呼ばれてるか調べればいいですね。お騒がせしました。
010295NGNG
コンストラクタ抜けた時点でデストラクタ呼ばれてるようですorz。
寿命が延びるといったのは受けた変数と同じ寿命になるという意味です。
直接受けた変数と同じになるだけみたいですね。考えてみれば当りまえかもしれませんが。
0103デフォルトの名無しさんNGNG
>>95
コードブロックの最後にデストラクトするのは、実装依存ではなくて
仕様。それにコンパイラは、ブロック外でアクセスされるのを
検知して、寿命を延ばすことはしない。(警告を出すことはありうる
だろうけど)
ARMに書かれているのは、テンポラリがconst参照されている場合
、その参照の寿命にしたがうということで、ここではcはテンポラリ
じゃないからね。
010495NGNG
>>103
というか cのとこがテンポラリだったとしても直接受けるのはコンストラクタの引数なので
コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。
0105デフォルトの名無しさんNGNG
>コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。
{
int c = 1;
p = new A(c);
std::cout << p->test << std::endl;
} ← ここで呼ばれるんじゃね?
010695NGNG
>>105
cのとこが一時オブジェクトだった場合、Aのコンストラクタが終了した時点で一時オブジェクトのデストラクタが呼ばれます。
0107デフォルトの名無しさんNGNG
>>106
p = new A(C());

こんな事やってんじゃね?
010895NGNG
>>107
そんな事やってますがそれがなにか?
0109107NGNG
>>108
ごめそ。>>106じゃなくて>>105ね。
0110デフォルトの名無しさんNGNG
>>95 == 104
>というか cのとこがテンポラリだったとしても直接受けるのはコンストラクタの引数なので
>コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。

レス遅れてすまそ。そうだった。漏れも勘違いしてた。
そのテンポラリで初期化されたのなら、参照変数に束縛(?)されるだろうけど、
変数として渡されたのなら束縛できないね。(コンパイル時に値(テンポラリ)が
確定しないから、C++が寿命管理できない)
で、誰にも束縛されてないから、すぐに(この例だとコンストラクタ抜けたあと)
削除されちゃうね。束縛されてれば最大テンポラリの作成されたスコープいっぱい
生きられるみたいだけど。
011195NGNG
>>110
A(int& a):test(a){}; を
A(int& a):test(int(a)){};
みたくしたらテンポラリで初期化するから生き続けるかなあと思ったけど
(もちろんこんなことするくらいなら値渡しすればいいんだけど)
コンストラクタ抜けたらやっぱり死にました。そういうもんなんですかね。
ところで参照のメンバを使う時ってどんなときですか?
0112105NGNG
>>106-109
了解ッス
0113デフォルトの名無しさんNGNG
>>111
> ところで参照のメンバを使う時ってどんなときですか?
生成順序、破棄順序に明確な親子関係がある時かな。
被参照クラスは参照するクラスのコンストラクタで渡さなきゃいけないし、
参照するクラスのデストラクタが呼ばれる前に非参照クラスが破棄されると
普通は困るから。
0114デフォルトの名無しさんNGNG
ところでみなさん、C++ のソースファイルの拡張子は、何にしてますか?
.C
.cpp
.cc
0115デフォルトの名無しさんNGNG
cxx
0116デフォルトの名無しさんNGNG
.cpp
0117デフォルトの名無しさんNGNG
VC++だと拡張子つけないと勝手にcppだからcpp。
つか、クラスの新規作成で勝手にファイル生成させてるが。
Linux上でgccに食わせるのはなんとなくccだったりする。
0118デフォルトの名無しさんNGNG
zshでは、cpp は、C++ の拡張子としては、扱われてなかった。
0119デフォルトの名無しさんNGNG
え、設定変更できないの?
0120デフォルトの名無しさんNGNG
zstyle を使えば、変更できます。
0121デフォルトの名無しさんNGNG
ちょいと本読んでたら気になる表現があったのですが
デフォルトコンストラクタを明示的に呼び出す・・・
というのは、どういうことでしょうか?明示的じゃない
呼び出しっていうのもあるんですか?
たとえば
class A{
 ...
};

A c;
とか
A c();
とかって違うのでしょうか?
0122デフォルトの名無しさんNGNG
int i;
と
int i();
は違う。
0123デフォルトの名無しさんNGNG
>>121
もしかして「デストラクタの明示的な呼び出し」の間違いか?

全然関係ないが
A c; はオブジェクトの定義
A c(); は関数の宣言
0124デフォルトの名無しさんNGNG
たぶん、explicit の話だろう。
0125デフォルトの名無しさんNGNG
>>114
.EXTENSIONOFC++SOURCEFILE
0126121NGNG
あ、
引数なしのコンストラクタ呼び出しって
A c();
という具合じゃだめなんですか・・・関数宣言になるんですね。
じゃあ
A c;
または
A c = A();
でデフォルトコンストラクタ呼び出しってことですかね。
いずれにせよ明示的って意味がわかりませんね・・・。
0127デフォルトの名無しさんNGNG
読み間違いの予感
0128デフォルトの名無しさんNGNG
だから、「explicit+コンストラクタ」でぐぐってこい
0129デフォルトの名無しさんNGNG
>>128
デフォルトコンストラクタにexplicitもクソもあるか。

明示かどうかで挙動が変わるのは組み込み型のデフォルトコンストラクタ。
0130121NGNG
その明示的と明示的じゃないというのは、表現方法はどう違うのでしょうか?
0131デフォルトの名無しさんNGNG
>>130
例えば、デストラクタなら
{
hage stroustrup;
} // 暗黙の呼び出し

this->stroustrup::~stsoustrup(); //明示的な呼び出し
0132デフォルトの名無しさんNGNG
const hage& hage::operator = (const hage& BullShit)
{
this->hage::~hage();
this->hage::hage(BullShit);
return *this;
}
0133131NGNG
s/stsoustrup/stroustrup/
s/stroustrup/hage/
吊ってきます
0134デフォルトの名無しさんNGNG
>>130
暗黙の型変換あたりでググれ。
0135デフォルトの名無しさんNGNG
A.h (class Aを定義)
A.cpp (実装を定義)

とやって、A.cppで、static A gA;
などとグローバルインスタンスとして A を定義し、それをsingletonとして
ポインタを返すメンバ関数をAに用意しておきます。
main.cppの方でそれを呼んで class Aのsingletonを使ってメンバ関数
をコールするというような使い方をする場合、
class Aのコンストラクタ、デストラクタはいつ呼ばれるのでしょうか?
多分、static A gA; がメモリー上に実際に生成される時だと思うんですが
それっていつなんでしょうか?
0136デフォルトの名無しさんNGNG
>>132のコードに感動した
0137135NGNG
>>135
色々自分でいじくってたら自己解決しました。
すんまそん。
0138デフォルトの名無しさんNGNG
>>133
吊るより
9階からああ飛び降りろ。
間違っても芝生のないところでやれ。
できるなら30階以上のところでやれ。
確実に死ねる
0139デフォルトの名無しさんNGNG
>>136
本気で言ってるのか?
0140デフォルトの名無しさんNGNG
>>138
正しい吊りかたすれば確実に死ねるぞ
0141デフォルトの名無しさんNGNG
C++ では類の実体を函数の返値にできるよね?
0142デフォルトの名無しさんNGNG
C++には自信があったのですが、141の日本語が理解できない漏れは、9Fからフェンスめがけて飛び降りるべきでしょうか。
0143デフォルトの名無しさんNGNG
「クラスのインスタンスを関数の返値にできるか?」
ってことか。それならイエスだが。
しかし、なんでわざわざ回りくどい聞き方するかね。
0144デフォルトの名無しさんNGNG
>>142
>>143

カタガナ語が嫌いだからさ
0145デフォルトの名無しさんNGNG
カタガナ語???
0146デフォルトの名無しさんNGNG
>>144
そんなにオナニー好きなのに
よりよいオナり方を人に訊くのか…
0147デフォルトの名無しさんNGNG
入門書買え、読め、と叩かれそうなぐらい初歩の初歩の質問を、
さも高度な質問のフリをするためには効果があるわけだな。
しかし、141がDQNであることは、はっきりした。
0148デフォルトの名無しさんNGNG
必死な低学歴が大量なスレですね
0149デフォルトの名無しさんNGNG
>>142
カッターで頚動脈切ってもらった上で15Fぐらいからダイブしたほうがいいぞ。
0150デフォルトの名無しさんNGNG
今は9Fからダイブするのがナウイ
0151デフォルトの名無しさんNGNG
今死ぬなら60F。
0152デフォルトの名無しさんNGNG
C++はCに比べて遅いというのは良く聞く話ですが、具体的にどれくらいですか?
なんとなく↓くらいかと思う

C>>C++>>>>>>>>>>>>>>>>Java
0153デフォルトの名無しさんNGNG
具体的に聞きたいならどういったコードの実行性能かを具体的に書け
0154152NGNG
>>153
科学計算用途です。行列演算とか、フーリエ変換とかが入った計算。
0155デフォルトの名無しさんNGNG
C++の既存の科学計算ライブラリ >>>>>>>>>>>>> 152の書いたCの科学計算コード
0156デフォルトの名無しさんNGNG
>>155
ライブラリ呼び出しだけで書けると思ってるの?ヴァカ?
0157デフォルトの名無しさんNGNG
>>152
処理系もライブラリもコードも示さないで比較もくそもないと思う。
そして処理系もライブラリもコードも示せるなら自分で計測すれ。
0158デフォルトの名無しさんNGNG
純粋な数値計算でC/C++の差が出ることってある?
標準ライブラリやメソッドコールの差はあるにしても。
0159デフォルトの名無しさんNGNG
>>158
数値計算はライブラリの質が大きいが、シミュレーションとか、
もっと一般的に言って物理エンジンなんかはどうなのさ?
0160デフォルトの名無しさんNGNG
>>152
全く聞かないけど?
実際は、C≒C++>>>>Java ぐらいじゃないか?

CとC++とJavaで同じ処理を試すということは、
クラスライブラリなどを一切使わないってことだよね?
0161デフォルトの名無しさんNGNG
> C≒C++>>>>Java
で、良いんじゃないかな?
0162デフォルトの名無しさんNGNG
>>158
あるよ。
expression template などを使わず。単純に見易さとか書きやすさだけを求めると
遅くなるよ。もっともC++ではそういう書き方もできるという意味で、C流に書けば
いいだけなんだけどね。

#expression templateも+,-,*などの単純計算ならなんとかなっても逆行列なんかには
#無力だけど。
0163デフォルトの名無しさんNGNG
継承レベルを出来るだけ浅くして、オブジェクトの生成も出来るだけしないようにすれば遅くならないよね。
って、Cで書けってことか?(w
0164デフォルトの名無しさんNGNG
>>162
具体例を希望
0165デフォルトの名無しさんNGNG
>>164
162 じゃないけどMATRIX operator+(MATRIX const&, MATRIX const&) とか。
何も考えずに書くと、戻り値で値のコピーが発生して遅くなりがち。
0166デフォルトの名無しさんNGNG
>>163
君にはきっと C のほうが向いていると思う。
0167デフォルトの名無しさんNGNG
結局書き方の問題であって、生成されるオブジェクトの
最高実行速度という意味では厳密に C++ == C ってことでは?
それに加えて、C++より広範囲の抽象化をサポートしていわけで。
(仮想関数ならそれなりの実行時コストをはらって、また、templateなら
実行時コスト無しで)

0168デフォルトの名無しさんNGNG
>>165
その計算はCだろうが戻り値のコピーは避けられないと思うが?
戻り値最適化を前提にしちゃいかんのはわかるが
Cで書けば同等の役割を持った上で高速に動作するコードを示してほしい

つーか expression template の話してるところで
「何も考えずに書くと」のケースの話されても一体何と何を比べてるんだって感じなんだけど
0169デフォルトの名無しさんNGNG
>>164
一番速度差が出やすいと言われるのはこんな場合。C++だと、
Matrix a,b,c,d,e;
for(int i = 0; i < takusan; i++){
a = b*c+d-e;
}
ってな計算。
なーんにも考えず二項計算だけ定義すると、
b*cの結果、それと+dの結果、
-eの結果、それぞれを確保、開放
繰り返してたらそりゃ遅くなるでしょ。

C流に書けば、a.b,c,d,e,tmp,tmp2,tmp3は適当に定義してあって、
関数にはポインタで渡すとして

tmp =(XXX &)malloc(sizeof(datasize) * matrixsize);
tmp2 =(XXX &)malloc(sizeof(datasize) * matrixsize);
tmp3 =(XXX &)malloc(sizeof(datasize) * matrixsize);
for( i = 0; i < takusan; i++ ){
mul(b,c,tmp);
add(tmp,d,tmp2);
sub(tmp2,e,tmp3)
}
で作業域は一回だけ確保しとけばいいってこと。
でも、計算式そのまま書けば計算できるC++流の関数と
C流の関数両方用意しとけばいいからC++が遅いってことにはならないよ。
Cだと見にくい書き方しかできないけど。

あと、式テンプレートは結果の作業域は用意しなくてもいいんだが、
結局計算式そのものをどっかに格納しとかなきゃいけなかったりする。
0170デフォルトの名無しさんNGNG
(XXX *)
だった、しばらく書いてなかったもんでスマソ
0171デフォルトの名無しさんNGNG
C++は速度を犠牲にして保守性を向上させているというのは都市伝説の類ですか?
0172デフォルトの名無しさんNGNG
>>169
言いたいことは分かるんだけれども
その例はC++でも
結果を格納するためのオブジェクトと op= の形式の演算子使うだけで
C流の関数なんて使わなくともそこそこ可読性を保ったままパフォーマンスを同等にまで上げられる。
しかもこれ、割とよく知られている最適化テクニックなんであまり適切な例ではないような。
0173デフォルトの名無しさんNGNG
速度求めるならSSE2命令使ってコーディングしてるatlas + fortranが速い。
SSE2命令有効にしてコンパイルしてもこれほど速くならないと思う。
C/C++からコールするにしても行/列アクセス順序入れ替えるのは面倒だし、
オーバーヘッドは必ず発生するしね。
0174デフォルトの名無しさんNGNG
>>173
Intel系ならそうですね。WSやマックは切り捨てですか?
atlasが速いのは、出来るだけキャッシュに入るように工夫してるのが大きいと思うのですが…。
InterlのMKLなんかはP4のパイプラインの分岐予測を乱さないように最適化されているみたいですし。
そこまで行ったら、言語の問題じゃないような気がする。
0175デフォルトの名無しさんNGNG
ちと気になったので質問します。
ファイル名を格納するchar配列があります。
この配列は幾つファイルが有るかわからないので動的に増やせるようにしたいです。
そこで今は以下のようにしています。

int n = 10;
struct FILENAME{ char lpsz[MAX_PATH]; };
FILENAME* files = new FILENAME[n];

が、これってわざわざ構造体なんか定義しなくても出来るようにならないでしょうか。
無理とは解ってますが以下とかじゃ駄目ですし。
char* files[MAX_PATH];
files = new char*[n];
0176デフォルトの名無しさんNGNG
fortranの場合並列処理に分割し易いとかそういった理由で科学計算の
分野ではC/C++より早いって話しだよね?
逆にfortranってC/C++みたいな自由度はないのでは?

ただ、CとC++の高速度ソフトウエアの記述能力といった意味では全く
同一だと思う。
0177デフォルトの名無しさんNGNG
>>175
std::stringとかstd::vector<char>とか使え。C++なんだし。
0178デフォルトの名無しさんNGNG
>>175
char** filenames = (char**)malloc(sizeof(char*)*n);
じゃだめなのかね。
0179デフォルトの名無しさんNGNG
>>175
つ[std::vector<std::string>]
0180178NGNG
しまった、C++スレでした。鬱山車脳。
0181デフォルトの名無しさんNGNG
というか構造体を定義することと動的配列の実装に何ら関連性がないのだが。
型名をどう記述してよいかわからないだけなら typedef で十分だし。
実際は「動的配列どうやって作れるの?」ってだけの話なのか?
0182デフォルトの名無しさんNGNG
char (*files)[MAX_PATH];
files = new char[n][MAX_PATH];
0183デフォルトの名無しさんNGNG
>結果を格納するためのオブジェクトと op= の形式の演算子使うだけで
>C流の関数なんて使わなくともそこそこ可読性を保ったままパフォーマンスを同等にまで上げられる。
>しかもこれ、割とよく知られている最適化テクニックなんであまり適切な例ではないような。
そりゃ、技を駆使すればC++も速くなるよ。
でも、多大なる努力を駆使して得られる処理速度は、誰でもすぐに書けるCの処理速度に
どれだけ漸近させられるかってだけ。
その努力が数値計算ユーザにどれだけ支持されるかってこと。
0184デフォルトの名無しさんNGNG
> 誰でもすぐに書ける

うーん、ダウト
0185デフォルトの名無しさんNGNG
>>183
何言ってんのかわかんない。
void add(MATRIX&, const MATRIX&, const MATRIX&);
みたいなC式のスタイルはC++でもできる。
C++式のスタイルは使いかたによってはパフォーマンスが悪い、それだけだろ。
0186デフォルトの名無しさんNGNG
>>174
>Intel系ならそうですね。WSやマックは切り捨てですか?
Pen4 に atlas 使って遅い用途ならWSも糞マックも役にたたんだろうからどうぞ捨ててくれ。
0187デフォルトの名無しさんNGNG
故意にC++を難しくみせようとしているヤツがいるな。
op= と op じゃ実装も記述の手間もろくすっぽ変わらん。
問題なのは可読性が下がることだけ。

>>169が言ってるのは、
a = sub(add(mul(b,c), d), e);
より mul_assign(b,c, tmp); ...(以下略) とする方が早いという以上の何者でもない。
それをC++の演算子オーバーロードに置き換えれば op と op= の違いになる、というだけ。
0188デフォルトの名無しさんNGNG
可読性と保守性と速度を全て満たした言語は無いのか?
0189デフォルトの名無しさんNGNG
>op= の形式の演算子使うだけで
ふーん。Matrix計算の場合+=.-=は確かに使えるね。
*=が使えると思ってる時点でオバカさんだな。
どうやったら使えるか解説してくれないか?
0190189NGNG
おおっと、定数には使えるよ
A *= 3.0;
とか
A /= 5.0;
とかね。
0191189NGNG
浅はかな>>172, >>187は、
A *= Bの計算を作業域使わずダイレクトにできると思ってるんだろうね。
おめでたいこった。
0192デフォルトの名無しさんNGNG
>>190
話のポイントのつかめんやつだな。
CとC++でどこが違うかって言ってるんだ。
>>166でも一時オブジェクトは確保してるだろ。
どこで一時オブジェクトがいらないなんて話になったんだ?
#さらに言うと *= の場合、
 中途で確保する一時領域は行単位で済むから * よりも
 オーバーヘッドは小さくできるぞ。
0193デフォルトの名無しさんNGNG
>>191
Cでは作業域使わずダイレクトにできるのか?
出来ないよな。なら特に今回の話に関係無いよな。

で?
0194デフォルトの名無しさんNGNG
>>192 >>193
作業領域を中で確保して値渡しで返す(もしくはswapする)のと、
外から作業用兼結果用の領域をもらうのとは結構違うと思うよ。
0195デフォルトの名無しさんNGNG
>>192
おつむの悪い僕ちゃんだな。
いいかい。
op= を遣う理由で一時作業領域を省略できる以外になにかあるのかい?
Matrixの*=の場合はそうならないから指摘してるんだよ。

##さらに言うと *= の場合、
# 中途で確保する一時領域は行単位で済むから * よりも
# オーバーヘッドは小さくできるぞ。
ハイハイ。がんばれよ。頭だけじゃなく往生際も悪いようだ。
0196デフォルトの名無しさんNGNG
void mul(Matrix *ret,const Matrix *a,const Matrix *b);
Cで書くとこういう関数になると思うが
この時、retとaのポインタが指す領域が別々とは限らないため、

Matrix &operator *=(const Matrix &a);
と関数内部は同一になると思うが、そういうことを言ってるのではないの?
0197デフォルトの名無しさんNGNG
>>195
いいでしょう。
*= については、a *= b ではさらに新たな一時オブジェクトを作る tmp2 = a * b; に対して改善が見込めないという部分は認めよう。
でも、Cでこの書き方より速くできるかという部分については納得する意見をもらってないよね。
0198デフォルトの名無しさんNGNG
>>196
だーかーらー ret,a,bが全部違った時は作業領域いらないでしょ。
その恩恵はC++のoperatorじゃあずかれないでしょ。

>>197
さっきからでてる三項の関数使えばいいじゃん。

C++だからってoperatorにこだわることないんだよ。
実際に数値計算のライブラリも三項引数の関数用意してるよ。
0199196NGNG
>>198
いや、全部違うかどうかは関数内部でわからないでしょ?
まさかポインタが違うかどうかifでチェックするの?なわけないよね?
0200198NGNG
え? ifでチェックすればいいじゃん。
っていうかこの問題、式テンプレート使うとなるとまた変わってくるのかも。
0201デフォルトの名無しさんNGNG
速度云々とかいいながら条件分岐なんか使う気なのか。
0202デフォルトの名無しさんNGNG
通りすがりの横レスだけど
確かにC++使ってるとoperatorとかtemplate使いたくなるよね。
そんな事やってる間にチューンを忘れるとか疎かになりがち。
そう言いつつET使ってキャッシュも意識して頑張るんだけど。

>>199
restrictって言おうとしたけどCだな。それに保証も出来んか。
0203196NGNG
ifチェックすんのかよ!
パフォーマンスがどうたら言うてる割に現在のCPUでペナルティ大きいifチェックかぁ。

まぁ想定してるmatrixが俺と違うのかもね。
内部で動的にメモリ確保したりするようなヤツならifチェックくらい別にかまわないか。
0204デフォルトの名無しさんNGNG
>>197
結局、出力パラメータに対して
operator の戻り値コピーの部分(最適化してくれないとして)がネックになるって話なのね。

>>200
expression template はないって前提でしょ。
一応、それならパフォーマンスをある程度保ったまま
はるかに直感的に式書けるんだからまあ文句は出ないと思う。
もちろん式格納領域はいるけど今問題の一時オブジェクトのオーバーヘッドはなくなるわけだし
0205デフォルトの名無しさんNGNG
式テンプレート使ってメリットあるのははせいぜい乗算ぐらいまででしょ。
blitzもublasも逆行列なんかを使うのが悪いと言うようなスタンスだし。
実際、逆行列に使ったところで逆に覚えとかなきゃいけない要素が多くなると思う。
0206198NGNG
>>201 >>203
バカかおまえらは?
気になるならチェックしないバージョンつくって使いわければいいだろ。
operatorにこだわるならそういうことすらできないんだよ。
0207196NGNG
>>206
お前にバカっていわれたくないなぁ。
つか、お前のレスは人格攻撃、見下しばかりでつまらん。
そんなヤツとは議論しても実りがない。お前パスな。
どうぞ、勝利宣言でもなんでもしてくださいな。

>>204
式テンプレート一時期凝った時があるが
4x4のMatrix値返しした時のほうが早くなって愕然とした記憶がある。
あまりに凝ると最適化が効かなくなるんかいな??もしくは単にミスってたかな。
0208デフォルトの名無しさんNGNG
>>205
そこはそれでかまわないと思うんだけど、、、
まあ俺が実際に使うのは乗算と加算ばっかりだから要望ないだけかも。
数値計算屋さん(なの?)としてはどういう風にしてほしいものなのかな
0209デフォルトの名無しさんNGNG
>>196
ちょっとまってチェックするっていっても関数の頭でポインタのチェックするだけだろ?
ループ内部で条件判断するわけじゃないの無視できるでしょ?
ふつう行列演算C++でかくなら演算できるかどうかの行、列数のチェックはするだろうし。
一般にoperator=でもソースとデスティネーションの同一性のチェックはふつーするでしょ?

#行き着く先のET使っても、保守性が向上するとは言いがたいと思うのだが。
#blitz 見やすいか?使いやすいか?
0210198NGNG
>>207
あ、ごめん。ちなみに俺は194=198=200=206で189とは違うから。
勝利宣言はしますけど。

まともな行列ライブラリなら行列の乗算は式テンプレート使うんだろうね。
LiDIAってライブラリには3引数の関数あったけど。
0211デフォルトの名無しさんNGNG
こうしてみると、人は説得力のあることを言えないときに
その代替として人を馬鹿にするんだってのがよくわかるね。
0212198NGNG
あ、185も僕でした。
>>211
つまんない揚げ足とられたから腹立っただけだよ。
0213デフォルトの名無しさんNGNG
いや、罵倒と質問ばっかで、肝心の自論については
雰囲気しか示していない>>189=>>195が主な対象。
0214デフォルトの名無しさんNGNG
最後に、>>204
> operator の戻り値コピーの部分(最適化してくれないとして)がネックになるって話なのね。
最適化なんてしようがないと思う。
0215207NGNG
ホント、カッターで刺した小学生の気持ちがよくわかる。
刺した上で9Fから突き落としたくなったよ。
0216デフォルトの名無しさんNGNG
>>215
通報しますた。
0217デフォルトの名無しさんNGNG
>>210
3引数の関数とは例えば
A * B * C
を計算するような関数かな?
でもこれを計算する場合でもtmp領域は必要だよ。
数学上、2項演算しか定義されてないから(それで十分だから)
2項の計算結果をどっかに保存しないと次項の演算に移れない。
ただし、3項以上の演算を定義することでtmp領域の確保回数を
減ずることはできる。
実際、newmatなんかは行列計算の開始宣言、終了宣言して2項毎の
tmp確保を避けてたと思う(随分前に使ってたので記憶が定かでない)。
0218175NGNG
>>181
そんなとこです。

>>182
なるほど、()で括ってやれば良かったんですね。
どもでした。
0219デフォルトの名無しさんNGNG
>>218
>>177や>>179は無視か?
0220デフォルトの名無しさんNGNG
結局 C だとどんな魔法を使って C++ より高速に算術演算を行えるのか、誰か分かった?
キャッシュラインのサイズに応じたベクトル計算の自動分割とかしてくれるのかな・・・
0221デフォルトの名無しさんNGNG
OOP機能を駆使すると遅くなるので、Cの機能しか使いません。
0222デフォルトの名無しさんNGNG
>>221
こんな感じ?
struct Matrix matrix_mul(struct Matrix a, struct Matrix b) { ... }
0223デフォルトの名無しさんNGNG
C++はinline使いまくれるからCより速い
0224デフォルトの名無しさんNGNG
>>223
ttp://seclan.dll.jp/c99d/c99d07.htm#dt19990802

一応Cでもinline使えないわけじゃないが。
0225デフォルトの名無しさんNGNG
>>223
inline にすれば100%早くなるってもんでもない。
無駄にプログラムサイズが大きくなると、キャッシュミスが多くなるし。

inline があれば、高速化のために手動で関数を展開しちゃうという
愚行に走らなくて済むのは確かだけど。

あと、C言語でもコンパイラによっては inline 展開するようになってるし。
0226デフォルトの名無しさんNGNG
>>222
ポインタ使え。
0227デフォルトの名無しさんNGNG
do{
  cout << "終了しますか? Yes = y, No = n" << endl;
}while(cin.get() != 'y');

このコードを実行して、「n」を入力すると
「終了しますか? Yes = y, No = n」の部分が二回表示されてしまいます。。
キチンと表示させるには、どうしたら良いのでしょうか?
0228デフォルトの名無しさんNGNG
> キチンと表示
????
0229デフォルトの名無しさんNGNG
  cout << "終了しますか? Yes = y, No = n" << endl;
do{
}while(cin.get() != 'y');
0230デフォルトの名無しさんNGNG
do {
cout << "終了しますか? Yes = y, No = n" << endl;
} while (cin.get() != 'y' && cin.get() != '\n');
0231230NGNG
ごめん わすれて
0232230NGNG
これでどうだ?
do {
cout << "終了しますか? Yes = y, No = n " << endl;
} while (cin.get() != 'y' && cin.get() == '\n');
0233227NGNG
>>230
ああ、要するにコレ、バッファに「\n」が溜まってたって事なんですね…
なるほど、良く分かりました。
0234デフォルトの名無しさんNGNG
>226
>222は皮肉じゃないの?
0235デフォルャgの名無しさんNGNG
きっとこうなってるんだよ。
struct Matrix {
    struct Matrix_t *m;
};
0236デフォルトの名無しさんNGNG
すいません.蒸し返すようで悪いですが少しだけ.

>>169
>結局計算式そのものをどっかに格納しとかなきゃいけなかったりする。
そのような式オブジェクトは理想的な最適化の結果
コードから排除されるだろうというのがET支持者の一応の主張ではあるんですが・・・.

>>172
三項以上の演算,例えば行列におけるa + b + cなどにおいては
op=の形式では抽象化によるペナルティを喰らう可能性は残ると思います.
0237デフォルトの名無しさんNGNG
>>195
以下のようなコード(中途半端な擬似コードで申し訳ない)だと192さんの指摘するように,
一時オブジェクトは1行分だけで済むように思えるのですが違うのでしょうか?
Matrix &Matrix::operator*=(Matrix const &rhs)
{
assert(*thisの列数==rhsの行数 && rhsの行数==rhsの列数);
Row tmp;
for(size_t i = 0; i < *thisの行数; ++i){
tmp = *thisのi行;
for(size_t j = 0; j < *thisの列数; ++j){
*this(i, j) = 0;
for(size_t k = 0; k < *thisの列数; ++k){
*this(i, j) += tmp(k) * rhs(k, j);
}
}
}
return *this;
}
0238デフォルトの名無しさんNGNG
>>200
式テンプレートでは左辺と右辺の依存関係の問題は
代入メソッドの選択に一任される形になるかと思います.
通常の代入operator=では一時オブジェクトに結果を保存してから代入(swap)する形を取り,
ユーザが代入による依存関係の問題が発生しないことを保証できる場合のために
式オブジェクトから直接代入するための関数を別途用意する,とか.

>>205
通常,線形代数の数値計算では逆行列を陽に求めるのは最終手段(通常はご法度)なので
blitzやublasのスタンスは適切だと思います.
0239175NGNG
>>219
そんなとこです、が>>177や>>179に対する答えでもあったのですが。
分からなかった様ならスミマセン。
0240デフォルトの名無しさんNGNG
>>239
「俺は俺のやり方がなぜうまくいかなかったかが知りてーんだ。
そんな安易な解決策はとっくに思いついてんだよゴミクズどもが!」
ってちゃんと言わないと駄目だよ。
0241デフォルトの名無しさんNGNG
>>237
rhsが正方行列じゃなかったら困らない?
あと、rhsってなんの略?
0242デフォルトの名無しさんNGNG
>>241
なんで正方行列である必要があると思うの?
rhs = right hand side
0243デフォルトの名無しさんNGNG
>>242
列数が変っちゃうから。
なるほど。right(left) hand valueしか知らなかった。
0244デフォルトの名無しさんNGNG
返事がないな。
0245237NGNG
>>243
237のままだと正方行列である必要があります.
なので,237のコード中のassertで一応そのことを表明しているつもりです.
0246デフォルトの名無しさんNGNG
>>245
ほんとだ。よく見てなかった。でもそうじゃない場合は困るよね。
Matrixの乗算っていうのはたまたま出た例で、op=で一時オブジェクトが必要なときは
C式のスタイルよりパフォーマンスが悪くなるっていうのがもともとの議論。
0247デフォルトの名無しさんNGNG
大きな行列の場合にはデータ本体はシェアしておいて
copy on write とか使うようにするのはどうかな・・・
オーバーヘッドもたいしたことないと思うんだけど。
0248デフォルトの名無しさんNGNG
>通常,線形代数の数値計算では逆行列を陽に求めるのは最終手段(通常はご法度)なので
>blitzやublasのスタンスは適切だと思います.

逆行列のETなんかはやろうとしてもできない。もしくはパフォーマンスの向上、
リソースの節約に寄与しないからこそ提供できない。
できないってのとやらないのは違う。
技術的にET実装は非常に難しいことをはっきり言うべき。難しいので提供できませんでしたと。
それを数値演算で逆行列を使うのはおかしいなどというのはイソップの狐と同じ。
0249デフォルトの名無しさんNGNG
逆行列の計算はもとのマトリックスを破壊してもいいなら、
作業領域はほとんどいらないし、逆行列のひとつの成分を計算するのに
もとの行列のすべての成分が関係するから式テンプレートを使うメリット
はまったくないな。
式テンプレートを使わず逆行列のメソッドを提供すればいいのになんで
blitz++はやらないのかね?
それを使うかどうかはユーザが決めればいいんだがな。
0250デフォルトの名無しさんNGNG
つまりは行列に限らず、巨大なデータを何段階にも扱う計算はC++は苦手と考えてよろしいか?
0251デフォルトの名無しさんNGNG
>>250
C++ が苦手というか、operator overload で「数式っぽい見た目」でプログラミング
するのと相性悪いんだと思うよ。

これが 4x4 行列と 4 次ベクトル限定で、ベクトル演算用のレジスタ積んでる
プロセッサだと話が変わってくるけど。演算子オーバーロードを使う場合でも、

o 演算子に対応する関数をインライン展開
o 行列やベクトルの要素がコンパイラ最適化によってうまくレジスタに乗る

と、陽に関数呼び出しを行う C スタイルの書き方より早くなることもある。
0252デフォルトの名無しさんNGNG
>>250
C++でもCのような書き方をするなら別に苦手ではない。
それでも効率より見やすさや安全性を考えてクラス化してるんだと思う。
0253デフォルトの名無しさんNGNG
Adobeのソフトや、Windowsなんかは全部C++使ってるんでしょうか?
速度重視のコアの部分はCで書いてて、外側の部分はC++のような気がするんですが…。
どうなんでしょう?
0254デフォルトの名無しさんNGNG
最近C++を始めたばかりです。
・ある物の状態を監視
・その状態を表示
といった単純な事がやりたいのですが、その状態を表すクラスを↓のように定義して
class Status{
public:
Status() : dat(0){};
virtual ~Status(){};
void set(int i) { dat=i; }
int is() { return(dat); }
private:
int dat;
};
メイン関数では↓のように作りました。
Status st;
// 監視側
if(ある物の状態==true){
st.set(1);
}
// 表示側
if(st.is()==1){
表示;
}
が、これだと表示側からもdat.set()が呼べてしまうので危険です。
現状ではfriendを使ってやってるのすが、すっきりしません。
こういう場合、普通は(オブジェクト指向的に?)どのように作るものなのでしょうか?
0255デフォルトの名無しさんNGNG
4X4ぐらいの小さい配列だとだとpure C に比べてETのオーバーヘッドが目立つだけだよ。
もちろん何も考えず作業領域をoperator毎に作るようなコードに対しては
アドバンテージがあるかもしれないけど。
大きな配列を持ってこないとETは逆効果
0256デフォルトの名無しさんNGNG
>>254
コメントを日本語で書くのはやめることだな
0257254じゃないよNGNG
>>256
言わんとしているのは
 「監視」を英語に直して+パターン
ということかな
0258257NGNG
s/監視/監視側/
0259デフォルトの名無しさんNGNG
説明用のコメントだろ。アフォだね。
0260デフォルトの名無しさんNGNG
Observer Pattern?
0261デフォルトの名無しさんNGNG
>>259
じゃあ、おまえは「ひまわり」でも使ってろ(プ
0262デフォルトの名無しさんNGNG
さぁ盛り上がってまいりますか
0263デフォルトの名無しさんNGNG
>>254
インターフェースと実装を分離する。
0264237, 238NGNG
>>246
237は行列同士の*=で1行分しか一時領域が要らないのではないか,
という疑問を単に投げただけのもので,議論の本筋からそれたものでした.すいません.
>でもそうじゃない場合は困るよね。
はい困ります.ただ,困るのはCでもC++でも同じことだと思います.
>op=で一時オブジェクトが必要なときはC式のスタイルよりパフォーマンスが悪くなる
というのは,上の議論において未だ論拠が指摘されていないように見えます.
自分としても,Cスタイルにおけるmultiply_assign(Matrix &a, Matrix const &b)という記述と
operator+=の記述との間にパフォーマンスの差を生じさせるものがあるとは思えないです.

>>248
いえ,私が指摘したいのは,
「ETを実装{しない/できない} -> 数値演算で逆行列を使うのはおかしい」
ではないです.
数値演算で逆行列を使うことは悪いとするスタンスは適切ではないか,ということだけです.
ただ,これは数値計算の一般論の指摘でこのスレで書くべきことではなかったです.すいません.

>>249
>式テンプレートを使わず逆行列のメソッドを提供すればいいのになんでblitz++はやらないのかね?
以下は私の中途半端な知識による考えです.適当に流してください.
通常,行列の逆行列が真に必要となる場面は非常に限られ,ほとんどの場合,
逆行列を陽に計算するよりも適切なアルゴリズムを選択する方が
計算量・精度双方の観点から圧倒的に有利になります.
例えば,行列の逆行列と{ベクトル/行列}との乗算では直接逆行列を計算することは論外で,
通常はLU分解法で行列を三角化してから計算します.
なので,あえて逆行列を陽に求めるメソッドを提供せず,逆行列を表す式オブジェクトとの演算を
適切なアルゴリズムにdispatchしているのではないかと愚考します.あくまで私見です.
0265デフォルトの名無しさんNGNG
みなさんはbad_alloc例外ってどう扱ってますか?

最近VC6.0から7.1に移行してとまどってる厨房です。
いままでは、

char* buf = new char [256];
if (buf) {
 delete [ ] buf;
}

みたいにしてたのを、
(auto_ptr, shared_ptrを使わないとすると)

try {
 char* buf = new char [256];
 delete [ ] buf;
}
catch (bad_alloc&) {
 delete [ ] buf; ← 例外の場合も開放しなきゃだめ?
}

にすればいいんでしょうか。

nothrowを指定するっていう方法もあるけど、
なんかDEBUG_NEWがあるとコンパイルエラーになるし...


0266デフォルトの名無しさんNGNG
>>264
>例えば,行列の逆行列と{ベクトル/行列}との乗算では直接逆行列を計算することは論外で,
>通常はLU分解法で行列を三角化してから計算します.

LU分解は大規模疎行列には使わない。逆行列を陽に求めないというのは同意。
0267デフォルトの名無しさんNGNG
>>266
LU分解は密行列にしか使いませんね.舌足らずでした.すいません.
0268デフォルトの名無しさんNGNG
>>265
> みなさんはbad_alloc例外ってどう扱ってますか?
即興プログラムなら放置してabort()逝き。
まともなプログラムなら適切にcatchを配備。

> delete [ ] buf; ← 例外の場合も開放しなきゃだめ?
まずは、コンパイル通してから出直せ。
0269デフォルトの名無しさんNGNG
>>264
>はい困ります.ただ,困るのはCでもC++でも同じことだと思います.
>というのは,上の議論において未だ論拠が指摘されていないように見えます.
>自分としても,Cスタイルにおけるmultiply_assign(Matrix &a, Matrix const &b)という記述と
>operator+=の記述との間にパフォーマンスの差を生じさせるものがあるとは思えないです.

過去ログちゃんと読めよ。昨日さんざん話したっていうのに。
A *= B の場合、一行分の作業領域もしくは行列1個分の作業領域とコンストラクタ、swapの呼び出しが必要。
C = A * B の場合、行列一個分の作業領域とコンストラクタ、コピーコンストラクタの呼び出しが必要(RVOが使えなければそれ以上)。
multiply(Matrix& C, const Matrix& A, const Matrix& B) を使った場合、
&C == &A の場合、A *= Bと一緒、
&C == &B の場合、一列分の作業領域もしくは行列1個分の作業領域とコンストラクタ、swapの呼び出しが必要。
&C != &A && &C != &B の場合、領域もコンストラクタもswapもいらない。
三番目のパターンはoperatorでは実現できない。受ける変数のために行列一個分の作業領域とコンストラクタが必要でも、
コピーコンストラクタ分は得する。あと変数を使い回せるという利点もある。

Matrix A = ...;
Matrix B = ...;
Matrix C = ...;
Matrix D = ...;
Matrix E;
//E = A * B * C * D;
multiply(E, A, B);
multiply(A, E, C);
multiply(E, A, D);
0270デフォルトの名無しさんNGNG
>>265
VCに限定していいなら__try〜__finallyを使う。
ちょっとしたものを書くときにクラス化しなくていいのは便利なんだけどな。
標準にして欲しい。
0271269NGNG
>>264
議論を理解してないようだけど、
multiply_assign(Matrix &a, Matrix const &b)とoperator+=を比較してるんじゃないよ。
>>187 参照。
0272270NGNG
スマン。265の回答にはなってない。
0273264NGNG
>>271
自分の理解が浅く,議論を蒸し返しただけでした.申し訳ないです.
0274デフォルトの名無しさんNGNG
finally使うんじゃもうC#つかった方がいいんじゃないの?
0275デフォルトの名無しさんNGNG
>>264
>例えば,行列の逆行列と{ベクトル/行列}との乗算では直接逆行列を計算することは論外で,

論外かどうかは用途とか行列サイズによる。理論式上では多用する分野もある。現実問題にアプローチ
する前に理論検証したい場合だってある。
あるいは自分が作った疑似逆行列アルゴリズムと理論式どおりの逆行列アルゴリズム間で精度や速度がどれだけ違うか
比較したい場合もある。
うまくいかなかった場合、元の理論がわるいのか、誤差が利いてきてるのか切り分けたい場合だってある。
そんなもんはケースバイケース。論外とするのはサイズの大きいマトリックスで実行時間もかかるし、求めたところで
誤差が大きくなって使い物にならないって言う場合。
事実、数値計算電卓のMATLAB/Octaveでは用意はしてる。

除算は理論的にワンショット(最小システムクロック)で算出できないから用意しませんでした。というプロセッサより
用意したがそれなりに実行コストはかかります。というのがユーザとしてはありがたいと思う。
ただ、逆行列のET実際はほとんど不可能だ。
0276デフォルトの名無しさんNGNG
>>274
C#なんていうクソ遅い言語は問題外。ベンチマーク取ってもVC7.1の1/2以下
の速度しか出ない。
0277デフォルトの名無しさんNGNG
>>276
それをいうなら
見やすいC++のコードを書いたら同機能のCの1/4の速度になったことあるよ。
もっというと、Cだと遅すぎるのでasmでチューンしたら3倍速くなったことがあるよ。
全部Verilogで書き直して組み合わせロジックだけで実現できたので1クロックで
処理できるようになったことがあるよ。

必要に応じて開発手段を選択するのが設計。
0278254NGNG
>>257
Observer Patternを調べてみて、だいたいどのようなものかは
分かったのですが、実際に監視側と表示側のソースをちょっと
書いていただけないでしょうか?
初心者なもんでそういう設計自体の方法がよく分からなくって・・・

>>263
こちらもできればお願いします。
0279デフォルトの名無しさんNGNG
>>265
bad_allocはnew演算子内から投げられる
bufには値は代入されていない
解放する必要がある/ないの前に
どこを解放するつもり?
0280デフォルトの名無しさんNGNG
>>279
イラク
0281デフォルトの名無しさんNGNG
>>280
イラクって解放できるの?
0282デフォルトの名無しさんNGNG
解放はできるけれど、解放した段階で未定義動作になります。
0283デフォルトの名無しさんNGNG
s/解放は/解放しようとすることは/
0284デフォルトの名無しさんNGNG
>>277
どうもよくわかんないんだけど、このレスで "C++" っていうとテンプレートや
オペレータの再定義等の C にない機能を使ったコードに限定されるの?

漏れはクラス一切無しのコードでも C++ で書くけど。
ネームスペースとか C99 風のいつでも出来る変数宣言とかありがたいし。
それで別に C より遅くなってる気もしないけど・・・
0285デフォルトの名無しさんNGNG
>>284
遅くなくて当たり前だ。
0286デフォルトの名無しさんNGNG
C 相当のコードで速度差がないのは自明なので議論の対象にならないだけ。
0287デフォルトの名無しさんNGNG
例えばg++, gccでC相当のコードのアセンブラが同一になるのは自明なの?
この部分のコンパイラは同一のコード同一の人間が書いてる?
0288デフォルトの名無しさんNGNG
このケースで「当然同じような速度になるはず」と思えないようだった
ら、コンピュータのプログラミングに対するセンスが欠如してると認識
したほうがいいよ。

ちなみに gcc と g++ だと、ソースコードがプログラミング言語非依存
の形式になった後は、まったく同じルーチンで最適化されてアセンブリ
出力される。VC++ の cl.exe の中身なんて知らんが、C と C++ でわざ
わざ別の最適化なんてするとは思えないでしょ。

0289デフォルトの名無しさんNGNG
全く同じプログラミング言語非依存の形式になるかどうか。
0290デフォルトの名無しさんNGNG
227で質問した者ですけど、
cin >> data;
した後、バッファに「\n」が残ったりしますけど
クリアするには、「cin.get()」とか「cin.ignore()」しかないんですかね?
0291デフォルトの名無しさんNGNG
>>290
俺は getline()派だ。
0292290NGNG
>>291
でも、象徴的に書ける「>>」が好きなんですよ。
「getline()」だと、Cと変わらないですし…
0293デフォルトの名無しさんNGNG
>>292
string使うから、それだけでも大きく違う。と、思う。
少なくとも、Cと変わらない、は偏見じゃないか?
0294290NGNG
>>293
Cと変わらないはちょっと言い過ぎでしたが…
それと、stringつかうというのはどういう事ですか?
0295デフォルトの名無しさんNGNG
本を持ってる人にしか分からない質問で申し訳ないのですが
Exeptional C++ の34ページの
>T::operator=()は、例外を投げた際に代入しようとしていたTオブジェクト
>の値が変更されてないことを保証しなければならない。
の意味が分かりません。そんな必要は無いと思うんですけど。
0296デフォルトの名無しさんNGNG
>>294
char[]じゃなくstd::stringが使えるからって事でしょ。

改行残るのは、なんかflushとかしたらよかった気がする。
環境依存かもしれんしうろ覚えだから違うかもしれんけど。
0297デフォルトの名無しさんNGNG
120 名前:番組の途中ですが名無しです[] 投稿日:04/06/10 02:39 ID:DlgC++i0
>>116
「かわいい彼女」といっても三日で飽きるわけだが。

121 名前:番組の途中ですが名無しです[sage] 投稿日:04/06/10 02:40 ID:Qn1mrozU
>>120
3日で飽きても
なにもないより全然マシじゃないのこのC++野郎
0298295NGNG
あともう一つ。swapが例外を投げないことを強調していますが、
アトミックでありさえすれば例外は投げてもよいように思えます。
なんで例外投げちゃいけないんですか?
0299デフォルトの名無しさんNGNG
>>298
標準化委員会でそう決定したからです。理由は標準化委員会に問い合わせて下さい。
0300規格制定委員会議長NGNG
>>299
こちらに聞かれてもこまります。
禿げに聞いてください。
0301295NGNG
>>299
どういうことですか?
コンテナとかの swapも throw()宣言されてませんが。
0302デフォルトの名無しさんNGNG
>>295
ん〜、科学的には説明できないけど、感覚として。

Cでも関数がエラーを返したのにポインタ経由で渡した引数を
ぐちゃぐちゃにされたらムカつくしな〜。

sturct Nanka iremono;

iremono.sono1 = saisyokarahaitteitamono;

if(ERROR == NannkaChoudai(&iremono)) {
 assert(iremono.sono1 == saisyokarahaitteitamono);
}

これでassert()に失敗したらムカつく。

それと同じようなものを感じる。

もしoperator=( )が例外を投げたのに中途半端にオブジェクトが
変わっていたらきっとムカつくな。
0303デフォルトの名無しさんNGNG
>>287
$gcc -dr hoge.c
$g++ -dr hoge.cc
とした時の出力はちょっと違うんだよねえ。
しかし最終的なアセンブラコードはほぼ同じ。どうしてでしょう。
0304デフォルトの名無しさんNGNG
わざわざCとC++で分けないでしょってのは概ね同意だけど、
CとC++は仕様量が格段に違うんだから
それによって最適化しやすくなったり、
逆に不確定要素が増えて最適化しにくくなったり
ってのはあると思うんだけど、なんで誰も指摘しないのかな。
0305デフォルトの名無しさんNGNG
>>304
例外に対処するためのコードが埋め込まれたりして?
0306デフォルトの名無しさんNGNG
スレの流れを折ってしまって申し訳ないですが、
vectorのN番目の要素を削除したいときって、
erase()を使うしかなくて、erase()の引数はイテレータしかないですよね。

そこでこんな↓関数を作ってN番目の要素を指すイテレータを取得しようとしたんですが・・・
template <class Cont> Cont::iterator GetNItr(Cont c, int n){
Cont::iterator it = c.begin();
for(int i = 0; i < c.size(); ++i, ++it)
if(i == n) break;
return it;
}
帰ってくるのは不定値ばかり。一体なぜなんでしょうか?(試した環境はVC6です。)

それ以前に「N番目の要素のイテレータの取得」なんて
かなり使いそうな気がするんですがBoostとかにもないですよね。
やっぱり「イテレータ=反復子」という名前に反した使い方だからですかね??
0307デフォルトの名無しさんNGNG
不定値とだけ言われても困るけど
つーか std::advance じゃだめなん?(戻り値として iterator を返してくれないから使いにくいけど)
0308デフォルトの名無しさんNGNG
erase(vec.begin() + n) ってやれば?
0309デフォルトの名無しさんNGNG
つーかvectorならbegin() + NでN番目を指すiteratorが帰ってくるはずだが
0310規格制定委員会議長NGNG
>>304
>なんで誰も指摘しないのかな。
ヴァカなお前に付き合うの嫌だから。
0311デフォルトの名無しさんNGNG
>>306
とりあえず、その関数は

引数で Cont c ってやってるから、コンテナがコピーされ、コピーされた方の要素を指すイテレータが返るからダメになる。

Cont &cなら思ったとおりにいくんじゃね?まc.begin()+Nの方が断然いいが
0312デフォルトの名無しさんNGNG
ファンクタ書く時に、
operator() 内で、
static std::vector< double > tmp;
ってインスタンス作るのと、
private 内に、std::vector< double > tmp
のインスタンス作ってoperator() 内で使うのと
どっちがいいんですか?
0313デフォルトの名無しさんNGNG
>>312
privateインスタンスのほうがstaticよりマシ。
0314デフォルトの名無しさんNGNG
>>295
http://www.boost.org/more/generic_exception_safety.html
0315290NGNG
>>296
それは分かるんですが…
「cin.getline()」使用時に「std::string」をどの様に利用するのですか?
0316デフォルトの名無しさんNGNG
たぶん、そっちじゃなくてstd::getline()のことを言ってるんだと思うよ。
0317290NGNG
>>316
なるほど。「std::getline()」だったのですね。
良く分かりました。
0318デフォルトの名無しさんNGNG
>>301
throw() 宣言すると、コンパイラが例外処理のためのコードを追加するから、
パフォーマンスを考えれたら、throw() は入れない。

あと、operator= が例外安全でなければいけない理由は、

simpleDBTable.Current["NAME"] = "MONA";

のような簡易データベース中の項目を置き換えるコードがあったとして、
この中で例外が発生したとき、すでにある項目が消されたら困るでしょ?
0319デフォルトの名無しさんNGNG
>>318
>パフォーマンスを考えれたら、throw() は入れない。
なるほどパフォーマンスの問題ですか。

>この中で例外が発生したとき、すでにある項目が消されたら困るでしょ?
そんなことは分かっているのですが(基本的に全ての関数はアトミックにすべき)、
この文脈でその必要はないのではと。例外投げられたら deleteされるので。
0320デフォルトの名無しさんNGNG
>>319
> 例外投げられたら deleteされるので。
そうは言えない。

T x = initial_value;
try
{
 x = new_value;
}
catch( ... )
{
}
// x はまだ生きている。
// ここで x の値は initial_value か new_value か、どちらかであると言えなければ、
// 以降、 x へアクセスしたときの動作が把握できない。
0321デフォルトの名無しさんNGNG
>>318
> 例外投げられたら delete される
誰が delete するのさ?
君はデータベースの更新に失敗したら即座にテーブルを破棄するのか?

0322デフォルトの名無しさんNGNG

何らかの例外が発生したときに、
1. その例外を呼び出し元に正しく通知する。(例外中立)
2. 例外が発生しても、オブジェクトの状態は変化しない。
  もしくは例外を出さない。(例外安全)

というのが、例外安全の基本。これを >>295 は理解しているのだろうか?
コンストラクタで例外が発生した場合、そもそもオブジェクトそのものが作成されないが、
代入処理の場合、例外が発生しても依然としてオブジェクトは存在している。
例外から回復して、オブジェクトを再度いじろうとしたときに内容が不定では話にならない。
0323295NGNG
>>320 >>321 >>322
おんなじこと何度も何度も書きやがって。んなこたー分かってる。
Exceptional C++ 33,34ページの話だYO!
catch してから deleteしてるだろ。
だからクラスTにアトミックな代入演算子は要求しないと思うんだよ。

あと swapについて。
確かに例外を投げないほうがいいときもある。
例えば73ページの第二の試み。最後に代入演算子使ってるけど、例外を投げない swapがあればそれで解決する。
でも Stackの例だとアトミックであれば例外は投げともよいと思うんだよ。
そこらへんどーよ。
0324デフォルトの名無しさんNGNG
>>295
まあ、おちついて。

"代入しようとしていたTオブジェクト"
とはコピー元をさしてっるて解釈はどお?
コピー元がconstでもmutable変数含んでりゃ
同にでも出来るし。

swapについてだけど、逆にswapが例外を投げる可能性がある場合、
swap(v1,src.v1);
swap(v2,src.v2);
swap(v3,src.v3);
見たいなメンバ関数を例外安全にするのは大変だYO!みたいな事が
言いたかったって解釈はどお?
0325デフォルトの名無しさんNGNG
>>323
> Exceptional C++ 33,34ページの話だYO!
そんなコード片の話をしてたのか、そりゃ気付かなかった。
例外発生したときの対応がdelete一択なら、たしかに、そんな要求はないよ。

でも、>>295で引用された2行が、より一般的なケースでの指針である可能性はないのかい?
本読んでないからわかんないだけかもしれないけど。
0326デフォルトの名無しさんNGNG
>>324
> "代入しようとしていたTオブジェクト"
> とはコピー元をさしてっるて解釈はどお?

明らかに問題外。
0327324NGNG
>>326
そお?例えばCOWな実装のstringの場合
代入時にコピー元にも影響ありそうだけど
0328295NGNG
>>324
よく分からんけど自己代入ってこと?
でもコピー先は newしたばっかの領域だし。
swap についてはその通りですね。
でも Stackの例は適切ではないと思います。

>>325
>でも、>>295で引用された2行が、より一般的なケースでの指針である可能性はないのかい?
そう読めなくもありません。訳の問題なのかも。
でも 58ページに
Stack を例外安全にするために、唯一例外安全にしなければならないTのメンバ関数
なんて書いてます。
0329デフォルトの名無しさんNGNG
>>327
そんな話は関係ない。>>295の引用に対する解釈の仕方が問題外だってこと。
0330デフォルトの名無しさんNGNG
>>323
そういうことかよ。まぁ、悪かった。
でも今は会社だから手元に本がないんだよなー。

ただ、すこし言わせてもらえば、
アノ本は 代入処理は以下の形式にしなさいというのがキモで、
途中のイロイロは、すべて以下のコードにもっていくための「布石」だと思う。

this_type & this_type::operator=( this_type const & rhs )
{
  this_type( rhs ).swap( *this );
  return *this;
}

だから、途中のコード云々で話をするのはまったくもって無意味だと思うのだが、どうか?
0331デフォルトの名無しさんNGNG
状態が「不定」なオブジェクトは delete 出来るの?
0332295NGNG
>>330
その swapは例外を投げない保証をする必要ありますか?

>>331
確かに!!!
0333デフォルトの名無しさんNGNG
>>331
できないかもしれない。
けど、最低限それだけは保証してもらわないと、どうやっても回復できなくなってしまう。
例外に対する対応がプログラムの終了以外ほぼ選択肢がなくなってしまうだろう。
(ほかには、そのオブジェクトに2度と触らないようにするくらい?)

解体すらできなくなってしまうような仕様のクラスは作らないのが常識だろう。
0334デフォルトの名無しさんNGNG
>>332
> その swapは例外を投げない保証をする必要ありますか?

this_type::operator=()への要求として例外安全性が必要なければ、
必要ない。

this_type::operator=()への要求として"no-throw gurantee"が必要ならば、
swapへの要求として引数に対する"no-throw gurantee"が必要。

this_type::operator=()への要求として"strong gurantee"が必要ならば、
swapへの要求として引数に対する"strong gurantee"が必要。

this_type::operator=()への要求として"basic(以下略)
0335334NGNG
s/引数に対する//
0336デフォルトの名無しさんNGNG
>>334
まあつまり例外を投げない保証をする必要はないですよね。
この本 swapが例外を投げないことをやたら強調してますが、その理由が示されていないように思えます。
0337デフォルトの名無しさんNGNG
>>330
> その swapは例外を投げない保証をする必要ありますか?
ある。

>>330 のコードにおいて、swap が例外を発生させる場合を考えると、
>>322 の 2. を満たすためには、
operator= は以下のように直す必要があるが …

this_type & operator=( this_type const & rhs )
{
 this_type temp( rhs );
 ... // this の状態を保存する。※1
 try { temp.swap( *this ); }
 catch( ... )
 {
  ... // this の状態をもとにもどすコードを入れる ※2
  throw;
 }
 return *this;
}
ここで、※ にどのようなコードを入れればいいかを考えるといい。

さらに、A.swap( B ) において、A のメンバの一部と、Bのメンバの1部だけが
入れ替わった状態で例外が発生すると、>>322 の 2. を満たせなくなる。

面倒なことをイロイロ考えなくてもいいように、swap は例外を出しちゃ駄目ってことになってるの。
0338デフォルトの名無しさんNGNG
>>336
例外が発生したときには、内部状態が変更されていないことを保証するクラス(群)を
構築する際には、例外安全な swap を用意すると便利だよ、STLもそうしてるよ、
っていう話だと思うけど。boost も同じ方針ですよね。
0339デフォルトの名無しさんNGNG
>>313 何故なんでしょうか?
また、マシって事は他にお勧めがあるんですか?
0340デフォルトの名無しさんNGNG
>>337
だーかーらー swapはアトミック性だけ保証してればいいんじゃないですか? アフォ?

>>338
あなたの言う例外安全っていうのは例外を投げないって意味ですか?

例外を投げないことがアトミック性を実現する一番簡単な方法ってなら分かりますが、
Exceptional C++ は swapが例外を投げないってことを強調しておきながら
そのちゃんとした説明がなされていないと思うんですよ。
0341デフォルトの名無しさんNGNG
>>340
swap がけして例外を投げないわけではない。
ポインタのスワッピングだから例外を投げないのだよ。わかるか?
0342デフォルトの名無しさんNGNG
>>341
???
組み込み型のスワッピングは例外を投げませんね。
再帰的に全てのスワッピングは例外を投げませんね。
swapは例外を投げないものだってのは分かります。
例外投げたらなんか無理してるってのも分かります。
でも Exceptional C++ 48ページに
> Swap() はどんな状況下であっても例外を投げない。
> Swap() のこの特徴こそが、Stack自身の例外安全に関する論証の要なのだ。
って書いてます。
Stack 内で StackImpl::Swap()は2回使われていますが、
これらが例外を投げたとしても Stackの例外安全性は損なわれないと思うんです。
0343デフォルトの名無しさんNGNG
そもそもC++の例外処理ってプロの方々は積極的に使っているので
しょうか?あんまりパフォーマンスがよくないとかいう話も聞くし。
どちらかというと、プログラムの連結とかそういうときに持ち出すの
ですか?
0344デフォルトの名無しさんNGNG
>>342
StackImpl::Swap のコードは、3つの std::swap から成り立っていて、
そのすべてが組込型に対するスワッピングである以上、StackImpl::Swap は
決して例外をスローしない。ここまではいいと思う。
そして、Swap が例外を投げない以上、これを積極的に使わない手はない。

で、それをふまえた上で、>>342 は、次のどちらを言いたいのか?

 1. Swap が無くても例外安全に出来るじゃないか。
 2. Swap が決して例外を投げないというその理由がわからない。


どうも、あなたの言いたいことがピンとこない…
0345デフォルトの名無しさんNGNG
>>344
僕が言いたいのは、Exceptional C++ の48ページの主張の真意を教えてくれ(Stackの例、間違ってんじゃねーの?)ってことです。
Stack がアトミックなのは Swapが例外を投げないからじゃなくて Swapがアトミックだからだ。
Swapが例外を投げないのはただの結果であって、この場合必要ではない。
と、僕は思うんです。

あー同じこと何回書いただろう。
0346デフォルトの名無しさんNGNG
C++で、継承についてわからないことがあります。

class A
{
 SetOne();
 SetTwo();
};

class B
{
 SetOne(;);
}

class C
{
 SetTwo();
};

というクラスがあったとします。クラスB、CはクラスAにある関数と同じものを一つずつ持っています。
このとき、同じことを何度も定義すると無駄なので、継承を考えますが、必要ない関数まで継承されて
しまいます。継承先で、必要のない関数を消す方法などはないのでしょうか?
また、何か解決策がありましたら教えてください。
0347デフォルトの名無しさんNGNG
必要な関数だけのクラスを作りましょう。
0348デフォルトの名無しさんNGNG
>>346
class A : public B, public C {};
なんじゃないのか?
0349131NGNG
>>346
struct afo { virtual SetOne() = 0; };
struct sine { virtual SetTwo() = 0; };
class black { /* ry */ };
class c { /* ry */ };
class A : public afo, public sine { black b; c dakko; /* ry */ };
class B : public afo { black b; /* ry */ };
class C : public sine { c dakko; /* ry */ };
0350デフォルトの名無しさんNGNG
>>345
Swapは絶対に例外を投げない を
Swapは絶対に失敗しない に読み替えれば納得いくんでない?
0351デフォルトの名無しさんNGNG
>>350
もったいぶらないではっきり言えよ。
なにが言いたいのか全くわからねえよ。
0352デフォルトの名無しさんNGNG
それぞれ関数の中で、同じ構造体に値を渡すのですが、この場合多重継承で考えると
かなりややこしい作りになってしまうんですが、もっとすっきりしたものにできないでしょうか?
できれば多重継承はない方向でいきたいと思ってます。
0353352NGNG
346です。
0354デフォルトの名無しさんNGNG
>>345
本の著作者にメールで真意を聞け
0355デフォルトの名無しさんNGNG
JAVAのStringTokenizerと同じような機能を持つ関数って
CやC++にはないですかね?
地道にクルクル回すしかないのでしょうか。
0356デフォルトの名無しさんNGNG
>>352
ソースさらすの下手っ取り早いかと
0357デフォルトの名無しさんNGNG
>>351
それで理解できないなら、その程度の頭ってことだ。
0358デフォルトの名無しさんNGNG
>>357
考えてみても分からん。まじで分からん。
教えてくれ。たのむ。
0359デフォルトの名無しさんNGNG
ソースはかなり長くなってしまうので無理ぽいです。
なのでかなり端折りますが、以下のような構造体を持つクラスがあります。
これはDirectXで用意されている構造体です。

typedef struct _D3DLIGHT9 {
D3DLIGHTTYPE Type;
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Ambient;
D3DVECTOR Position; // ディレクショナルのとき無視
D3DVECTOR Direction; // ポイントのとき無視
float Range; // ディレクショナルのとき無視
float Falloff; // ポイント、ディレクショナルのとき無視
float Attenuation0; // ディレクショナルのとき無視
float Attenuation1; // ディレクショナルのとき無視
float Attenuation2;// ディレクショナルのとき無視
float Theta; // ポイント、ディレクショナルのとき無視
float Phi; // ポイント、ディレクショナルのとき無視
} D3DLIGHT9;

type には ポイントライト、スポットライト、ディレクショナルライトがあります。
それぞれのライトには適用されず無視される変数というのが存在しています。
パラメータの前に書いてあるメッセージがそれです。
この構造体のすべての値を変更できるように、それぞれに対してセッターを作ると
実際に使用するときに、間違って無効なパラメータを設定してしまう場合があると思います。
これを防ぐために、3つのライトそれぞれをクラス化して、無効なパラメータを設定するような
関数は省きたいと思っています。
0360デフォルトの名無しさんNGNG
よーやくわかったよ。だからこれで最後。


わたしが想像する サッターさんの真意は、
P35 や P37 のガイドラインおよび、P42 の 3 にあると思う。
それをうけての P48 の記述。

彼の譲れない部分(信念)として、「例外を起こす可能性のある処理」をすべて最初に行い、
「例外を投げる可能性のある処理で状態変更をしてはならない」わけ。
例はあくまで例。言いたいことはコレ。

以下駄文。国語のテストみたいなもん。

Swap に求められていることは、「アトミック」だとか「例外安全」とかいうことではないと思う。
本当に求められているのは、きっと「絶対に失敗しない」こと。
「ここまで来れば絶対成功する」という保証。だから、アトミックであることはもちろん、例外を投げるなんて論外。

まぁ、そういう宗教だと思えばいいじゃん。
0361360NGNG
あ、360 = 342 ね。


0362デフォルトの名無しさんNGNG
>>360
あっはっはー
やーい逃げた逃げた
何が宗教だ ぼけ
0363デフォルトの名無しさんNGNG
例外を投げるくせにアトミックというのがよくわからん。
教えてエロいひと!!
0364デフォルトの名無しさんNGNG
>>359
struct PointLight : D3DLIGHT9 {
  ポイント用セッター
};
としておいて、生の変数には直接触らないと誓う。
もしくは、AbstructLightクラスのメンバにD3DLIGHT9を持たせて、外からは触らないようにするか。
どっちにしろ、あんまりこだわっても大して嬉しくはならないので、適当なところで妥協することを薦める。
0365デフォルトの名無しさんNGNG
そもそも例外安全な代入をやりたいのに、代入とは別の処理であるSwap()が失敗されちゃあ、たまらん。
失敗する可能性が本来の代入処理より増えるのであれば、そんなロジックは採用したくない。
0366デフォルトの名無しさんNGNG
>>360 >>361 >>362
え? 騙られてんの?

>>360
なるほどねえ。そう考えればつじつまは合わなくもない。
例はあくまで例というけれど、そんな破綻した例を持ち出して 48ページのような強い物言いをするかな?
信念があるのはよいけれど全く例が伴ってないよ。
>>323 に書いたように swapが例外を投げちゃいけない例ってのがあって、しかもその信念にぴったりなのにね。
0367デフォルトの名無しさんNGNG
本の内容に納得いかないのなら、著者に文句を言うべきだ。
0368デフォルトの名無しさんNGNG
>>364
>>生の変数には直接触らないと誓う。
誓うというのは、基本的に自分ならば大丈夫ですが、それ以外となると不可能なので。
妥協して無駄に同じ処理を記述するようにします。
ありがとうございました。
0369デフォルトの名無しさんNGNG
>>365
そんなレベルの話をしてるんじゃねえよボケ、と言いたいところだけど
著者の真意は案外そんなとこかもしれない。

>>367
そうですね。これだけ粘っても誰も説明できなかったので、著者は電波ってことで納得します。
スレ汚しスマソ。
0370デフォルトの名無しさんNGNG
295の態度が徐々に変わってゆく姿が笑える。
0371デフォルトの名無しさんNGNG
>>369
>>363 の質問にも答えてやってくれ。
例外を出して、かつアトミックな処理の例とか出してくれると助かる。
0372デフォルトの名無しさんNGNG
>>371
そんなもん try,catch 使えばいくらでも書けると思うけど、好みじゃないので。
例えば >>330
最初のコピーコンストラクタが失敗しても、状態は変化していない。
その後の swapは例外を投げない、もしくはアトミックなので例外が起きても大丈夫。
最後の returnは参照渡しだから例外を投げない。

より一般化すると >>314

template <class Container, class BasicOp>
void MakeOperationStrong( Container& c, const BasicOp& op )
{
Container tmp(c); // Copy c
op(tmp); // Work on the copy
c.swap(tmp); // Cannot fail
}

op() がアトミックじゃなくても swap()がアトミックであれば、副作用が一つの処理なら
どんな処理でもアトミックにできると思う。

副作用が二つあったりすると、例外を投げない swap() が必要になると思う。
まあ swap()は例外を投げないべきだけどね。
0373デフォルトの名無しさんNGNG
文章いじったらおかしくなった。

op() がアトミックじゃなくても swap()がアトミックであれば大丈夫。
アトミックな swap()があれば、副作用が一つの処理ならどんな処理でもアトミックにできると思う。

にして。
0374デフォルトの名無しさんNGNG
あぁ、アトミックってそっちかYO!
てっきりクリティカルセクション的なアトミックを連想したよ。
つまり、

T temp( a ); a = b; b = temp;

ってあったら、そのすべてが必ずひとまとまりに行われるってのを想像した。
0375デフォルトの名無しさんNGNG
>>295は釣り師だったということで、終わりにしようぜ。
0376313NGNG
>>339
staticインスタンス
×寿命が(おそらく)不必要に長くて、さらにその寿命はほぼ制御不能。
×さらに関数内staticは関数外からのアクセスは不可能。
○毎回作り直さないので、生成、破棄のコストがかからない。
×マルチスレッドに対応不可能。

privateインスタンス
○寿命はファンクタの寿命を超えない範囲で自由に制御できる。
○メンバ関数を通してアクセスが可能。
×毎回作り直すので、生成、破棄のコストがかかる。
○マルチスレッドに対応可能。

お勧めは、ファンクタのコンストラクタでstd::vector<double>への参照を受け取り、
メンバにポインタを保持する方法。
アルゴリズムのファンクタ引数は値渡しで実装されている可能性が高いので、
コピーのコストを抑えた方がいいケースが多い。
0377デフォルトの名無しさんNGNG
>>355
boost::tokenizerでかなりの事はできない?
0378デフォルトの名無しさんNGNG
>>368
ポイントライトの位置設定とスポットライトの位置設定が同じ処理になることが偶然
と考えれば、別の関数としておくことに意義を見出せないか?
0379デフォルトの名無しさんNGNG
>>376 それを指針に考え直してみます。
詳しい説明有難うございました。
0380デフォルトの名無しさんNGNG
EUCからShift Jisに変換するにはどうしたらいいでしょうか?
0381デフォルトの名無しさんNGNG
nkf
0382デフォルトの名無しさんNGNG
>>376
特徴としてあげている箇条は大筋いいが
目的が示されていない以上そこまでだろ
どっちがお勧めという根拠がないぜ
0383デフォルトの名無しさんNGNG
>>380
EUC2SJISを使えば変換してくれるよ♪
0384デフォルトの名無しさんNGNG
visual cとturbo cとc言語とc++との
区別が付けられません
0385デフォルトの名無しさんNGNG
>>384
区別をつけられなくて困っていることがあるのか?
0386デフォルトの名無しさんNGNG
小文字厨らしいな
0387デフォルトの名無しさんNGNG
>>384
>(visual cとturbo c)と(c言語とc++)との
E-mailとインターネットはどっちがいいですか?
ってのと同じくらい的外れな質問だぞ
0388デフォルトの名無しさんNGNG
>>380
http://tohoho.wakusei.ne.jp/wwwkanji.htm
下の方
半角文字は考えられていないようなので注意
0389デフォルトの名無しさんNGNG
>>380
EUCコード&0x7f7fしてからwctombs()だっけ?
0390デフォルトの名無しさんNGNG
>>389
Shift-JISだぞ。
0391デフォルトの名無しさんNGNG
>>380
iconv()
0392デフォルトの名無しさんNGNG
小文字厨なんてのもいるのか
0393デフォルトの名無しさんNGNG
いるようだ。
全角厨より、100倍マシだと思うけど。
0394389NGNG
wcstombs()か。つーか寧ろmbcjistojms()で一文字ずつ変換した方が楽か。
>>390
それが何か?

まぁ実際には、自分でコーディングしちゃうんだけどね。
0395デフォルトの名無しさんNGNG
>>394
&0x7f7fしたら1バイト目の8ビット目まで0になってしまうと思うんだけど。
0396デフォルトの名無しさんNGNG
http://ime.st/ime.st/www.personal-media.co.jp/book/c/ansi.html
これ、最強
0397デフォルトの名無しさんNGNG
http://tohoho.wakusei.ne.jp/wwwkanji.htmを見る限り、389が言っているのはEUC->JISに見える。
0398389NGNG
>>395
それがなにか? EUCの最上位ビットなんて(コードページを切り替えるための)飾りですよ。
飾りを取れば只のJISですから。
#但し、所謂1バイトかなの判定はそれ以前に行う必要があるけど。

>>397
私にはあなたの言いたいことが判らない。
0399デフォルトの名無しさんNGNG
380 :デフォルトの名無しさん :04/06/12 08:57
EUCからShift Jisに変換するにはどうしたらいいでしょうか?
0400389NGNG
度々スマソ。
wcstombs()がコード変換すると何でか思い込んでたよ。
私が勘違いしてただけなのね。
0401デフォルトの名無しさんNGNG
setlocale(LC_ALL, "jpn");
char buf[101];
wcstombs(buf, L"あいうえお漢字", 100);
puts(buf);

いや、普通にUCS-2からSJISに変換してるが@VC++6.0
0402デフォルトの名無しさんNGNG
文字コードの変換じゃなくて、表現形式の変換。
0403デフォルトの名無しさんNGNG
C+++++++++++++++++++++++++++++++++++++++
0404デフォルトの名無しさんNGNG
EUC-KR からだったらどうするよ
0405デフォルトの名無しさんNGNG
文字コードすれ逝けよ→http://pc5.2ch.net/test/read.cgi/tech/1063177450/
0406デフォルトの名無しさんNGNG
CreditCard *card = new CreditCard("岸部四郎")
if( ! card ){
  printf("ブラックリストに載っています");
  return 0;
}

card.buy(1000000);
delete card;
return 0;

こんな風にしたいんですが、
new("岸部四郎") CreditCard() を回避できないでしょうか?
0407デフォルトの名無しさんNGNG
???
0408406NGNG
えっと、

・初期化エラー時nullを返すにはnew内で初期化
・初期化に引数をとるにはコンストラクタ内で初期化

で、両立する方法は new("誰それ") CreditCard() とありました。
しかしできれば普通の書式が良いのですが、他に無いでしょうか?
それともnullチェックより例外を使うべき?
0409デフォルトの名無しさんNGNG
>>406
class CreditCard{
CreditCard(const char *);
public:
static CreditCard *New(const char *name){
if(name in list){
return 0;
}
return new CreditCard(name);
}
};

CreditCard *card = CreditCard::New("岸部四郎")
if( ! card ){
  printf("ブラックリストに載っています");
  return 0;
}

card.buy(1000000);
delete card;
return 0;
0410デフォルトの名無しさんNGNG
意味が分からないというか、
その前に本をよく読んでいないか読み間違えていないか?

new で引数をとるコンストラクタを用いたいなら、
new CreditCard("岸部四郎")以外ないと思うが、
回避したいって何が問題で何を回避したいの?
0411406NGNG
>>409
ありがとうございます。
ただ、やはり特殊な書き方になってしまうので避けたいです…。

>>410
・初期化失敗時にnullを返したい
・普通にnew CLASS(引数)を使いたい//こっち重視
です。

newをオーバーロードして new(引数) CLASS() でも、>>409さんのCLASS::New(引数)でも、
一つ目をクリアする代わりちょっと浮いちゃうので…。
一つ目を諦めると例外を使うことになりますが、あまり失敗の多いところで使うと良くない気がして…。
他に解決方法はあるでしょうか。(例外で問題なければそうします)
0412デフォルトの名無しさんNGNG
滅多に失敗しないのなら、なおさら例外を使うべきでは?
0413デフォルトの名無しさんNGNG
>>409 はファクトリちっくだしそんなに特殊な書き方だとは思わないけど。
0414デフォルトの名無しさんNGNG
>>411
>他に解決方法はあるでしょうか。
無い。
0415デフォルトの名無しさんNGNG
相談の範囲を多少逸脱するかもしれないけど。

チェックしたいのがブラックリストのみで、
それに必要なのがコンストラクタで与える名前だけなら、
ブラックリストをメンバ変数としてもち
内部で>>409 のような処理を行うメンバ関数をもつ発行者クラスを
別に用意してチェックを分離したほうがスマートだと思う。
0416406NGNG
>>412
失敗はそれほど多くは無いと思います。が、後学のためにと思って。
>>413
そうですか…。勝手に CLASS.Create() はdelphiスタイルと思い込んでいました。
>>414
分かりました、ありがとうございます。他の方法をとります。
>>415
なるほど…。今回の場合ですが、例が不適切でした。
実は一段下でそれに似たことを行っており、(例? Deal *deal = card.startDeal() )、
かつcardを多数作るわけではなかったので三重は大げさかなと思った次第です。

今回は例外で行きますが、今後三種類の方法を適宜使い分けることにします。ありがとうございました。
情報が小出しになった&長文失礼しました。
0417デフォルトの名無しさんNGNG
Cスレより誘導されてまいりました。同じことを質問しますがお許しください。
データの初期化について質問します。
例えば以下の例が有るとします。
enum Type
{
  taaa,
  tbbb,
  tccc,
  tlast
};
static char* lpType[tlast];
void main()
{
  lpType[taaa] = "aaa";
  lpType[tbbb] = "bbb";
  lpType[tccc] = "ccc";
  printf(lpType[tbbb]);
}
これはこれで上手く行ってる訳ですが何となく美しくない。
そこでこれをlpTypeを宣言した時に初期化したいわけですが
何らかの方法って無いでしょうか。
要は
static char* lpType[tlast] = {
  [taaa] = "aaa",
  [tbbb] = "bbb",
  [tccc] = "ccc",
};
見たいな事が出来ないかなぁと思うわけですが。
0418デフォルトの名無しさんNGNG
>>417
http://pc5.2ch.net/test/read.cgi/tech/1087049069/32
0419デフォルトの名無しさんNGNG
グローバルなクラスオブジェクト
...を要素とする配列
...をメンバ変数にもつクラスオブジェクト
...がTypeを添え字にとる配列オペレータを定義
していれば、できるんじゃねーかな。
0420デフォルトの名無しさんNGNG
enum Type
{
  taaa,
  tbbb,
  tccc,
  tlast
};

template< std::size_t N >
class lpType {
static char[] tmp;
public:
static ostream&
operator<<( ostream& os ) const {
os << tmp;
}
};

lpType<taaa>::tmp = "aaa";
lpType<tbbb>::tmp = "bbb";
lpType<tccc>::tmp = "ccc";
template< std::size_t N >
lpType<N>::tmp = "not defined";

int main( void ) {
std::cout << lpType<taaa> << std::endl:
}
0421デフォルトの名無しさんNGNG
あ〜、間違えてら。
0422デフォルトの名無しさんNGNG
いろいろ調べてみましたがどうやらVCはC99に対応していないようなので
>418の方法は無理みたいですね。
それにC99を使うとなるとC++は使えなくなるようなのでこれも問題です。
とりあえず今回は勉強になったのでこれで良しとします。
有難うございました。

>>420
ここまでやるぐらいなら最初にmainで定義したほうが良さげです。
これはこれで面白いのですが。
0423デフォルトの名無しさんNGNG
Javaで言うとことのプロパティファイルを読みこむ自社製ライブラリがあります。
名前=値に加え、型情報などの情報が「バイナリ形式」として納められています。

↓イメージ(実際はバイナリ)
long=name1=-123
unsigned long=name2=123
char *=name3=hello

↓値取得のクラス&メソッド(名前と型が一致しないと例外発生。型を取得するメソッドはない。)
void Conf::Conf(const char *file);
void Conf::getValue(const char *name, long *l);
void Conf::getValue(const char *name, unsigned long *lu);
void Conf::getValue(const char *name, char **s);

■このクラス&メソッドを下のような形式にラッピングしたいと思っています。
適切な型 ConfX::getValue(const char *name);

基底クラスをあとから作る?例外で条件分岐?なにかよい方法ありませんか?
0424デフォルトの名無しさんNGNG
>>423
どうすれば「よい」とみなすのか示せボケ
0425デフォルトの名無しさんNGNG
>>423
役に立つかどうかは知らないが
http://www.ksky.ne.jp/~seahorse/cpp/virtualbase.html
0426デフォルトの名無しさんNGNG
CBaseを基底クラスとしたCAとCBと言うクラスが有ります。
そしてCBaseにはhoge()と言う仮想関数を実装しています。
そして現在、以下のようなコーディングをしていますがー
CBase* pBase;
switch (i)
{
case 0:
 pBase = new CA;
 break;
case 1:
 pBase = new CB;
 break;
}
pBase->hoge();

正直綺麗じゃないし無駄なような気がします。
クラスを配列に定義して以下のように何とか出来ないでしょうか。
pBase = new class[i];
0427デフォルトの名無しさんNGNG
>>426
typedef CBase* NewFunction();
template< typename T > CBase* New(){ return new T; }
NewFunction* const table[] = { &New<CA>, &New<CB> };

pBase = table[i]();
0428デフォルトの名無しさんNGNG
>>1の名前がv(^・^)vでないんですけど。
0429デフォルトの名無しさんNGNG
>>427
うーん、色々やって見ましたが上手く行かないです。
これをどこら辺に定義すれば良いのでしょうか。
とりあえず、こんな感じじゃ無理でした。

#include <windows.h>

typedef CBase* NewFunction();
template< typename T > CBase* New(){ return new T; }
CBase* const table[] = { &New<CA>, &New<CB> };   // エラー

CTest::CTest()
{
 int i = 1;
 CBase* pBase = table[i]();
}

エラーメッセージ
error C2440: 'initializing' : '' から 'class CBase *const ' に変換することはできません。(新しい動作 ; ヘルプを参照)
コンテキストはオーバーロードされた関数の非不明瞭を考慮しません。
0430デフォルトの名無しさんNGNG
っと、上のままの場合だと以下でした。
>CBase* const table[] = { &New<CA>, &New<CB> };   // エラー
NewFunction* const table[] = { &New<CA>, &New<CB> };   // エラー

error C2440: 'initializing' : '' から 'class CBase *(__cdecl *const )(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
0431デフォルトの名無しさんNGNG
>>429
class CBase{};
class CA : public CBase{};
class CB : public CBase{};

typedef CBase* (*NewFunction)();
template< typename T > struct NewT{ static CBase* New(){ return new T; } };
NewFunction table[]={&NewT<CA>::New,&NewT<CB>::New};


int main(){
CBase *p=table[0]();
0432デフォルトの名無しさんNGNG
>>429
まずはVC6を捨てる。
0433デフォルトの名無しさんNGNG
>>431
上手く出来ました。有難うございました。
0434デフォルトの名無しさんNGNG
constは捨てろってことだな
0435デフォルトの名無しさんNGNG
>>434 何の話?
0436デフォルトの名無しさんNGNG
VS2002にVCToolKit2003をいれてstlport4.6.2でboostコンパイルできた人いる?
error LNK2019: unresolved external symbol "__declspec(dllimport)
int __cdecl swprintf(unsigned short *,unsigned int,unsigned short const *,...)"

が4個ほど出るよ…
0437デフォルトの名無しさんNGNG
変な組み合わせすんなよ
2002使えるってことは2003もらってるはずだろ
0438デフォルトの名無しさんNGNG
アカデミックだったり(泣
0439デフォルトの名無しさんNGNG
コンストラクタにテンプレート引数を渡したいのですが引数を使って
暗黙的?に渡す以外はコンパイルエラーになってしまいます
A自体にtemplateをつける以外でどのようによびだせばよいでしょうか?
struct A
{
  template<class T>A()
  {
    cout << typeid(T).name() << endl;
  }

  template<class T>A(T)
  {
    cout << typeid(T).name() << endl;
  }
};

int main()
{
// A a<int>(); こういう感じで呼びたい
  A a(1); //かっこ悪い
  return 0;
}
0440デフォルトの名無しさんNGNG
何で、
>A自体にtemplateをつける以外で
こんなことしたいの?
0441デフォルトの名無しさんNGNG
ちょっとした型推論ですよ。ありがたく省略しないと。
0442デフォルトの名無しさんNGNG
>>439
もしかしてVCか?
明示的なテンプレート実引数の
正当な形を撥ねるケースよくあるぞ
0443デフォルトの名無しさんNGNG
コンストラクタで、そういったことがしたいなら、以下のような手を使うとかね。
ちょっと格好悪いかも知れんけど。

template< typename T > struct type{};

template< typename T >
A::A( type<T> )
{
  cout << tyoeid(T).name() << endl;
}


A a( type<int>() );
0444デフォルトの名無しさんNGNG
>>377
そんなものがあったんですね。ありがとうございました。

で、さっそく使ってみたのですが、
tokenizer.hppをincludeしてビルドしたところ、以下のようなビルドエラーが出ました。

boost\tokenizer.hpp(60) : error C2039: 'begin' : 'CString' のメンバではありません。
c:\program files\microsoft visual studio\vc98\mfc\include\afx.h(368) :
'CString' の宣言を確認してください。
C:\VC_PROJECT\0806\01\Main1.0β_0806\SetUserEntryDlg.cpp(310) :
コンパイルされたクラスのテンプレートのインスタンス化 '__thiscall boost::tokenizer<class boost::char_delimiters_separator<char,struct std::char_traits<char> >,char const *,class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > >
::boost::tokenizer<class boost::char_delimiters_separator<char,struct std::char_traits<char> >,char const *,class std::basic_string<char,struct std::char_traits<char>
,class std::alloca
tor<char> > >(const class CString &)' の参照を確認してください

問題の個所は

template <typename Container>
tokenizer(const Container& c)
: first_(c.begin()), last_(c.end()), f_() { }

となっています。これってboostのバグなのでしょうか。それともこちらの設定か何かが悪いのでしょうか。
長くてすみません。
0445デフォルトの名無しさんNGNG
>>444
CString じゃなくて std::string を使うべき。
0446444NGNG
すみません。
読ませるのをCStringじゃなくstringにしたら通りました・・
お騒がせしました。
0447444NGNG
>>445
あ、ありがとうでした。
0448デフォルトの名無しさんNGNG
boost::functionにtemplate関数を代入したいのですが、
以下のコードではコメントアウトした部分ですべてコンパイルできませんでした。
何とかならないでしょうか?

#include <iostream>
#include <boost/function.hpp>

template< typename X >
void
testFunc( const X x ) {
std::cout << typeid(x).name() << std::endl;
}

int
main( void ) {
//boost::function< void ( const int ) > f;
//boost::function< template< typename X > void ( const X ) > f;
//boost::function< void template< typename X >( const X ) > f;
//boost::function< void ( template< typename X > const X ) > f;

f = testFunc;
f( 1 );

return 0;
}
0449デフォルトの名無しさんNGNG
>>448
boost::function<void (const int)> f; // constはなくても変わらない。
f = static_cast<void (&)(const int)>(testFunc); // void (*)(const int)でも良い。
0450デフォルトの名無しさんNGNG
キャストすれば良かったのか…
とおりました、ありがとです。
0451デフォルトの名無しさんNGNG
本番が出来ませんでした…orz
boost/graphの
boost::in_degreeをつっこみたいのですが。宣言だけ書いてみます。
template< class Config, class Base >
inline typename Config::degree_size_type
in_degree( typename Config::vertex_descriptor, const adj_list_helper< Config, Base >& );

0452デフォルトの名無しさんNGNG
関数の戻り値の型(?)がoperatorとなっているものを
見かけたのですが、これはどういう意味でしょうか。
0453デフォルトの名無しさんNGNG
>>449
ふつうは、キャストを嫌ってこっちだとおもうが。
boost::function< void (int) > f = testFunc< int >;
0454デフォルトの名無しさんNGNG
>>452
ttp://www.kuzbass.ru/docs/isocpp/special.html#class.conv.fct
0455デフォルトの名無しさんNGNG
newで作った配列の初期化はどのようにすればいいのでしょうか?
文法がよくわかりません。
int *p = new int[3] = { 1, 2, 3 };
や
int *p = new int[3] { 1, 2, 3 };
とやっても構文エラーがでてしまいます。
JavaやC#は下のやり方でいけるのですが。
0456デフォルトの名無しさんNGNG
>>455
できません。
0457455NGNG
>>456
ガ━━━━━━(゚д゚lll)━━━━━━ン
0458デフォルトの名無しさんNGNG
>>455
#include <vector>
static int const initial[3] = {1,2,3};
std::vector<int> v(&initial[0],&initial[3]);
0459デフォルトの名無しさんNGNG
class A
{
protected:
 int a;
public:
 int GetA() const { return a; }
 void SetA(int a) { this->a = a; }
};

class B : public A
{
protected:
 double b;
public:

};

このようなクラス関係で

B bInstance[100];
bInstance[1].SetA(50);

const A* ptr = bInstance;
++ptr;
int result = ptr->GetA();

とやるとポリモーフィズムでresultに50が入ると思うのですが、
実際には正しい値が得られません。
どこがおかしいのでしょうか?ご教授下さい。
0460デフォルトの名無しさんNGNG
>>459
C++のポリモはポインタが指してる先のオブジェクトへの操作
( *ptrか ptr ->mem_function() )についてだけで
ポインタそのものの操作(この場合、++ptr)に対しては
ポリモではないから。

つまり++ptrが間違い。
0461デフォルトの名無しさんNGNG
>>459
ポリモーフィックなクラスを配列にしてはいけない。

参考:More Effective C++ の
「項目3: 配列をポリモルフィズム的には扱わない」
0462デフォルトの名無しさんNGNG
>>460
そういうものなのですね。ありがとうございました。
0463デフォルトの名無しさんNGNG
>「項目3: 配列をポリモルフィズム的には扱わない」
C++っていたるところで腐臭がする言語ですね。
0464デフォルトの名無しさんNGNG
そうでもないよ。
0465デフォルトの名無しさんNGNG
やっぱり
C++は
ダサい
な
0466デフォルトの名無しさんNGNG
ポリモーフィックなクラスへのポインタ配列を使えばいい。
基底クラスやそこから派生したクラスを同一の配列に押し込むのは、サイズの違う
構造体を一つの構造体配列に無理矢理入れるのと同じ。破綻して当たり前。
0467デフォルトの名無しさんNGNG
>>452
struct mona { operator giko (); };
なら、mona型からgiko型へのキャスト
mona c;
(giko)c;
0468デフォルトの名無しさんNGNG
ポリモーフィックはJavaでは良く使うんだがC++ではちょっと難しいね
0469デフォルトの名無しさんNGNG
boost::tokenizerについて2つ質問です!

typedef boost::tokenizer<> tokenizer1;
tokenizer1 token( strLine );
for( tokenizer1::iterator it=token.begin(); it!=token.end(); ++it ){
cout << "TOKEN: " << *it << endl;
}

strLine には id001,あいうえお,pass,1, という文字列が入ってます。
で、 it の中の tok_ を見てくと、一回目は "id001" がちゃんと切り出されているのですが
二回目は "あいう" となっていて 三回目は "お" となっています。
区切り文字が "," 以外にも使われているのが原因か、日本語がだめなのかどちらかだと思います。
区切り文字を指定する方法、日本語を使う方法、わかりませんか?

2つめ。itに入ったトークンをCString か std::string か char[] にコピーするにはどうしたらいいでしょうか。
0470デフォルトの名無しさんNGNG
単なるポインタの理解の問題に見えるけど?
459ってポリモーフィック関係ある?
0471デフォルトの名無しさんNGNG
>>468
Java や C# のようにいちいち new するやり方なら、C++ も似た様な動きをすると思うけど。
0472デフォルトの名無しさんNGNG
>>470
関係ないですね。
C++ 的にはこの場合ポインタじゃなくて iterator をつかうべし、ということになるんでしょうね。
アドホックに済ませるならポインタ進めるための Next とかいうメンバ関数を用意するとか。
0473デフォルトの名無しさんNGNG
C++のごちゃごちゃな仕様を組み合わせた結果
直感に反する挙動を示したからっていまさらキーキー言うのはナンセンスだよ。
カレーに肥料としての効果を期待するようなもんだ。
0474デフォルトの名無しさんNGNG
すみません。質問ですー
DB検索結果を格納するために
連想配列を使用してやろうとおもっているのですがなかなうまくいきません。
vector<map<string, string>>の型に格納予定です。
要素のmapにアクセスできないみたいです。 どのように書けばうまくアクセスできるのですか?

typedef StringHash map<string,string>
typedef VectorStringHash vector<StringHash>

VectorStringHash *pvsh // 検索結果格納済み
vector<string> vstrFieldName // フィールド名

for (VectorStringHash::iterator vit = pvsh->begin(); vit < pvsh->end(); vit++)
{
 for (vector<string>::iterator it = vstrFieldName.begin(); it < vstrFieldName.end(); it++)
 {
  StringHash shMap = *vit;
  StringHash::const_iterator n = (StringHash::const_iterator) (*vit).find(*it);
  string strMap = n->second; //Segmentation faultでおちちゃう。
 }
}

0475デフォルトの名無しさんNGNG
C++のときはnewは滅多に使わないな。
遅くなるし...面倒だし...
継承もメモリもったいないからなるべくしない...
ようにしてる
0476デフォルトの名無しさんNGNG
>>475
たぶん、その餌じゃ釣れませんよ。
0477デフォルトの名無しさんNGNG
>>474
つーか、そのコードじゃコンパイル通らんぞ普通。
0478デフォルトの名無しさんNGNG
フリーのコンパイラを入れて、とりあえず何か作って練習しようと思ってるんですが
GCC と Borland C++ Compiler だとこちらの方がおすすめとかありますか?
・特殊な部分がなく汎用的で、後から別の環境に移りやすいか
・初心者にも使いやすいか
の2つを気にしてるんですが・・・
0479デフォルトの名無しさんNGNG
>>478
Win32APIに触って窓出したりする必要ないならCygwinのgccが無難なんじゃないの。
フリーのbccは進歩止まってるし。
0480デフォルトの名無しさんNGNG
http://www.skunksoup.com/images/funpics/camelspider1.jpg
こういうのを作りたいんだけど
0481デフォルトの名無しさんNGNG
>>474
typedefの使い方が変。
0482デフォルトの名無しさんNGNG
>>479
フリーのBuilderXに新しいBCCついてるよ
0483デフォルトの名無しさんNGNG
>>474
nがendだから?
0484デフォルトの名無しさんNGNG
>>474

x < it->end() って意味あんの?
x != it->end()じゃね?
0485デフォルトの名無しさんNGNG
>>484
いみあるよ
0486デフォルトの名無しさんNGNG
すみません。解決しました。
>>483さんの助言で見直したところ
表示ルーチンはまったく関係なかったようです。
mapを作るときにどうやらスコープを考えてなくつくったようで
内容がすべておかしくなってました。
お騒がせしました。
0487デフォルトの名無しさんNGNG
>>478
フリーって時点で「初心者向き」は消えたも同然
ベテランにとって必要な機能に限定した軽快な味が売りだからね

手取り足取りのサポートが欲しければ金がかかるのは世の常だよ
0488デフォルトの名無しさんNGNG
>>478
gcc しかないと思う。
風変わりな拡張を多用しないし、処理系固有のクラスライブラリとか覚えなくて済むし。
あと、コンパイラに「使いやすい・使いにくい」っていう差は特にないと思う。
あまり古いものだと規格準拠度が落ちて問題あるかも知れないけど。
0489デフォルトの名無しさんNGNG
>>488
>処理系固有のクラスライブラリとか覚えなくて済むし。
は? 別に付属してるもの全部覚える必要なんぞ無いだろ?
0490デフォルトの名無しさんNGNG
>>489
そういやそうだ。
0491デフォルトの名無しさんNGNG
オーバーライド可能な演算子にカンマがあるのですが

これって何の用途があります?
0492デフォルトの名無しさんNGNG
>>491
cppllにいろいろ例が載ってるよ
0493デフォルトの名無しさんNGNG
>>492
とはいえ、無理に使わないほうがイロイロな意味で幸せな気もする。
0494491NGNG
>>492
http://www.tietew.jp/cppll/archive/364
この辺ですか?参考にさせてもらいます。
ありがとうございます。

なんだか、ものすごくトリッキーな感じがするので
頭の体操にいはなるけど、素人は近寄らないほうがよさそうですね。
0495デフォルトの名無しさんNGNG
ま、そんくらいでトリッキーとか言い出す人の発言としては嘘じゃあんめえな
0496デフォルトの名無しさんNGNG
>>495
一見してデフォルトとまったく違う動きをするようなコードは、避けたほうが
良いと思うけどな。演算子オーバーロードにせよプリプロセッサのマクロに
せよ。

ネタとしては面白いけど。
0497452NGNG
>>467
レスありがとうございます。なんとなくそんな気がするのですが、
(giko)c
というより
giko(c)
ではないのでしょうか・・・それともどっちでもいいんですかね。
0498デフォルトの名無しさんNGNG
>>497
いてっ
おめーに突っ込まれるとな・・・
俺もヤキ回ったな
0499デフォルトの名無しさんNGNG
>>496
あんたの「一見」って? (ニヤニヤ
0500デフォルトの名無しさんNGNG
>>499
昔ハマったのは operator&& のオーバーロード。C/C++ だと組み込み演算子の && は
短絡評価できることが保証されているから

return foo() && bar();

だと foo() が真なら bar() は評価されない。しかし operator&& オーバーロードして
あると bar() も評価されちゃうので、意味合いがまったく違ってしまう。

字面が同じで一見してバグを発見できずに数人が半日無駄にした覚えあり。この
オーバーロードをしたヤツが、その後どうなったかはとても言えない。
0501デフォルトの名無しさんNGNG
>>500
>return foo() && bar();

こんなんでハマんなや
0502デフォルトの名無しさんNGNG
C++じゃねぇが、Pikeの組み込みstring型の算術演算子オーバーロードは流石にやりすぎだろと思ったな。
わからんでもないんだが。

C++だとboostのpathあたりか。spiritあたりまでいっちまうともうどうでもいいんだが。
0503デフォルトの名無しさんNGNG
極論するとoperatorはまったくいらない(代入でさえも)
「やりすぎ」かどうか論じるには基準が必要
0504デフォルトの名無しさんNGNG
>foo() が真なら bar() は評価されない
foo()が偽なら bar() は評価されない
じゃない?
0505デフォルトの名無しさんNGNG
>>484
コンテナのiteratorがRandomAccessIteratorなら、あり。
それ以外のイテレータなら、なし。
0506デフォルトの名無しさんNGNG
最近、「実装とインタフェースの分離」を耳にする事が多いのですが、
ここでのインタフェースって何を指しているのでしょうか?
例えば、
class Implと、class Infcが在ったとき、Implの方には実装に必要な
privateインタフェースのみが定義されていて、publicインタフェースは無しで、
Impl内で、friend class Infcが記述されていて、InfcにImplのインタフェースを
移動していると言うことでしょうか?例を示して貰えないでしょうか?
0507デフォルトの名無しさんNGNG
>>506
ごく簡単な例だと、例えば簡単な html パーサを書いていて、タグの情報をクラス化するとしたとき、
インタフェイス IHtmlTag を
class IHtmlTag {
 public:
 virtual const string& get_Name() const = 0;
 virtual const HtmlAttr& get_Attributes() const = 0;
};

と定義し、実装は
class CHtmlImpl : public IHtmlTag
{
 string m_strTag;
 HtmlAttr m_attributes;

 virtual const string& get_Name() const { return m_strTag;};
 virtual const HtmlAttr& get_Attributes() const { return m_attributes;};
};

なんてしておく。
多重継承やcontainment で複数のインタフェイスを持つクラスなんかも作れる。
利点はイロイロあるけど、産業的にはクローズドソースでクラスライブラリを公開できる点が重要。
0508506NGNG
>>507
ほほ〜。多重継承の場合は、LokiのGenLinearHierarchy等で複数のインタフェースを突っ込んだら
いい訳ですな。containmentは初めて聞くのでちょっと分かりません。後、
クローズドソースでクラスライブラリを公開できるって言うのと、.cppは公開せずに.hppのみの
公開の違いが分かりません。良かったらフォローお願いします。
0509デフォルトの名無しさんNGNG
>>508
C++ はたとえ private なものでもメンバ変数ひとつ増えるとオブジェクトサイズが
変わってしまう。インターフェースと実装を分離しない場合、内部的な改修で
あってもバイナリ互換性が崩れる可能性があるのでマズい。

以前は Microsoft の DLL でも、この手の変更が合ってとつぜん動かなくなる、
なんつー問題がしばしば発生してた。
0510デフォルトの名無しさんNGNG
>>506
Cで言うところのソースとヘッダの分離におけるヘッダにあたる。
ヘッダだけ公開しといて、ソースはそれに合うように作れと。
標準化委員会なんかが好むやり方を想像すればいい。
0511デフォルトの名無しさんNGNG
インタフェイスだけのクラスでも、そのサイズは最低1だったと思ったのですが、
そこから継承されたクラスは、その分、大きくなるのでしょうか?
0512デフォルトの名無しさんNGNG
>>511
1バイト?
確かに実装は未規定だが
さすがにそれは難しそうだな
0513506NGNG
>>510 実装とインタフェースを分離した場合でも、実装とインタフェースのヘッダファイルは
両方とも公開しますよね?分離した場合何か特に利点となる場合があるのですか?
0514デフォルトの名無しさんNGNG
>>513
実装については一切公開しないのがインターフェイスというやり方。
現実には実装も公開しちゃってるケースよくあるけど、それは妥協の産物。
0515デフォルトの名無しさんNGNG
>>511
1 バイトなのはポリシークラスでしょ。仮想関数あったら、最低ポインタ 1 個分は
必要。

継承した場合は単一敬称なら相変わらずポインタ 1 個分。多重継承すると
ポインタ n 個分になる実装が一般的。あと仮想継承は話が別。
0516506NGNG
>>514 それでは自分で独自のインタフェースを書く場合困らないのですか?
0517デフォルトの名無しさんNGNG
>>513
実装側のヘッダは公開する必要ないけど。コンストラクタを陽に呼び出すのではなく、
インターフェースに従ったオブジェクトを作成する関数や、あるいはファクトリクラス
を公開する。

// 公開ヘッダ
struct IFoo {}; // 純粋仮想関数いろいろ
IFoo* CreateIFoo(); //

// 非公開ヘッダ
class CFoo : public IFoo {};
// 非公開実装
IFoo* CreateIFoo() { return new CFoo; }

Microsoft の COM まわりのドキュメントが参考になると思うぞ。
0518デフォルトの名無しさんNGNG
>>516
もしかして
#define インターフェース 実装
状態か?
0519506NGNG
あー、すいません、勝手に、

template< typename Interface >
class Impl : public Interface { ... }

を妄想していました。
0520デフォルトの名無しさんNGNG
>>519
Impl* pObj; ってやろーとしたろ?
Interface* pObj = new Impl; もダメ
さあどうする?
0521506NGNG
>>520 今日はもう寝るので明日考えてみます。
0522デフォルトの名無しさんNGNG
string型をchar型へのポインタに変換するにはどうしたらいいのでしょうか。
0523デフォルトの名無しさんNGNG
c_str
0524デフォルトの名無しさんNGNG
標準コンテナってデストラクタが仮想関数じゃないから
継承できないんだよな。(パフォーマンスのためなんだろうか)
virtualって一文字追加すれば良さそうなんだが...
このためだけに2つも実装書くのも面倒そうではあるが...
0525デフォルトの名無しさんNGNG
>>524
継承する必要ある?
0526524NGNG
>>525
機能拡張したい場合は、
できないよりできた方がイイと思うんだが...
完成されたものであれば、その必要はないだろうねぇ。
0527デフォルトの名無しさんNGNG
そもそもコンテナをポリモフィックにdeleteする場面ってあるんだろうか?
0528デフォルトの名無しさんNGNG
>>526
10中ハック、526がタコ。
といったところ本人がそれに気づくはずもなし。
まぁ、気がむいたら問題を書いてみな。
0529デフォルトの名無しさんNGNG
このスレの前の方にいた、継承するときには必ずデストラクタをvirtualにしなければならないと思い込んでるヤシだったりして。
0530デフォルトの名無しさんNGNG
つーか、STLコンテナにPolicyがあればいいだけなんだがな。
0531524NGNG
>>527
のような場合に
virtualじゃなかったら欠陥になりうるじゃん。
気を付けろといえばそれまでだけどw。
(だから、自分が管理してないコードに使うときはこわくて使えない。)

一般にポリモフィックな動作であれば問題ないコードで問題に
なるわけで、たぶんこれは継承じゃないんだなと邪推。

struct NV{~NV(){}};
struct EX :public NV{~EX(){}};
boost::scoped_ptr<NV> p(new EX);
とか?
0532デフォルトの名無しさんNGNG
・virtualメソッドを持つクラスを定義する場合、デストラクタもvirtualにする。
・virtualメソッドをもつクラスを継承する場合、デストラクタもoverrideする。
0533デフォルトの名無しさんNGNG
>>531
それはコンテナなのか?
0534デフォルトの名無しさんNGNG
>>532
それはそうかもしれないが、重要なのはなぜそうなのか?ということだ。
>>526 にも理解できるよう説明すること。(20点)
0535デフォルトの名無しさんNGNG
>531
boostのスマートポインタで扱う場合、そのケースでもメモリリーク(確か)しないよ。
試しにやってみなよ。
0536524NGNG
>>535
#include<iostream>
#include<boost/scoped_ptr.hpp>
struct NV{~NV()//virtual をあえてつけてない
{std::cout << "~NV" << std::endl;}
};
struct EX :public NV{
~EX()//virtualにすると呼ばれないだけでなく、下記の呼び出しでアボーンしちゃう
{std::cout << "~EX" << std::endl;}
};
int main()
{
{boost::scoped_ptr<NV> p(new EX);}//~NV
}
0537524NGNG
>>530
その通りですね。(以下はイメージ的なもの)
#include<iostream>
#include<boost/scoped_ptr.hpp>
struct Virtual{virtual ~Virtual(){} };
struct Non_Virtual{};
template<typename T,typename P_V=Non_Virtual> struct SEL{
SEL(){}
~SEL(){ std::cout << "~SEL<T,Non_Virtual>" << std::endl; }
};
template<typename T> struct SEL<T,Virtual>{
SEL(){}
virtual ~SEL(){ std::cout << "~SEL<T,Virtual>" << std::endl; }
};
template <typename T,typename P_V=Virtual> struct SEL_EX :public SEL<T,P_V>{
SEL_EX(){}
~SEL_EX(){ std::cout << "~SEL_EX" << std::endl;}
};
int main(){
{boost::scoped_ptr< SEL<int,Non_Virtual> > p(new SEL_EX<int,Non_Virtual>);}std::cout << std::endl;
{boost::scoped_ptr< SEL<int,Virtual> > p(new SEL_EX<int,Virtual>);}
}
0538デフォルトの名無しさんNGNG
>>535-536
メモリリークしないのは shared_ptr
ためしに、>>536 の main を以下のように書き換えて見れ。

int main()
{
 boost::shared_ptr< void > p( new EX );
 return 0;
}

0539デフォルトの名無しさんNGNG
標準ライブラリとかAPI的なものは普通は継承しないんだから
デストラクタにvirtual付いていなくても仕方が無いような気がするんだが。
継承しても、クラスの内部的な動作を差し替えるようなことはできないし。
単なるラップ+αなら、メンバとして持ったって同じような気がする。

ソースを見てデストラクタを確認したり、ドキュメントを見なければならないのは
確かに危険だが、Javaのfinalに相当するものが無いからなぁ。
0540524NGNG
>>538
ほんとだ。
{boost::shared_ptr<NV> p(new EX);}//~EX~NV

shared_ptrのコンストラクタってメンバtemplateになってるから
指定した型(NV)から推測されるポインタに代入しないで、
実際にコンストラクタに引き渡された型で
削除用の関数オブジェクトも生成しちゃって処理してるのか...。(頭イイ)
だからvirtual付けてない場合は、
{boost::shared_ptr<NV> p(dynamic_cast<NV*>(new EX));}//~NV
としちゃうと意図的にメモリリークを起こせると...
0541デフォルトの名無しさんNGNG
>>539
C++ で継承禁止クラスを作ることは可能だよ。
0542デフォルトの名無しさんNGNG
どやって?
0543デフォルトの名無しさんNGNG
>>542
http://www.tietew.jp/cppll/archive/10658
あたりからの流れを参照。

早速自作ライブラリに取り込んでみたものの、結局使ったことがない。
ここまでするメリットを感じない。デメリットのほうが大きそうだしね。




0544デフォルトの名無しさんNGNG
>>543
ええと、これ仮想継承で実現するのか。
デストラクタをvirtualにするよりメモリ食うのではなかろうか。
デストラクタvirtualよりパフォーマンスが良いなら考えるけどな。
0545デフォルトの名無しさんNGNG
>>543
以下のコードでどれだけメモリを食うか調べた。
(VC++2003)

struct A : public nonderivable< A > { int a; };
struct B { virtual ~B(){} int b; };
struct C : public B, public nonderivable< C > {};

int main()
{
 cout << sizeof(A) << endl;
 cout << sizeof(B) << endl;
 cout << sizeof(C) << endl;
}

結果は A, B は 8 、C は 12 と出た。
パフォーマンスにはあまり影響はなさそうだけど…、ようわからん。
0546デフォルトの名無しさんNGNG
で、けっきょくいえることは、Policy として使うだけのクラスは、protected なデストラクタにするか、
char_traits などのようにすべてのメンバを static で持つかどちらかにしろということだ。
0547デフォルトの名無しさんNGNG
>>524
STLコンテナの継承にはprivate継承がお薦めですよ.
使うメンバー関数だけusingするといいです.
#include <deque>
using namespace std;
class A: private deque <int>
{
typedef deque <int> Base_;
public:
A (): Base_ () {}
A (const A &p): Base_ (p) {}
A &operator = (const A &p) {if (&p != this) {Base_::operator = (p);} return *this;}
virtual ~A () {}
using Base_::push_back;
};
int main () {
A a0;
a0.push_back (0);
return 0;
}
0548デフォルトの名無しさんNGNG
>>547
usingでそんなことできたんだ。
知らなかった。
0549デフォルトの名無しさんNGNG
>>547で基底クラスのデストラクタは呼ばれる事が保証されるの?
0550デフォルトの名無しさんNGNG
>>549
よくわからんが、
private継承だから、基底クラスのポインタにすることはできない
0551デフォルトの名無しさんNGNG
>>549
基底クラスのポインタでインスタンスを保持できないんだから
デストラクタは必ず呼ばれると思う。
0552デフォルトの名無しさんNGNG
> virtual ~A () {}
ひょっとしてvirtualは不要になる?
0553547NGNG
>>550,551
そういう意図です.

>>552
混乱させたようですが,
デストラクタのvirtualはなくてもOKです.
これがなくても,先祖クラスのデストラクタを呼び忘れるなんてシチュエーションは起き得ないです.
Aをpublic継承する可能性があるなら付けておきましょう.
0554547NGNG
sed 's/先祖クラス/派生クラス/'
055510659NGNG
>>543
>ここまでするメリットを感じない。デメリットのほうが大きそうだしね。

「デメリット=無駄にメモリ喰う」って類のことを言ってんなら
デバッグ版の時だけギミックを仕掛けといて
リリース版の時にはギミックを外すようにしとけばいいんじゃない?
0556デフォルトの名無しさんNGNG
STLコンテナにvirtualなデストラクタがないことが心配っていう人は、
struct person
{
 char name[256];
 int age;
};
こんなやつも同じ理由で心配になるのかな?
0557デフォルトの名無しさんNGNG
EffectiveC++に確かこんな記述があったはず。
(若干表現は違ったかもしれない)
>基底クラスのポインタを介して派生クラスのオブジェクトを
>削除するとき、基底クラスのデストラクタがvirtualでないと
>、その結果は不定となる。
>不定とはコンパイラはどんなコードでも好き勝手に生成しても
>よいということだ。
この記事を読んでからは
特定のコンパイラで制限付きで動いてても
virtualでない場合は(似非)継承は避けることにした。

ポリモフィックな動作を保証できなくなるなら
他のキーワードがあっても良かった気がする。
0558535NGNG
>>536
微妙にうそついてすまんかった。

>>538
scoped_ptrだとリークするんだねぇ。
scoped_ptrリークする可能性のあるコード書いたこと無かったから知らなかったよ。
0559547NGNG
>>556
?
0560デフォルトの名無しさんNGNG
>>557
基底クラスオブジェクトへのポインタって考え方に固執することないじゃん
テンプレートあるんだし
0561デフォルトの名無しさんNGNG
>>557
そもそも仮想関数が1つも無いクラスのオブジェクトを
ポリモフィックに使わない。というか使えない。

そんなクラスに仮想デストラクタが必要なんだろうか?
他のメンバ関数は仮想で無いのに。

と、ひさびさに小一時間問い詰めたい。
0562デフォルトの名無しさんNGNG
>>561
まったくだ
0563デフォルトの名無しさんNGNG
あの非常に初歩的なことかも知れません、いいですか?
#include <iostream.h>
とやるよりも、
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
とかってする意義はあるのでしょうか?
<iomanip.h>とかも全て<iomanip>でわざわざ using して使われてます。

どなたか知ってる方。
0564デフォルトの名無しさんNGNG
>>563
#include <iostream.h>
はものすごく古い
0565デフォルトの名無しさんNGNG
デストラクタでぐちゃぐちゃうざい。
C#つかえよ。
どーでもいいよそんなもん。臨機応変にやれよ。
0566デフォルトの名無しさんNGNG
>>563
そういう風に標準化されているんです。
0567563NGNG
古いのは分かるんですが、何かが劣ってるとか
<iostream>だけしかできないことがあるとかはないんでしょうか?
0568デフォルトの名無しさんNGNG
>>567
いいとこ突いたな
返答が見ものだw
0569デフォルトの名無しさんNGNG
C#じゃなくても __gc あるもん〜。
0570デフォルトの名無しさんNGNG
>>567
std
0571デフォルトの名無しさんNGNG
>>567
劣っているというか、

string.h が困るよね。
0572563NGNG
>>570
あんまり良く分かりません
>>571
それは cstring を使えばいいのでは?
0573デフォルトの名無しさんNGNG
古くて規格外というのは、大きな欠点だと思うが。
0574デフォルトの名無しさんNGNG
>>572
>あんまり良く分かりません
「まったく分かりません」だろ?
名前空間について調べてみ
0575デフォルトの名無しさんNGNG
>>573
古いかもしれないけど規格外ではないだろ?
0576デフォルトの名無しさんNGNG
>>575
1998年の時点でdeprecatedなんだから、そろそろアウトにしたいなぁ。
0577572NGNG
まつまり基本的に古いものは排せってことですね。
良く分かりました。
0578デフォルトの名無しさんNGNG
>>573
プ
0579デフォルトの名無しさんNGNG
古いiostreamの実装ってよく知らないんだよなー。
2000年からプログラミング始めたから。

std::stringとの連携、たとえば
ostream& operator<<(ostram&, const string&);
getline(istream&, string&);
なんかは、"iostream.h"には存在する保証が無い・・・のかな?
0580デフォルトの名無しさんNGNG
>>573
プ
0581579NGNG
これはiostreamそのものとは関係無いか。
0582デフォルトの名無しさんNGNG
つまり、賞味期限きれたものと、きれてないものどっちがいいかというと
そらー、食えるとしても新しいほうがいいじゃないかと。
0583デフォルトの名無しさんNGNG
ttp://www.kab-studio.biz/Programing/Codian/iostream/08.html

これの末文とかかな。
名前空間の問題もそうだけど、要は古い実装は1byte lengthのcharに
べったりで用意されていて、過渡期においては、テンプレート化された
新しい実装のものとで住み分けの必要も出てきた。
新しいものがstd名前空間に置かれてるのは当然のことで、逆に置かれてない方は
歴史的な事情に配慮して(つーか放置されて)こうなってるだけ、と。
0584デフォルトの名無しさんNGNG
iostream.hって規格内なの?
14882:1998にそんな記述見つけられなかったし、VC7.1に入ってないけど。
0585デフォルトの名無しさんNGNG
いまだかつてiostream.hがC++の規格に存在したことはない
0586デフォルトの名無しさんNGNG
ライブラリの作りの良し悪しは、規格化されているか否かとは無関係
規格化されていても問題ある定義体はいくらでもある(例: gets)

>>573にプと言ったのはマジレスだよ
0587デフォルトの名無しさんNGNG
プ
0588デフォルトの名無しさんNGNG
>>586
実際にそうした定義が山ほどあるとしたところで、
数があるから問題じゃないというわけじゃなし…

えーと、悪い奴はだれだ!
0589デフォルトの名無しさんNGNG
誰が悪いのかは知らんが「規格外」ってことは

#include <iostream.h>
int main() { cout << "hoge" << endl; return 0; }

と

#include <iostream>
int main() { std::cout << "hoge" << std::endl; return 0; }

で同じ結果が得られるって保証がないんだよね?
0590デフォルトの名無しさんNGNG
わたくしJava厨なのですが、最近 C++ の勉強をはじめました。
WindowsでもLinuxでも使えて、
フリーで使えて(業務用途不可でもいいです)、
Eclipseライクな操作性の C++ のIDEがあったら教えてください。
0591547NGNG
>>561
抜け道(非仮想デストラクタを持つ基底ポインタで派生クラスを削除)塞いどくのは,
別に悪いことではないのではないでしょうか.
そのままでは警告なりエラーなりはでないんですし.

ただ561は,確かにそうかもしれないと思った.
立て札たてとかなくても抜け道通る奴はあんまりいないかな.
0592デフォルトの名無しさんNGNG
>>590
知らんけど、EclipseライクがいいんならEclipse自身のC++サポートは駄目なの?
0593デフォルトの名無しさんNGNG
>>589
得られる保証も得られない保証もない
ISO/IEC14882が規定しないライブラリは
ISO/IEC14882ではユーザ定義であって
正しいか正しくないかを論じることができない

おまえさんの口ぶりから察するに
言いたそうなことは痛そうだが・・・w
0594デフォルトの名無しさんNGNG
Realメディアファイルを再生するプログラムを書きたいのですが、
フィルタに何を指定したらいいのでしょうか。

ユーザに、作ったソフトに加えて、RealMediaSplitterをインストール
してもらい、それのフィルタを使って再生する方法なら分かるのですが、
RealMediaSplitterの代わりに、本家のRealPlayerをインストールしてもらうだけ
で、Realメディアファイルを再生できるようになる方法が分かりません。

0595594NGNG
自己解決しました。

REALSYSTEM SDK
ttp://proforma.real.com/rnforms/resources/server/realsystemsdk/index.html
を使うそうで・・・・・

板汚しすいません(´・ω・`)
0596デフォルトの名無しさんNGNG
>>591
派生クラスを作るだろう人の実力によるよな。
初心者に毛が生えたような人だとすると
「どーあっても安全にしたい。効率なんか二の次だ」って
考えてvirtualつけることもあるだろう。
10659氏が言ってくれているように仕掛けを付けとくのも強力。
継承可能かどうかドキュメントに記しておくことも手助けにはなる。
デストラクタprotectedもある。ケースバイケースだな。
0597524NGNG
>>561
そういわれてみればそうですね。
仮想関数をなくしてデストラクタを非仮想関数にしてしまう
クラス設計もそれはそれでいいのですが、
本来継承するべきでないのか、
あるいはそれを断念せざるを得ない状況を生み出すという見方もないでしょうか?
(使用者側からはPolicyで選択できるのがいいです。)
まぁC++の場合、C#のsealedやJAVAのfinalのように継承を禁止されない分、
自由度が高いという見方もあるのかもしれません。

宗教論争みたいになってきたんでこれくらいでやめにしておきます。w
つきあってくださった方、ありがとうございました。
0598547NGNG
>>596
> 派生クラスを作るだろう人の実力によるよな。

同意.
私は(未来の自分も含め)派生クラスを作る人(以後,利用者)を信用しないほうですから,
安全性を優先してます.
作成者が利用者をコントロールする手段を提供するのは重要なことだと思います.
(そういう意味では543,555は私的にはヒットでした.)
次の言語規格改定では,この辺をもう少し頑張って欲しいですね.
0599デフォルトの名無しさんNGNG
int* abc
と
int *abc の違いは何なのでしょうか?。*って、読み方なんでしたっけ?。
0600デフォルトの名無しさんNGNG
>>599
見た目だけ。
みにくいし
int* a, b;
とかしてはまるからそういう記述はやめとけ。
* = asterisk
0601デフォルトの名無しさんNGNG
* = 菊門
0602デフォルトの名無しさんNGNG
規格上違いが無いのですが、実際に出力されるオブジェクトに違いが出ることがあります。
理由はわかりません。
0603デフォルトの名無しさんNGNG
base* でdeleteする時点でデストラクタがvirtualかどうかくらい点検しろよ
0604デフォルトの名無しさんNGNG
>>602
あなたの不注意
0605デフォルトの名無しさんNGNG
>>604
いろいろ試してみてください。
結構予想と違う振る舞いが多いですよ。
0606547NGNG
>>603
利用者の点検を言語レベルで強制できればいいんですけどね.
0607デフォルトの名無しさんNGNG
>>606
http://www.research.att.com/~bs/bs_faq2.html#virtual-dtor

C++に【も】向かない人はいるってことさ
0608デフォルトの名無しさんNGNG
ださげんご
0609デフォルトの名無しさんNGNG
はげんご
0610547NGNG
>>603
「base* でdeleteする」のが利用者でない場合ってのはありえないでしょうか?
極端な例を出すと,
// designer.h
struct Must_Not_Derive {void memfun0 () {} ~Must_Not_Derive () {}};
void func (Must_Not_Derive *p);
// designer.cpp
void func (Must_Not_Derive *p) {delete p; p = new Must_Not_Derive;}
// user.cpp
struct Derived: public Must_Not_Derive {~Derived () {}};
int main () {
Derived *p (new Derived);
func (p);
return 0;
}
で,利用者がdesigner.cppを閲覧できない場合.
設計者は利用者がよもやMust_Not_Deriveを継承するとは考えてない.
一方,利用者はMust_Not_Derive::memfun0を使いたいのだか,
コンポジットあるいはpriavete継承が面倒臭いので,
funcでdeleteされることとは知らずにpublic継承してしまった.
例が極端だけどこういうはまり方はないでしょうか?
0611デフォルトの名無しさんNGNG
>>605
どんな場合?ぜんぜん思いつかない。
0612デフォルトの名無しさんNGNG
>>600
int* a, b;
とかしてはまるからそういう記述はやめとけ。

この場合は、aもbも、ポインターになるのですか?それとも、bは整数?。
0613デフォルトの名無しさんNGNG
>>612
試せば?
0614デフォルトの名無しさんNGNG
>>610
引数が非constのfuncが何をする関数かを知らずに使うわけか
0615デフォルトの名無しさんNGNG
答えられないなら黙ってていいよ。
レスつけるのは別に義務ってわけじゃないからね。
0616デフォルトの名無しさんNGNG
>>615
稚拙杉
0617デフォルトの名無しさんNGNG
>>612
自助努力をしろ
初心者であろうがベテランであろうが関係ない
これは人間性の問題
0618デフォルトの名無しさんNGNG
スレ荒らして楽しいかい?
0619デフォルトの名無しさんNGNG
>>618
ん、何か間違ったこと言ったか?
0620デフォルトの名無しさんNGNG
int* a, b;
って書く人はやはり多いんですか?
私は絶対
int* a;
int* b;
と書きます。
0621デフォルトの名無しさんNGNG
>>620
その前に、
int* a,b;
と
int *a;
int *b;
は意味が違う
0622デフォルトの名無しさんNGNG
>>620
a と b が
・同型でなければならないとき
・たまたま同型なだけのとき
で書き方わけてるよ
0623デフォルトの名無しさんNGNG
漏れは int* a; 派だな
型の記述なんだから型の方にくっつけたいよ。
ポインタ宣言は一行に一個。
0624デフォルトの名無しさんNGNG
int * w ;
0625デフォルトの名無しさんNGNG
int * (a,b);
0626デフォルトの名無しさんNGNG
>>623
そんなのは伺いをたてること
こっちから押し売りすることじゃない
0627デフォルトの名無しさんNGNG
LPINT
0628デフォルトの名無しさんNGNG
>>625
typedef
0629デフォルトの名無しさんNGNG
>>626
文盲か?
とりあえず馬鹿は引っ込んでてくださいな。
0630デフォルトの名無しさんNGNG
int *a,*b;
int *c;
でFA
0631デフォルトの名無しさんNGNG
>>629
コーディング基準は俺ルールじゃないってことだよ
0632デフォルトの名無しさんNGNG
こうやって不毛なコーディングスタイル論争が始まるんだな
0633デフォルトの名無しさんNGNG
>>632
ム板ではなくマ板でやれば
少しは実りがあるはずだ
0634デフォルトの名無しさんNGNG
>>633
隔離ですかw
0635デフォルトの名無しさんNGNG
>>634
そういう意図はない
スタイルはプログラム技術じゃない
PGの社会に関することだ
0636デフォルトの名無しさんNGNG
>>635
マ板ってネタ系でわないのかね?
0637デフォルトの名無しさんNGNG
>>621
そうです。
つまり、勘違いや間違いを起こさないように、と言う意味です。
0638デフォルトの名無しさんNGNG
int* p1,*p2;

を

int* p1,p2;

と書き間違えたからって問題になるケースがあるかな?
大抵コンパイルエラーになって、んで訂正して終わりっしょ。
0639デフォルトの名無しさんNGNG
はぁ、またこれか。
0640デフォルトの名無しさんNGNG
double ** m_tblに領域をnewしたいのですがどうすればよいですか?
まず、
m_tbl = new (double *) [TBLNUM]; //TBLNUM個のdouble*型を割り当て

として次に
*m_tbl[i]=new (double *) [EACH_TBL_ARRAY];//おのおののm_tbl[i]にEACH_TBL_ARRAY個の配列へのポインタをセット

のようにしたいです。
上記だとコンパイルエラーになります。
0641デフォルトの名無しさんNGNG
>>640
*m_tblの型はdouble *だろ。
0642デフォルトの名無しさんNGNG
そうでした
*m_tbl[i]=new double[]ですね。
でもその前にm_tbl=new(double*)[]がエラーってしまうのですが。
0643641NGNG
あともう一つ。
*m_tbl[i]はm_tbl[i]の間違いだろ?

要するに
*m_tbl[i]=new (double *) [EACH_TBL_ARRAY];
↓
m_tbl[i]=new double[EACH_TBL_ARRAY];
0644デフォルトの名無しさんNGNG
たびたびありがとうございます。
最初の記述は
m_tbl = new double* [TBLNUM];としたらOKでした。
もっと勉強します。
0645デフォルトの名無しさんNGNG
>>598
でも、543の仕掛けでエラーになったとして、
派生クラス作る人がヘボだと、ただ悩むだけになってしまったり。
ドキュメントちゃんと書けよってことか。
やっぱりこういうの綺麗にコンパイルエラーにする仕組みは欲しいよな。
0646デフォルトの名無しさんNGNG
これスレのFAQに入れておこう。
int * i;
int* i;
int *i;
どれでも好きなやり方にしろって。
0647デフォルトの名無しさんNGNG
>>645
最後の一行を除き激しく同意
小技に凝る前に大きな忘れ物だ
0648デフォルトの名無しさんNGNG
>>646
組み合わせ1つ抜けてる
0649デフォルトの名無しさんNGNG
>>647
> 小技に凝る前に大きな忘れ物だ
具体的にはどういう意味?
0650デフォルトの名無しさんNGNG
ドキュメントを書くってことだろ。
0651デフォルトの名無しさんNGNG
ソースツリーはどうやって決めてますか?
なにか良い本やWebがあれば教えて下さい。

これから作るシステム構成は
・いくつかのサブシステムからなる。
・共通のコマンドユーティリティがある。

です。

lib, src, lib/src ???
0652デフォルトの名無しさんNGNG
C++ スタイルのキャストを使えと良く聞きますが、やっぱり C スタイルより C++ スタイルでキャストした方が良いのでしょうか?
0653デフォルトの名無しさんNGNG
安全性を考えるならC++キャストのほうが良いだろうな。
0654デフォルトの名無しさんNGNG
Cスタイルのキャストを禁止にするようなコンパイルオプションとかあったらいいな。
ってもうある?
0655デフォルトの名無しさんNGNG
>>652
const_castやreinterpret_cast, mona(giko, c)はともかく
(char *)0を(char*)(0)と書けという根拠は希薄
0656デフォルトの名無しさんNGNG
>>655 漏れは精神衛生上C++にしてる。
混ざってると気持ち悪い。
0657デフォルトの名無しさんNGNG
>>653
安全性を考えてそうします。
0658デフォルトの名無しさんNGNG
>655
static_cast<char *>(0)
( ゚∀゚)アヒャ
0659デフォルトの名無しさんNGNG
>>655
(char *)(0)はCスタイルじゃないか?
static_cast<char *>(0)
または
template<typename T> struct id{typedef T type;};
id<char *>::type(0)
かと。
0660デフォルトの名無しさんNGNG
そこでEffective C++ですよ
0661デフォルトの名無しさんNGNG
>>658
いいたいことはわかるが
reinterpret_castでないあたりから
耐え難い腐臭が・・・
0662547NGNG
>>614
利用者のスキルが低い場合にはありえることじゃないでしょうか?
funcは今回は適当に名前を付けましたが,
その中でdeleteしてることを全く連想させない名前である可能性はあるわけです.
これを否定するために,私としても561みたいにこの状況が起こり得ないことを示したいですね.

>>645,647
「ドキュメントちゃんと書けよ」ってのには異論の余地は無いですが,
設計者が利用者とコミュニケーションが取れないことを仮定して,
対策を講じておくのはいいことだと思います.
また,利用者が設計者を信用しないことも同様に安全性を高めると思います.
私に反論して下さる方には,利用者と設計者の立場を分けて考える視点が欠落していると思います.
どうでしょうか.(煽ってなんかないですよ.念のため.)

皆さんそれぞれ作ってるものが違うでしょうから一概には言えませんけど,
virtualディストラクタが(ディストラクタに限らなくてもいいですが.)
全体のパフォーマンスに影響与えてる局面って,
結構少なくないですか?
0663デフォルトの名無しさんNGNG
>>662
>利用者が設計者を信用しないことも同様に安全性を高めると思います

では、STLもコンパイラもCPUも信用せずに何ができるのか聞こうか。
0664デフォルトの名無しさんNGNG
プログラミングができる。
0665デフォルトの名無しさんNGNG
>>659
float(0) はC++タイプ、同様に(char*)(0) もC++タイプ


>>660
reinterpret_cast<char*>(0)
↑間違い
0666デフォルトの名無しさんNGNG
背後が壁の席でしか仕事をしない俺だって愛用の道具はあるさ
0667デフォルトの名無しさんNGNG
reinterpret_cast<char*>(0)
これって何で間違いなの?
0668547NGNG
>>663
ここでいう,安全性とは
利用者と設計者の意志疎通がうまく行ってないことに起因する危険に対する安全性です.
そういう意味ではSTLもコンパイラも自前で設計した方が安全ですよ.
ただ,私にはその能力も時間も無いので機能的規模が小さくなっちゃうでしょうけど.
0669デフォルトの名無しさんNGNG
>>668

>利用者と設計者の意志疎通がうまく行ってないことに起因する危険に対する安全性です.
ここまではいいが

>そういう意味ではSTLもコンパイラも自前で設計した方が安全ですよ.
なんでそうなるんだよw

おまえさん、プロのコンパイラ屋よりもマシなコンパイラ作れるのか?
0670547NGNG
>>669
利用者と設計者が同一人物であるほうが利用者と設計者の誤解が少ないと言いたいのです.

> おまえさん、プロのコンパイラ屋よりもマシなコンパイラ作れるのか?
そんなの無理です(笑).
だから「機能的規模が小さくなっちゃう」と書いてるんですよ.
まぁそんなのは最早STLとは呼べないんでしょうが.
0671デフォルトの名無しさんNGNG
>>669
なんでそうなるんだよw
0672デフォルトの名無しさんNGNG
>>670
>利用者と設計者が同一人物であるほうが利用者と設計者の誤解が少ないと言いたいのです.
・・・・・・
0673デフォルトの名無しさんNGNG
>>670
大体同じ意見。細かいところに話が行き過ぎてる気がするな。
ライブラリ作成者と利用者という立場で分けて考えると
ライブラリ作成者が課した決まりで利用者を縛りたいのは当然。
今話題になっている継承可能か否かという条件に関しては、それを行う時に
1. もしJavaのfinalのような言語仕様があれば、
利用者にも原因がわかりやすいコンパイルエラーにできる。
2. >>543のような仕掛けを用意して、とりあえずコンパイルエラーにする。
3. 継承不可能とドキュメントに書いておく。
4. (別の解法だが)効率無視してデストラクタvirtualで好きに継承させてしまう。
これくらいの選択肢があるぞと。
で、最もスマートなのは1。ドキュメントもほとんどいらないが今のC++では現実的じゃない。
2、3はドキュメント化して、利用者に守らせることが必須になる。
(2の場合は違反して継承した場合のコンパイルエラーを示しておかないと混乱の元)
4をやるかどうかはライブラリ作成者のポリシーによる。
俺は一連の流れからこんなふうに感じた。
0674デフォルトの名無しさんNGNG
>>665
g++3.3ではポインタに関してコンストラクタ記法はCスタイルキャストと全く同じ挙動を取るから、
(char *)(0)がどちらと等価かは実験では判断できない様だ。
従って、実際上どうでも良い事になるな。
文法上はどうなんだろう。
0675デフォルトの名無しさんNGNG
>>672
中点を幾つも書きたいだけなら、いちいち引用とかしなくていいです ;-)
0676547NGNG
>>673
Great! 私の意見はこの中にまとまってます.
0677673NGNG
>>547は潔癖の傾向があって
自分が提供したライブラリを利用した場合、
どんなヘボプログラマが利用者でも可能な限り問題が起きないように
したいと思っているんだろうな。気持ちはよくわかる。

virtualの効率に関して言えば、最近だとケータイアプリの
ゲームなんかを作っている人は気にするんではなかろうか。
こういう環境で汎用的なライブラリを作ろうとすると、
「何でもvirtual付けとけ」とはならないような気がする。
0678547NGNG
>>673
あぁ,しまった.「private,protected継承」ってのも入れて下さい.
安全性を第一に優先する私としては,
1. Javaのfinalのような言語仕様
2. >>543のような仕掛けを用意して、とりあえずコンパイルエラーにする。
3. private,protected継承を検討する.
4. 効率無視してデストラクタvirtualで好きに継承させてしまう。
5. 継承不可能とドキュメントに書いておく。
の順でしょうか.
0679デフォルトの名無しさんNGNG
デストラクタがvirtualでないクラスを継承したら警告するコンパイラってないの?
0680547NGNG
>>678
よく考えると,「private,protected継承」するのは利用者で,
他の項目は設計者ですね.
すみません.
0681673NGNG
>>678
俺の見た感じこの話にはいくつか段階があって
Q. ヘボ利用者にポリモーフィズム周りで安全なライブラリを提供するには?
A1. デストラクタproteccted
A2. デストラクタvirtual
A3. 継承禁止
A3-1. Javaのfinalのような言語仕様
A3-2. >>543のような仕掛けを用意して、とりあえずコンパイルエラーにする。
A3-3. 継承不可能とドキュメントに書いておく。
のような形だろうか。

> 3. private,protected継承を検討する.
これはライブラリ作成者側から縛れないので疑問符。

>>673で 4に関して別の解法と記したのはA3の実現方法を論じているのに
それより上位の解法を出すのは反則かなと考えていた。
0682デフォルトの名無しさんNGNG
C++な人はdelphiを馬鹿にしますがdelphi->c++
と移る人は多いと思われます。
つまり、c++の練習用ともなっているわけで
妨害する理由がいまひとつわかりません。
0683デフォルトの名無しさんNGNG
突然、何の脈絡もなくそんなこと言うヤツの精神構造がいまひとつわかりません。
0684547NGNG
>>679
g++だと,
-Wnon-virtual-dtor 非仮想デストラクタについて警告する
ってのがあるけど,なんだか効いていないようです.
あと,
-Weffc++ Effective C++ 式の指針からはずれるものについて警告する
ってのがあって,これはbase class `class Hoge' has a non-virtual destructor
と警告してくれます.
0685547NGNG
>>681
了解しました.
0686673NGNG
>>547話し続けてくれてありがとう。この話題はすごく楽しめた。
>>543のような手法を知るきっかけにもなったし。では撤収。
0687デフォルトの名無しさんNGNG
喧嘩するなおまいら仲良くしろ(´☻ω☻`)
0688デフォルトの名無しさんNGNG
>>667
まずは前提として→http://www.kouno.jp/home/c_faq/c5.html

reinterpret_cast<char*>(0)だと、int型の値0のビットパターンによるchar*型の値になる。
static_cast<char*>(0)だと、char*型のヌルポインタになる。
ヌルポインタが欲しい場合なら、前者は間違い。
0689デフォルトの名無しさんNGNG

  Λ_Λ  \\
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ >>688
 (_フ彡        /


s/ヌルポ/空ポ/
0690デフォルトの名無しさんNGNG
g++って、using namespace stdなしでcout使っても怒られない。
-Wall使ってもだめ。
どうすれば、ちゃんと怒られるようになるの?
0691デフォルトの名無しさんNGNG
>688
ダウト。
5.2.10-8 に明示的に書いてあるべ。
| 8 The null pointer value (4.10) is converted to the null pointer value of the destination type.
従って、reinterpret_cast<char*>(0) は char* 型のヌルポインタになる。
後、reinterpret_cast による変換は実装定義だからビットパターンが同じになるとは限らない。
サイズが十分なら「戻したとき」に同じになるだけ(5.2.10-5)。
0692デフォルトの名無しさんNGNG
>>690
間違って iosteram.h をインクルードしてない?
0693デフォルトの名無しさんNGNG
>>692
そんな奇妙な名前のものはインクルードしていません。
0694デフォルトの名無しさんNGNG
>690
g++ (GCC) 3.3.1 (cygming special) だとオプションなしでしっかりと怒られますが何か?

特定の環境に依存した話題は↓の方が望ましい。

【初心者歓迎】C/C++室 Ver.7【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1086373839/

つか、g++ ならむしろこっちか。

GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/
0695デフォルトの名無しさんNGNG
>>694
Cスレに帰ってください。
0696デフォルトの名無しさんNGNG
まずこんな関数が有るとして
bool Foo(){
return false;
}
でこの時、
main(){
 int a = 0;
 bool b = true;
 if (a == 0 && b || Foo())  // A
  a = 1;
 if (a == 0 && b || Foo())  // B
  a = 1;
}
と言う事をするとAではFoo()は呼ばれません。
これはbがtrueだからFooを実行しなくともifは真になる為、呼ばれないのは解ります。
しかしBではFoo()が呼ばれてしまいます。
漏れ的考えではa=1になってる為に最初のa == 0で偽になり、その後の条件は実行されないと思っていましたが・・・。
これは一体何故でしょう?
なお、コンパイラはVC++6.0です。
0697デフォルトの名無しさんNGNG
('A`)<ヒロシです…
0698デフォルトの名無しさんNGNG
>>696
B のほうは
if (偽 && 偽 || Foo()) // B
なんだから、
if (偽 || Foo()) // B
と同値で、まだ Foo() によって真になる可能性がある。
0699デフォルトの名無しさんNGNG
>a=1になってる為に最初のa == 0で偽になり、その後の条件は実行されないと思っていましたが・・・。

左辺で偽になってるために、右辺が実行されるのでは....
0700デフォルトの名無しさんNGNG
おっと間違い、最初のは
if (偽 && 真 || Foo()) // B
ね。結論は変わらんが。
0701デフォルトの名無しさんNGNG
>>696 || の意味分かってるか?
0702デフォルトの名無しさんNGNG
>>696
&&と || の優先順位の仕様を確認しよう。
MSDNだと、「優先順位と評価順序」という項目があるはずです。



初心者ほどわざと難しく書いて自分を混乱させるのが得意だからなぁ。
「難解な書き方するのがプロ」とかは、思わない方がいい。
素直に括弧つけてれば避けられるようなヒューマンエラーは自力で避けよう。
0703688NGNG
>>691
ごめん。調べてみたら、まだ結論が出てない話みたい。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#463
漏れの意見は"SUGGESTED RESOLUTION"と同じく、
reinterpret_cast<T*>(0)は実装定義の変換であるべきだと思う。

そして、null pointer(これならガッてされない?)を取得する方法として
reinterpret_cast<T*>(0)としない理由を、「間違い」ではなくて
「static_cast<T*>(0)のほうが良い」と訂正しておく。

あと、
s/値0のビットパターンによる/値0から実装定義の変換によって得られる/
これでいいかな?
0704デフォルトの名無しさんNGNG
s/ってなんでつか(´・ω・`)
0705デフォルトの名無しさんNGNG
ヒューマンエラーのリスクを極力減らしてこそ、プロだ罠。

ポインタだろうが配列だろうが、パフォーマンスはそんなに変わらんし、
無闇にポインタ使うのは最初のうちだけに汁。
かといって無闇に関数に参照渡しするのはマズイけど。
0706デフォルトの名無しさんNGNG
>>704
swap(文字列置換)
viエディタやPerl言語などで用いる有名な正規表現
0707デフォルトの名無しさんNGNG
>>704
sedスクリプトの置換コマンド。たぶんsubstituteの略。
0708704NGNG
>>706
ありがとう(´・∀・`)
ぐぐっても出てこなかたーYO!
0709704NGNG
>>707
同じくサンクスコ(・∀・)
なんかのスイッチかと思いまつた
0710696NGNG
あ、そうか、||の方を括弧で括らなきゃ駄目でしたね。
アホだ、俺。あまりに初歩過ぎて気が付かなかった。


つか、今までコレよくまともに動いてたな。
たまたまデバッグで発見したんだけど。
0711デフォルトの名無しさんNGNG
>>709
ちなみに>>706がネタで、>>707がマジ。
0712デフォルトの名無しさんNGNG
>>710
自分のソースなら間違いと気付けるけど、
他人のソースだった場合は、間違いなのか意図的なものなのか、
分からない事が多い。
0713デフォルトの名無しさんNGNG
あるなあ、それ。
しみじみ。
0714デフォルトの名無しさんNGNG
>>690
歴史的な事情により、そういうバージョンも残っている
STLも初期のバージョンではstdで囲われていなかった
0715デフォルトの名無しさんNGNG
>>702
そーゆーことを言いながら
素直に憶えれば避けられるようなヒューマンエラーは放置か
0716デフォルトの名無しさんNGNG
他PGの文法理解度に依存した(もしくは、甘えた)記述を
避けてこそ堅牢な開発が可能。

「素直に憶えれば避けられる」とか、気合とか、修行とか、
精神論まがいな言動をカマす人間は、
一生、独りでソース管理やってればいいだけのこと。

先入観が大きいほどに見逃す危険も大きくなるという
人間の心理を理解できない、>>715が実に憐れだ。
0717デフォルトの名無しさんNGNG
ぶっちゃけ、「自分以外のPGはアホだから配慮してやる」でも構わん。
0718デフォルトの名無しさんNGNG
ポインタとオーバーロードと標準変換のからみってどう思う?
char* c;
fc(c);
の呼び出しって、void fc(char*)が存在しない場合、
だいたい次の順で呼び出されるのが決まる。

1.fc(char*) or fc(char* const)
2.fc(const char*) or fc(const char* const)
3.fc(volatile char*) or fc(volatile char* const)
4.fc(const volatile char*) or fc(const volatile char* const)
5.fc(void*) or fc(void* const)
6.fc(const void*) or fc(const void* const)
7.fc(volatile void*) or fc(volatile void* const)
8.fc(const volatile void*) or fc(const volatile void* const)
9.fc(bool) or fc(const bool) or fc(volatile bool) or fc(const volatile bool)
0719デフォルトの名無しさんNGNG
>>718
> fc(char*) or fc(char* const)
これ、オーバーロードじゃないよ。同じ関数。
0720デフォルトの名無しさんNGNG
>>718
> fc(bool) or fc(const bool) or fc(volatile bool) or fc(const volatile bool)
これも全部同じだな。
0721デフォルトの名無しさんNGNG
fc(char*) or fc(char[])
これも同じだな。
0722デフォルトの名無しさんNGNG
>>681
Java や C# じゃないんだから、非ポインタで普通に(ポリモじゃなく)クラスとして便利に使える
場面も多々あるわけで、ポリフォできないから継承ダメ、っていうのは方向性として漏れはすきじゃないなー。

派生クラスから基底クラスへのポインタに変換するトコがあればエラーなり警告なり出してくれる程度でいいや。
0723デフォルトの名無しさんNGNG
連想配列を使おうと boost を導入したのですが、
連想配列を扱う関数名が分かりません。
知ってる方がいれば教えてほしいのですが。
0724デフォルトの名無しさんNGNG
>>723
連想配列なら標準のstd::mapがお勧め。
ちなみにboostのProperty Mapはmapっぽいものに対する
共通のインターフェースであって、連想配列そのものではない。
0725デフォルトの名無しさんNGNG
【教えてください】
いま、C++でカウンターCGIを作ってるんですが、
更新を押してもカウントしなようにするには
なにを使えばいいのですか?

なにかヒントになりそうなページとかあったら教えてください。
0726718NGNG
>>719-721
フォローどうもです。
fc(char*) = fc(char[]) = fc(char* const)
fc(const char*) = fc(const char[]) = fc(char const*)
ですね。
後から関数が加わったときに呼び出し先が変わると困る場合は
標準変換に頼って関数を呼びださないで
きっちりキャストしとかないとまずいってことなのかな。

0727デフォルトの名無しさんNGNG
ヒントになりそうなページ
http://pc5.2ch.net/php/
0728デフォルトの名無しさんNGNG
>後から関数が加わったときに呼び出し先が変わると困る場合は
こういう場合はオーバーロードしない方がいいんじゃないか?
0729デフォルトの名無しさんNGNG
delete [] a, b;
とした場合ってaもbも配列扱いのdeleteになるのでしょうか?
それとも
int *a, b;
みたいになっちゃうのでしょうか?
0730デフォルトの名無しさんNGNG
>>716
甘ったれはそっちだろ
規格票を読んでない人がそのことの正当性を強弁する姿は
マニュアルを読んでないユーザが直情で当たり散らす姿とそっくりだ

無知そのものに罪はないが、居直りが加われば間違いなく足手まとい
初心者には厳しさの中に優しさを持って接するが
周囲の足をひっぱるお荷物は叩き出すのが唯一の正当防衛

自分の仕事に関わる規格に精通しようと勉強する人の
やる気をくじくような毒電波をまき散らすな
あんた1人の甘ったれじゃ済まされない威力業務妨害なんだよ
先輩から吹き込まれたならアフォの伝統は浄化しろ
0731デフォルトの名無しさんNGNG
質問があります。(next = NULL)っていうのが
あるサイトのプログラムにあるのですが、
NULLって一体なんでしょうか?
文字でもないみたいだし。
教えてください。お願いします。
0732デフォルトの名無しさんNGNG
>>731
0に展開されるマクロ。
ポインタに変換される事を意図していると表明するために使われる事がある。
0733デフォルトの名無しさんNGNG
>>729
delete [] a; b;
となる
0734デフォルトの名無しさんNGNG
>>729
うわ、こわっ
0735デフォルトの名無しさんNGNG
えっと、あのC++を始めたばかりで、
マクロとかよくわからないのですが・・・
もう少し簡単に説明するとどういう事なんでしょうか?
お手数ですが、お願いします
0736デフォルトの名無しさんNGNG
電車ガール
0737デフォルトの名無しさんNGNG
>>731,735
逃げろ!
0738デフォルトの名無しさんNGNG
>>734
怖くない
0739デフォルトの名無しさんNGNG
>>735
そのレベルの質問だと初心者スレのほうがいいでしょ。
ただし、そっちでも「自分で調べろ」「入門書嫁」で終わる
可能性が高いですが。
0740デフォルトの名無しさんNGNG
>>730
>周囲の足をひっぱるお荷物は叩き出すのが唯一の正当防衛

「言うは易し、行うは難し」だよ。
ネットで怪気炎あげるのは構わんが実際に叩き出すにしても、
そのための労力・時間も馬鹿にならん。
むしろ、甘ったれてるのは君だろ?


>自分の仕事に関わる規格に精通しようと勉強する人のやる気をくじく

そのくらいで挫けるならさっさと挫けてしまえばいい。
職人的な聖域を徹底排除することがPMにとって重要。
0741デフォルトの名無しさんNGNG
よし!
730は740に返答するんだろうけど、
言いたいこと全部書いたら敬語に変換して送信してみよう。
0742デフォルトの名無しさんNGNG
>>740
>「言うは易し、行うは難し」だよ。

行えない香具師からのインカムでおまんま食えてるわけだがw
職人やりたくない奴の侵入社員が何物よりも迷惑なんだよ

 や る 気 ね ー や つ は 出 て け

どこの職場にも通じる鉄則だ
0743デフォルトの名無しさんNGNG
またスレ違いの話題で盛り上がる
頭の可笑しい方々がいらっしゃいますねw
0744デフォルトの名無しさんNGNG
「言語の規格」と、「人間にとって理解しやすい規格」はイコールじゃない。
C/C++も例外でなく、C/C++である規格が定義されているからといって
その規格を無理に使う必要はない。

あえて思い切って、高度で煩雑な規格の使用を制限して、
多数派PGの理解レベルを優先したとしても、
決して資源の無駄にはならないだろう。
0745デフォルトの名無しさんNGNG
>>742
人事にかかわったことがない万年下っ端は楽でいいな。
0746デフォルトの名無しさんNGNG
>>742の職場は、職人的な高い技術が求められているにも関わらず、
新入社員がスタッフとして送り込まれてくるらしい。可哀相に(w

大した仕事でもないのに職人気取るヤシって邪魔だよな。
0747デフォルトの名無しさんNGNG
>>744
無能PGの理解レベルを優先して何の勝負をしてるんだ、おまえんとこわw
0748デフォルトの名無しさんNGNG
投稿者について言及してもヒートアップするだけで実りはないですよ.
0749デフォルトの名無しさんNGNG
「人妻にかかわったことがない…」と語読。
もえ。
0750デフォルトの名無しさんNGNG
どっちの主張もうなずけるんだがな。
不特定の人と関わる仕事をしているのであれば
これからメンテするかもしれないヘボプログラマのためにわかりやすい
書き方をしてやれる能力も必要だし、素人にはぱっと見紛らわしいような
仕様を理解しておく能力も必要でしょ。
そんな一方的な見方ばかりしてないで仲良くしてくれよ。
0751デフォルトの名無しさんNGNG
あえて思い切って、高度で煩雑な規格の使用を制限して、
HSPを使用し、多数派PGの理解レベルを優先したとしても、
決して資源の無駄にはならないだろう。
0752デフォルトの名無しさんNGNG
>>751
規格票が理解できねって? ああ、そりゃお気の毒に・・・
0753デフォルトの名無しさんNGNG
だったらわざわざここに来る必要は無い。
のぞいて荒らしてることろを見ると、少しはやってみたいんだろ。

だったら大人しく教えて下さいといいなさい。
0754デフォルトの名無しさんNGNG
>>752
ネタにマジ煽りされても困るなぁ。

なんつーかさぁ、もうちょっと心に余裕持てよ。
0755デフォルトの名無しさんNGNG
でもさ、いまどき C++ で能無しがこなせる業務あるかな。
ドライバ書きとかゲーム書きとか、あんまヘボだと言語がどうとかいう以前に業務が難しい領域が多くない?



・・・・とオモタけど携帯のソフトがあったか・・・
0756デフォルトの名無しさんNGNG
3日前からずっとやってない?
0757デフォルトの名無しさんNGNG
>>753
大人しく教えて下さい

で、何を教えてくれるの?そもそもお前はどのレスに言ってるの?
0758デフォルトの名無しさんNGNG
>>757
なにが教えて欲しいの?
0759デフォルトの名無しさんNGNG
C++やると性格が歪むって本当らしいですね?
0760デフォルトの名無しさんNGNG
>>759
あるひとつの問題に対してアプローチがいくつもあり、
それらひとつひとつが曲者だからね。
追いかけるのに疲れ果てて性格が歪むのも無理はない。

これは、C/C++をマスターしていると思っている人間ほど顕著である。
いちいち他人のコードを自分流に修正せずには
いられない脅迫観念にとりつかれているからだ。合掌。
0761デフォルトの名無しさんNGNG
>>759
規格票が理解できねって? ああ、そりゃお気の毒に・・・
0762デフォルトの名無しさんNGNG
>>760
ひとつしかない方が異常だとおもうけど。
0763デフォルトの名無しさんNGNG
よっぽど悔しかったらしいなw
0764デフォルトの名無しさんNGNG
>>758
何が教えられるの?
0765デフォルトの名無しさんNGNG
>>742は、問題が起きたら俺が泥をかぶればいいという気質の人間だろう。
さもなくば、事情を知らない煽りか?
前者であれば、口は悪いが心の熱い人間であるといえよう。
実際問題、無能PGが配置されてしまったとして、
そのフォローに奔走するのは結局>>742自身だからである。

>>740は、意外と冷酷な人間だろう。
途上国の安価PGに下請け発注することを専らとしているに違いない。
0766デフォルトの名無しさんNGNG
742も740も俺の自演ですが何か?
0767デフォルトの名無しさんNGNG
>>725
私は直前のIPを保持して同値ならカウントアップしないようにしています。
クッキーは好きじゃない。
自分自身が参照したときもカウントアップしないようにするといいかも。
こっちは自分なのでクッキーでもいいかな。
それよりもC++でCGI作らせてくれることがうらまやしい。
SAKURAはC止まりなので。
0768デフォルトの名無しさんNGNG
delete [] a, b;
とした場合ってaもbも配列扱いのdeleteになるのでしょうか?
0769デフォルトの名無しさんNGNG
>>768>>733

delete a,b; とし、a,bをクラスにして、
bのデストラクタが呼ばれない事を確認してみろ。
0770デフォルトの名無しさんNGNG
>>768
演算子の結合規則くらい調べて来い
0771デフォルトの名無しさんNGNG
delete [] (a,b)としたところで何の問題の解決にもならん気がするが。
0772デフォルトの名無しさんNGNG
>>771
768は何かの「解決」を求めているか?
0773デフォルトの名無しさんNGNG
deleteといえば、プログラムが終了になるときは、
特にdeleteで解放しなかった領域も解放されるんですよね?
プログラムが終わった後まで影響しないですよね?
0774デフォルトの名無しさんNGNG
>>773
デストラクタはどうしましょ?
0775デフォルトの名無しさんNGNG
>>773
絶対されるとも言えないし、絶対されないとも言えない
0776デフォルトの名無しさんNGNG
処理系によってはやばいってことですか?
プログラムの終わらせ方としては
普通にmainのreturnで終わる場合やexit()やabort()。
main終わるときにローカルオブジェクトはデストラクタ
呼ばれるんですよねぇ。
exit()を呼ぶと、後処理やってくれるようですが
スタックの巻き戻ししないんで、ローカルオブジェクト
はもれるって話みたいで、例外使うなりしてちゃんと
deleteしたほうがいいんですかね、というかみなさんは
そうしますか?
0777デフォルトの名無しさんNGNG
>>776
>後処理やってくれるようですが

このへん全然ダメ
ちゃんと調べろ
0778デフォルトの名無しさんNGNG
>>773
OS依存。まぁ、普通はプログラム終了時に
リソースは全て回収される罠。
0779デフォルトの名無しさんNGNG
>>773
メモリに関して言えば、多くのOSや環境でその通り。
デストラクタは走らないので、例えばテンポラリファイルを作るクラスなど開放時に
処理が必要なオブジェクトはちゃんと delete する必要がある。
0780デフォルトの名無しさんNGNG
>>778
>OS依存。まぁ、普通はプログラム終了時に

このへん全然ダメ
ちゃんと調べろ
0781デフォルトの名無しさんNGNG
>>776
デストラクタを動作させる必要があるなら、ちゃんと delete する。

「〜ほうがいい」とか言うより、仕様や期待する動作の通りに動くように
プログラムを書けばいいだけだと思うけど。
0782デフォルトの名無しさんNGNG
exitは単に静的オブジェの破棄、バッファフラッシュ、クローズ処理を
行う。atexitで登録した関数も呼ぶ。
0783デフォルトの名無しさんNGNG
どなたか CINT
ttp://root.cern.ch/root/Cint.html
の日本語でのマトモな解説サイトとか御存知だったら教えて下さい。
google先生にお伺いしても大したサイトは引っかからないし、
本は絶版になっちゃってるみたいだし。

このソフトすごいと思うんですけど、マイナーなんですかね。
C++インタープリターってここにいる人達なんかにとってはちょっとしたスク
リプト感覚でC++が使えて非常に便利だと思うのですが。
0784デフォルトの名無しさんNGNG
ttp://www.itworld.com/AppDev/710/swol-0818-regex/

C/C++系のインタプリンタって結構あるんだけどな。
0785デフォルトの名無しさんNGNG
日本人の作者がいるからメールしてみたら?
どこかで聞いたことがある名前だったと思う。
0786デフォルトの名無しさんNGNG
>>784
そこ行ったらspybotが喚き出した。
0787デフォルトの名無しさんNGNG
ご教授お願いします。

VC++6でUnicodeです。

LPTSTR szHoge = new TCHAR(MAX_PATH);
ZeroMemory( szHoge, MAX_PATH * sizeof(TCHAR) );
int nRtn = (GetDlgItem( IDC_EDIT_HOGE ))->GetWindowText( szHoge, MAX_PATH * sizeof(TCHAR) );
LPTSTR lpTgzPath = new TCHAR( nRtn + 1 );
ZeroMemory(lpTgzPath, (nRtn + 1)* sizeof(TCHAR) );
CopyMemory( lpTgzPath, szHoge, nRtn * sizeof(TCHAR) );
delete szHoge;

IDC_EDIT_HOGEのコントロールから取得した文字列をlpTgzPathにコピーするんですが、
delete szHoge; にて例外が発生します。
何がいけないんでしょう・・・?
宜しくお願いいたします。
0788デフォルトの名無しさんNGNG
LPTSTR szHoge = new TCHAR(MAX_PATH);
delete szHoge;

↓

LPTSTR szHoge = new TCHAR[MAX_PATH];
delete [] szHoge;
0789725NGNG
>>767
サンクスです。
その方法でやってみます。
0790デフォルトの名無しさんNGNG
>>788
グハ orz
サンクス。もう仕事辞めます。
0791デフォルトの名無しさんNGNG
>>790
昼飯くったらまた頑張れ
0792デフォルトの名無しさんNGNG
>>787
誤:LPTSTR szHoge = new TCHAR(MAX_PATH); // 値MAX_PATHで初期化された 1 つの TCHAR を newする
誤:LPTSTR lpTgzPath = new TCHAR( nRtn + 1 ); // 値nRtn+1で初期化された 1 つの TCHAR を newする

正:LPTSTR szHoge = new TCHAR[MAX_PATH]; // MAX_PATH個のTCHARの配列をnewする
正:LPTSTR lpTgzPath = new TCHAR[ nRtn + 1]; // nRtn+1個のTCHARの配列をnewする

だら〜っとで良いので、もういっぺん C++ の本とか読み直しておいた方が余計な苦労せずに済むかも。
あと、szHoge みたいなのはいちいち new しないで、ローカル変数の方が良いと思う。
0793デフォルトの名無しさんNGNG
っていうか、スマートポインタ使えよ
0794デフォルトの名無しさんNGNG
なんでもスマートポインタを使えばいいわけじゃないし、この処理では明らかに不要だろ。
0795デフォルトの名無しさんNGNG
この処理とやらの外側でWin32構造化例外を拾っている可能性はあるからスマートポインタが不要とはいえんな。
0796デフォルトの名無しさんNGNG
>>787
GetWindowTextやCopyMemoryで中身は上書きされるんだからZeroMemoryはいらない
テキストの長さだったらGetWindowTextLengthでわかる

int nSize = (GetDlgItem( IDC_EDIT_HOGE ))->GetWindowTextLength();
LPTSTR szHoge = new TCHAR(nSize);
(GetDlgItem( IDC_EDIT_HOGE ))->GetWindowText(szHoge, nSize);
0797デフォルトの名無しさんNGNG
>>794
deleteミスるぐらいならスマートポインタ使えってことだよ。
っていうか今どきnewとかつかわんよ
0798デフォルトの名無しさんNGNG
スマートポインタ使えとだけ言っても何の疑問も解決しねえだろカス
0799デフォルトの名無しさんNGNG
>>797
>っていうか今どきnewとかつかわんよ

はいはい、脳内「今どき」はあんたの頭の中だけにしときな( ´,_ゝ`)プッ
0800デフォルトの名無しさんNGNG
素で質問です。
new以外に何使えばいいんでしょうか?
0801デフォルトの名無しさんNGNG
>>800
そんな餌で俺様がくまー
0802デフォルトの名無しさんNGNG
前もって全部staticで宣言しておけばいい。
リソースの量を把握できなくていったい何の為のC++プログラマか。
0803デフォルトの名無しさんNGNG
動的に増やさなくちゃいけないから new があるんじゃ
0804デフォルトの名無しさんNGNG
またC厨が暴れているのか。
0805デフォルトの名無しさんNGNG
mallocで十分
0806デフォルトの名無しさんNGNG
>>805
Cスレに(・∀・)カエレ!!
0807デフォルトの名無しさんNGNG
ただ騒ぎたい奴が8割
0808デフォルトの名無しさんNGNG
ポインタの参照 *& ってどんな意味があるのでしょうか?
例えば、void func( char **& ) に参照つけるのはどうしてですか?
0809デフォルトの名無しさんNGNG
>>808
void func( char **&p)
だとしたら、funcでpをいじるんじゃないですか?
*pではなく、**pでもなく。
0810デフォルトの名無しさんNGNG
>>808
普通の参照と同じだが?
void func(char *&rp)
{
static char c = 'd';
rp = &c;
}

char *p;
func(p);
0811デフォルトの名無しさんNGNG
ダイアログ上のフォーカスをTABで移動していって、ボタンにフォーカスが来ると
点線と黒い影が出ると思うんですけど、
そこからSetFocusでフォーカスを別のとこに移動させると
点線だけ移動して、黒い影がボタンに残ったままになってしまいます。
この黒い影を強制的に消すにはどうしたらいいでしょう?
0812デフォルトの名無しさんNGNG
>>811
キミはそれをC++の話題だと思うのか?
0813デフォルトの名無しさんNGNG
>>812
VC++やらMFCの話をここでしてはいけないのですか?
0814デフォルトの名無しさんNGNG
・::std::vector< TCHAR > を使う。

・ATL ないし、MFC を使っているならば、CStringT< TCHAR > を使って、
あらかじめサイズをしてした後で、GetBuffer()

・_bstr_t を使って、SysAllocStringByteLen を使い、領域確保してから、
 GetBSTR() でバッファ取得。だが、この方法はオススメしない。
 
0815デフォルトの名無しさんNGNG
あ、VCのスレがあるんですね。失礼しました。
0816814NGNG
>>787 へのレスね。
0817デフォルトの名無しさんNGNG
>>813
だめ。氏ね。
0818デフォルトの名無しさんNGNG
ポインタと参照ってほとんど同じものだと思ってました…orz
0819デフォルトの名無しさんNGNG
>>811
Microsoft の Windows の話だと仮定して返事してみる。
黒い影は「デフォルトボタン」の印で、フォーカスとは必ずしも関係ない。
あとはWin32 API スレで続けた方がいいよ。C++ と関係ないし。

>>813
811 はおそらく Windows の UI の仕様に関する質問で、別に MFC も VC++ も関係ないみたいだけど・・・
0820デフォルトの名無しさんNGNG
ん〜、以下のrfuncとpfuncの違いは何なのでしょうか?
それと、rfunc( aaa ) と記述できない事と何か関係ありますか?

#include <iostream>

void rfunc( char *& rp ) {
rp[0] = 'a';
}

void pfunc( char * pp ) {
pp[0] = 'b';
}

int
main( int argc, char **argv ) {
char aaa[100];
char *bbb;
bbb = aaa;
rfunc( bbb );
std::cout << aaa[0] << std::endl;
pfunc( bbb );
std::cout << aaa[0] << std::endl;

return 0;
}
0821デフォルトの名無しさんNGNG
>>820
リファレンスを取る時は実体が必要。aaaは単なるポインタに変換され、それは
実体がない(変数に入っていない)のでリファレンスを取ることはできない。
無理に取ろうとすると一時変数が作られる。
0822デフォルトの名無しさんNGNG
>>820
rfuncもpfuncも引数(この例ではそれぞれrpとpp)に対して操作を行っていないので、
違いが大きく現れない。
rfuncでは、例えばrp = 0;とすると、これがmainのbbbに反映される。
pfuncではこれは起こらない。
このあたりはポインタとの絡みは関係なく参照という物の性質なので、
参照渡しについて復習してみる事をお勧めする。
rfunc(aaa)と書けないのは、aaaがポインタ変数でないから。(ポインタに変換可能であるに過ぎない)
0823デフォルトの名無しさんNGNG
ポインタのリファレンスはむしろこっちの使い方の方が多いな。&pとして呼び出す
手間を省く。

#include <iostream>

void rfunc(char*& rp)
{
 rp[0] = 'a';
}

void pfunc(char** pp)
{
 (*pp)[0] = 'b';
}

int main()
{
 char a[] = "abc";
 char* p = a;

 pfunc(&p);
 std::cout << *p << std::endl;
 rfunc(p);
 std::cout << *p << std::endl;
}
0824デフォルトの名無しさんNGNG
関数の中で引数に対してnewとかしちゃうと、
pfuncの引数のとり方では悲惨なことになりますね。
(まぁそういうことはあまりやらないけど)
0825824NGNG
あ、もちろん>>820宛です。
0826デフォルトの名無しさんNGNG
ていうかね
void func(T&) と void func(T) の違いなんよ。ポインタとか関係ないんよ。
0827デフォルトの名無しさんNGNG
>>826
わかってるけどその説明じゃ分からない香具師がいるんだよ。頭の固い香具師が。
0828デフォルトの名無しさんNGNG
>>827
>頭の固い香具師が。
下らん質問にしか回答できない半端もんのくせに、
初心者に対してはびっくりするほど態度でかいな。お前。
0829デフォルトの名無しさんNGNG
>>828
>下らん質問にしか回答できない半端もんのくせに、

どうやって俺が下らん質問にしか回答してないとわかるんだ?エスパーか?
0830デフォルトの名無しさんNGNG
s/しか/も/
0831デフォルトの名無しさんNGNG
C++(プログラム)が早く身に付く方法はないですか?
0832デフォルトの名無しさんNGNG
検索エンジンとかで出てくる%83%82%83E%83_%83%81%83%7Cとかいったコードを
デコードする良いアルゴリズムって無いですかね?
自分で作った奴じゃ遅くって。
0833デフォルトの名無しさんNGNG
>>829
恐らくエスパーではなく「こわがり」なのでしょう ;-)
0834デフォルトの名無しさんNGNG
>>831
プリンタで大きく「C++」と印刷した紙を糊で体に貼り付けろ。
0835デフォルトの名無しさんNGNG
>>834
つまんね
0836デフォルトの名無しさんNGNG
>>831
パイロットに早くなれる方法はないかというのと同じくらい果てしない質問だ
0837デフォルトの名無しさんNGNG
給料はパイロットの5分の1くらいしか貰えんが
0838デフォルトの名無しさんNGNG
パイロットって月給手取り300万近いのか?
0839デフォルトの名無しさんNGNG
もらう奴はそれ以上。
0840デフォルトの名無しさんNGNG
Cからのステップアップに最も適した本は何ですか?
0841デフォルトの名無しさんNGNG
>>840
プログラミング言語Ruby
0842デフォルトの名無しさんNGNG
>>840
マジレス

これ!
http://www.research.att.com/~bs/3rd.html
推奨の理由は、自分がこれで憶えたから。
ただし、これは第3版。俺が使ったのは第1版だった。

邦訳はこれ
http://www.longtail.co.jp/errata/
0843820NGNG
char *pp で ppは、*bbbのアドレスのコピーが入った入れ物で、
char *& rp はbbbその物自体と理解しました。
0844デフォルトの名無しさんNGNG
>>843
おおまかにはそれでよし。
0845デフォルトの名無しさんNGNG
コンストラクタの初期化リストで配列を初期化することはできるの?
やりたいことは、エラーでるけどこんな感じ。
class A {
public:
string s[];
A(): s[0]("0"),s[1]("1") {}
};
0846デフォルトの名無しさんNGNG
>>845
無理無理。
0847832NGNG
誰かお知恵は有りませんか、、、
文字で変換で調べてるけど見つからず・・・。
0848デフォルトの名無しさんNGNG
>>847
JavaScriptなら変換関数あるから簡単だよ。
C++なら自分で作ればいいし。アルゴリズムも何も、先頭から順に見て%見つけたら変換するだけだしね。
0849832NGNG
>>848
いや、出来るというか出来てるんですが結構遅くて。
こういうものは結構昔から使われているだろうから
何か良いアルゴリズムは無いかなぁと思う次第です。
0850デフォルトの名無しさんNGNG
>>848
相手にすんな。
「自作だと遅い」とか言ってるが、C言語で遅く作る方が難しい。
本当は作ってもいないのに知恵を拝借したいだけだろう。
あるいは過去ログコピペ荒しかもしれない。
0851デフォルトの名無しさんNGNG
自作コードのパフォーマンスについて評価する術を知る者が、
この程度のアルゴリズムでつまづくはずがない。

よって、釣り確定。
0852デフォルトの名無しさんNGNG
>>849
その遅いコードとやらはどうせ8,9行だろ貼って見せろ。
0853デフォルトの名無しさんNGNG
>>832=>>848=>>852

自演して楽しいもんなのか?
スレ違いだし。
0854デフォルトの名無しさんNGNG
851=852=853
0855832NGNG
これです。もっと良い方法あると思うんですけどね。
BOOL URLdecode(char *in, char* out)
{
char hex[3] = { 0 };
char *p;
while (*in) {
if (*in != '%')
*out = *in;
else {
++in;
p = in;
if (*p >= '0' && *p <= '9' || *p >= 'a' && *p <= 'f' || *p >= 'A' && *p <= 'Z') {
hex[0] = *p;
++p;
if (*p >= '0' && *p <= '9' || *p >= 'a' && *p <= 'f' || *p >= 'A' && *p <= 'Z') {
hex[1] = *p;
*out = strtol(hex, &p, 16);
++in;
}
}
else
return FALSE;
}
++in;
++out;
}
*out = '\0';
return TRUE;
}
0856デフォルトの名無しさんNGNG
url エンコード define
でぐぐれ
0857デフォルトの名無しさんNGNG
url エンコード include
のほうがよいかも
0858デフォルトの名無しさんNGNG
デコードだった
0859デフォルトの名無しさんNGNG
なんだ、真性だったか。>>832

何と比較して遅いのかが知りたいところだな。
0860デフォルトの名無しさんNGNG
>>855
URLdecode って名前つけてるな
それで検索しなかったのか?
0861デフォルトの名無しさんNGNG
Cから始めて15年、strtol() なんて使ってるプログラムは初めて見た。
確かに遅そうなコードで、しかもバグがあるね。
0862832NGNG
>>856
幾つか見て見ましたが定石みたいな物は無いみたいですね。
それでも自分の作ったやつよりは速そうなのでそれを使ってみることにします。


てか、URLdecodeで調べれば一発だったんだ。
文字変換で調べまくってたのはあほだった。。。
関数名に同じの使ってるのもあるし、、、orz
0863デフォルトの名無しさんNGNG
>>855
ifの比較は遅すぎ。テーブル検索するように変更。
strtolは遅すぎ。自前で書き換え。
0864デフォルトの名無しさんNGNG
テーブル検索って何だ?
0865デフォルトの名無しさんNGNG
>>864
isdigit()などの実装しらんのか?
0866デフォルトの名無しさんNGNG
BOOL URLdecode(const char *in, char* out)
{
char hex[3] = { 0 };
int i = 0, j = 0;
while (in[i]) {
if (in[i] != '%')
out[j++] = in[i++];
else {
if ( isxdigit(in[i+1]) && isxdigit(in[i+2])) {
hex[0] = in[i+1];
hex[1] = in[i+2];
out[j++] = strtol(hex, 0, 16);
i += 3;
}
else {
out[j++] = in[i++];
out[j++] = in[i++];
}
}
}
out[j] = '\0';
return TRUE;
}

ほれ。ってもういいのか。
0867デフォルトの名無しさんNGNG
C++と関係ないじゃん。Cスレに逝ってくれよ!
夏厨の季節には少し早いはずなんだが。
0868デフォルトの名無しさんNGNG
>>865
isdigit()などの実装がひとつだとでも言うのか?
0869デフォルトの名無しさんNGNG
ここがいいよ
C言語のCGIを語りつつ普及するスレ
http://pc5.2ch.net/test/read.cgi/php/1048393217/
0870864NGNG
>>865
ひょっとして、char型の256個配列を用意するとか?
0871デフォルトの名無しさんNGNG
>>868
粘着厨が。氏ね
0872864NGNG
ちなみにMSDNには大嘘が書かれている。(以下抜粋)

http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_character_classification.asp
通常、文字分類ルーチンは、自作のテストより高速です。たとえば、次のコードは isalpha(c) を呼び出した場合より遅くなります。
if ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))
return TRUE;
(抜粋ここまで)

などと書かれている。お前ら、実際に試してみろ。
上のコードとisalpha()をReleaseビルド版で試すと、自作コードの方がisalpha(c)より速いことを確認できるだろう。
0873デフォルトの名無しさんNGNG
const char codetbl[] = "0123456789ABCDEF";
0874デフォルトの名無しさんNGNG
>>872
( ´,_ゝ`)プッ
嘘つきはお前だよ
0875デフォルトの名無しさんNGNG
そんなの、CPUとメモリやキャッシュ速度によって如何様にも変わるから
MSDNも872も正しくない
0876デフォルトの名無しさんNGNG
>>873
そんなの何の意味も無い。

VC6のランタイムだと、
#define isdigit(_c) (MB_CUR_MAX > 1 ? _isctype(_c,_DIGIT) : _pctype[_c] & _DIGIT)
こんな実装になってる。_isctypeもまたシンプルでない実装になってるし。
0877デフォルトの名無しさんNGNG
>>874
いいから試せ。
漏れは、GCCとVC6で逆転を確認している。VC7は試してない。
0878デフォルトの名無しさんNGNG
>>877
だから試してから書いてんだよ。激遅。CPUの違いぐらいで吸収できる差とは
思えん。
0879デフォルトの名無しさんNGNG
相変わらず、C++の領分から外れたり、話題の程度が低くなったりすると
俄然盛り上がるな。
0880デフォルトの名無しさんNGNG
低レベルな争い
0881デフォルトの名無しさんNGNG
関数内で宣言した変数ってスコープの関係で、関数から出ると使えなくなるんでしょ?
その変数を返り値にした場合、呼び出し元で使っても大丈夫なの?
呼び出し元で返り値をすぐに変数に代入すれば安全が保証される?
スコープなぞ
0882デフォルトの名無しさんNGNG
>>879>>880
だって煽ると面白いんだもん。やめられんよ。(゚∀゚)アヒャ
0883デフォルトの名無しさんNGNG
>>878
ちゃんとinline関数とかマクロにしたか?
漏れの環境だと、isdigit():自作コード=5:1だぞ(VC6)。
0884デフォルトの名無しさんNGNG
>>878は無知の煽りか?
0885デフォルトの名無しさんNGNG
>>883
それぐらいちゃんとしてるっつーに。しつこいな。
0886デフォルトの名無しさんNGNG
>>884
俺がどのスレのどのレスで煽ってるかはどこにも書いてないのだが・・・・
またエスパーか?
0887デフォルトの名無しさんNGNG
>>878
コンパイル環境と所要時間の比ぐらい示したらどうか?
劇遅でも数値ぐらい示せるだろ。
0888883NGNG
こまかいけど訂正

isdigit()じゃなくて、isalpha()
0889872NGNG
>>874、>>878、>>885
嘘つきな俺を啓蒙してくれよ。今ひとつ納得できないもんでな。
0890デフォルトの名無しさんNGNG
>>881
ダメ。すぐもなにも元よりスコープ外の物に保障はない。
0891デフォルトの名無しさんNGNG
class cTemp{
………
}

class cAdv : public cTemp{
………
}

という感じでクラスを宣言して

cTemp *Test = new cAdv();

delete Test;

↑のコードを実行するとcAdvのデストラクタは実行されないみたいなんですが、
まちがっていますか?継承元ポインタのポインタをdeleteすると
継承元のデストラクタしか実行されないのかっていうことなんですが
0892デフォルトの名無しさんNGNG
また、virtualに戻るのか…
0893デフォルトの名無しさんNGNG
>>891
間違ってない。そういう仕様だ。
0894デフォルトの名無しさんNGNG
>>889 isa1>isa2=isalpha
#include <stdio.h>
#include <ctype.h>
#include <assert.h>

const int alpha = 1;
int table[256];

maketable()
{    int i;
    for (i = 'A'; i <= 'Z'; i++) table[i] |= alpha;
    for (i = 'a'; i <= 'z'; i++) table[i] |= alpha;
}
int isa1(int c)
{ return table[c] & alpha; }
int isa2(int c)
{ return ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')); }
int measure(int(*f)(int), int times)
{    char s[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i, j, t = clock();
    for (i = 0; i < times; i++) for (j = 0; j < sizeof(s) - 1; j++) assert( f(s[j]) );
    return clock() - t;
}
main()
{    maketable();
    printf("%dms.\n%dms.\n%dms.\n", measure(isa1, 1000000), measure(isa2, 1000000), measure(isalpha, 1000000));
}
0895872NGNG
>>880
>低レベルな争い

そうだ。
低レベルで、かつ、ループの中で何千・何万回も行うかもしれない重要な処理だ。
スレ違いなのは認めるが、if構文や自作コードが遅いかどうかは極めて重要だろ?
0896デフォルトの名無しさんNGNG
>>895
センスが無いのか読解力がないのか微妙な1〜2行目はともかく、
> スレ違いなのは認めるが
わかっているようなので終了ですね ;-)
0897872NGNG
>>894は、>>878.>>885とは別人かな?
inline関数やマクロを使ってないみたいだし。

それはそうと、>>894のコードを自環境(VC6)でやってみた。
(一部コンパイルが通らない部分やassert()除外などの修正した。)
297ms.
360ms.
343ms.
自環境ではテーブル検索型が最も速かった(isa2>isalpha>isa1)。

述語関数的な用途だと確かに標準ライブラリ関数が威力を発揮する。
自分が>>883で使ったソースでも非インライン・非マクロの場合、
標準のisalpha()に惜敗だった。差は5〜10%ほど。

いずれにせよ、>>878が触れたような【CPUの違いぐらいで吸収できない格差】が得られなかった。
>>878の劇遅に関するレポートが見たいところだな。
0898デフォルトの名無しさんNGNG
VC6なら-Ob2かな、これでインライン展開されたはず。
isa1 140ms
isa2 190ms
isalpha 670ms
くらいになった
0899872NGNG
>>898
なぬ?
関数アドレス渡しでもinline処理が使えるとは知らなかった。・・・orz

0ms.
0ms.
265ms.
・・・アレ?スマソ。ソース修正の仕方が悪く余計な最適化されてしまってたみたい。
そんなわけで余計な最適化されないように修正した。


〜最終結果〜
●非インライン・非マクロ(Ob2なし)
281ms.
375ms.
359ms.
>>897とほとんど同じ。

●インライン(Ob2あり)
78ms.
141ms.
500ms.
これも、テーブル検索型が最速だ。
0900899NGNG
興味深いのは、Ob2指定でisalpha()がかえって遅くなっているところだ。
不思議だが、この辺はコンパイラ依存が強そうだ。
VC7やgccでまた違った結果になる悪寒。
0901デフォルトの名無しさんNGNG
cygwin + gcc3.4.0 (-O3)だとこうなった。

453ms.
500ms.
547ms.
0902デフォルトの名無しさんNGNG
俺もやってみた。

Borland-C++5.6.4
-Od(最適化なし)
454ms.
578ms.
765ms.
-Ox(最大限最適化)
422ms.
516ms.
703ms.

Pen4 2.8G + WindowsXPSP1

腐った某ランドのコンパイラでもテーブルが最速である事が判明。
0903872NGNG
漏れは以前、このスレに、「車輪の再発明はよくない」とか書き込んた者なのだが、
コンテナの再発明と、グローバル関数の開発は別だと思っている。

このスレを独壇場にしてスマンかった。
ムシャクシャしてやった。今は反省している。
0904デフォルトの名無しさんNGNG
>>903
そう思うなら氏ね
0905デフォルトの名無しさんNGNG
車輪を再発明する必要はないが、出来の悪い車輪を改善する必要は時としてある。
0906デフォルトの名無しさんNGNG
まあ、今回のケースはisxdigitを迂回する必要があるかどうか疑問だけどな
0907デフォルトの名無しさんNGNG
例外規則って何かに使われてるんですか?
書いても何も得しないんでしょうか?
void Process() const throw();
のthrow()の部分。
0908デフォルトの名無しさんNGNG
デザインパターンのStateパターンって、
継承で実装するよりも、templateと特殊化で実装
した方が楽な気がしますが、何か問題あるでしょうか?
0909デフォルトの名無しさんNGNG
>>908
それで動的に出来るのか?
0910デフォルトの名無しさんNGNG
isalphaはロケールを見て適したテーブルを引く、ということをVCはやってたから (間違ってたらゴメン)
ASCIIコードのみを考えるなら、自作のほうが早くなるのかも寝。
0911デフォルトの名無しさんNGNG
*BaseState に代入できませんな…orz
コーディングは繰り返しが出てくるくせに…
0912デフォルトの名無しさんNGNG
>>910
テストしてみたけど、isalphaだけだとうまくいかない。
(下記の後者のどこがいけないのでしょうか?)

setlocale(LC_CTYPE,"japanese");

//これはOK
for(int i=0;i<=0xFF;i++){
if( !( isa2(i) == ( (isascii(i & 0xFF) != 0) ? (isalpha(i & 0xFF) != 0 ) : (false) ) ) )
printf("isa2(%d)=%d,isalpha(i)=%d\n",i,isa2(i),i,isalpha(i));
}

//これだとなぜかうまくいかない
for(int i=0;i<=0xFF;i++){
if( !( isa2(i) == (isalpha(i & 0xFF) != 0 ) ) )
printf("isa2(%d)=%d,isalpha(i)=%d\n",i,isa2(i),i,isalpha(i));
}
0913デフォルトの名無しさんNGNG
なんで戻り値を比較してるんだ?
0914デフォルトの名無しさんNGNG
>>890
じゃあ、どうやって戻り値を利用するの?
0915デフォルトの名無しさんNGNG
ローカル変数のコピーを返せばいい
0916デフォルトの名無しさんNGNG
>>912
つうか、プログラムもうちょっとちゃんと書け
ifの条件をすっきりさせて、printfの引数の数を数えなおせ
0917デフォルトの名無しさんNGNG
>>912
半角カナ
0918デフォルトの名無しさんNGNG
>>915
関数の引数に変数を渡したらコピーされるのは知ってるけど、
returnの場合もコピーされた変数が戻る?
0919912NGNG
>>916
ほんとだね。全然見てなかった...orz

setlocale(LC_CTYPE,"japanese");//これがないときは両方うまくいく

//これはOK
//asciiか判断してからalphaかを確認
for(int i=0;i<=0xFF;i++){
if( isa2(i) != ( (isascii(i) != 0) ? (isalpha(i) != 0 ) : (false) ) )//一致しないとき
printf("isa2(%d)=%d,isalpha(%d)=%d\n",i,isa2(i),i,isalpha(i));
}

//これだとlocale変えてるときに一致しないときがある
//alphaかだけを確認
for(int i=0;i<=0xFF;i++){
if( isa2(i) != (isalpha(i) != 0 ) )//一致しないとき
printf("isa2(%d)=%d,isalpha(%d)=%d\n",i,isa2(i),i,isalpha(i));
}
0920デフォルトの名無しさんNGNG
結局>>872は正直者?
0921デフォルトの名無しさんNGNG
ctype.hのisalphaとlocaleのisalphaは別物だぞ。
ctype.hのisalphaはマクロだから遅くないけど、
localeのisalphaは複雑なコードだから遅い。
0922デフォルトの名無しさんNGNG
つまりC++はCより遅い
0923デフォルトの名無しさんNGNG
>>920
>>872は正直者です。
ちなみに私も正直者です。
0924デフォルトの名無しさんNGNG
ついでに俺も正直者という事にしておいてください。
0925917NGNG
>>919
一致しない範囲は半角カナなんだってば。

この辺?
> _ismbcalpha
> 英字 c がシングルバイト ASCII 英字(0x41<=c<=0x5A または 0x61<=c<=0x7A)
> または半角カタカナ文字(0xA6<=c<=0xDF)の場合だけ真を返します。
0926デフォルトの名無しさんNGNG
>>918
もどらない。戻り値は使わないようにすべき
0927デフォルトの名無しさんNGNG
>>926
!?
0928デフォルトの名無しさんNGNG
すみません、質問があります
今96×96で14枚つづりのアニメーションをしよう(画像は96×1334)と思っているのですが
アニメーションなんてやったことないので正直わかりません
やり方を教えていただけないでしょうか?
また画像をまとめる際は横長や縦長にするより正方形や長方形にしたほうがいいのでしょうか?
よろしくお願いします
0929デフォルトの名無しさんNGNG
はい次の質問どうぞ
0930デフォルトの名無しさんNGNG
"C++"を二文字動かして"C#"にしろといわれましたがよく分かりません。
すっきりとした回答をお願いします。
0931デフォルトの名無しさんNGNG
>>930
二文字動かすの部分がわかりません。出力例をください
0932デフォルトの名無しさんNGNG
VC++つかってるんですが
Debug warning!
Detected memory leaks
といわれてしまいます
なぜですか?
0933デフォルトの名無しさんNGNG
>>932
メモリリークしてるからです。
0934デフォルトの名無しさんNGNG
>>932
文字通りメモリリークしている。
たぶんdelete忘れ。

VCスレで発見方法教えてもらえ。
0935デフォルトの名無しさんNGNG
>>933
>>934
サンクス
0936919NGNG
>>925
thx.
923あたりで言ってる意味がやっとわかったw

MSDN不親切すぎ
>is 系ルーチンでは、指定した条件に対するテスト結果は、
>現在のロケールの LC_CTYPE カテゴリ設定に依存します。
>詳細については、setlocale を参照してください。

MINGWの説明(・∀・)イイ!!
http://mingw.biggie.jp/reference/isalpha.html


0937デフォルトの名無しさんNGNG
( 'ー' )イイ!
0938デフォルトの名無しさんNGNG
質問でございます
class A{
class B{
public:
int x;
}
B y;
}
こんな感じでクラスの中で宣言したものをその上のクラスで宣言して使う時
gccではコンパイルできるんですがBorland C++では出来ません。
なにかオプションとかつけたら出来るようになるんでしょうか?
0939デフォルトの名無しさんNGNG
>>928
ISO/IEC 14882:2003,Information Technology―Programming languages―C++
では、アニメーションについて規定していない。
よって、このスレのスコープ外である。

処理系別のスレで質問されるがよい。
0940デフォルトの名無しさんNGNG
>>938
できるだろ。もしかして

int x;
} ←ここに ; が抜けてるだけ、とかいうオチじゃないだろうな?
0941デフォルトの名無しさんNGNG
>>940
それっぽい罠
0942デフォルトの名無しさんNGNG
今晩は厨房いないのかツマラン
0943デフォルトの名無しさんNGNG
↑初登場
0944デフォルトの名無しさんNGNG
iostreamについて質問です。
int main(int argc,char *argv[])
{
FILE *fin = stdin;
if(argc>1) fin = fopen(argv[1],"r");
・・・
}
このように引数が与えられない場合は標準入力を使用し、引数が与えられた
場合にはファイルオープンをするような処理をiostreamを使って簡潔に記述する
方法をご教授ください。
0945デフォルトの名無しさんNGNG
istream* pistr;
ifstream istr;

pstr = &cout;
pstr = &istr;

(*pistr) >> i;
0946デフォルトの名無しさんNGNG
(argc > 1)って常に真だと思うが。
0947945NGNG
訂正。

pstr = &cout;
↓
pstr = &cin;
0948デフォルトの名無しさんNGNG
>>946
マジで言ってるんだとしたら、相当痛い。もう寝とけ。
0949デフォルトの名無しさんNGNG
>>944
こんなところで。
#include <iostream>
#include <fstream>
int mainfunc(std::istream & stream){
    int i;
    stream >> i;
    std::cout << i;
}
int main(int argc,char *argv[]){
    if(argc>1){
        std::ifstream stream(argv[1]);
        mainfunc(stream);
    }else{
        mainfunc(std::cin);
    }
    return 0;
}
0950945NGNG
さらに訂正。

pstrを、pistrに修正。
ま、雰囲気で分かるとは思うが。
0951944NGNG
>>945,949
なるほど・・・理解しました!
ありがとうございました。
0952デフォルトの名無しさんNGNG
クラスのプライベートで、

char *dogs[4] = {"Afghan Hound", "Beagle", "Border Collie", "Dalmation"};

のような文字列の配列を定義するにはどうすればいいんだろ。。。

class name{
private:
char *dogs[4] = {"Afghan Hound", "Beagle", "Border Collie", "Dalmation"};
};
こうするとエラーでるし。
0953デフォルトの名無しさんNGNG
>>952
これでいいか
class name{
private:
 static char *dogs[];
};
char *name::dogs[] = {"Afghan Hound", "Beagle", "Border Collie", "Dalmation"};
0954デフォルトの名無しさんNGNG
>>952
class name{
private:
char *dogs[4];
public:
name()
{
dogs[0] = "Afghan Hound";
dogs[1] = "Beagle";
dogs[2] = "Border Collie";
dogs[3] = "Dalmation";
}
};
0955952NGNG
>>953
これだと結局はグローバルで初期化することになるよね?
できればコンストラクタ内で初期化したいんだよ。

>>954
それは俺も考えたんだけど、そんな面倒くさいことしないといけないの?
本当に使おうと思ってる配列の数は28個なんだけど。。。。
0956デフォルトの名無しさんNGNG
>>955
class name{
private:
char *dogs[4];
public:
name()
{
ifstream f("dogs.txt");
for(int i = 0; i < 4; i++) {
//ma, ganbareya...
}
}
};
0957デフォルトの名無しさんNGNG
class name {
private:
static const char * * dogs;
public:
name() {
static const char * const tmpDogs[] = {
"AH", "B", "BC", "D",
};
dogs = tmpDogs;
};
0958デフォルトの名無しさんNGNG
>>955
> できればコンストラクタ内で初期化したいんだよ。

ならコンストラクタの中に書けばいいじゃないか。
0959デフォルトの名無しさんNGNG
>>955
>そんな面倒くさいことしないといけないの?

古今稀に見るワガママ君だな、キミ(w
クラス関係ないじゃん。
0960デフォルトの名無しさんNGNG
>>955
コンストラクタ内で初期化したいということは、インスタンス毎に配列を
持っていたいということ?そうだとしたら、そもそも>>953の方法は適さない。

その配列を書き換えるつもりが無いのなら、staticなメンバとして宣言して、
クラス定義の外で一度だけ初期化するの(つまり、>>953の方法)が自然だと思う。

その配列の用途が判らないことには答えようがないよ。
0961デフォルトの名無しさんNGNG
>>960に同意
>>952はインスタンス変数とクラス変数の違いが分かってないのでは?
0962デフォルトの名無しさんNGNG
とりあえず、>>952はマルチ。
0963デフォルトの名無しさんNGNG
>>961
>インスタンス変数とクラス変数

お前の造語か?( ´,_ゝ`)
0964デフォルトの名無しさんNGNG
わかったとしてもわがまま言うだろうから、ここは素直に「できない仕様」と言って放置しよう。
0965デフォルトの名無しさんNGNG
>>963
マジ知らねーの? おまえ・・・
0966デフォルトの名無しさんNGNG
>>963

まずググってから発言するべきだったな

( ´,_ゝ`)スゲーバカハッケンシマスタ!
0967デフォルトの名無しさんNGNG
>>966
まあ、クラス変数作るのにstaticなんてキーワード使うC++系言語が悪いといえば悪いんだけど。
ググってから発言すべきってのには同意。
0968デフォルトの名無しさんNGNG
グローバル変数、メンバ変数と言ってくれなきゃわからん。
0969デフォルトの名無しさんNGNG
そして誰も相手しなくなった・・・
0970デフォルトの名無しさんNGNG
>>963
お前ひょっとして、>>874と同一人物か?
0971デフォルトの名無しさんNGNG
>>968
それもクラス変数、インスタンス変数とは微妙に違う。
0972デフォルトの名無しさんNGNG
C++では、両方とも「メンバ変数」で、static付いてるのが「静的メンバ変数」だ。
0973デフォルトの名無しさんNGNG
稲垣メンバ変数
0974デフォルトの名無しさんNGNG
Javaの用語をC++スレで言われてもなぁ・・・・・
0975デフォルトの名無しさんNGNG
じゃあ変数の呼び方で1000目指します。
0976デフォルトの名無しさんNGNG
それじゃおまえら女性にはちんちんのこと何て呼んで欲しいよ。
俺は恥かしそうに「おちんちん」て言ってほしい。
0977952NGNG
>>956-960
Naruhodone, Thank you!!
0978デフォルトの名無しさんNGNG
個人的にはインスタンス変数って言葉が何となく気持ち悪い。
0979デフォルトの名無しさんNGNG
俺もおちんちん派
0980デフォルトの名無しさんNGNG
インスタンスおちんちん
0981デフォルトの名無しさんNGNG
じゃあ非staticメンバ変数をおちんちん変数と呼ぼう。
0982デフォルトの名無しさんNGNG
Visualおちんちん++
0983デフォルトの名無しさんNGNG
おちんちん++;
は、つまり勃起することを意味する。
0984デフォルトの名無しさんNGNG
違うだろ++はイテレータだ。隣のマムコに移動するんだよ。
0985デフォルトの名無しさんNGNG
++は必ずプラプラと発音する様に
0986デフォルトの名無しさんNGNG
C++の相談を・・・・



すみません、部屋間違えました
0987デフォルトの名無しさんNGNG
>>986におちんちんをいじってる姿を見られた感じがするんだが
0988デフォルトの名無しさんNGNG
>>984
型が違うから同じコンテナに入れて走査できないだろ?
0989デフォルトの名無しさんNGNG

        ∧∧  ミ _ ドスッ
        (   ,,)┌─┴┴──────┐
       /   つ. 相談室は夏期休暇中 │
     〜′ /´ └─┬┬──────┘
      ∪ ∪      ││ _ε3

0990デフォルトの名無しさんNGNG
ぬルポに決まってるだろうが!
0991デフォルトの名無しさんNGNG
ちんぽいんたー
0992デフォルトの名無しさんNGNG
あとは次スレ立てて現スレ埋めるだけだから、
ここでおちんちんの呼び方がきっかけで起こった俺のちょっとHな体験談を
書かせてもらおうか。

あれはバイトをしてた頃の話だ。
当時俺はファミレスでバイトをしていた。
ある日バイトの休憩時間にウエイトレスの女の子と休憩室で二人きりになったんだ。
女の子と言っても俺より2歳年上で、バイトの先輩でもあった。
0993デフォルトの名無しさんNGNG
ツヅキマダー?
0994デフォルトの名無しさんNGNG
埋め
0995デフォルトの名無しさんNGNG
で、どういう流れでそうなったのかは忘れたが、
男性器のことを何と呼ぶかという話になった。
彼女はさっきも書いたとおり年上で、
けっこう活発で面倒見も良い頼れる先輩って感じなんだけど、
その話の時はなんだか耳が赤くなってるのが俺にはわかって、ちょっと可愛く見えた。
その時は彼女は「ちんちん」と呼ぶと言っていた。
いつもの先輩としての彼女とは違って、少し恥かしがってる言い方がちょっと新鮮だった。
休憩時間はそんな話で終わったんだけど、
その日のバイトは俺も彼女も閉店時間までだったので、
バイトが終わってからまた休憩室で一緒になった。
0996デフォルトの名無しさんNGNG
産め
0997デフォルトの名無しさんNGNG
梅
0998デフォルトの名無しさんNGNG
埋め
0999デフォルトの名無しさんNGNG
生め
1000デフォルトの名無しさんNGNG
1000おちんちん ぬるぽ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。