C++相談室 part28
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら>>2-13
0002v(^・^)v
NGNG1 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://pc2.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc2.2ch.net/tech/kako/1043/10436/1043605481.html
16 http://pc2.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc2.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc2.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc2.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc2.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc2.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc2.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc2.2ch.net/test/read.cgi/tech/1062690663/
24 http://pc2.2ch.net/test/read.cgi/tech/1066546387/
25 http://pc2.2ch.net/test/read.cgi/tech/1067949669/
26 http://pc2.2ch.net/test/read.cgi/tech/1070164402/
27 http://pc2.2ch.net/test/read.cgi/tech/1074454641/
0003v(^・^)v
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/ (日本語)
0004v(^・^)v
NGNGamazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
0005v(^・^)v
NGNG[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
0006v(^・^)v
NGNG[C++】template 統合スレ]
http://pc2.2ch.net/test/read.cgi/tech/1066493064/l50
[ぼるじょあがC/C++の宿題を片づけますYO! 19代目]
http://pc2.2ch.net/test/read.cgi/tech/1073566342/l50
[初心者にVisual C++を教えるスレ★ Part9]
http://pc2.2ch.net/test/read.cgi/tech/1068983609/l50
[■ VisualC++(MFC限定)相談室 MFC10.dll■]
http://pc2.2ch.net/test/read.cgi/tech/1074104008/l50
[ATL 相談室]
http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
[C/C++でのWindowsPrograming議論スレ(質問お断り)]
http://pc2.2ch.net/test/read.cgi/tech/1049790146/l50
[COMの世界を斬る!]
http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
[managed C++ やろうぜ!!]
http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50
[C++Builder相談室 Part8]
http://pc2.2ch.net/test/read.cgi/tech/1070222674/l50
[タダで使えるBorland C++ Part3]
http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
[Borland C++ BuilderX]
http://pc2.2ch.net/test/read.cgi/tech/1065260556/l50
[Code of the Nerds" Digital Mars C/C++]
http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[GCCについて part3]
http://pc2.2ch.net/test/read.cgi/tech/1072484422/l50
[OpenWatcom C++]
http://pc2.2ch.net/test/read.cgi/tech/1033433728/l50
[タダで最強!フリーC/C++コンパイラ]
http://pc2.2ch.net/test/read.cgi/tech/1035882599/l50
0007デフォルトの名無しさん
NGNG後何かあったら付け足してください。
0008デフォルトの名無しさん
NGNG乙curry
0009デフォルトの名無しさん
NGNG乙!
0010デフォルトの名無しさん
NGNGCDでのRAWに対応するものをDVDで引き出すコマンドってありますでしょうか。
0011デフォルトの名無しさん
NGNGスレ違い
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0015デフォルトの名無しさん
NGNGすげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0016デフォルトの名無しさん
NGNG0017デフォルトの名無しさん
NGNGとかいうエラーが出るんだけどこれってどうすればいいのでちゅか?
0018デフォルトの名無しさん
NGNG(前略)(中略)(後略)
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNG海外サイトの翻訳だけど、iostreamだけでなくSTLのリファレンスもある。
ttp://www.shibu.jp:8080/cppreference/index.html
0023デフォルトの名無しさん
NGNG乙
0024デフォルトの名無しさん
NGNGWWWで公開されてていいものかどうかは知らんが。
0025デフォルトの名無しさん
NGNGttp://jbbs.shitaraba.com/bbs/read.cgi/computer/5651/1076858362/14
>引っ越しが完了したらttp://www.shibu.jp/cppreference/になります。
だそうです。
0026デフォルトの名無しさん
NGNGこれ、どういうこと?
0027デフォルトの名無しさん
NGNGMetrowerks CodeWarrior 8.2 Pro for Winを使っております。
(hello.cpp)
class hoge
{
public:
hoge();
~hoge();
private:
struct impl* pimpl_;
};
struct hoge::impl{};
hoge::hoge() : pimpl_(new impl){}
hoge::~hoge(){delete pimpl_;}
int main()
{
hoge hage;
return 0;
}
(メッセージ)
エラー: 宣言シンタックスエラー
hello.cpp 行: 9 struct hoge::impl{};
エラー: 宣言シンタックスエラー
hello.cpp 行: 10 hoge::hoge() : pimpl_(new impl){}
警告: 不完全な struct/union/class 'impl' の使い方が不当です。
hello.cpp 行: 11 hoge::~hoge(){delete pimpl_;}
ちなみに
struct impl;
impl* pimpl_;
とあらかじめ宣言すれば通ります。
0028デフォルトの名無しさん
NGNG'struct impl'の形はelaborated-type-specifierといって、でてくる文脈によって働きが微妙に異なる。
struct impl;
とかくと、そのスコープでimplが宣言され、
struct impl* pimpl_;
とかくと、「そのスコープを含む、最も内側の、非クラス、且つ、非関数宣言の」スコープ(この場合はグローバル名前空間)
でimplが宣言されたことになる。
詳しくは規格の3.3.1の5を参照すべし
002928
NGNG誤:とかくと、そのスコープでimplが宣言され、
正:とかくと、その宣言を含むスコープでimplが宣言され、
誤:とかくと、「そのスコープを含む、最も内側の、...
正:とかくと、「その宣言を含む、最も内側の、...
0030デフォルトの名無しさん
NGNG003126
NGNGレスありがとうございます。ご指示のありました規格書を読みましたところ、
ご指摘の通り、この場合struct implはグローバル空間に宣言されていて、
struct hoge::impl〜のhoge::を削除することによってコンパイルすることが
できました。
しかしながら、一つの疑問が増えます。前掲のコードはExceptional C++(訳)の
Pimplイディオムに必要な部分だけを取り出してきたものと認識して
おります。私の認識がが間違っているのでしょうか。それとも前掲の
書籍のサンプルコードが間違っているのでしょうか。どなたか更にご指摘願います。
0033デフォルトの名無しさん
NGNG本は持ってないけど、
> struct hoge::impl{};
これを
struct impl{};
こうしてあった、とか?
0035デフォルトの名無しさん
NGNG項目27は「先行宣言してあるクラスへの」と書いてあるから
struct impl; は省略されていると解釈したほうがいいんじゃないだろうか。
しかし、項目30とか見ると、Sutterタンのサボりやね。
0036デフォルトの名無しさん
NGNGよくC++にはガベージコレクション(GC)がないのが欠点(?)
とか言われますが、自分的には数年C++を使ってきて
スマートポインタで十分なのですが、それでもGCが必要という
のには何か理由があるのでしょうか?
0037デフォルトの名無しさん
NGNG0038デフォルトの名無しさん
NGNG標準には使いづらいauto_ptrしかないからそのことをいってるんだと思われ。
shared_ptrとかそのうち標準になるんだろうね。
制御できないGCなんていくらあっても屑なんだが。
0039デフォルトの名無しさん
NGNG004027
NGNGSutterさんがサボったのだろうと思います。これからはきがねなく先行宣言
しようと思います。重ね重ねありがとうございました。
0042デフォルトの名無しさん
NGNG成熟させるのが面倒。
004336
NGNG使っておりました(TT
もう一度勉強してきますです。
ありがとうございました。
0044r
NGNGスレッド間のデータの受け渡しが簡単になるよ。
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNG0047デフォルトの名無しさん
NGNGデータオブジェクトをのやり取りにキューを使用したてスレッド間通信する場合、
所有権があいまいになるからGCがあれば楽だといいたいのでは?
まあ、別にGCなくても実装簡単だけど。(それともJ*V*儲の戯言か?
>>36
ポイントされるオブジェクトの寿命によるんじゃないの?
リソースオブジェクトみたいに寿命が長ければ、smart_ptrで十分。
っていうかそういうものをGCにしてしまうとデストラクタがいつ走るか
わからんのでかえってよくないような気がする。
寿命が短く頻繁に生成・破棄を繰り返す場合には確かにGCあれば良いかも。
しかし、そういった状況は設計時に手を打てば回避可能だとおもうし。
0048デフォルトの名無しさん
NGNG↑ ↓
(・∀・)←(・∀・)
アアアァァ━━━━━(ゞ゚Д゚)ゞ━━━━━!!!
0049デフォルトの名無しさん
NGNG循環参照のことが言いたいのかね?
0050デフォルトの名無しさん
NGNGtp://www.cc.nao.ac.jp/fsunman/japanese/C++/
0051デフォルトの名無しさん
NGNGまた、in_availってどんな風に使うのでしょうか?
ifstream file("test.txt");
cout << file.rdbuf()->in_avail() << endl; ←こいつ
file.read(buf, M);
cout << file.rdbuf()->in_avail() << endl;
レスお願いします。
0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNGifstreamを使って、エラーをチェックするのが一般的なのでしょうか?
0054デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNG実行してエラーになったらファイルがない。
0056デフォルトの名無しさん
NGNG日本語版と英語版で違ってたりしますか?
リンクでエラーが出るのでLIBの中身を見てみたところ
一文字だけ違ってました。
?関数名@クラス名@@QAEXI@Z
が
?関数名@クラス名@@QAEXK@Z
みたいな感じでI->KやH->Jみたいに
どこか一箇所がコード2つ分後ろにずれます。
ご教授よろしくお願いします。
0057デフォルトの名無しさん
NGNGよく知らんけどスレ違いだろう。
005856
NGNG005927
NGNG0060デフォルトの名無しさん
NGNG0061デフォルトの名無しさん
NGNGboost::filesystem::exists
0062デフォルトの名無しさん
NGNGtest.txtは空じゃない?
ちなみにBCC5.6.4で14,278バイトのテキストを入力に取った
時の出力。
14278
3928
0063デフォルトの名無しさん
NGNGVC++6.0だとコンパイルできないのです。
通したいのでしがなにか技ないですか?
#include <iostream>
class A { public: int a1; char *p; int a2;};
class B {public: int b1; int b2;};
union C { A aa; B bb;};
C c = { aa:{ 1, "hoge", 2 } };
C d = { bb:{ 3, 4 } };
int main(){ std::cout<< c.bb.b2 << "\n"; return 0;}
0064デフォルトの名無しさん
NGNGC99? 無理だと思う…
0065デフォルトの名無しさん
NGNGどうしてもというのなら
独自拡張があるかどうかVCスレあたりで聞いてみては?
0066デフォルトの名無しさん
NGNG>>65
サンクスです。
他で聞いてみます。
0067デフォルトの名無しさん
NGNGがいるからここに誘導するか?
0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNG0070デフォルトの名無しさん
NGNG0071デフォルトの名無しさん
NGNG0072デフォルトの名無しさん
NGNGワロタ
0073デフォルトの名無しさん
NGNGenum { VAL1=1, VAL2=2 }
int result = foo(VAL1, VAL2);
みたいに inline 関数の実引数が定数のとき、コンパイラが
a * 100 + b を定数式と認識してくれることを期待してもいいもんですか?
0074デフォルトの名無しさん
NGNG奇遇ですなぁ.漏れつい昨日これと同じことして遊んでたよ.
もっと複雑なことさせたけどね.
結論から言うと期待しても良い.
その例ではfooの呼び出しはリテラルの102に置き換えられることを期待できる.
ただし,どこまで深く定数の伝播を評価できるかはコンパイラ依存かと.
0075デフォルトの名無しさん
NGNG期待できることもあるし、できないこともある。
コンパイラにアセンブリコードを吐かせてみたまえ。
0076デフォルトの名無しさん
NGNG(配列のサイズとか)には使えないんじゃないか?
0079デフォルトの名無しさん
NGNGどうしてもコンパイル時に評価して欲しければというのならテンプレート使って計算させろ
0080デフォルトの名無しさん
NGNGというか、その計算を何万回もやるんならともかく、
そこだけ取り上げてどういう風に最適化されるか考えるのは
どっちかというと無駄。初心者卒業あたりって、とにかくそうやって
一つ一つの命令を最適化しようとするけど、実際にはアルゴリズムとか
ループを見直した方がよい。20-80の法則ってやつ。
profiler使った結果、その関数の呼び出しがボトルネックだって
言うのが前提なら何も言わないけど。
ま、一番正解は>>76ってことで。
0081デフォルトの名無しさん
NGNGいうポインタがコピーされるのだから、privateメンバ変数の隠蔽に使いたい場合には
自分でoperator=()を定義する必要がありますよね?Exceptional C++にはそういう
記述は見当たらないのですが。
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNGEffectiveならともかく、Exceptionalはそういうレベルは当然の話題として
わざわざ触れてないんだと思う。
>>82
smart_ptr使うのとoperator=のオーバロードはぜんぜん趣旨が違う。
008482
NGNGたとえば、
boost::scoped_ptr<impl> pimpl; // コピー禁止
boost::shared_ptr<impl> pimpl; // 参照カウンタ方式で共有
こんなふうにすると、operator=のオーバーロードは不要になると思ってる。
なんか間違ってる?
0085デフォルトの名無しさん
NGNG0086デフォルトの名無しさん
NGNG「組み込み型のように振舞え」という原則にはずれている。
本当に共有していても動作に問題が無いとか、
ライト・オン・コピーしてくれてるんなら文句は無いが。
クラスライブラリとかで勝手にこんな実装されると混乱するのでやめてほしい。
デバッグの最中に「このクラスは代入されても実装部分は共有される」なんて
ドキュメントを見たらぶち切れると思う。
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNGソース読んでるとか?
0089デフォルトの名無しさん
NGNGそのサイトすごくいい!
0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNGSTL覚えるのと似たような感じ?
てーか、どうやっても糞もねーだろ。
使って覚える、これ最強。
0092デフォルトの名無しさん
NGNGとりあえず
ttp://www.kmonos.net/alang/boost/
ここを眺めていれば使い方の概要はわかる
0093デフォルトの名無しさん
NGNG{
cout << array[i];
}
これをアルゴリズム(for_each ?)を使って書くには
どうしたらいいのでしょうか?
0094デフォルトの名無しさん
NGNG#include <iterator>
copy( array.begin(), array.end(), ostream_iterator<T>(cout) );
Tはarrayの要素の型ね。
Boost使ってよければ
using boost::lambda;
for_each( array.begin(), array.end(), cout << _1 );
0095デフォルトの名無しさん
NGNG試してみます。ありがとうございました。
0096デフォルトの名無しさん
NGNGfor_each以外に
vector<int> v;
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
あとlambdaでの注意点。
using namespace std;using namespace boost::lambda;
for_each(v.begin(),v.end(),cout << _1 <<" ");//これは動く
/*これは動かない、少なくともbasic_ostream<char,char_traits<char> > & endl(basic_ostream<char,char_traits<char> > &)と
basic_ostream<wchar_t,char_traits<wchar_t> > & endl(basic_ostream<wchar_t,char_traits<wchar_t> > &)があるので。
*/
for_each(v.begin(),v.end(),cout << _1 << endl);
0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNGこの衝撃的なコードがなぜ動くのかも疑問だけど、なにがどうlambdaなのかがもっと疑問
λってナニを意味してるの?
0099デフォルトの名無しさん
NGNG0100デフォルトの名無しさん
NGNG0101デフォルトの名無しさん
NGNG若い人は知らんか
0102デフォルトの名無しさん
NGNG0103デフォルトの名無しさん
NGNGhttp://www.boost.org/libs/spirit/doc/phoenix.html
ここの下あたりに書いてある.っていうかlambda(;´Д`)ハァハァ
http://www.boost.org/libs/spirit/doc/subrules.html
ここでtypeofやautoキーワードが( ゚д゚)ホスィ…って愚痴ってるけど
確かにこういうの漏れも( ゚д゚)ホスィ…(何に使うかはとりあえずおいといてw)
でもexpression templateの多用って実行コードを
爆発的に肥大化させるように思えるんだが,連中は気にしてないんだろうか?
0104デフォルトの名無しさん
NGNG0105103
NGNG0106デフォルトの名無しさん
NGNGもはや実行コードのサイズなんて問題にはなりませぬ。
むしろコンパイラ側の最適化に一任した形となっているのでは。
コンパイラ技術はまだまだこれからだけど。
コードサイズ要求のシビアな分野では普通にCを使うだろうし。
なんでも適材適所かと。
0107デフォルトの名無しさん
NGNG> 爆発的に肥大化させるように思えるんだが,
確かに typeof / auto がないと途中でExpression Templateを
virtual関数に分断せざるを得ないのでその分コード量が
増えるんだがしかし、
逆に言えばtypeofやautoや型推論があれば、むしろETによって
最適コードだけが出力されるので、実行コード量は減る方向に
行くんじゃないかと思う。例えば型情報を全部手書きで頑張ると、
http://www.boost.org/libs/spirit/doc/techniques.html
の no_rule3.cpp
くらいにはすぐに落ちるわけで。
0108103
NGNGぎゃーす!そのページ読み落としてた.ありがとう.
っていうか,すでにそのレベルの文法でも,頑張ってらっしゃる
no_rule3.cppのtypedefがやばいことになってるんですがw
やっぱauto( ゚д゚)ホスィ…
再帰的なBNFだと連中はどうするつもりなんでしょうかねぇ・・・
(仮想関数に逃げるしかなさそうな・・・)
0109107
NGNG> no_rule3.cppのtypedefがやばいことになってるんですがw
禿同w
再帰的BNFは、やるとすればBoostのVariantみたいな
recursive_wrapper か、コンパイラの発展を期待して
特大subruleで頑張るか…。微妙だけどな。
0110デフォルトの名無しさん
NGNGこれの最後に改行文字を入れる一つの式を作ることはできますか?
0111デフォルトの名無しさん
NGNGたぶん君の期待してるようなものは無理。
0112デフォルトの名無しさん
NGNG出力ストリームのフラッシュは必要ない場合がほとんどだと思うのですが。
0113デフォルトの名無しさん
NGNGその通り。'\n' と同じ効果を期待するなら '\n' で十分。
std::endl; が多用されているのは '\n' より美しく見えるという
理由だけのような気がする。
0114デフォルトの名無しさん
NGNG出力先が常にstd::coutと仮定できればね
0115デフォルトの名無しさん
NGNG改行コードに関する環境差は今でこそ大所では何とか辻褄あわせしているようだけど
根本的に「ヤバい状況」であることには間違いなかんべ
本格的に破綻するまで待たずに予防策を打っておく案にはおいら賛成だ
0116デフォルトの名無しさん
NGNGこれの意味がわかりません。Operator Overloadをどう活用すれば
こういった記述ができるようになるんでしょうか?
0117デフォルトの名無しさん
NGNG今回の例では
A << B は
ストリームの A と文字列の B を取って戻り値として A を返す左結合の演算子
つまり
((cout << "HELLO ") << "WORLD!") << endl;
(cout << "WORLD!") << endl;
cout << endl;
cout;
と計算が進んでいく
0118デフォルトの名無しさん
NGNGどの部分がわからんのかちゃんと書いてくれ。よけいな手間がかかる。
文字列リテラルはchar*に対するoperator<<のオーバーロード、
マニピュレータは関数ポインタに対するオーバーロードを用いている。
繰り返し適用できるのはどれも演算後に自分自身(この場合cout)をreturnしてるから。
#マニピュレータはメンバでなくフリー関数だったかもしれない。が、本質には関係ない
0119デフォルトの名無しさん
NGNG多謝。初めて知った↓
The reason this is called a lambda expression is that traditionally,
such placeholders are written using the Greek letter lambda λ.
0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNGcoutのoperator<<の引数としてそれ以降のやつを取る、といえば分かるか?
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNGC++を使うと禿げるってホントですか?
0124デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNG0127デフォルトの名無しさん
NGNG0128デフォルトの名無しさん
NGNGどこのMACアドレスかわからんし処理系依存。
0129デフォルトの名無しさん
NGNG/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/
の下を眺めているんですが、coutの定義されてる場所が見つかりません…
0130デフォルトの名無しさん
NGNG/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/iostream に
extern istream cin;///< Linked to standard input
extern ostream cout;///< Linked to standard output
extern ostream cerr;///< Linked to standard error (unbuffered)
extern ostream clog;///< Linked to standard error (buffered)
#ifdef _GLIBCPP_USE_WCHAR_T
extern wistream wcin;///< Linked to standard input
extern wostream wcout;///< Linked to standard output
extern wostream wcerr;///< Linked to standard error (unbuffered)
extern wostream wclog;///< Linked to standard error (buffered)
#endif
という記述がありました。どうもすみませんでした。
0131デフォルトの名無しさん
NGNG演算子オーバーロード以前にC++の基本的な部分の勉強が足りな過ぎ。
処理系のソースを漁るのもいいが
標準ライブラリの体系だった説明とコード例の載った本を読め。
0132デフォルトの名無しさん
NGNGどういうことだ?
俺には>>130が妙なことを言っているようには思えないが。
0133デフォルトの名無しさん
NGNG0134デフォルトの名無しさん
NGNGん?
cout の定義場所もわからないでいるのに
演算子オーバーロードの利用もないだろうってこと。
無論学習順序はそれぞれだろうが、
その目的のためにも標準ライブラリは参考になるところが多いはずだしな。
0135デフォルトの名無しさん
NGNG細かい実装の詳細なんてどうでもいい。
0136デフォルトの名無しさん
NGNGお前の個人的な意見だと言うのなら勝手だが
0138デフォルトの名無しさん
NGNGなるほど、そういうことか。
まあ、俺はcoutの定義場所(おそらくスタティックライブラリの中)を知ることが
重要なことだとは思わんが。
0139デフォルトの名無しさん
NGNGJ( 'ー`)し たかしへ 最近C++勉強してるのでウィルス添付してみました 開くと自動実行するからね
(`Д) OSごと消えたウィルス送るな殺すぞ
J( 'ー`)し ごめんね。おかあさん始めてウィルス作って見たから、ごめんね
(`Д) うるさいくたばれ、しかも俺から世界中にウィルス発信されてるじゃねーか
J( 'ー`)し ニューヨークも全体落ちたみたいです 食事はしてますか?
(`Д) もうおなかいっぱいです
0140デフォルトの名無しさん
NGNG(`Д) OSごと消えたウィルス送るな殺すぞ
J( 'ー`)し ごめんね。おかあさん始めてウィルス作って見たから、ごめんね
(`Д) うるさいくたばれ、しかも俺から世界中にウィルス発信されてるじゃねーか
J( 'ー`)し ニューヨークも全体落ちたみたいです 食事はしてますか?
(`Д) もうおなかいっぱいです
0141デフォルトの名無しさん
NGNG### gcc/libstdc++-v3/src/globals_io.cc ###
typedef char fake_ostream[sizeof(ostream)]
__attribute__ ((aligned(__alignof__(ostream))));
fake_istream cin;
fake_ostream cout;
### gcc/libstdc++-v3/src/ios_init.cc ###
extern istream cin;
extern ostream cout;
・・・
ios_base::Init::Init()
{
・・・
new (&cout) ostream(&buf_cout_sync);
new (&cin) istream(&buf_cin_sync);
new (&cerr) ostream(&buf_cerr_sync);
new (&clog) ostream(&buf_cerr_sync);
・・・
しかしostreamの定義場所がどうしても見つけられません…
0142デフォルトの名無しさん
NGNG標準ライブラリの体系だった本読めと言っているのに……急がば回れだよ。
ostream は basic_ostream の typedef。
ostream の中で定義されているはず(宣言だけなら ios_fwd にもあるが)。
http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1basic__ostream.html
0143デフォルトの名無しさん
NGNG/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/iosfwd
(iostrem → ostream → ios → iosfwd という順序でインクルード)
ここに
namespace std {
・・・
typedef basic_xxx<char> xxx;
typedef basic_xxx<wchar_t> wxxx;
・・・
という風にIO関連の型定義がいくつかありました。どうもお騒がせしました。
0144デフォルトの名無しさん
NGNGint i=0;
struct A {
A() {i=1;}
static A & a() {
static A a;
return a;
}
private: static A * ap; // (*)
};
A * A::ap=&A::a(); // (*)
int main() {
A & ap=A::a(); // (**)
return 0;
}
(*)の部分がない場合は(**)の呼び出し前後でiの値が
変わることになる。(*)の部分があるとmainの呼び出し前に
A::a()の呼び出しが行われているみたいだけど、
これってC++の仕様的に保証されているのでしょうか?
Singletonのインスタンスにmain前にアクセス可能にする場合
上みたいに実装すること思うけど、スレッド安全性の確保の
為に、main前にはA::a()が呼び出されていて欲しくてこんな風に
してみた。まあ、mainの先頭で手動で呼び出してもいいんだけど。
apに誰もアクセスしないので最適化で消えちゃうかなあ?
0145デフォルトの名無しさん
NGNGただ依存関係を持つ複数のオブジェクトがあったりすると話がややこしくなるけど。
0146145
NGNGただポインタ ap はクラス変数じゃなくて
ふつうのグローバル変数として定義するべき。
翻訳単位の異なるスタティックオブジェクトの初期化順序に関する規定はないんで
そういう場所で定義するのはよろしくない。
0147145
NGNGローカル(関数内部)のスタティックオブジェクトの初期化は
その関数を最初に呼び出したときに行われるんで、
a() の呼び出しそのものを省いたりはしないで。
ついでにグローバルの ap もポインタじゃなくて参照でいいよね。何で織り交ぜてるのか知らないけど。
無駄レススマソ。
0148デフォルトの名無しさん
NGNGたとえば、DLL化とか言い出した日にはもう目も当てらんない。
0149デフォルトの名無しさん
NGNG俺もそう思う。
サボりの美学と非科学的な神頼みの境がわかってないヴォケ大杉。
0150デフォルトの名無しさん
NGNGhttp://www.codesourcery.com/cxx-abi/
0151144
NGNG>何で織り交ぜてるのか知らないけど。
A * A::ap=&A::a();
とすることによりのapの初期化の為にA::a()がmain前に
必ず呼ばれる事を期待しているって意図は伝わってる?
apをprivateなクラス変数にしたのは、main前には
apがいつ初期化されるか未定だから、誰もapにアクセス
できないようにしただけです。
>>148
(Winの)DLLにしてもプロセスのアタッチ時にグローバル変数は
初期化されるんじゃないの?
>>150
私に対するレスですか?
0152デフォルトの名無しさん
NGNGそうしてヒトは成長するのさ〜
0153デフォルトの名無しさん
NGNG本人が痛い目にあうならいいんだけどさ
0154デフォルトの名無しさん
NGNG多くの場合は設計に問題があるんだけどね
0155デフォルトの名無しさん
NGNGここ一発ふんばらにゃならんときに
ふとよぎる悪魔のささやきだな
0156デフォルトの名無しさん
NGNGそっちよりも↓のが重要。
>ap はクラス変数じゃなくてふつうのグローバル変数として定義するべき
まあ今回の件に関してのみ言えばどちらでもよいことなんだが
ふつうは(というかそのクラスを再利用するつもりがあるのなら)
初期化は最終的にはクライアントのコードで指示する。
簡単に説明するなら、
初期化の順序や必要なパラメータの指定はプログラムの全体像を知らないと記述できないから。
まあもっと頭の痛くなる問題もあってそっちのが重要なんだけど。
#つーかモジュールでオブジェクトの生成までやってしまうのなら Singleton の意味ないし。
#たいたいコンストラクタが引数持ってたらどうするつもりだ?
何度も言うが、今回のプログラムでしかそのクラスを利用しないというのなら別にどちらでもいい。
0157144
NGNGクラス変数でもグローバルでもどっちでもいいです。
どうせアクセスしないし。
>初期化の順序や必要なパラメータの指定はプログラムの全体像を知らないと記述できないから。
Singletnoの問題はむしろ破棄の順番では?勿論、ファイルやドライバのハンドル等の
場合にはまずいかもしれないけど。少なくともそういったリソースの管理クラスに
当てはめ様とは考えていません。
>#つーかモジュールでオブジェクトの生成までやってしまうのなら Singleton の意味ないし。
んー、そうですか?ちょっと言い過ぎなような気がするけど。
0158デフォルトの名無しさん
NGNG雑談がしたいのか、仕様が知りたいのか、はっきりしる。
0159デフォルトの名無しさん
NGNGありますが、実際にやってみると非常に面倒くさいと感じます。皆さんは
そのへんどう解決してますか?気にせずがんがん再コンパイルですか?
それとも、ちゃんと設計してからコード書けやごるぁ!!!って感じですか?
0160デフォルトの名無しさん
NGNGクラスやコンポーネントの依存関係を気にするべき。
コンパイル時間なんて気にスンナ。
あ、gccをご利用?そりゃごめんなさい。
0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNG気にしたくないよ
気にしたくないんだよおおお
んなこと言ったって・・・(泣
0164デフォルトの名無しさん
NGNGコピペで再利用するわけじゃないし。
0165デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNG>147の織り交ぜるってのは
A & A::ap=A::a();
何故こうしない?と言うことでは。
しかし、普通に、一番最初のstatic A & a();呼び出しで初期化すればええやん、と思うのだが。
pimplは、めんどくさくは無いけど、
小さいオブジェクトにnewは何となく嫌症候群だからなぁ。
0167デフォルトの名無しさん
NGNGMACアドレスを取るのはどういう方法があるのでしょうか?
IPのMACで例えばWindowsなどの処理系です
ipconfig.exeを使う方法があるのですがバージョンなどの問題などありますから
0168デフォルトの名無しさん
NGNGIPにはMACアドレスという概念はありません。
Windowsは処理系ではありません。
0169デフォルトの名無しさん
NGNG物事を正しく把握し、説明する練習をしてからまたもどってこい。
0170デフォルトの名無しさん
NGNGヒープの分断化を招きますか?
やはりループ外で事前に定義しておくか、自前でアロケータを書くべきでしょうか?
ちなみにalloca()などを使ってスタック上にアロケートするアロケータを書くことは
この場合妥当な選択でしょうか?
0171デフォルトの名無しさん
NGNG話はどこにいったの?
0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNG#include <ctime>
using namespace std;
int main()
{
std::time_t systime = std::time(0);
std::tm *cur = std::localtime(&systime);
cout << systime;
}
上のようなプログラムを実行すると1078750166と表示されるのですが、
これを2004/3/XX XX:XX というようにするにはどうすれば?
0174デフォルトの名無しさん
NGNGてかC++じゃなくてCの話題だねそれ
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNG本当にそのフォーマットじゃなきゃいけないのならstrftime
あとはリファレンス見てくれ
0177173
NGNGお答えサンクス。
てぇことはですよ、プログラム中で時刻を使いたい場合は
その文字列から時分秒を求める必要があるンすか?
0178こんぴゅー
NGNG2) a=3;
3) d; 注:この直前の文はchar d[10];
4) ((a=3)>2 || (b=0)<-1);
5) "abcdefg";
6) printf("%s",string="abcdef"); 注:変数stringは文字型へのポインタ変数
各式の評価値を教えてください(理由もお願いします)
0179デフォルトの名無しさん
NGNGお前が使っているstd::localtimeはいったいなんなのかと(ry
0180173
NGNGじゃあ、どうすれば良いですか?
0181デフォルトの名無しさん
NGNGだから>>175->>176の関数を今すぐ調べろ。
0182デフォルトの名無しさん
NGNGCの標準関数は別の名前空間にしておくべきではなかったか。
0183デフォルトの名無しさん
NGNGlocaltime の引数は何なのか調べればよろしいかと。
0184ルージン
NGNGtemplateスレで聞こうと思ったのですが下がっているので
ここに来ますた。
class CTest
{
public:
void f() const
{
g();
}
void g(){}
};
このコードはもちろん通らないのですが
このクラスをtemplateにするとconstのチェック
が効かなくてコンパイルできてしまいます。
なんでですか?
0185デフォルトの名無しさん
NGNGクラスtemplateのメンバ関数は、必要になるまで定義が実体化されないから。
たぶん、コンパイルできてるソースからは f() の呼び出しがないんでしょう。
0186デフォルトの名無しさん
NGNG実体化されていないから。
0187ルージン
NGNG0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNG> 頻繁に構築・解体するコンテナ(例えばループ内の一時変数など)は、 ヒープの分断化を招きますか?
情報足らなさ過ぎ。実測するのが一番。
実測する方法もわからないのなら、そもそも断片化を気にしてもしょうがないし。
0190デフォルトの名無しさん
NGNG配列とかをローカルで宣言するとスタックの浪費になるのでしょうか?
ポインタの配列を宣言して、オブジェクト自体はヒープに
作ったほうがいいのでしょうか?
0191デフォルトの名無しさん
NGNGうん
0192デフォルトの名無しさん
NGNG0193190
NGNGメモリの使用量は同じだと思うのですが、スタックというのは
一定の予約された領域なので、大きなオブジェクトをバシバシ
作ってもいいのかと思いまして。(スタックオーバフローとか
いうのもあるといいますし...)
0194デフォルトの名無しさん
NGNGあまりに大きいオブジェクトの配列はスタック上よりヒープに作った方がとりあえず無難。
それよりその用途ならポインタの配列じゃなくて
ふつうにオブジェクトの配列を動的に作成すればいいんじゃないの?
あとでオブジェクトを一個一個受け渡すのならともかく。
0196デフォルトの名無しさん
NGNGいただきたいのですが、これってただ
コンストラクタを呼んでくれるだけですよね。
であれば
new ((void*)pObj) CWidget;
なんてせずに単に
pObj::CWidget();
としたらいいのになんでわざわざplacement new
という構文が必要なのでしょうか?
実際deleteにはplacement delete(?)みたいな
ものはなくて
pObj::~CWidget();
と書いているのをよく見ますが...
0197デフォルトの名無しさん
NGNGそのpObjってのが何なのかわからん。
ともかく placement new ってのは
引数で与えられた領域にオブジェクトを生成するためのものだ。
コンストラクタを呼び出すだけってのは見当違い。
0198196
NGNGすでに確保されたメモリ上の位置をさしています。
>コンストラクタを呼び出すだけってのは見当違い。
ほかにはどんな作業があるのでしょうか?
0199デフォルトの名無しさん
NGNG>pObj::~CWidget();
>pObjというのはCWidget型のポインタです。
出典はしらんがこんなコード例が載ってるものを信用するな。
>ほかにはどんな作業があるのでしょうか?
注目してるのはオブジェクトを生成する領域だって言ってるだろ。
つーか通常のインスタンス宣言と new や placement new との違いを本当にわかってるのか?
0200デフォルトの名無しさん
NGNGclass AAA
{
AAA() {}
~AAA() {}
};
charbuf[sizeof(AAA)];
AAA*pa = new(buf) AAA;
pa->~AAA();
pa->AAA::AAA();
pa->~AAA();
どっちも同じように走るんだが、何が違うんだろうな?
と書いてて思ったんだが、クラスAAAにplacement newがあったら後者はまずいな。
0202デフォルトの名無しさん
NGNG標準C++ではその様に直接は呼べないだろう。
0203デフォルトの名無しさん
NGNGあるオブジェクトを”割り当て済みのメモリ領域に”生成したいときに使うのが placement new だ。
コンストラクタやデストラクタの振る舞いなんかは二の次。
詳しいことは More Effective C++ の第8項を読むといい。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNG>pObj::~CWidget();
>pObjというのはCWidget型のポインタです。
っていうかこれ、コンパイル通るの?
0206202
NGNG0207デフォルトの名無しさん
NGNGが作成されるだけで、呼び出しが終わると消滅してしまう。だから
placement newを使うか、コンストラクタを呼び出した結果を*thisに
代入しなければならない。
#include <iostream>
class sample_class
{
public:
int value;
sample_class(int i) {
value = i;
std::cout << "Ctor(int) called\n";
}
sample_class() {
sample_class(10); // ダメダメ
// new (this) sample_class(10);
// *this = sample_class(10);
std::cout << "Ctor() called\n";
}
~sample_class() {
std::cout << "Dtor() called\n";
}
};
int main()
{
sample_class a;
std::cout << a.value << std::endl;
}
0208デフォルトの名無しさん
NGNGコンストラクタからコンストラクタを呼び出して放置すると
メモリリークが起きてしまう。
0209デフォルトの名無しさん
NGNGちごた、これは間違い。デストラクタが正しく書かれていれば一時
オブジェクトの消滅時にデストラクタが呼ばれる。
0210デフォルトの名無しさん
NGNGみたいなやつはあくまでデフォルトの定義。
それはそれで有用ですけど。
placement な operator new は、
例えばこんな風にオーバーロードして、
どこからメモリを確保するかをコントロールしたりとか
けっこういろんなことに使える。
void* operator new(size_t n, Allocator& a)
{
return a.alloc(n);
}
0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNG別になくてもおかしくないじゃん。
0213196
NGNG今さらなのですが、間違っていました
× pObj::CWidget();
○ pObj->CWidget();
× pObj::~CWidget();
○ pObj->~CWidget();
0214デフォルトの名無しさん
NGNG言っていることが良くわからない。漏れが言いたかったのは、
foo *p = new foo;
delete p;
とやるなら、
foo *p = new(buf) foo;
delete(static_cast<void *>(0)) p;
とか、
foo *p = new(myalloc) foo;
delete(myalloc) p;
みたいにできた方が自然じゃないか、ってこと。
0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG形だけ見て物を言うと引数つきのデストラクタがないのは不自然みたいな話になるわけだが。
0217デフォルトの名無しさん
NGNGvoid operator delete(void *, void *) {}
void operator delete(void *p, Allocator &a)
{
a.dealloc(p);
}
こんな感じで使えばいいと思う。
0218デフォルトの名無しさん
NGNGnew はコンストラクタじゃないし、delete はデストラクタじゃないよ。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG初期化は外部からパラメータ与えてカスタムできる必要があるけど
破棄は(必要なら内部でパラメータを保持していて)
外部からの指定なしにできるべきだという理屈。
そうでないと初期化のパターンすべてについて
破棄を命ずる側がよく知っていなくてはいけなくなるだろ。
この厄介さを考えれば初期化に対する破棄時の仮定は成り立ってもらわんと困る。
#STLのアロケータと同じ類の問題かな
0221デフォルトの名無しさん
NGNGオブジェクトごとに破棄方法を記録するってこと?
それはそれで意味があるかもしれないが、記法の問題を越えるよな。
それに、C++がデフォでその方法を採用するとは思えないから、
(単純なデストラクタ呼び出しに仮想関数呼び出しを付随させるわけにはいかない)
どちらにしてもdeleteと書くたびに、そのメカニズムを使うかどうかを選択せねばならんし。
0222デフォルトの名無しさん
NGNG要するに、
単一の破棄手段と多様な初期化手段の両方を実現するには
どの初期化方法に対しても単一の方法で破棄できるようにするか、
それが嫌ならオブジェクト内部に何らかの形で必要な情報を記録するか
どちらかを選ぶしかないってことよ。
>deleteと書くたびに、そのメカニズムを使うかどうかを選択せねばならんし
これこそ引数つきの delete に対して>>220で指摘した問題なんだけど……
実際現行のC++はそんなものをサポートしていないわけで
0223デフォルトの名無しさん
NGNGどうも話がかみ合っていないと思ったら・・・
>単一の破棄手段と多様な初期化手段の両方を実現するには
>>214は多様な「確保手段」と「開放手段」に似た見た目を与えようとしているのであって、
初期化・破棄についていっているのではない。
0224デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
NGNG確保・解放も含めての話のつもりだったんだけどなあ……。
多様な確保手段に”対応する”多様な解放手段を
常に考慮しなければいけなくなる状況に問題があることはわかってる?
特に解放側から確保側への依存関係を持ち込みたくない状況で。
独自のフレームワークで拡張するのは構わないが、
言語仕様にそんな厄介なものを持ち込まれてはたまらない。
0226デフォルトの名無しさん
NGNGじゃあ、
foo *a = new foo; /* ヒープ */
foo *b = new(buf) foo; /* スタック */
foo *c = new(fixed_alloc<foo>()) foo; /* 固定サイズのメモリ確保ライブラリ */
general_free(a);
general_free(b);
general_free(c);
これがうまく動作するgeneral_freeが実現できるとでも?
0227デフォルトの名無しさん
NGNG>>226
using namespace boost;
shared_ptr<foo> a( new foo );
shared_ptr<foo> b( new (buf) foo, no_op() );
shared_ptr<foo> c( new (fixed_alloc<foo>()) foo, fixed_alloc<foo>::dealocater() );
とかでダメ?
0228デフォルトの名無しさん
NGNG勝手に話を拡張しないでくれ。
placement new は実際にシステムからメモリを”確保”することは行っていないし、
それに対応する”解放”処理もその意味でのメモリの”解放”は行わないってことは踏まえてるか?
いや、俺も>>225で不用意な言い方したんで悪かったと思う。
#placement new でなされる処理をメモリの”確保”と呼ぶのなら
#それに合わせようとしたんだが過度な誤解を与えそうな言い方なのは確かだ。
しかしそこまで基本からはずれた問だと揚げ足取るための例かと邪推してしまうぞ。
0229226
NGNGたとえば、
foo *p = new(myalloc) foo;
p->~foo();
myalloc.dealloc(p);
と書く場合、開放側のコードは確保側に依存しているよな?
(pがmyallocによって確保されたことを期待している)
それを>>214の様に書き直したところで依存性は変わらない。
変わるのは見た目だけで、「'new'と書いたんだから'delete'と書きたい」という
自己満足を満たす以上の何者でもない。(templateが絡むと変わってくるが。)
>>225の言うことは正論で、実行可能だ。(>>227氏thx)
けど、ここでは直接関係しない、ということでいいんじゃないだろうか。
0230デフォルトの名無しさん
NGNGそれってオブジェクトの内部にデアロケータへの参照渡してるんだよな?
(クラスの継承関係に縛られないよう関数ポインタ渡すべきだと思うけど)
それって要するに
あるフレームワークに従って
オブジェクトの内部にデアロケートのための情報を保持させるってことだろ?
>>226だかの placement delete が欲しいと言っている人(達?)の意見は
それは嫌で引数としてアロケータを渡したいと言うもののようだが。
あとついでにshared_ptr は何のために持ち出したか知らないけど。
最後にデストラクタじゃなくて delete 演算子呼んでしまわうから
実際の例としてはまずくない?
0232225(としとく)
NGNGもっかいまとめるね。
placement delete 反対派の俺としては、
(とりあえず自動変数としての宣言、 malloc や、引数なしの new のような”生の”メモリ確保は別物として)
placement new を行った場合に、
その引数に対応する適切な解放処理を解放側が
常に覚えて置いて解放時に記さなきゃいけないような記述はクライアント側のコードの独立性を下げる。
だから、もしデストラクタ以外にそうした独自の解放処理が必要なら
独自のフレームワークに従ってオブジェクトの内部に必要な情報を保持するなりして対応しろ、
ぶっちゃけ、外部から与えるような形式を言語仕様が認めるような形にはするんじゃない(※)と言っている。
もう一方の主張は、
解放処理に余分な指示を与える前提で(※)
どうせ後から解放のための関数呼び出しをするくらいなら
引数つきの delete があった方が構文が統一的になる、というようなものと解釈している。
で、※の部分の前提が目的意識を違わせ、かみ合わなくなっている気がするんだがどうだろね?
0233225
NGNG俺も熱くなりすぎていた。
解放時の独自の関数呼び出しがそこまで重要視されることが想像外だったのね(たぶん)、そこは謝っとく。
それじゃ俺も退散するわ。
0234デフォルトの名無しさん
NGNGplacement new を使えばできてしまうのであれば、
どうせなら直接呼び出せるようにすればいいのに。
構文を統一的にするなら、こっちの方がよっぽどいい。
0235227
NGNGC++でplacement delete演算子を"明示的に"呼び出す構文が
ないのは、禿曰く↓↓みたいなテンプレートを用意すればユーザ定義
できるから、という理由だったはず。
template<typename P1, class T>
void Delete( const P1& p, const T* ptr ) {
ptr->~T(); operator delete( p, ptr );
}
俺はplacement newの方も廃止して、アドレスを渡してコンストラクタを
呼び出す構文"だけ"を用意しとくべきだったと思うのでplacement delete自体に
反対だが、現にplacement newがある以上、対称性からplacement deleteを呼ぶ
構文も存在するべきだというのには全面同意する。
>>230
一個目以外はdelete呼ばないよ。継承関係?関係ない。
0236デフォルトの名無しさん
NGNG#include<iostream>
#include<cstdlib>
struct XX{
int data;
XX(){std::cout << "XX()" << std::endl;}
~XX(){std::cout << "~XX()" << std::endl;}
static void* operator new[] (size_t size){
std::cout << "new XX[]" << std::endl;
void* p = malloc(size); std::cout << p << std::endl;
return p;
}
static void operator delete[] (void* p){
std::cout << "delete XX[]" << std::endl;
free(p); std::cout << p << std::endl;
}
static void* operator new[] (size_t size,void* mem_p){
std::cout << "new (mem_p) XX[]" << std::endl;
mem_p = malloc(size); std::cout << mem_p << std::endl;
return mem_p;
}
static void operator delete[] (void* p,void* mem_p){
std::cout << "delete[] ( p , mem_p )" << std::endl;
std::cout << p << std::endl; std::cout << mem_p << std::endl;
delete [] p; //エラー!!! -> デストラクタがないときは大丈夫 ,G++3.3.1は大丈夫
}
};
0237続き
NGNGXX *x = new XX[5];
delete [] x;
void* mem_p=0;
XX *x2 = new (mem_p) XX[5];
XX::operator delete[] (x2,mem_p);
}
0238デフォルトの名無しさん
NGNGまあそれは置いといて、
static void operator delete[] (void* p,void* mem_p);
の時のpとmem_pの値を見てみろ。
おまえがmallocから貰ったポインタはどちらですか?
0239デフォルトの名無しさん
NGNGnew(mem_p)[]の中では
mem_pは 003707B9
main関数に戻ったときは
mem_pは 00000000
x2 は 003707BC
従って、
static void operator delete[] (void* p,void* mem_p);
のpにx2を渡してるので不整合が起きるみたいです。
デストラクタがある場合は詰め物?があるようで、xの場合も
delete [] x; //はOK
XX::operator delete[](x); //デストラクタがあるとだめ
XX::operator delete[](x-1);//デストラクタがあるとOK
となってしまいました。
>それはplacement newとは言わないんじゃないのか?
なんか根本的に使い方を間違えてるような気がしてきた...
0240デフォルトの名無しさん
NGNGvoid* ひとつを受け取るバージョンは標準ライブラリ<new>で定義されているので、
ユーザーが定義しちゃダメです。
0241デフォルトの名無しさん
NGNGのところにplacement newしちまっているじゃないか。
placement newはすでに領域は確保してあって、そこにオブジェクトを
構築したい時に使う。>>236=237がやりたいような、「自分の希望した
*任意の*アドレスにオブジェクトを生成する」わけではない。
class c{...};
void *buf = operater new[](5 * sizeof(c));
c* pc = static_cast<c*>(buf);
for(int i = 0; i < 5; ++i)
new (&pc[i]) c();
...
delete [] buf;
こんな感じ。というか、More Effective C++読もうや。
0242241
NGNGvoid* operator new(size_t, void* buf)
{
return buf;
}
ここのなかで領域確保するのでは*ない*のです。
0243デフォルトの名無しさん
NGNGv=0;
~((~v) >> 1)
で,intが32ビットなら,
10000000000000000000000000000000 (2)
と,最上位が1のビット列になりますよね
これと同じ事はshortやcharには通用しないんですか?
unsigned short(16bitと仮定)やunsigned char(8bitと仮定)でそれぞれ,
1000000000000000 (2)
10000000 (2)
となることを期待したのですが,参照してみると0だと言われます。
もしかして,ビット演算って1word単位でやるのですか?
だとすると,
10000000000000000000000000000000
で,右から16ビットだけ読んだ場合も,8ビットだけ読んだ場合も
どちらも0となってつじつまは合うんですが。
0244じゅn
NGNG0245デフォルトの名無しさん
NGNGhttp://pc2.2ch.net/pcqa/
0246デフォルトの名無しさん
NGNG計算途中でintになっちゃうYO
最後に代入する部分で警告でてるはずだが。
0247デフォルトの名無しさん
NGNGそそ。整数への格上げ。C++でなくCでも同じ。
0248デフォルトの名無しさん
NGNGv=~v;
v=v>>1;
v=~v;
ならunsigned shortやunsigned charでも最上位が1になるよ。
0249デフォルトの名無しさん
NGNGアメリカの大学でコンピューターサイエンスを
専攻し、昨年卒業したんですが、未だに就職先が
見つかりません。今アメリカではIT業界で職を探すのは
非常に困難です。特に新卒にとっては…。
学校ではJavaでプロジェクトなどやったんですが、
これからはC++に変えたいと考えています。
そこで質問なんですが、C++に将来性はあるのでしょうか?
またC++のどのあたりを勉強したら就職に役立つでしょうか?
あとOSはRedhatのFedoraを使ってるんですが、
コンパイラーは何がいいんでしょうか?
よろしくお願いします。
0250デフォルトの名無しさん
NGNG0251デフォルトの名無しさん
NGNG学者にでもなれば?と思うんだけど。
0252デフォルトの名無しさん
NGNGBYTE b=19;
cout << hex << b << endl;
とやってみたのですが、文字化けしてしまいます。
なんででしょうか?
0253デフォルトの名無しさん
NGNGBYTEってのは中身は(unsigned) charだろ。つまり文字として出力されてしまう。
intに格上げしる。
cout << hex << (b & 0xff) << endl;
みたいに。
0254sage
NGNG論文なり、プログラム作品は持ってる?
0255デフォルトの名無しさん
NGNG> cout << hex << (b & 0xff) << endl;
これでは意図が不明確なので、static_cast<int>(b)の方が良いと思う。
0256デフォルトの名無しさん
NGNG0258252
NGNGintにしちゃうと2バイトなので、0xff00みたいになってしまいました。
「0xff」だけで出力したかったのです。
0259デフォルトの名無しさん
NGNG0260デフォルトの名無しさん
NGNG登録時にバランス化されますか?
登録コストはlog nですか?
mapエントリ削除、編集のコストはどうですか?
このときも逐一再バランスされますか?
0261249
NGNG学者というよりは目先の金ってタイプなもんで…。
Visual C++などのマイクロソフト系に
行きたくないんですが、それでは
就職は難しいのでしょうか?
0262デフォルトの名無しさん
NGNGマ板行けよ
0263デフォルトの名無しさん
NGNG#include <iostream>
inline complex<double>&
operator+=(complex<double>& c, double dval)
{ return c += complex<double>(dval); } // ←ここが再帰的な定義になってる?
inline complex<double>&
operator++(complex<double>& c)
{ return c += complex<double>(1.0); }
int main()
{
using namespace std;
complex<double> purei(0, 2);
cout << purei << endl;
complex<double> real(2);
cout << real << endl;
// error ...
// by default, only += complex object
// ok; overloaded instance
purei += 1; cout << purei << endl;
++purei; cout << purei << endl;
purei += real; cout << purei << endl;
}
このコードがgcc-3.3.2では処理途中でアボーンします。
何が間違っているんでしょうか?C++Primerのサンプルコードです。
0264デフォルトの名無しさん
NGNGエラーメッセージ見逃してました。。。
complex.C:11: error: syntax error before `&' token
complex.C:15: error: syntax error before `&' token
complex.C: In function `int main()':
complex.C:32: error: no match for 'operator++' in '++purei'
普通のシンタックスエラーですね。失礼しました。
0265デフォルトの名無しさん
NGNG二分木である必要は必ずしもないが、規格で決まった計算量の
要求を満たすデータ構造が事実上なんらかのバランス木しかないので、
実際の実装はほとんど全て二分木。B木とかを使う実装もあるかもしれん(知らんけど)
> 登録コストはlog nですか?
> mapエントリ削除、編集のコストはどうですか?
http://www.sgi.com/tech/stl/Map.html
0266デフォルトの名無しさん
NGNGなんで大学卒業しといて
> そこで質問なんですが、C++に将来性はあるのでしょうか?
> またC++のどのあたりを勉強したら就職に役立つでしょうか?
> あとOSはRedhatのFedoraを使ってるんですが、
> コンパイラーは何がいいんでしょうか?
そんなことくらい自分で答えを出せないのか?そりゃ職もないだろう。
0267デフォルトの名無しさん
NGNGデストラクタを起動するために配列のオブジェクトの数が必要なため、
たいていの実装では、数を格納する4Byteを余分に確保する。
そのため、デストラクタのあるオブジェクトのplacement new[]では、
与えるポインタと返されるポインタがずれる。
>241
どうでもいいけど
>operater new[](5 * sizeof(c));
>delete [] buf;
個人的に、単なるメモリ確保には
operator new(5 * sizeof(c));
operator delete(buf);
こっちを押したい
0268デフォルトの名無しさん
NGNG> 実際の実装はほとんど全て二分木
たいてい赤黒木やね。
0269デフォルトの名無しさん
NGNGただの言語ヲタに仕事なんか無ぇよ。
OSの細かいことやらハードウェアやらネットワークやらの勉強をするか、
アプリの対象となるなんらかの専門分野の勉強をしれ。
0270デフォルトの名無しさん
NGNG237の場合、
static void* operator new[] (size_t size,void* mem_p)
の中では size = 24 になってるから
5*sizeof(XX) = 5 * 4 = 20 でなく
24バイト確保せよということですよね?
242で指摘されてるように
new演算子を呼び出す前にこのメモリ分を確保してから呼び出さなきゃいけないとしたら
値が容易には推測できない気がする(コンパイラ、環境、デストラクタの有無)のですが、
何かスマートな方法があるor勘違いをしているのでしょうか?
(More Effective C++は持っていません。スイマセン)
0271デフォルトの名無しさん
NGNG勉強しはじめでもわかるぐらいな、簡単な感じでお願いします。
0272デフォルトの名無しさん
NGNGマルチやめれ
つーか自分の質問の仕方の悪さすら気づかないのか……?
0273デフォルトの名無しさん
NGNGC++コンパイラ屋として食っていくつもりなのかもよ
0274デフォルトの名無しさん
NGNGtemplate <class T>
typename enable_if<boost::is_integral<T>, void>::type
foo(T t) {}
こんな風に使えるtypename演算子ですが、gccにあるtypeof演算子とは
どういった点で異なるんでしょうか?
0275デフォルトの名無しさん
NGNGその場合でもOSに詳しくなければかなり厳しいだろ。
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNG月とすっぽんぐらい全然違う.
typenameはtemplate引数で与えられた識別子が型名であることを
コンパイラに明示するためのもの.
一方typeofはインスタンスの型を得るもの.
template<typename T> class C{};
C<int> a;
typeof(a) b; // C<int> b; と同じ
0279デフォルトの名無しさん
NGNGなんとなくですがわかりました。ありがとうございました。
0280249
NGNGあんた、なんかいいこと書いてくれましたね。
で、もうちょっと教えてもらいたいんですが、
"アプリの対象となるなんらかの専門分野"って
具体的にどんなものなんでしょうか?
0281デフォルトの名無しさん
NGNG0282デフォルトの名無しさん
NGNG同意
0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNG荒らすな
0285デフォルトの名無しさん
NGNGクラススコープの外で定義するにはどうすれば良いのでしょうか?
書き方が分かりません・・・
template<typename T1> class C1{
template<typename T2> class C2;
};
// ここでclass C1<T1>::C2<T2>を定義したいのですが書き方が分かりませんヾ(;´Д`)ノ゛
0286デフォルトの名無しさん
NGNGtemplate<typename T2>
class C1<T1>::C2<T2> {
...
};
0287285
NGNGおぉ,こんな書き方になるんですね.相変わらずC++は奥が深いなぁ・・・
ありがとうございました.ちなみに<T2>は要らないですよね?
これがあると怒られます@MSVC++7.1(無い方が文法にかなってますし)
template<typename T1> template<typename T2> class C1<T1>::C2{/**/};
0289デフォルトの名無しさん
NGNG1.placement new[]を使わない
2.何も考えずに+4余分に確保する
3.一度試しで作って(要素二個ぐらいで)ずれを調べる
俺が思いつくのはこれぐらいか
0290デフォルトの名無しさん
NGNG一人でお疲れさんです。
0291デフォルトの名無しさん
NGNGenum Month { January=1,February,March,…,December}
という列挙型があるときに
出力をJanuaryとかアルファベットで表示する方法はありますか?
0292デフォルトの名無しさん
NGNGint January = 1;
という整数型があるときに、
出力をJanuaryとかアルファベットで表示する方法はありますか?
0293デフォルトの名無しさん
NGNGマクロ使え
0294291
NGNG0295デフォルトの名無しさん
NGNG#include <iostream>
using namespace std;
enum AAA { BBB, CCC, DDD, };
ostream& operator<< (ostream& o, AAA e) {
switch (e) {
case BBB: o << "BBB"; break;
case CCC: o << "CCC"; break;
case DDD: o << "DDD"; break;
}
return o;
}
int main (int c, char**v) {
cout << BBB << endl << CCC << endl << DDD << endl;
return 0;
}
0296デフォルトの名無しさん
NGNGconst char* s[] = { "", "January", 略 };
Month e = 略;
cout << s[e] << 略
0297デフォルトの名無しさん
NGNGテーブルでも用意してindexで取得するしかない。
範囲外や疎な値を含む場合はmapでも使うといいだろ。
その場合には値->文字列の対応にプリプロセッサの文字列化が使える。
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNGマクロでスマートに書けるか?
0302デフォルトの名無しさん
NGNGINVALIDな列挙値も1つ用意しておく事をお勧めする。
変数はその値で初期化しておくのがベスト。
0303デフォルトの名無しさん
NGNG実装したら、C++ってUNIX上でも最強じゃない?動的リンクの
コストもゼロ。とろくさいGC付きの仮想マシンも要らない。
OSごとの差異はポリシーとして切り出せれば。
0304デフォルトの名無しさん
NGNG>>291の例ならMonth(0)が使えるよな。
0305デフォルトの名無しさん
NGNG#define MONTH M(InvalidMonth) M(January) M(February) M(March) … M(December)
#define M(s_) s_ ,
enum Month { MONTH };
#undef M
#define M(s_) #s_ ,
const char* strMonth[] = { MONTH };
#undef M
Month m = March;
cout << strMonth[m] << endl;
0306デフォルトの名無しさん
NGNG0307デフォルトの名無しさん
NGNG#include "boost/preprocessor/seq/for_each.hpp"
#include "boost/preprocessor/stringize.hpp"
#define CASE_STATEMENT(r, _, elem) case elem: ost << BOOST_PP_STRINGIZE(elem); break;
#define PRINTABLE_ENUM(name, memberseq) \
enum name{ BOOST_PP_SEQ_ENUM(memberseq) }; \
::std::ostream &operator<<(::std::ostream &ost, const name n) {\
switch(n) { \
BOOST_PP_SEQ_FOR_EACH(CASE_STATEMENT, _, memberseq)\
default: ost << int(n); \
} \
return ost; \
}
#include <iostream>
PRINTABLE_ENUM(Month, (Nullmonth)(January)(February)(March))
int main()
{
Month m = January;
std::cout << m << Month(0) << March;
}
どうせマクロ使うならこれくらいやらないとな。
0308デフォルトの名無しさん
NGNG0309デフォルトの名無しさん
NGNG一通りのプログラムが完了し、デバッグをしてみたらデストラクタが呼ばれてない事が判明しましました。
"virtual"はもちろん指定しているのですが何か足らない点等があるのでしょうか?
以下にソース(抜粋)を載せておきますので、どうか宜しくお願いします。
//DirectSoundオブジェクトのインターフェイス
DECLARE_INTERFACE(ISoundManager)
{
STDMETHOD_(BOOL, Initialize)(THIS_ HWND, BOOL, DWORD) PURE; //DirectSound初期化処理
STDMETHOD_(void, Release)(THIS) PURE; //DirectSound解放処理
//...
};
//DirectSoundオブジェクトを管理するクラス
class CSoundManager : public ISoundManager{
private:
//メンバ変数
//...
public:
CSoundManager(void);
virtual ~CSoundManager(void);
BOOL __stdcall Initialize(HWND, BOOL, DWORD); //DirectSound初期化処理
void __stdcall Release(void); //DirectSound解放処理
//...
}
0310デフォルトの名無しさん
NGNGextern "C" BOOL __stdcall CreateSoundManager(ISoundManager** ppSoundMgr)
{
(*ppSoundMgr) = new CSoundManager;
return (*ppSoundMgr) != NULL;
}
//ISoundManagerインターフェイスを破棄する(DLLを使用するアプリが呼び出す)
extern "C" void __stdcall DestroySoundManager(ISoundManager** ppSoundMgr)
{
delete (*ppSoundMgr); //CSoundManager::~CSoundManager が呼ばれない
}
0311デフォルトの名無しさん
NGNGC++っていうよりWindowsネタな感じだが…
ちゃんとAddRef, Releaseで参照カウントして
Releaseの中でdelete thisすればいいんでないか。
仮想デストラクタは、あくまでも親側のクラスに宣言(定義)されてないと呼べない。
DECLARE_INTERFACEマクロの中身は知らんが、仮想デストラクタが
定義されてないんじゃないか? もしそうなら実装クラスでvirtualつけても無駄。
0312デフォルトの名無しさん
NGNG~ISoundManager() が仮想なのかわからないんだけど……。
CSoundManager のデストラクタが呼ばれてないっていうけど
別のデストラクタは呼ばれてる?
そもそもどういう手段でそれを確認したかないとこれだけじゃ判断つきにくいな。
とりあえず基本的な確認事項として
ポインタがNULLでないか、
不正なポインタ渡していないか( delete されてもたまたま動いている)
なんかはチェックした?
それとテストはDLLの形でしてるの?
その場合、基本的な単体テストなんかはきちんと通ってるの?
0313デフォルトの名無しさん
NGNG0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNG0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNG詳細不明な俺マクロをやめろ。
メンバ関数に__stdcallってなに?
BOOL返すだけならCreateはポインタを返せよ。
Destroyはポインタのポインタを受け取る必要ないだろ。
0319デフォルトの名無しさん
NGNGこのスレだから仕方ないけど・・・
0320デフォルトの名無しさん
NGNGスレ違いでしたか、失礼しました。
取り合えず、参照カウンタを保持してやることにしました。
あと、ISoundManager::~ISoundManagerを実装すると、
interfaceではなくclassになってしまい、Cで使えなくなってしまうのでちょっと都合が悪かったりします。
ちなみに、DECLARE_INTERFACEは俺マクロでないです。
マイクロのヘッダにあるマクロです。
さておき、レスありがとうございました。
0321デフォルトの名無しさん
NGNG環境依存な話を禁止する条項が書かれてないんだよな。
でも、環境依存を避ける傾向はあるから、
>>318 みたいに COM プログラミング知らない人がいるのも
仕方がないかもね。
COM スレは寂れてるっぽいし、
次からは↓のスレで聞くのがいいと思う。
【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1077102238/
0322デフォルトの名無しさん
NGNG意味がわからん。CSoundManager::~CSoundManager()を実装して、
CSoundManager::Release()から参照カウント方式でdelete this使って
呼び出せ、という話だろ。ISoundManager::~ISoundManager()は
宣言してはいけない。
0323デフォルトの名無しさん
NGNGご丁寧にありがとうございます。
質問させて頂いた件ですが、
reinterpret_castを使ってダウンキャストをしてからdeleteしたところきちんとデストラクタが呼ばれるようになりました。
いろいろとお騒がせをしてスミマセンでした。
0324デフォルトの名無しさん
NGNGあんた、ちゃんと人の話聞いてるのか?
0325デフォルトの名無しさん
NGNG( ゚д゚)ポカーン
0326デフォルトの名無しさん
NGNGreinterpret_castを使ったらダウンキャストじゃない
たまたま結果が一致することはあっても
あくまで無保証
0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNG確かにそうだ
0329318
NGNGようするにCでも使えるようにCOMをパクったけど、理解が足りてない、ってか。
0330デフォルトの名無しさん
NGNGデストラクタもない。ただC++でWindowsを自由自在に操るとなる
と避けて通れないから仕方ない。COMを全く知らない人でも
GUIDなら知っているだろう。
COM+はCOMの欠点が大幅に取り除かれ、だいぶC++との親和性
も良くなっている。但しWindows 2000以降でしか使用できない。
0331デフォルトの名無しさん
NGNG0332デフォルトの名無しさん
NGNGま、そうだが、エラーハンドリングはCOMではコードを返すと
いう古い設計を使っているという意味ね。
0333デフォルトの名無しさん
NGNG例えば、VC++で作ったexeからBC++で作ったdllのエクスポート関数を呼び出し
内部でthrowされた例外をexeでcatchするなんてできないですよね?
コンパイラに関係なく使える例外機構ってないですか?
0334デフォルトの名無しさん
NGNG例えば簡単なプログラムで
int main()
{
int *p=new int();
}
と、C++で何のヘッダもインクルードしなくても
operator new を呼んでくれるのですが、これは
どういうことでしょうか?(環境はVC6.0です)
0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNG何嘘教えてんだよ!
>>334
暗黙インクルードファイルに<new>が含まれてるんだよ。
処理系によっては<iostream>も含まれてることもあるよ。
0337デフォルトの名無しさん
NGNG>>335 が正解。
>>336
>「暗黙インクルードファイル」
また俺用語ですか。
0338デフォルトの名無しさん
NGNG(placement new は無関係じゃないが)、
<iostream> とかが暗黙にインクルードされる処理系ってあるの?
0339デフォルトの名無しさん
NGNGいまリトルで開発中だが、同一のファイルにアクセスするビッグやバイへの
ポーティングができるだけ短時間で終わるようにしたい。
性能重視なので「解決」はできるだけ翻訳中に行い、実行環境でのオーバーヘッドを最小限にしたい。
こういうとき、336以外のお前らだったら何を使う?
0340デフォルトの名無しさん
NGNGデータと同じエンディアンの環境ならこの変換が省略されるようにすればよい。
データが固定でなくて良いなら、
データを異なるエンディアンを持つ環境に持っていく際に
データを変換すればよい。
これなら、実行時に変換が不要になる。
0341デフォルトの名無しさん
NGNGレスどうも。自分で作るなら屁でもないんだけど、
もう1人の自分が「おめーわアフォか」と煽ってくるんだわ
0342デフォルトの名無しさん
NGNGC++の勉強よりも英語の勉強に適してるような感じかも。
0343デフォルトの名無しさん
NGNGまず結論から。現規格では placement new[]/delete[] は使い難い。
1.>>236-239,267 で指摘されている通り、new T[n] では sizeof(T)*n+x(x≧0)
が第一引数として operator new[] に渡される。
new T[n]の結果は operator new[] の返り値から x だけオフセットされる。
これは placement 版でも同じ。
この x の値は不定であるため、事前に必要な容量を確保しておくことができない。
つまり確保済みの領域にオブジェクトを生成することはできない。
[参考] 5.3.4 - 12
2.>>210,217 のように Allocator を使う場合もオフセットが問題を引き起こす。
placement operator new[] から呼び出されたコンストラクタで例外が
発生した場合には、対応する placement operator delete[] が、
placement operator new[] が返したポインタ値を引数として正しく呼び出される。
しかし、一旦オブジェクトが生成されると、配列形式の placement new expression
が返す値は、placement operator new[] が返した値より不定値分オフセット
されている。
このオブジェクトが占める領域を解放したい場合、現規格では配列形式の
placement delete expression が存在しないため、placement operator delete[] を
直接呼び出す必要がある。
が、オフセットが不定のため plament operator new[] の返した値を引数とする
ことができない。
つまり、Allocator は allocate() が返すポインタ値と deallocate() に渡される
ポインタ値が一致しないことを想定して処理しなければならない。
[参考] ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=146
結局、メモリ割り当てのコントロールがしたければ、配列を使わず vector を使え、
ということか。
0344デフォルトの名無しさん
NGNGヒープデバッグ以外の用途に使う事なんてないだろね。
一般PGではなく、STLを拡張したいPGにとっては重要かもしれんけど。
0345デフォルトの名無しさん
NGNGコンストラクタではアロケータで確保したメモリを使って
uninitialized_copyまたはuninitialized_fillをしている。
これは実質的には要素ごとにplacement newをしている。
デストラクタでは要素ごとに~T()をしている。
ちなみにuninitialized_copyなどに対応した廃棄用関数は標準関数にはなぜかない。
0346デフォルトの名無しさん
NGNG0347デフォルトの名無しさん
NGNG//複素数クラス
class Complex{
double re;
double im;
public:
//コンストラクタ省略
friend double Real(const Complex& x) {return(x.re);}
friend double Imag(const Complex& x) {return(x.im);}
//中略
Complex& operator+=(Complex& x){
re+=x.re;
im+=x.im;
return (*this);
}
Complex& operator-=(Complex& x){
re-=x.re;
im-=x.im;
return (*this);
}
friend Complex operator+(const Complex& x,const Complex& y){
return (Complex(x.re+y.re,x.im+y.im));
}
//以下省略
というソースなのですが、これに関して質問させて下さい。
friendについてなのですが、Complex& operator+=(Complex& x){〜〜〜}はfriend修飾しなくて良いのでしょうか?
引数の私的部にアクセス出来るようにするのがfriendだと思ったのですが、
Complex& operator+=(Complex& x)は私的部にアクセスしていますよね?
どうか解説お願いします。
0348デフォルトの名無しさん
NGNG0349デフォルトの名無しさん
NGNG0350デフォルトの名無しさん
NGNGそのmember関数、double Calc::function(const double& x)の中身を
Calc a;
の中では
return x*x;
Calc b;
の中では
return x+1;
などのようにすることは出来ますか?
派生class作って、それぞれにfunctionを定義するしかないですかね。
外部のfileに関数を沢山定義しておいて、
それをCalcのconstructorに引数として渡すような事がしたいのです。
0351デフォルトの名無しさん
NGNG生成された順番?変数の識別子?スコープ?
0352450
NGNG順番で御座います。
0353デフォルトの名無しさん
NGNG>それをCalcのconstructorに引数として渡すような事がしたいのです
渡せばいいんじゃないのか
0354347
NGNGなるほど。*thisを返す場合には必要ないのですか。
勉強になりました。ありがとうございます。
>>349
すみません。
本に書いてあったソースを写し書きしただけなので、分かりません。
0355デフォルトの名無しさん
NGNGそのクラスのメンバなら、
引数のであっても直接アクセスできる。
あと、friend つけてクラス内で直接定義してある関数は、
メンバ関数ではなく通常の関数になる
(名前空間はそのクラスの属している名前空間と同じになる)。
operator+= は friend でなくていいのではなく、
friend であってはならない。
0356デフォルトの名無しさん
NGNGあと、どうしてoperator+を外部関数にするのか、とか。
0357デフォルトの名無しさん
NGNG12日午後、ファイル交換ソフト「shsre」を使用して、違法なファイル交換を
行ったとして、神奈川県横浜市緑区2-66-9に住む無職 戸塚薫容疑者31歳
を著作権法違反など3つの罪で逮捕したとの発表が神奈川県警ハイテク課
からあった模様。ハイテク課ではひきつづき捜査を行っているが、戸塚容疑者は
意味不明な言語を発し、捜査には全く応じていないという。
神奈川新聞 無断転載禁止
http://news2.2ch.net/test/read.cgi/news7/1076656479/
0358397
NGNG本を見ながらDOSで作動するものを作っているのですが、Windowsの(DOSじゃない)を作りたいのですが、全然わかりません。
0360デフォルトの名無しさん
NGNGそれを C++ 使って書き直してみたら?
0361デフォルトの名無しさん
NGNG0362デフォルトの名無しさん
NGNGどうでもいいっちゃぁ、どうでもいいな。
0363デフォルトの名無しさん
NGNG無名コンストラクタの場合
T* p = _allocator.allocate(size,0);
uninitialized_fill_n(p,size,T());
0364デフォルトの名無しさん
NGNG最後の一文から判断すると、
class Calc {
double (*func_)(double);
public:
explicit Calc(double (*func)(double)) : func_(func) {;}
double function(double x) { return func_(x); }
};
みたいなことがやりたいのか?(ちなみに double は値渡しがふつう)
言葉通り外部から関数を与えてを実行させたいのなら
オーバーライドを使うのはおかしいと思うんだが。
0365デフォルトの名無しさん
NGNGWin32 API入門 http://black.sakura.ne.jp/~third/system/winapi/win.html
0366デフォルトの名無しさん
NGNGC++の基礎がきちんと身につくまではWindowsアプリなんぞ手を出すな
まず今読んでる本をきちんと最後まで読んで理解しろ
それが結局自分のためだぞ
0367397
NGNG0368デフォルトの名無しさん
NGNGWin32 APIならC++ではなくCだけで十分
C++が事実上必須になるのはCOM関係
C++が必須なのはMFC
0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNGたとえばリストテンプレートで、
class B: public list<A>
のようにやってもコンパイラが受け付けてくれません。
0372デフォルトの名無しさん
NGNG{};
0373デフォルトの名無しさん
NGNGclass A {
};
class B : public std::list<A> {
};
で試したけど、大丈夫だよ。
コンパイラは何?
0374347
NGNG解説ありがとうございます。
要するに、
friend指定にすると普通の関数になるということは、つまりthisが破錠してしまう。
だからthisを使いたい場合にはfriend指定をしてはいけない。
ということなのでしょうか?
更にもう1つ質問なのですが、
引数や戻り値をポインタ(参照?)にしている意味はあるのでしょうか?
僕自身Cから入ったもので、関数の引数としてのポインタの用途は実引数を書き換えたい場合しか思い浮かばないのですが、
この場合、実引数を書き換えているようには見えません。
解説お願いします。
0375デフォルトの名無しさん
NGNGエラーは名前空間のstdを指定していなかっただけでした。
どうもありがとうございました。
0376デフォルトの名無しさん
NGNG1引数 operator+= はメンバ関数で、
2引数 operator+= は普通の関数だ。
operator+=(Complex& own, Complex& x) とするなら friend 関数でいいんだが、
operator+=(Complex& x) とするならメンバ関数だ。
a += b; と等価な表現は、
前者は operator+=(a, b); で、
後者は a.operator+=(b); だな。
>引数や戻り値をポインタ(参照?)にしている意味はあるのでしょうか?
foo(a += b); とか (a += b) *= c; とかできるように。
0377デフォルトの名無しさん
NGNG>関数の引数としてのポインタの用途は実引数を書き換えたい場合しか思い浮かばないのですが、
それは「C から入った」とかいう以前の問題のような……。
コピーのコストが高くつくオブジェクトは、コピーを避けるために
const 参照で渡すのが常套手段。
C でも、でかい構造体は const ポインタで渡すのが普通だよ。
0378347
NGNG確かに云われてみれば…。気付けなかった自分が恥ずかしいです。
中学3年生の頃からCを勉強して早2年…、Cは大体網羅したと勝手に思っていましたが、全然ダメダメですね。
C++とか云う前に修行し直してきます…。
0379デフォルトの名無しさん
NGNGていうかやめれ。おまえには向いてない。
0380デフォルトの名無しさん
NGNGお前がやめれ。>>378=>>347が後釜になるから人手に困らん。
0381デフォルトの名無しさん
NGNG>>347は2ちゃんなんか見てる暇があったら、
とっととまともな入門本を読めってこった。
メンバ関数と非メンバ関数とか、参照とかポインタ渡しとか、
こんなもののはC++の基本中の基本。
こんなレベルでいちいち疑問が浮かぶたびに質問されてたら、
スレがいくつあっても足りん。
0382デフォルトの名無しさん
NGNGC++の前に2chやめれ
0383デフォルトの名無しさん
NGNG0385デフォルトの名無しさん
NGNGむこうでも「入門書嫁」で終わりそうではあるが。
0386デフォルトの名無しさん
NGNGthisを使いたいかどうかっていうよりも、
クラスのメンバ関数にしたいなら、friendをつけない。
外部関数にしたいときは、単にクラスの外で宣言・定義する。
外部関数にしたいけれど、クラスのprivateメンバにアクセスしたいときは、
friendをつけてクラスの中で宣言する。
まあ、引数をポインタや参照で渡すことも含めて、
この辺のことはEffective C++とかにも書いてあるから、
暇だったら読んでみたら? それ以前にCの理解が不十分な気がするけどね。
0387デフォルトの名無しさん
NGNGといった形で値のリストを保持しているのですが、これを後ろから5以上
の場合だけ削除し、5未満が出た場合は中断するといった場合
bool isstop = false;
std::list<int*>::iterator it;
for (it = value_list.end(); it != value_list.begin(); --it) {
if (*it >= 5) {
delete *it;
value_list.erase(it);
} else {
isstop = true;
break;
}
}
if (!isstop) {
it = value_list.begin();
delete *it;
value_list.erase(it);
}
これ以外に一度のforですますような方法はありますか?
スレ違いでしたら申し訳ないのですが誘導お願いします。
0388デフォルトの名無しさん
NGNGrbegin(), rend()
0389デフォルトの名無しさん
NGNGそのコードはendを逆参照しているし、無効になった反復子をデクリメントしているからまずい。
特に理由がないなら、標準アルゴリズムを使うべし。
0390デフォルトの名無しさん
NGNGrbegin(), rend()を使って5未満の要素をfind_ifして、そこから後ろを全て消すというのはどう?
0391389
NGNGありがとうございます。調べてみます。
0392デフォルトの名無しさん
NGNGこんなもんかな。
//ファンクタを用意
#include <functional>
struct comp_val : public std::binary_function<const int*,int,bool> {
bool operator() ( const int* ptr, int val ) { return *ptr < val; }
};
//後ろから検索して初めて見つかった5未満の要素より後ろのものを削除
value_list.erase( std::find_if( value_list.rbegin(), value_list.rend(),
std::bind2nd(comp_val(),5) ).base(), value_list.end() );
0393デフォルトの名無しさん
NGNG単にeraseではまずいと思われ。
0394デフォルトの名無しさん
NGNGああ、要素の破棄もするのか。
訂正
//ファンクタを用意
#include <functional>
struct comp_val : public std::binary_function<const int*,int,bool> {
bool operator() ( const int* ptr, int val ) { return *ptr < val; }
};
struct del_ptr : public std::unary_function<int*> {
void operator() ( int* ptr ) { delete ptr; }
};
//後ろから5未満の要素を検索
std::list<int*>::iterator i=std::find_if( value_list.rbegin(), value_list.rend(),
std::bind2nd(comp_val(),5) ).base();
//要素の破棄
std::for_each( i, list_value.end(), del_ptr() );
//リストの削除
value_list.erase( i, value_list.end() );
これから飯食いに行くんで走り書き。
何か不味かったら誰か突っ込んどいてください。
んじゃ。
0395デフォルトの名無しさん
NGNG×unary_function<int*>
○unary_function<int*,void>
×std::for_each( i, list_value.end(), del_ptr() );
○std::for_each( i, value_list.end(), del_ptr() );
んじゃ。
0396デフォルトの名無しさん
NGNG純粋に素朴な疑問なんだが、なんで要素が"int *"なの?
0397389
NGNGこんな風にできるんですねぇ、まだまだ勉強が足りないと思いました。
>>396
実際にはクラスのポインタを入れてるんですが、簡単のためにint*と
いたしました。
0398デフォルトの名無しさん
NGNGそれと全く同じ機能を持つ別名のclassを作りたいのですが、
どういう風にやるのが最も簡単でしょうか。
0399デフォルトの名無しさん
NGNGtypedef SomeClass AnotherNameClass;
あるいは
class AnotherNameClass : public SomeClass {
// コンストラクタを全部再定義
};
0400デフォルトの名無しさん
NGNGコンストラクタ再定義しないとまずい?
0401デフォルトの名無しさん
NGNGtypedef はダメ?
0402デフォルトの名無しさん
NGNGもっと条件を絞ってもらわないと、質問があまりにも一般的すぎ。
SomeClassの定義如何では全く同じ機能を持つクラスを派生できない場合もあるし。
0403デフォルトの名無しさん
NGNGマズい。
コピーコンストラクタと代入オペレータは派生されないから。
0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNGtypedef Foo<0> Bar;
typedef Foo<1> Hoge;
ってのはどう?
0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNGということは、コピーコンストラクタと代入オペレータをprivateで封印している場合は
何も再定義しなくて使えるってことですよね。
でも、なんでコピーコンストラクタと代入オペレータが継承されない仕様になっているのだろうか。
0408デフォルトの名無しさん
NGNG0409399
NGNG派生側でこんすとらくた定義しとかないと
class A { public: A(int) {} };
class B : public A {};
…
B obj( 5 );
ってコンパイル通らないよね?
0410デフォルトの名無しさん
NGNG0411デフォルトの名無しさん
NGNGオブジェクト指向は、ベースクラスの仕様がサブクラスの仕様拡張に
影響されないので良いんだよ。何やっても良い。
0412デフォルトの名無しさん
NGNGコピーコンストラクタと代入オペレータがprivate宣言されているっつーことは、
SomeClassの性質上、それはやっちゃいけないか、そもそもそういう操作があり得ないからと
考えるのが自然だろな。
さもなくば、SomeClassからfriend宣言されている関数またはクラスのみが、
コピーコンストラクタと代入オペレータを呼び出すことができる。
0413デフォルトの名無しさん
NGNGコンストラクタは継承されない。自分で明示的に呼び出す必要あり。
0414デフォルトの名無しさん
NGNGほとんどC++を知らないらしいヤシらが勝手な事言ってるよw
0415デフォルトの名無しさん
NGNG0416デフォルトの名無しさん
NGNGhttp://www.research.att.com/~bs/bs_faq.html#SE
0417398
NGNGみなさんレスありがとうございます。
実はi)派生させる場合とii)typedefする場合を、
それぞれ試したのですがうまくいかなかった為質問しました。
i)派生させる場合
class A {
private:
double val;
public:
A(const double& rval){val = rval;}
};
class B : public A{};
こうすると、
double val = 0;
B b(val);
が通りません。
B(double&)は存在しなくて、B(const B&)しかないと言われます。
ii)typedefする場合
同じように、constructorまわりでerrorを吐きます。
やはり、constructorの再定義は必要なわけですね。
405さんのも使えそうですね。
0418デフォルトの名無しさん
NGNG#define temp(x) class x {public:x(){} x(int){}};
temp(hoge)
temp(huga)
0419デフォルトの名無しさん
NGNGtypedefなら出来るはずだが、いったいどんなコンパイラ使ってるんだ?
0420398
NGNGした後にBを引数として、
他のclassのconstructorに渡したのですが、
which is of non-aggregate type
というerrorが出ます。
compilerはg++です。
何度もすみません。
0421398
NGNGA or Bのconstructorにはdoubleを渡し、
他のclass CのconstructorにBを渡すようにしてあります。
で、B b(1.0)とした後に、
C c(b)とするとcompileが通るのですが、
C c(B(1.0))とすると通らないのです。
Cのmember関数を呼び出すところで、
which is ...のerrorが出ます。
もしかしたらこのmember関数が悪さをしているのかも知れませんが、
cの宣言の違いで結果が変わるため、
constructorあたりが悪いのかと想像しました。
0422デフォルトの名無しさん
NGNG> C c(B(1.0))とすると通らないのです。
本当にそれが通らないのか?
double x = 1.0;
C c( B(x) );
c.member( ... );
は通らない( 2行目が、B型の引数xを取ってC型を返す関数cの
宣言と見なされる )が。
0423デフォルトの名無しさん
NGNGint * hoge;
private:
CHoge::~CHoge( kill());
CHoge::initial( *hoge = new int[1];);
CHoge::kill( delete [] hoge;);
};
void ugu(CHoge fuga){ fuga.hoge[0] ++; };
void main(){
CHoge piyo;
piyo.initial();
piyo.hoge[0] = 10;
ugu(piyo);
cout << piyo.hoge[0];
}
とすると、デストラクターで元のpiyoのhogeもdeleteされてしまいます。
このような場合、どうすればいいのでしょう?
0424デフォルトの名無しさん
NGNGコピーコンストラクタを書く。
0425デフォルトの名無しさん
NGNG>このような場合、どうすればいいのでしょう?
どうなって欲しいのか書いてくれないと答えられない。
ポインタメンバのコピーコンストラクタと代入オペレータは
用途にあわせてきちんと実装する必要がある(何も書かなきゃポインタがそのままコピーされるだけ)。
典型的な処理ならば”スマートポインター”と呼ばれるものが使える。
ついでにいっておくと ugu で引数のオブジェクトを変える目的があるなら
コピーでなくて参照で渡すべきだぞ。今はコピー先とメンバを共有してるから書き換えられてるけど
0426デフォルトの名無しさん
NGNGそのBをAにしたらエラーは消えるか、試しましたか?
0427デフォルトの名無しさん
NGNGa.cppで
const int a;
b.cppで
extern const int a;
とやったのですが、名前解決が出来ない
と言われてリンクできません。
constを外すとできます。
どうしてでしょうか?
0428デフォルトの名無しさん
NGNGa.cppでも
extern const int a;
とする事。C++ではconstは内部リンケージを持っているので
外からは見えない。
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNGそれだけじゃだめだよ。a.hに
const int a = 7;
とでも書いて初期化し、a.cppとb.cppでa.hをインクルード
~~~~~~~
しなければ。
0431デフォルトの名無しさん
NGNGそれは時と場合による。a.cppとb.cppのどちらかでexternを
つけたconstを初期化しておけばこの場合はよい。
a.cpp
extern const int a = 123;
みたいに。
0432デフォルトの名無しさん
NGNG>a.cppとb.cppでa.hをインクルード
それだとa.obj、b.objの両方に別々にaが確保されるから
externする意味がないじゃん
0433デフォルトの名無しさん
NGNGvoid FlagCheck()
{
std::list<SHOOT>::iterator S;
for(S = shoot.begin(); S != shoot.end(); S++)
{
if(T->GetFlag())
{
shoot.erase(T++);
}
else ++T;
}
}
とやっています。
SHOOTは弾が物体にあたったときにflagがtureになるようなクラスです。
一応今は問題なく動いているのですが作るときに色々試した結果たまたま動いただけで
あまり理解ができていません。
shoot.erase(T++)をerase(++T)にしたりshoot.erase(T);T++;にするとエラーになってしまいます。
前者は無論理由はわかるのですが後者の理由がよくわかりません。
上の関数に欠点がないか、それとshoot.erase(T);T++;がエラーになってしまう理由を教えていただけないでしょうか。
よろしくお願いします。
0434427
NGNGconstは定義ですでにextern指定
しないといけないんですね。
ところがMFCのAFXTMPL.hという
ファイルの中で
extern const TCHAR _afxWnd[];
と宣言されていて、これの定義は
WINCORE.cppのなかで
const TCHAR _afxWnd[] = AFX_WND;
とされていて、定義のほうにexternが
ついてないのですがこれはどうして
でしょうか?
なんかわけがわからなくなってきました(TT
0435デフォルトの名無しさん
NGNGshoot.erase(T++)の実行順序は、
1. Tの値を引数として保存
2. T++を実行
3. 保存された引数をshoot.eraseに渡す(この結果旧Tの指していた要素は消滅する)
だよ。
これがshoot.erase(T); T++;になると:
1. Tの値を引数としてshoot.eraseを実行し、Tの要素が消滅しているため無効になる
2. 無効になってしまったTに対してT++を実行するのは駄目
0436デフォルトの名無しさん
NGNGなるほど。「保存」ですか。
ひとつ賢くなりました。
ありがとうございました!
0437デフォルトの名無しさん
NGNGSTGなんて作ったことないので想像でしかないけど、
弾なんて生成と破棄が激しそうだからstd::listは
パフォーマンス悪くない?
SHOOT型オブジェクトを配列で用意しておいて、
SHOOT型内に次SHOOT型オブジェクトへのポインタ
とか持たせた埋め込みタイプのリンクリストで
連結したほうが良いような気がするけど。
あ、Allocatorいじってんなら話は別だけど。
0438デフォルトの名無しさん
NGNG0439398
NGNG通らないのは、c.member()のところです。
>>426
試しましたが、駄目でした。
そうすると他の所の記述が悪いせいでしょうか。
ただ、
C c(B(1.0));
とすると駄目だったのに、
C c = C(B(1.0));
という風に書き換えると走るようになりました。
これは、実質的に同じ表現ではないのですか?
このようにすると、c.member()も通るようになりました。
結論としては、typedefでは駄目なのでしょうか。
0440デフォルトの名無しさん
NGNGC のコンストラクタの引数の型は何?
0441デフォルトの名無しさん
NGNG0442398
NGNGまとめます。さらにいくつか試したのも書きます。
■目的■
class Aと全く同じ機能を持ったclass Bを作りたい。
(性質は一緒だが、実世界で概念の異なる物を表現したいため。)
■方法■
一番簡単な方法として、typedef A B;によって、Bを扱えるようにした。
0443398
NGNG(実際にはもう少し複雑なclassを扱っていますが、
内容をかなり省略して書きます。)
Cというclassのconstructorに、引数としてBを渡した。
C(const B& rb) { b = new B(rb);}
ここで、A(or B)のconstructorはA(const double& rval){ val = rval;}
という単純なものである。
copy constructorは、A(const A& rA){ val = rA.val;}である。
また、Cのmember関数としてC::func()を用意した。
このとき、main()の中で、
C c(B(1.0));
c.func();
という記述を行うと、二行目で
error: request for member `func' in `c(A)', which is of non-aggregate type `C ()(A)'
と出る。(あくまで簡略して書いています。)
1行目は何も怒られない。
そこで、c.func();をcomment outして再compileさせると、
compileは通った。(OS Xのg++です。明日、他の環境も試してみます。)
ただし、gdbでデバッグしてやると、
この1行目は何故か読み込まれていなかった。
また、先のをさらに書き換えて、
B b(1.0);
C c(b);
c.func;
としてやるとcompileは通り、
動作も期待通りのものであった。
0444398
NGNG分かりません。
■附記■
もっとも単純な構成でtypedefが機能するかを調べるために、
以下のcodeをcompileしたところ問題は生じなかった。
ここに貼り付けると長くなるのでやめるが、
自分で書いた他のcodeで同様のtypedefを行った場合、
先に書いたerrorが生じた。
#include <iostream>
using namespace std;
class A {
private:
double val;
public:
A(const double& rval) : val(rval){;}
A(const A& rA) : val(rA.val){;}
~A(){;}
A& operator=(const A& rA){val = rA.val;}
void print_val(){cout << val << endl;}
};
typedef A B;
0445398
NGNGprivate:
B* b;
public:
C(const B& rB){b = new B(rB);}
C(const C& rC){b = new B(*(rC.b));}
~C(){delete b;}
C& operator=(const C& rC){delete b; b = new B(*(rC.b));}
void print_val(){b->print_val();}
};
int main(){
C c(A(0.1));
C c(B(0.1));
c.print_val();
return 0;
}
長文スマソ。
0446398
NGNGC c = C(B(1.0);
c.func();
でも大丈夫でした。
0447デフォルトの名無しさん
NGNG0449デフォルトの名無しさん
NGNGどうして代入演算子のオーバーロードで*thisを返してないのか
わからん。
#include <iostream>
class A {
double val;
public:
A(const double& rval) : val(rval) {}
A(const A& rA) : val(rA.val) {}
A& operator=(const A& rA) {
val = rA.val;
return *this;
}
void print_val() { std::cout << val << std::endl; }
};
typedef A B;
class C {
B* b;
0450デフォルトの名無しさん
NGNGC(const B& rB) : b(new B(rB)) {}
C(const C& rC) : b(new B(*rC.b)) {}
~C() { delete b; }
C& operator=(const C& rC) {
delete b;
b = new B(*(rC.b));
return *this;
}
void print_val() { b->print_val(); }
};
int main()
{
C c1(A(0.1));
C c2(B(0.1));
c1.print_val();
c2.print_val();
}
0451デフォルトの名無しさん
NGNG…と、Effective STL P34 を見てちょぃっと思ってみるテスト。
0452デフォルトの名無しさん
NGNGconst 整数型 はC++では基本的に「定数」だから
それよりもグローバル変数を使うな。素直に共通ヘッダを作るべし。
どうしてもヘッダファイルを作りたくないなら、まだマシな関数にしろ。
0453デフォルトの名無しさん
NGNGvoid Test(A *a);
みたいな関数をツクって
それでAをリストなりベクトルなりで管理し、イテレータで操作した場合
Test(&(*q)); // qはイテレータ
みたいなやり方ってスマートじゃないですかね。見た目からして…
0454デフォルトの名無しさん
NGNGおもいっきり、関数として認識されてんじゃねーか。
いいかげんに気付けよ。
C c(A(1.0)); // 1.0で初期化した class A の一時オブジェクトで class C のローカル変数 c を初期化して定義
C c(A(x)); // class C を戻り値とし、 class A の引数を一つ(仮引数名 x で)受け取る関数 c を宣言
0455デフォルトの名無しさん
NGNGTest(A* a)にヌルを渡すことが無いなら、Test(A& a)のほうがいいかも。
0456デフォルトの名無しさん
NGNG> A(const double& rval)
が気に食わん。
double程度に、なぜ参照を使うかなぁ。
で A(1.0) なんて書いても、そりゃおかしいんじゃねーの?
だって、定数のアドレスを求めようとしてるじゃんかよ。
0457デフォルトの名無しさん
NGNG上半分は同意.
下半分はconst &をリテラルで初期化したときの挙動を理解していらっしゃらないだけかと.
0458456
NGNG読み返してみると,上半分も場合によりけりなのかな?
ちょっと混乱してきた.教えて,エロい人!!
0459457
NGNG0460デフォルトの名無しさん
NGNG最適化でインラインになっちゃえば同じという説も。
俺はそれより>>356も言ってるようなoperator+を外に出す方が課題。
どうしても継承したり複雑になってくるとoperator+を外に出したときに問題が出てくる。
部分特殊化が出来ないとoperator+の引数が曖昧になってあらゆる+を奪っちゃったりとか。
0461398
NGNGレスどうもです。
そうすると、明示的に書くしかないということですね。
compilerに関数として認識させないように。
typedefは悪くない、と。
0462デフォルトの名無しさん
NGNG0463デフォルトの名無しさん
NGNG0464デフォルトの名無しさん
NGNGプリミティブ型は値渡しが普通っていうのはわかるが、
昨今の32bit環境の場合は
sizeof(int) < sizeof(double)
が普通なわけで。
doubleの場合は参照渡しの方が良くない?
0465デフォルトの名無しさん
NGNGsizeof(int) と 値渡し/参照渡し の間に何の関係が??
0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNGC++ の仕様なんだけどな。
まぁ、それはともかく、わざわざ参照を使う理由が分からないのは同意。
0468デフォルトの名無しさん
NGNGis_arithmetic<T> == true && sizeof(T) <= sizeof(void*)のときは値渡しで
それ以外なら参照渡しという実装だった.@1.31.0
(もちろんpointer渡しはpointer渡しで)
0469デフォルトの名無しさん
NGNG0470デフォルトの名無しさん
NGNG>>451
0471469
NGNG0472デフォルトの名無しさん
NGNGC++というかC標準ライブラリの関数(strcpyとかatoiとか...)の
使い方ってみなさんどうして学習したんですか?
C++標準ライブラリのリファレンスってよくありますが、Cのって
見かけないんですが...
スレ違いかも知れないのですが宜しくおながいします。
0473デフォルトの名無しさん
NGNG0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGMSDN http://www.microsoft.com/japan/msdn/library/ja/vclib/html/vcrefruntimelibraryreference.asp
JM http://www.linux.or.jp/JM/
望洋タンとこ http://www.bohyoh.com/CandCPP/C/Library/hindex.html
とか色々…俺は逆にC++のよりCの標準ライブラリのリファレンスの
方が遙かに沢山あると思うんだけど…
0477デフォルトの名無しさん
NGNGhttp://www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E+%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9
0478472
NGNGいろいろあるんですね。
めちゃくちゃ参考になりました。。。
0479デフォルトの名無しさん
NGNGてかK&Rの付録がまとまってて非常に良いと思われ
0481デフォルトの名無しさん
NGNGVzで、常に開いてたような気がするなあ。
0482デフォルトの名無しさん
NGNGvoid buy()とint buy()
voidとintの違いってなんですか?
よくわからないです。
0483デフォルトの名無しさん
NGNG0484デフォルトの名無しさん
NGNG0485デフォルトの名無しさん
NGNG0486482
NGNG全部intなら問題ないってことですか?
0487デフォルトの名無しさん
NGNG0488デフォルトの名無しさん
NGNG商品とお金を渡しておつりが欲しいなら戻り値を考慮すべきだし、
関数が成功したか否かが欲しいならboolだし、っていうかC++の
質問じゃないじゃん。
0489482
NGNGありがとうございました。
C++の本を見ながら試していたので、ここのスレでいいのかとおもいました。
0490デフォルトの名無しさん
NGNG-- aaa.h --
#include "bbb.h"
class A {
B bbbb;
};
-- bbb.h --
#include "aaa.h"
class B {
A aaaa;
};
これだと例えばbbb.h側でクラスAが定義されていないとか認識されちゃうんだけど、
どうしたらいいでせう。#ifndef・#define〜#endifでは囲ってます。
0491デフォルトの名無しさん
NGNG認識以前に、もしできても無限に大きな構造体にする気ですか?
ポインタや参照でなら、前方宣言
class B; // これ
class A {
B * bbb;
};
とか、まとめて
class A {
class B * bbb;
};
ならできるが。
0492デフォルトの名無しさん
NGNGあ、そうか。確かに無限大サイズになってまうですね。なるほど。
・・・それで片方だけポインタ使っとけば問題ないかなと思って
↓こんなの試してみたんだけどエラーでてしまいました。
-- aaa.h --
#include "bbb.h"
class B;
class A {
B *bbbb;
};
-- bbb.h --
#include "aaa.h"
class B : public A { // Aは定義されていない
};
これも同じような問題あるですか?
0494デフォルトの名無しさん
NGNGbbb.h は class A の宣言の後にインクルードすべし。
0495492
NGNGあれやっぱ動かないと思ってたらincludeの位置が問題だったか。
ありが�d
ただ、class A内のB型ポインタからclass Bの適当なメンバにアクセスを
させようとした途端、class AからはBが見えないため、
また未定義のエラーが出てきてしまいますね。
クラス間の相互アクセスはどうがんばってもできないのでせうか。
0496デフォルトの名無しさん
NGNG-- aaa.h --
class B;
class A {
B *bbbb;
void hoge();
}
-- bbb.h --
#include "aaa.h"
class B {
A *aaaa;
};
-- aaa.cpp --
#include "aaa.h"
#include "bbb.h" // class Bを実際に使うのに必要
void A::hoge()
{
// bbbb->aaaaが使える
}
0498デフォルトの名無しさん
NGNGコンストラクタは明示的に呼べないのでしょうか?
例えば今
class CTest{
public:
int m_nData;
CTest():m_nData(0){};
CTest(int n){m_nData=n;}
void Init(int n);
};
というクラスがあったとして
メンバ関数Init()を
void CTest::Init(int n){
CTest::CTest(n);
}
と実装してもちゃんとnが設定されません。
int main()
{
CTest a;
a.Init(5);
printf("%d\n",a.m_nData);// ←0のまま
}
なんででしょう。。。
0499デフォルトの名無しさん
NGNG>コンストラクタは明示的に呼べないのでしょうか?
呼べません。
Initでコンストラクタを呼ぶ代わりに、
Initで実際の初期化をして、コンストラクタでInitを呼ぶのがいいでしょう。
0501デフォルトの名無しさん
NGNGちなみにコンストラクタを明示的に呼ぶとどうなるかと
言うと、そのコンストラクタで一時オブジェクトが作成され、
一時オブジェクトが不要になった時点で削除されるから。
*thisにその一時オブジェクトを代入するか、placement new
を使えばできない事もないが、お勧めしない。
0502デフォルトの名無しさん
NGNG質問の回答じゃないけど
>CTest():m_nData(0){};
>CTest(int n){m_nData=n;}
これって
CTest(int n = 0): m_nData(n) {}
でいいんじゃないかな。
0503デフォルトの名無しさん
NGNG#include <iostream>
class A {
int* p;
public:
A(int i = 0) : p(new int[i]) { std::cout << "Ctor(" << i << ")\n"; }
~A() { std::cout << std::hex << p << "\n"; delete p; std::cout << "Dtor\n"; }
void Init(int i = 0) { delete p; *this = A(i); std::cout << "Init(" << i << ")\n"; }
};
int main()
{
A a(10);
a.Init(5);
}
0504デフォルトの名無しさん
NGNGそれはまともなoperator=を実装していないのが悪いんじゃないか?
0505デフォルトの名無しさん
NGNG0506デフォルトの名無しさん
NGNG#include <iostream>
class A {
int* p;
public:
A(int i = 0) : p(new int[i]) { std::cout << "Ctor(" << i << ")\n"; }
~A() { std::cout << std::hex << p << "\n"; delete p; std::cout << "Dtor\n"; }
void Init(int i = 0) { *this = A(i); std::cout << "Init(" << i << ")\n"; }
A& operator=(const A& ca) {
delete p;
p = ca.p;
return *this;
}
};
int main()
{
A a(10);
a.Init(5);
}
0507デフォルトの名無しさん
NGNG設計がおかしい。それだとまともにコピーできない。
class A {
int *p;
std::size_t size;
public:
A(int i = 0) : p(new int[i]) {}
~A() {delete []p;}
A &operator=(const A &ca) {
idelete []p; p = new int[ca.size]; std::copy(ca.p, ca.p+ca.size, p); return *this;
}
void Init(int i = 0) {*this = A(i);}
};
これで(例外安全は別にして)問題ないはずだが?
0508デフォルトの名無しさん
NGNGありが�d。やはり明示的にコンストラクタを呼び出すのはやめます。。。
0509デフォルトの名無しさん
NGNG横やりスマソ。
A(int i = 0) : p(new int[i]), size(i) {}
ですよね。
0510デフォルトの名無しさん
NGNGいや、operaotor= を正しく書けば明示的にコンストラクタを
呼び出しても良いという例かと。この場合は。
0511505
NGNGthis->CTest::CTest(n)だと
一時オブジェクトじゃなくちゃんと呼ばれてる見たいなんだが。
でも仮想関数が絡むとらえらい事なるからどっちにしろ使えねーなぁ。
0512デフォルトの名無しさん
NGNGコンパイルエラー。
0514デフォルトの名無しさん
NGNG取り敢えずMinGW(gcc3.3.3)ではエラー。
今標準で該当部分を探している所。
0515デフォルトの名無しさん
NGNG12.1.2当たりかな。
"Because constructors do not have names, they are never found
during name lookup;"
関数のように呼び出すのはだめだが、一時オブジェクトの生成の
ために呼び出すのは良いらしい。よくわからんけど。
0516デフォルトの名無しさん
NGNGusing namespace std;
int main()
{
int num1, sum=0;
cout << "何個の数字の和を求めますか?\n";
cin >> num1;
if(num1 >= 1 && num1 <= 10){
cout << "数値を" << num1 << "個入力してください。\n";
int pok[num1-1];
for(int i=0; i<=num1-1; i++){
cin >> pok[i];
sum = sum + pok[i];
}
cout << "合計値は" << sum << "です。\n";
}
else
cout << "数値が正しくありません\n";
return 0;
}
と入力して、ユーザーが指定した数の和を求めようと思うのだが
pok[num1]のところで「サイズを指定してください」とエラーがでます。
cin >> num1 で入力されたサイズを作りたい場合はどうすればよいのですか?
0517デフォルトの名無しさん
NGNG配列変数のサイズはコンパイル時に確定していなければならない。
int pok[num1-1]; ではなく
std::vector<int> pok(num1); だな。(要 #include <vector>)
あとnum1-1は一個少なく確保されてメモリ破壊ネタだね。
0518516
NGNGstd::bector<int〜〜 とやるのですね。
どうもありがとうございます。
0519デフォルトの名無しさん
NGNG$ gcc test.c && ./a
size:100
400
#include <stdio.h>
int main()
{
int i;
scanf("size:%d", &i);
int arr[i];
printf("%d\n", sizeof(arr));
return 0;
}
0520デフォルトの名無しさん
NGNGそれはC99の機能。
0521デフォルトの名無しさん
NGNG現行のC++規格的には通らないが、C99では通るしな。
0522デフォルトの名無しさん
NGNGB を操作する inline 関数を実装したいときには、
A の宣言部の直後に include する。
0523デフォルトの名無しさん
NGNG0524一星 ◆Cppn/.YI3.
NGNGclass Book{
string name;
int thicness; // mm
string color;
public:
Book(string,int,string);
};
Book :: Book(string r_name,int r_thicness,string r_color){
name = r_name;
thicness = r_thicness;
color = r_color;
cout<<name<<"が作成されました。"<<endl;
}
int main(void){
Book mine[16]("ある本",20,"青"); // エラーになる
getchar();
return 0;
}
上の様に、オブジェクト配列にコンストラクターを適用するにはどうすればいいんでしょうか?
『{}』を使ってみたりもしましたがよくわかりませんでした。わかる方は、ご教授お願いします。
0525デフォルトの名無しさん
NGNG朝だからしょうがない。
0526デフォルトの名無しさん
NGNGstd::vector< Book > mine( 16 , Book("ある本",20,"青") );
あとは、余計かもしれないけど。
×<iostream.h> → ○<iostream> で名前空間指定しる。
コンストラクタでは初期化リストを使え。
#include <string> #include <cstdio> が足りない。
0527大猿じゃないけど ◆N773RO82ms
NGNGnew を使ってもできそう。
ただ delete[] するのが面倒ですが。
#include <iostream> // std::cout, std::endl
#include <string> // std::string
#include <cstdio> // getchar()
using namespace std;
class Book {
string name;
int thicness; // mm
string color;
public:
Book(string r_name, int r_thicness, string r_color)
: name(r_name), thicness(r_thicness), color(r_color)
{ cout << name << "が作成されました." << endl; }
};
int main()
{
Book* mine = new Book[16]("ある本", 20, "青");
getchar();
delete[] mine;
return 0;
}
0528デフォルトの名無しさん
NGNGできそうだけどできないよ。
0529527
NGNG0530デフォルトの名無しさん
NGNG0531デフォルトの名無しさん
NGNGコンストラクタは呼ばれるが、引数を与えることはできない。
0532527
NGNGその通りみたいですね。
ISO/IEC 14882:1998 にも
void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw(std::bad_alloc);
しか載ってませんでした。
-pedanticオプションつけたらコンパイルできなかったし。
0533デフォルトの名無しさん
NGNG本当に配列の要素をコンストラクタで初期化したい場合は初期化リストで明示的にやるしかない。
Book mine[2] = { Book("Book",20,"Blue"), Book("Book",20,"Blue") };
で、単に何らかの値で初期化しておきたい場合には、デフォルトコンストラクタを使うこともできる。
配列の初期化に初期化子を用いない場合、デフォルトコンストラクタがその初期化に用いられる。
class Book ではユーザ定義のコンストラクタが存在するため、デフォルトコンストラクタも明示的に
定義する必要がある。
0534デフォルトの名無しさん
NGNG#include <iostream>
using namespace std;
class Book {
string name;
int thickness; // mm
string color;
public:
Book(string,int,string);
Book(); // default constructor
~Book();
};
Book::Book(string r_name,int r_thickness,string r_color):name(r_name),thickness(r_thickness),color(r_color) {
cout << "(\"" << name << "\"," << thickness << ",\"" << color << "\") is constructing" << endl;
}
Book::Book():name("A book"),thickness(20),color("Blue") {
cout << "(\"" << name << "\"," << thickness << ",\"" << color << "\") is constructing" << endl;
}
Book::~Book() {
cout << name << " is destructing" << endl;
}
int main(void) {
Book mine[2]={ Book("A Book",20,"Blue"), Book("A Book",20,"Blue") };
Book mine2[3];
return 0;
}
0535デフォルトの名無しさん
NGNG> その通りみたいですね。
> ISO/IEC 14882:1998 にも
> void* operator new(std::size_t) throw(std::bad_alloc);
> void* operator new[](std::size_t) throw(std::bad_alloc);
> しか載ってませんでした。
それは allocation function の話であって、new expression とはまた別の話だと思われ。
依然として↓は OK なわけで。
Book* = new Book("A book", 20, "Blue");
長いんでコピペしないけど、5.3.4 New の 15 だと思う。
0537デフォルトの名無しさん
NGNG0538デフォルトの名無しさん
NGNG<string>
0539デフォルトの名無しさん
NGNG<iostream>かと思ってたました
thanks alot !!
0540デフォルトの名無しさん
NGNGちょっと待て。
istream& getline(istream& strm, string& str)
の事だよな。念のため。
0541デフォルトの名無しさん
NGNG第3引数にchar型のパラメータがあったかもしれないすが・・
ちなみに、リターン値の参照は第1引数と同じ参照ですか?
0542デフォルトの名無しさん
NGNGistream& getline(istream& strm, string& str, char delim)
というのもある。
参照は同じなので、getline(cin, str) >> ss; なんて書き方も
できる。
0543デフォルトの名無しさん
NGNG重ね重ねthanks
0544デフォルトの名無しさん
NGNGclass ABC{
public:
int data;
void func();
ABC *next; //最後の場合は自分をさす
};
な感じの単方向リンクリストで最初から最後まで回すときなんですが
ABC *lp;
while(lp->next != lp)
{
lp->func();
lp = lp->next;
}
lp->func();
のように現在使ってる本に書かれていました。
上のように簡単な処理ならいいのですがもう少し複雑になったときに
whileを終えたあとのリスト最後の要素のlp->func();の部分がスマートじゃありません。
何かいい方法はあるでしょうか?
while(1)
{
lp->func();
if(lp->next == lp)
break;
lp = lp->next;
}
というのは考え付いたのですが何か不都合とかは起きてしまいますか?
どなたかアドバイスよろしくお願いします。
0545デフォルトの名無しさん
NGNG最後の場合はNULLじゃね?
0546デフォルトの名無しさん
NGNGリストとイテレータに分けるべきだろうね
0547544
NGNGその本では自分を指すようにしてました。
NULLでもいいのですが同じかなァと思いまして。
>>546
質問では宣言とか余分なものが入って長くなっちゃうので
イテレータを入れてませんが実際には使ってます。
0548デフォルトの名無しさん
NGNGイテレータって何のことを言ってるかわかってるのか?
で、
ABC* lp;
do{ ABC& current = *lp; lp = lp->next; current.func(); } while( );
0549デフォルトの名無しさん
NGNG> その本では自分を指すようにしてました。
マジか ?
その本の名前プリーズ。
0550デフォルトの名無しさん
NGNGリンク手繰っていくときにバグがあると
自分自身をポイントすると無限ループに、
NULLならエラーでとまってくれるので
どっちでもいいならNULLにしといたほうがいいよ。
デバッガでも終端であることを認識しやすいし。
あとどちらが一般的かといえばNULLの方。
0553デフォルトの名無しさん
NGNGて言うか、自分を指す方になんかメリットあるのかなぁ。
俺は、初めて聞いたよ。
0554柏原正三
NGNG>NULLならエラーでとまってくれるので
そんな保障は何処にもないが?
純粋にどちらが安全か、という意味でいうなら
自分自身を指している方が安全。
ただループするだけであって、未定義動作をするわけではない。
0555デフォルトの名無しさん
NGNG変なところに突っ込むね。
エラーでとまってくれない環境があるなら教えてくれ。
その環境で開発するときには注意するよ。
0556デフォルトの名無しさん
NGNG「NULLなら止まってくれる環境がたくさんあるので」
なら満足してくれるかい?
0557デフォルトの名無しさん
NGNG0558デフォルトの名無しさん
NGNG0559デフォルトの名無しさん
NGNGABC* lp;
do{ ABC& current = *lp; lp = lp->next; current.func(); } while( );
の意味が理解できません。
ABC& currentというのはどのようなものなのでしょうか
0560デフォルトの名無しさん
NGNG参照型、この場合は lp が指すオブジェクトのエイリアスと
なる。lp = lp->next として lp の値が変わっても、参照型は
変化しない。
別にここを
ABC* currentp = lp; lp = lp->next; currentp->func();
と書いてもいい。これなら理解しやすいだろう。
0561デフォルトの名無しさん
NGNGリンクされるライブラリの方を特定のnamespaceの中に入れるには
どうしたらいいのでしょうか?
具体的な問題は、
「namespace A」に置かれるクラスとライブラリa.hとa.lib、
a.hとa.libをリンクして作られるライブラリb.hとb.lib、があり、
このb.hとb.libを、namespace Aで作られるライブラリCでも利用したいということです。
DLLであれば、それぞれスタティックリンクされるため、このような問題は起きませんが、
スタティックリンクだと、ライブラリCのビルドモデルが変わったり、
一部の仕様が変わると問題が起きます。
構造的にはこのような感じにしたいのです。
namespace A{
ファイルアクセスクラス(b.libを作った時とは変更されている)
namespace B{
namespace A{
ファイルアクセスクラス
}
}
}
「ファイルアクセスクラス」を同じファイルでも別の実体としてリンクしたい。
0562デフォルトの名無しさん
NGNGいみわからん。
特に、
> リンクされるライブラリの方を特定のnamespaceの中に入れる
> ビルドモデルが変わったり
> 「namespace A」に置かれるクラスとライブラリ
> namespace B{
> 同じファイル
> 別の実体としてリンク
0563デフォルトの名無しさん :
NGNG管理できるようにするものを作っているのですが、
#include <new>
void* operator new( size_t size , const char *file , unsigned line );
とnewをオーバーロードして
呼び出し側で
char hoge = new( _FILE_ , __LINE__ )char;
と書いてコンパイルしたところ
下のようなワーニングメッセージが出てしまいます。
warning C4291: 'void *__cdecl operator new(unsigned int,const char *,unsigned int)' : 初期化コードが例外をスローすると、'new' 演算子を使用しているとメモリを解放しません。
これのなにがまずいのでしょうか?
0564デフォルトの名無しさん
NGNGすみません。
まず、namespace Aで作られる大型ライブラリCがありまして、
そのライブラリCの一部のファイルを利用したBというライブラリを作ったところ、
このライブラリBを、元の大型ライブラリCでも利用したいということになったのです。
0565デフォルトの名無しさん
NGNGoperator delete が定義してないからだろ。
0566デフォルトの名無しさん
NGNG最後のnextにNULLを入れれば
while(lp != NULL)
{
lp->func();
lp = lp->next;
}
でいーんじゃない?
最後のリンクに自分を入れるから余分なものが必要になっちゃってるのでは…?
0567デフォルトの名無しさん
NGNGEffective C++の第10項をよく読んでみよう。
0568デフォルトの名無しさん
NGNG> エラーでとまってくれない環境があるなら教えてくれ。
GBA とかドリームキャストとか。あと組み込み系も TLB なかったり、
アドレス 0 に ROM がマッピングされてたりするので、読み出しても
ふつーにデータが返ってきたりする。(書き込みは無視される)
でも NULL 入れとけというのは同意だけど。多くの環境だとそれで落ちるし、
実機上ではダメでもエミュレータでならトラップ掛けられる場合も多い。
>>554
> ただループするだけであって、未定義動作をするわけではない。
いずれにしても、リリースする段階で残っていたらアウトっつー類のバグだ。
テスト段階で検出しないとマズい。
0569柏原正三
NGNG>最後のリンクに自分を入れるから余分なものが必要になっちゃってるのでは…?
それでは比較の操作が1回余分に発生する。
>>568
>テスト段階で検出しないとマズい。
未定義である以上、実行時の結果だけでバグでないと
保障することはできない。
テストの時、たまたま予想通りの動作をしていたらどうする?
0570デフォルトの名無しさん
NGNGC++の話題にしてくれよ!実装依存の話は聞きたくない!
0571デフォルトの名無しさん
NGNGそれらの人たちにとっても意味のある議論をしなければならない。
それが分からない厨房は帰れ。
0572デフォルトの名無しさん
NGNG確かにそうだな…
というかよくそんなレスを思いついたものだ
0573デフォルトの名無しさん
NGNGそれはあなたの脳内だけに留めてください。お願いです。
>>572
俺もそう思った。確かに間違ってはいないが。
0574デフォルトの名無しさん
NGNGNULLの安全性(若しくは有用性?)の話は十分にgenericな話題
空想論に走るのを防止する目的で要求しだい実例を挙げているだけ
そこはスルーしててもちゃんと通じる話だよ?
0575デフォルトの名無しさん
NGNG「本に書いてあったから」なんて理由で使うのはどうかと思う
0576デフォルトの名無しさん
NGNG0577デフォルトの名無しさん
NGNGまあどちらでも同じなんだけど。
0578デフォルトの名無しさん
NGNGおお同士よ
0579デフォルトの名無しさん
NGNGだってもともとが「C言語アルゴリズム徹底入門」から出た質問だもの
端からスレ違いだって
0580デフォルトの名無しさん
NGNGポインタを返す関数の仕様を「〜の場合は0を返す」と書くことになるんでしょうか?
0581デフォルトの名無しさん
NGNG素直にNULLでいいじゃん。そこで「0でも同じなんですけど!」
と反論しても空しいし。
0582デフォルトの名無しさん
NGNG俺だったら>>580さんのようにすると思う。と言うかしている。
大抵のC++処理系は #define NULL 0 としてあるが、そうで
ない処理系もあるだろうから、移植性を重視するならNULL
は撤廃した方がいいよ。
0583デフォルトの名無しさん
NGNGC++ではNULLは0って規格で決まってるんじゃなかったっけ?
0584デフォルトの名無しさん
NGNGttp://www.kuzbass.ru/docs/isocpp/lib-support.html#lib.support.types
18.1.4
[Footnote: Possible definitions include 0 and 0L, but not (void*)0. --- end foonote]
つまりNULLは0または0Lしか許されない。
0585デフォルトの名無しさん
NGNG国内では「空ポインタ」と訳すのが標準のはず
0586580
NGNGそうすると、例の関数の戻り値をテストするコードはNULLを使うのが正しいと感じます。
関数の仕様にそう書いてあれば、それを読んだユーザーが == NULL でテストするのは自然なことです。
これはNULLを使わないと言う方針に反してしまうのです。
だからといって、ドキュメント中に0じゃぁさすがに伝わりにくいんじゃないか、と思うわけで。
0587デフォルトの名無しさん
NGNG#include <iomanip>
struct X { int a, b; };
int X::*c;
int X::*d = 0;
template <class T>
struct Y
{
union
{
T* e;
unsigned char* f;
};
};
0588デフォルトの名無しさん
NGNGinline
void dump(T* p)
{
Y<T> y;
y.e = p;
for(std::size_t i = 0; i < sizeof(T); i++)
{
std::cout
<< std::hex
<< std::setw(2)
<< std::setfill('0')
<< int(*y.f++)
<< ' ';
}
std::cout << std::endl;
}
0589デフォルトの名無しさん
NGNG{
dump(&c);
dump(&d);
static int X::*c;
static int X::*d = 0;
dump(&c);
dump(&d);
return 0;
}
0590デフォルトの名無しさん
NGNG0591デフォルトの名無しさん
NGNG他にも回避策はある。(lp == NULL) で比較するのではなく (!lp)
とすれば。
0592デフォルトの名無しさん
NGNGff ff ff ff
ff ff ff ff
ff ff ff ff
ff ff ff ff
0593デフォルトの名無しさん
NGNG00 00 00 00
ff ff ff ff
00 00 00 00
ff ff ff ff
というかメンバへのポインタの値を直接参照してもあまり
意味がないような。
0594デフォルトの名無しさん
NGNGいいえ、「ヌルポ」です。
0595デフォルトの名無しさん
NGNGガッ!
0596デフォルトの名無しさん
NGNGいきなりじゃぁ、ちょっと訳解らんw
テンプレのサイト回ってきます・・・。
0597デフォルトの名無しさん
NGNGCなんですか?C++の間違いじゃないんですか?
0598デフォルトの名無しさん
NGNGそれはいきなりすぎます。
まずはキスから始めた方がよいのではないでしょうか?
0599デフォルトの名無しさん
NGNG参考文献:「はじめてのC」
0600デフォルトの名無しさん
NGNG0602デフォルトの名無しさん
NGNGC++ 的に組んだプログラムは
C とは全く違うものになる。
C 的に組んだプログラムは
さほど変わらないけどね。
0603デフォルトの名無しさん
NGNG> え?CとC++って、違うんですか?
> てっきり、似たようなものだと・・・。
似たようなものであり、違うものです。
つーか「似たような」という表現は通常、異なる物同士に対して使う形容なわけで、
この質問はちょいと変ではないかと。
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNGCの記述はなんか読みにくいので漏れはC++的に組んでまつ。
0606デフォルトの名無しさん
NGNG始める方が良い。Cで一度ポインタに関する変な癖が付いて
しまうと、そこから脱却してC++らしい考え方を身に付けるの
は骨が折れるぞ。
0607デフォルトの名無しさん
NGNG0608デフォルトの名無しさん
NGNG十分注意してください。説明書にも但し書きがあるはずです。
0609デフォルトの名無しさん
NGNG0610607
NGNG」というのがありました。 そのアドレスを壊しちゃうと、その場所はもう使えない??
壊してばかりいると、64Mのメモリが10Mとかになっちゃうのですか…?
0611デフォルトの名無しさん
NGNGC++の勉強はやめて、Cの勉強しなさい。
0612デフォルトの名無しさん
NGNG次第にOSの使えるメモリが少なくなっていきます。
やりすぎるとWindowsの起動にも支障をきたすようになりますよ。
0613デフォルトの名無しさん
NGNG>やりすぎるとWindowsの起動にも支障をきたすようになりますよ。
デバイスドライバに関わるプログラムでも組めばそうですが、
普通のアプリを作っている限りにおいては、バッファの不正書込みで
OSの挙動がおかしくなる事はないですが・・・。
WindowsCEやWindows3.xはヤバイかもしれないけど。
0614デフォルトの名無しさん
NGNGHD に過負荷をかけて壊してしまうことはあるかもしれない。
>>610
その場合の「壊す」というのは、物理的に壊すのではなく、
そこの値を勝手に変更してしまうことを指す。
0615607
NGNG一回再起動すれば元通りになるということでしょうか?
普通にポインタの勉強でいろいろいじってる分には物理的に壊れることないでしょうか?
もし壊れることあるなら、試行錯誤できないでう。。。
0616デフォルトの名無しさん
NGNGネタにマジレスをする人が集まるスレはここですか?
0617デフォルトの名無しさん
NGNGそれを言うなら昔のDOS環境でのCは今より遙かに危険だったぞ。
ディスプレイに規格外の同期信号が入ると今のディスプレイなら
勝手に阻止してくれるが、昔のはそのままディスプレイから煙を
吹いて逝ってしまう事があったからな。
滅多な事ではハードウェアにダメージを与える事はできないと思わ
れ。但しデバイスドライバを作っている場合は変なコマンドをデバイ
スに送って壊してしまう事があるかもしれない。クロック周波数とか
HDDにコマンドを送るような時。
0618デフォルトの名無しさん
NGNGほとんどないから、試行錯誤してヨシ。
そのプログラムの挙動がおかしくなるだけ。
そんな場合はそのプログラムを強制終了すればいいだけ。
場合によっては強制終了が出来なくなる場合もあるが、
ほとんどまれなので、遠慮なくメモリを破壊して
Windowsカーネルのメモリ保護機能を楽しんでいい。
0619607
NGNG0620デフォルトの名無しさん
NGNGまず壊しても誰にも怒られないマシンを持て
びくびくおどおどしてちゃ何も試せないだろ
因みに俺は実用と実験用に別々のマシンを使ってる
氏なれたら困るマシンで怪しいことは一切しない
0621デフォルトの名無しさん
NGNG0622デフォルトの名無しさん
NGNG0623デフォルトの名無しさん
NGNG#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int nn[4];
srand(time(NULL));
cout << "0〜9の中から4個ランダムに選ぶ" << '\n';
for (int i=0; i<=3; i++){
nn[i] = rand() % 10;
cout << nn[i] << ' ';
}
return 0;
}
1〜9までの間からランダムに4個選ぶのを作ったんだけど、0,7,9になる確率が多いようなのは気のせい??
0624デフォルトの名無しさん
NGNGrandを使って0からRAND_MAXまでの乱数を発生させるとき、
最大値をRAND_MAXではなく100にしたいのですが、
この際、rand%101としたとき、
発生される0から100の間の数字には微妙な偏りが生じてしまうと思うのですが、
このような偏りを生じさせず、きちんとランダムに0から100の間で乱数を発生させる方法はありますでしょうか。
470 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:07
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/rand.3.html
471 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:09
良い乱数・悪い乱数
http://www001.upp.so-net.ne.jp/isaku/rand.html
472 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:12
>>470
>>471
どうもありがとうございました。
473 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:14
あとセキュリティにかかわるなら/dev/random
0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNG英語版なら知ってるけど。
0627デフォルトの名無しさん
NGNGどこですか?
0629デフォルトの名無しさん
NGNG0630デフォルトの名無しさん
NGNGttp://www.mycnknow.com/c.htm
悪用しないようにな。
0631デフォルトの名無しさん
NGNG/*読み込み*/
for(tate=0;tate<=kaisu;tate++){
for(yoko=0;yoko<=MAX;yoko++){
gets(moji);
moji[tate][yoko]=atoi(moji);
}
}
for(tate=0;tate<kaisu;tate++){
for(yoko=0;yoko<MAX;yoko++){
printf("%s",moji[yoko][tate]);
printf("\n");
}
}
}
/*ソート*/
for(i=0;i<kaisu;i++){
for(j=i+1;j<kaisu;j++){
if(moji[i]>moji[j]){
temp=moji[i];
moji[i]=moji[j];
moji[j]=temp;
}
}
}
/*表示*/
for(i=0;i<kaisu;i++){
printf("%s\n",moji[i]);
}
return(0);
}
0632623
NGNG#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int nn[4];
srand(time(NULL));
cout << "1〜9まで\n";
for (int i=0; i<=3; i++){
nn[i] = 1 + (9.0 * rand() / (RAND_MAX+1.0));
}
for (int j=0; j<=3; j++){
nn[j] = 1 + (9.0 * rand() / (RAND_MAX+1.0));
cout << nn[j] << '\n';
}
return 0;
}
2かいランダムに発生させたら、最初の文字が8じゃなくなりました。
0633デフォルトの名無しさん
NGNG例えばある関数からダイアログを表示するとき
void foo()
{
CDialog dlg;
dlg.DoModal();
}
と書くのと
void foo()
{
CDialog* pDlg=new CDialog();
dlg.DoModal();
delete pDlg;
}
と書くのとがありますが、どうやって使い分けるのでしょう?
また同様にクラス内でも変数として宣言してしまう
場合と、ポインタとして宣言してコンストラクタ等で
newする場合がありますが、どう使い分ければいいのでしょうか?
0634デフォルトの名無しさん
NGNG前者でできるんだったらとりあえずそれでやっとけ。
0635デフォルトの名無しさん
NGNGint* fuga
hoge(int i){ new int fuga[i];}
~hoge(){delete [] fuga;}
};
int main(){
for(int i = 0; i < 5; i++){
hoge fuga(i);
}
return 0;
}
このようにすると、まずhoge(0)と初期化され、
その後hoge(1)..というようにhoge(5)まで初期化されますが、
その際にデストラクターが呼び出されずにメモリリークしますか?
0636デフォルトの名無しさん
NGNGしない。
(public:が抜けてるけど。)
0637デフォルトの名無しさん
NGNG漏れが new で作る場合はむしろモードレス
0638デフォルトの名無しさん
NGNG補足しておく。
>どうやって使い分けるのでしょう?
ダイアログ(変数)の生存期間によって使い分ける。
>>637 が言ってるのもそういうことね。
特定のブロック内だけ(この場合foo()の中)でいいのならば自動変数として確保する。
任意のタイミングで生成・破棄したい場合に new/delete の組を使う。
別に下の例の方でも構わないといえば構わないが、いちいちメモリを確保、解放するのが面倒だし、無駄。
さらに例外のことを考えると自動変数にするのが良い。
>また同様にクラス内でも(以下略)
ポインタにしといてコンストラクタで new する場合ってのはあんまりないんじゃなかろうか。
一応思いつくのはこんな感じ。
1.可変長配列の場合
2.NULL であることに意味がある、NULL を表現する必要がある場合
(この場合、コンストラクタではむしろ NULL 初期化する方が多いかも)
3.(ポインタを通して)1つのインスタンスを共有する可能性がある場合
(単純にコンストラクタで new 使って生成したりしないような気もするが)
結局のところ >>633 で正解だと思われ。
>>635
fuga の生存期間は for 文の {} の中だけなので、ループが回るたびに、fuga は生成され破棄される。
つか、試してみればいいじゃないか。
ところで、
×hoge(int i){ new int fuga[i];}
○hoge(int i){ fuga = new int[i];}
だよな?
0639デフォルトの名無しさん
NGNG×結局のところ >>633 で正解だと思われ。
×結局のところ >>634 で正解だと思われ。
0640デフォルトの名無しさん
NGNG>633
ものすごくオブジェクトのサイズがでかくて、スタックに積むのが不安なとき、とか?
そんな糞設計ないと思うが。
0642デフォルトの名無しさん
NGNG自分で調べた・聞いた結果としましては、
STLはどれも重くて生成・削除が激しいものにはきつい。
このスレを見てたところリスト構造というのがあり、少なくともSTLよりは
ずっとイイみたいなので今はこれを使っています。
あとは普通に最大数の配列を用意しておいてフラグなどのtrue/falseで
最初から最後までまわす方法ですが、さすがに要素が多いとキツイかと思ってましたが
某所に「今のPCの性能はいいからいくらでも問題ない」みたいなことがかいてありました。
しかしメモリを節約するに越したことはないですし…
何かいい方法がありましたら教えていただけないでしょうか。
よろしくお願いします。
0643デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNGまず質問の仕方から勉強しましょう。
0645デフォルトの名無しさん
NGNG>数が変化するオブジェクトを管理するにはどうやるのがいいでしょうか?
>自分で調べた・聞いた結果としましては、
>STLはどれも重くて生成・削除が激しいものにはきつい。
お前は、オブジェクトという言葉を使うのさえ10年早い。
STLが何故重いのか、どれぐらい重いのかを説明できるか?
0646デフォルトの名無しさん
NGNGアプリケーション中、ただ一つのmain.cppでは、
コンフィギュレーションの類いを記すだけとなる、
という話は本当ですか?
0647デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNGsrd::list使えば?
リスト構造ですよ。ちなみにこれ、STLね。
0649デフォルトの名無しさん
NGNGSTLはどれも重くて生成・削除が激しいものにはきつい。
そんなものをすすめるあなたは荒らしですね。
荒らしは死んでください。
0650デフォルトの名無しさん
NGNG循環参照にはどう対応するんだ(w
0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNG> コンフィギュレーションの類いを記すだけとなる
コンフィギュレーションもファイルから読み込みますから
0653デフォルトの名無しさん
NGNG0654デフォルトの名無しさん
NGNG生成・削除が激しい場合はそもそも動的な確保を頻繁にやらないでしょ。
STL云々より、設計の進め方自体が間違っていると思うのだが。
それをSTLのせいにしたあげく2chで質問をしているって感じですかねw
ひょっとしてstd::vectorなどに、「サイズやインデックス管理が一切必要ない」
という理想を求めてますか?そんな要求はそもそも無茶ですけど。
プログラマは皆それ理解した上でSTLを使っているのですが、>>649はそうではないようですね。
0655デフォルトの名無しさん
NGNG0656デフォルトの名無しさん
NGNGマジレスしとく
>STLはどれも重くて生成・削除が激しいものにはきつい。
何処で誰に聞いたのかは知らないが、十中八九あなたの勘違い/読み間違い。
正しくは、コンテナによっては、アイテムの追加挿入削除にコストがかかるものと
そうでないものとがあるということ。このことは別にSTLのコンテナに限らない。
配列やSTLのvectorは前者の代表で、リスト構造は後者の代表。
なおSTLにもリストは用意されている。
どうやらあなたは基本的な用語や概念の理解が不十分のようです。
もう一度基礎をしっかり勉強することをお勧めします。
そうすれば、とんちんかんな質問をして、あきれられたり煽られたりすることも
なくなるでしょう。
0657デフォルトの名無しさん
NGNG言語の仕様の問題ではなく各プログラマの使うアルゴリズムの問題だって事に気づかず、
C++のせいにする人は、C++開発力だけでなくプログラミング能力自体が未熟といえます。
0658デフォルトの名無しさん
NGNGベースとなっているデータ構造をご存じですか?まあそもそも
STLのコンテナが保証しているのはO値だけでコンテナの実現
方法までは規定してないけど。
仮にstd::vectorが配列、std::listがポインタ、std::setが赤黒木
だとするとそれに十分見合う速度は出ていると思います。
これでも遅くて使い物にならないのなら一切new/deleteを含む
アロケータを使用しない独自のコンテナを自作すべきです。
またはtraditionalなC式のイテレータを持たないデータ構造に
するか。その場合配列を除いて<algorithm>は使用不可になっ
てしまいますが。
0659デフォルトの名無しさん
NGNG0660デフォルトの名無しさん
NGNG×std::listがポインタ
○std::listが双方向リスト
0661デフォルトの名無しさん
NGNG649!=642で、649はどうみても荒氏だろ。
0662デフォルトの名無しさん
NGNGその文章を的確に理解している人は少ないようです。
「STLの主たる目的はメモリリークを回避するためのものであり、
実行パフォーマンスを向上するためのものではない。」
という文章から読者はどのように解釈するでしょうか?
STLはパフォーマンスが悪い、等とはどこにも書かれていません。
かといってSTLはパフォーマンスが良いとも書かれていません。
パフォーマンスを向上させる責任はあくまでもプログラマにあります。
0663デフォルトの名無しさん
NGNG俺の書いたコンテナのコードのほうが20%〜300%速いし。
STLの存在価値は速度ではなくアルゴリズムに疎いショボコーダでも
そこそこの質と速度のコードが書けるようになるって事だから
盲信したり拒絶したりするのはどうかと思うよ。
0664デフォルトの名無しさん
NGNGまたまた痛いのが来たな(w
作ったというコンテナは、STLと同じテンプレート(汎用)コンテナなのか?
それとも、特定オブジェクトに最適化して可植性を犠牲にしたコンテナ(あくまで自称)なのか?
0665デフォルトの名無しさん
NGNGそれは言えてる。「盲信したり拒絶したり」しないで、STLの
性能と便利さを天秤にかけた後にプログラムに使用するか
どうか決定すればよいだけの話。
それを言うなら、C++の標準入出力ライブラリなんて、Cの
stdio.hより禿げしく重いし遅いものがたくさんある。速度は
度外視して便利さを追求したものならstd::stringstreamなん
てものもある。これらは継承によって構築されているので
ほとんどインターフェースが共通していて覚えやすい。
STLは継承は使用していないが、コンテナにクラスのポインタ
を入れられるので多態性を表現するのにも使える。
0666デフォルトの名無しさん
NGNGSTLとiosクラス群は全く別の物です。
同列に論じている時点でどうかと思われます。
0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNG自作コンテナ賞賛の時点で失格です。
出直しましょう。
結論から言えば、自作コンテナなどという物は一切必要ありません。
私も駆け出しの頃、メモリ管理を覚える勉強がてら
コンテナ(自称)を作ってSTLと競わせて独りよがりな優越感に浸ったりしてました。
結局STLだけで必要十分という結論に達しました。
0669デフォルトの名無しさん
NGNGreserve や insert のことを何も知らず、ただ push_back のみを利用して
評価しているだけのような気がする。
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNG私もそう思います。
ただし、STLのstd::stringは曲者です。
std::string::reserve()の挙動がVC++とgccで異なります。
gccのstd::string::reserve()は恐ろしい事に何もしないみたいです。
つまり、サイズが多目にある事を前提にしたコードを
VC++環境で書くとgccに持っていった時悲惨な目に遭います(泣
0672デフォルトの名無しさん
NGNG>STLかー。結構がんばってはいるけど普通に遅いよな。
>俺の書いたコンテナのコードのほうが20%〜300%速いし。
STLを盲信したり拒絶したりしないのは評価できるが、300%速くなった時点で、
何か疑問に思うことは無かったのですか?
自分を盲信したり拒絶したりしないほうがいいと思います。
0673デフォルトの名無しさん
NGNGお目出度い自作コンテナ厨が御来訪でつか?w
早く>>668にみたいに卒業しないとな。精進しろよw
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGだれかベンチ取ってないの?
自作コンテナとやらと比べたベンチはあるんでしょ?
0676642
NGNG速いということでいいんでしょうか。
自分で作る場合はポインタ配列をnewして
NULLをセットすればいいんでしょうか。
動作が安定したら将来的には高速化を考えています。
アセンブラコードで高速化するといいと聞いたのですが
アセンブラコードからnewを呼ぶ事も可能ですか?
よろしくお願いします。
0677デフォルトの名無しさん
NGNG悪いことは言わん。その程度の理解しかしてないのならおとなしくSTLを使っとけ。
0678デフォルトの名無しさん
NGNG>自分で作る場合はポインタ配列をnewしてNULLをセットすればいいんでしょうか。
素だとするととんでもないやっちゃな(w
ひょっとしてリア厨かな?
工房だともうちょい知能が高いような気がする。
0679デフォルトの名無しさん
NGNGと思っているからSTLを使っています。
0681デフォルトの名無しさん
NGNG>えーとつまりSTLではなくリスト構造を自分で作ったほうが
>速いということでいいんでしょうか。
測ってみろ。
>自分で作る場合はポインタ配列をnewして
>NULLをセットすればいいんでしょうか。
違う。
>動作が安定したら将来的には高速化を考えています。
>アセンブラコードで高速化するといいと聞いたのですが
>アセンブラコードからnewを呼ぶ事も可能ですか?
可能だ。
0682デフォルトの名無しさん
NGNGunko = NULL;NULLをセット
>>動作が安定したら
しません。
0683682
NGNG0684デフォルトの名無しさん
NGNGだから、君の理解の度合いで自力でコンテナ実装するのは不可能。
一から勉強しなおすか、とりあえず出来合いのものを利用するしかない。
つか、多分STLも使えないと思う。それこそstd::vectorでひたすらpush_back()
で、やっぱりリア厨か。
0685デフォルトの名無しさん
NGNG決めてしまったなら思い直せ。言えるのはそれだけだ。
0686デフォルトの名無しさん
NGNG0687デフォルトの名無しさん
NGNGってか、「リア厨」ってむやみに言うな。
0688(^^;)ガクガクぶるぶる
NGNG>>ってか、
>>ってか、
0689デフォルトの名無しさん
NGNGstd::back_inserterとかstd::back_insert_iteratorを(ry
0690デフォルトの名無しさん
NGNG↓
(心理学用語としての)合理化
↓
(゚∀゚)「STLは使い物にならないね!」
こういうのは典型的なアフォ。氏ね。
0691デフォルトの名無しさん
NGNG賛成
0692デフォルトの名無しさん
NGNGなんだ、その程度のヤシにマジレスしていたのか。我ながら
情けない。
0693デフォルトの名無しさん
NGNGcin >> unum;
cout << unum[5] << '\n';
入力時に”123456789"って9桁入力しても
cout << unum[5] << '\n';で反映されちゃうんですが、これが反映されない方法ってありますか?
0694デフォルトの名無しさん
NGNGちょっと待て、一体何がしたいのか教えてくれ…
入力長を制限したいのか、それとも本気でunum[5]を使いたいのか
0695デフォルトの名無しさん
NGNG#include <iostream>
#include <iomanip>
int main()
{
char unum[3];
std::cin.get(unum, 3);
std::cout << unum << '\n';
}
0696693
NGNGifを使って5文字目が何もなかったら処理をしようかと思ったのに、入力したものが反映されてしまいます。
0697デフォルトの名無しさん
NGNGOK、おまいはまず'\0'というものを知るべきだ
0698693
NGNG0699デフォルトの名無しさん
NGNGchar unum[3];
って宣言したとき、安全にアクセス可能なのは
unum[4]までよ、しかもunum[4]に書き込みは言語道断
その値も何が入ってるかわかったもんじゃない
つまり、unum[4]はforループかなにかで
「ちょっとオーバーしちゃった。てへへ」な用途にしか使えない。
umin[5]以降のアクセスは超絶的未意義何があっても文句は言えない。
まあつまるところ、普段はunum[0]からunum[3]までにしておけと言うことです。
0700699
NGNGchar unum[3]のときumun[n]のnが
0-2 安全にアクセス可能
3 アクセスは可能、書き込み不可、値は不定
4以降 未定義
に修正しておくんなまし
0701デフォルトの名無しさん
NGNG式として見ると、unum[3]は未定義じゃあないかな。unum+3を逆参照していることになる訳だから。
unum+3だけであれば安全だけどね。
あともう一つ。unum+3は「ちょっとオーバーしちゃった。てへへ」な用途以外にも、
イテレータの終端としての重要な役割がある。
0702デフォルトの名無しさん
NGNG0703702
NGNGunum[3]の間違い
0704デフォルトの名無しさん
NGNGつまり
char* p = &unum[2];
p++;
のとき
&p = &unum[3];
を保証する、みたいな
0705701
NGNG>>701に対して書いているのかな?そうだとしたら補足しておく。
>>701で言いたかったのは、char unum[3];という宣言があったとき、*(unum + 3)のシンタックスシュガー
としてのunum[3]は未定義じゃないか、ということ。[]演算子は、ポインタのインクリメントだけでなく、
逆参照を行うのだから、配列の末尾+1の場合は未定義になると思うのだけど。
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNGc ='0'
c = '\0'
c = 0
全部違う値ですか?
0708デフォルトの名無しさん
NGNG確実に言える事は c = '0' だけは違うって事かな。
0709デフォルトの名無しさん
NGNG'\0'は全ビットが0だったかな。
0710デフォルトの名無しさん
NGNG下がったな。それともいきなりC++から始めたのでCの知識
が足りない奴が増えたのか。
std::cinからの入力はなるべくstd::stringを使ってくれよ。Cの
悪夢に戻りたくねー。
0711デフォルトの名無しさん
NGNGおまいらもいい加減放置というものを覚えてくだちい
0712デフォルトの名無しさん
NGNG入門サイトを渡り歩いてベンキョーしてるやつが増えたからでしょ。
それだけプログラミングの敷居が下がったってこと。
あいてするのが面倒なら、スルーするか、初心者スレに誘導したらいいでしょ。
0714642
NGNGまずなぜこの質問したかというとこのスレの上の方に
STGゲームの弾みたいな生成・削除が激しいものはSTLより
リンクリストがいいのでは?と書かれていたからです。
あとはサイトをまわってもたいていはSTLは重いから使わない方がよい(便利ではあるが)
とありましたので…
なぜあれほどたたかれたのか理由はよくわからないのですが返答よろしくお願いします
0715デフォルトの名無しさん
NGNG0716デフォルトの名無しさん
NGNG0717デフォルトの名無しさん
NGNG空気読め糞野郎。
0718デフォルトの名無しさん
NGNGログ読んで判らんのなら初心者スレにでも逝けば?
0719642
NGNG0720デフォルトの名無しさん
NGNGはい。
0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNGstd::listって知ってるか?
あとリンクリストって何かわかってるか?
0723デフォルトの名無しさん
NGNG環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
これはメモリサイズにもそのまま言えると思う。
0724デフォルトの名無しさん
NGNG【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1077102238/
ただし、君のレベルだと、ここでも
「顔洗って出直せ=一から勉強しなおせ」
で叩き出されると思いますが。
あと、STG云々に関しては完全に間違って理解してますよ、君。
0725720
NGNGvectorで大量に多摩オブジェクト配列を確保しておく。
多摩オブジェクトにメンバ変数に使用・未使用のフラグを入れておく。
新規に多摩が必要になった場合は、
アルゴリズムのupper_bound()で未使用の多摩オブジェクトを探し出して再利用。
使い終わったらフラグを未使用状態にセット。
多摩の同時出現最大数は制限すべきだし、実際制限しないとヤバイ。
0726デフォルトの名無しさん
NGNGすげえ。ダイナミックリンクしといてファイルサイズもメモリサイズも
増えないとかいってるよ。この人。
0727デフォルトの名無しさん
NGNG>>723
そのネタいい加減に止めれ (;´Д`)
0728デフォルトの名無しさん
NGNG以前にも見たので秋田。
楽しいのか?そういう書込み。
0729デフォルトの名無しさん
NGNGとかいうエラーが出るんだけどこれってどうすればいいのですか?
0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNGSTLで生成・削除が激しいから遅いという理由はおかしい
だが、バッドノウハウを吸収したいなら「タスクシステム」で検索してみなさい
「やねうらお」でもいい
0732デフォルトの名無しさん
NGNGVCスレに行け。
その前にそのエラーでそのままググれ。
0733デフォルトの名無しさん
NGNGC++の宿命だからな
コンシューマ機でよくやるオブジェクトのサイズを全部同じにしてしまうという荒業もある
ただのはいれつ のようだ
0734デフォルトの名無しさん
NGNGリビルドしてみれ。それでも駄目ならプリコンパイル済ヘッダを使わない設定にする。
0735デフォルトの名無しさん
NGNGC++じゃなくてOSのメモリマネージャの宿命かと。
そんなわけでプログラマ自身がメモリマネージャに就任しなければならない。
メモリマネージャに就任したPGからの会見コメント
↓
0736デフォルトの名無しさん
NGNGC++の宿命???????
0737デフォルトの名無しさん
NGNG#include "stdafx.h"
後死ね。
0738デフォルトの名無しさん
NGNG0739デフォルトの名無しさん
NGNG言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0740デフォルトの名無しさん
NGNG0742デフォルトの名無しさん
NGNGttp://www.aya.or.jp/%7Esanami/peace/index.html#CODE44
0743デフォルトの名無しさん
NGNG0744デフォルトの名無しさん
NGNG0745デフォルトの名無しさん
NGNG同じ関数名を持つ複数のライブラリを扱うにはどうしたらいいのでしょうか?
ライブラリAにもBにもinit()という関数があり、両方使う必要が出てきました。
ヘッダの方はnamespaceに置きましたが、
namespace His_Lib{
#include "his.h"
}
namespace Her_Lib{
#include "her.h"
}
ライブラリをリンクするときにエラーになります。区別するにはどうしたらいいのでしょうか。
745 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 14:39
::で解決した?
746 名前: デフォルトの名無しさん 投稿日: 04/03/25 14:40
>>745
747 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 14:43
どうしようもありません
0746デフォルトの名無しさん
NGNG>>744
どっちかのライブラリを変更して再コンパイルすることはできる状況なの?
どっちも変更できなくても、Windows の DLL だとまあ何とかできる。
749 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:03
>>748
ソースがあれば変更すればいいのですが、ソースがないのです。
スタティックリンクするライブラリだけなので・・・
750 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:10
>749
>748はWinの場合なら、
それぞれ別のバイナリ(DLL)としてリンクして、
GetProcAddressでアドレス取得して使えってことでしょ
751 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:36
>744
まさに、グローバル名前空間を浸食する二つのライブラリが衝突した瞬間ですな。
namespace はこうならないように予防するためのもので、対処するためのものじゃないです。
で、多重定義になる以上、
どうやっても同じバイナリに二つのライブラリを入れることは無理かと。
752 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:55
スタティックか。じゃあムリだね。
オブジェクトファイルを取り出してバイナリエディットで関数名変える
ぐらいしか手はないかと。
0747デフォルトの名無しさん
NGNGC++ にはある文字 ch がそのロケールにおける数字かどうか判別する方法として、
std::isdigit テンプレート関数がありますが、 ch をそのロケールで対応する
数値に変換する関数というのはあるのでしょうか?
std::locale lc;
if( std::isdigit( ch, lc ) )
{
// 数字に変換するには?
}
754 名前: 753 [sage] 投稿日: 04/03/25 16:52
最初は、純粋に '0' (wchar_t なら L'0' )を引けばいいかなーと
思っていたのですが、
std::locale lc( "japanese");
isdigit( L'1', lc ) // 全角1
が true を返すので、どうしたもんかーとか思っているわけです。
755 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 17:09
>>753
std::num_putかな?
ようわからん。
756 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 17:12
std::num_get?
757 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 17:30
>>750
全然違う
0748デフォルトの名無しさん
NGNG>>755 >>756
num_get は、いちいち、stream を作成しないといけない上に、
あろうことか VC++7.1 では wchar_t の num_get を用いると、
例外で落ちます。
また、数字1文字だけを数値に変換したいのに、わざわざ num_get を使うのも、
気が引けます。
759 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 19:17
>>758
一文字だけでいいのなら
ch-'0';
ただしロケールとかは完全に無視してるけど。
複数の文字なら。
int result;std::string buf;
std::istringstream(buf) >> result;
760 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 19:34
>>759
ふりだしにもどんな
0749デフォルトの名無しさん
NGNG>>744
それぞれのスタティックライブラリをラップするDLLを自作しれ
762 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 21:03
class A {
public:
A(const char* name) : name_(name) {}
~A(){}
private:
const char* name_;
};
class B {
public:
B() {
a.insert(new A("aaa"));
a.insert(new A("bbb"));
}
~B(){}
private:
std::vector<A*> a;
};
~B(){}でaの要素を開放する必要ありますか?
763 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 21:11
だまって boost::shared_ptr 使っとけ。
要素が文字列だけなら string でいいけど。
つーか vector に一引数の insert はないんだが
0750デフォルトの名無しさん
NGNG>>763 レスありが�d。使ったことないけど、チャレンジしてみます。
a.push_back(new A("hoge"));のまちがいです^^;
765 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 22:20
>>762
ある
766 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 23:05
そもそもvector<A>じゃだめなの?
767 名前: デフォルトの名無しさん 投稿日: 04/03/26 00:07
> また、テンプレートライブラリ(STL含む)に関する質問は
> 専用の別スレへどうぞ。
> 過去スレ、関連スレ、関連リンクなどはこちら>>2-13
0751デフォルトの名無しさん
NGNG勉強のためゆくゆくはAbstractFactoryとかPrototypeパターンを使用するつもりなので。
#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<A*> APtr;
class B {
public:
B() {
a.insert(APtr(new A("aaa")));
a.insert(APtr(new A("bbb")));
}
~B(){}
private:
std::vector<APtr> a;
};
でコンストラクタ呼ばれました。便利ですね。
追加質問ですが、自分で、deleteするのが面倒ならば、
常に、new をshared_ptrで包んだ方がいいですか?何か弊害ありますか?
769 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 00:20
>>766
それはまあ、実際のコードではAは抽象クラスで...
みたいになっているのではないかな。
0752デフォルトの名無しさん
NGNGデストラクタですた。失礼。
それと、a.push_backです。これまた失礼しました。
771 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 00:45
>>768
そうですね。shared_ptrで包まずに書けばメモリリークします。
772 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 00:47
> 追加質問ですが、自分で、deleteするのが面倒ならば、
> 常に、new をshared_ptrで包んだ方がいいですか?何か弊害ありますか?
むしろ、
shared_ptr を使うなら
・自分で delete してはいけない。
・常に new を shared_ptr で包まなければいけない。
さらに、 shared_ptr のテンポラリオブジェクトは作らないほうがいい。
0753デフォルトの名無しさん
NGNG結局、以下のようなものを作りました。やれやれ。
template< typename CharT > struct todigit_impl
{
static inline int cvt( ChatT ch, std::locale const & lc )
{
CharT a[] = { ch, '\0' };
std::locale old = std::locale::global( lc );
int i = atoi( a );
std::locale::global( old );
return i;
};
// wchar_t 版を特殊化
...
template< typename CharT >
inline int todigit( CharT ch, std::locale const & lc )
{
return todigit_impl< CharT >::cvt( ch, lc );
}
774 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 15:36
標準Cライブラリにも 「数字1文字」→「数値」ってなかったけか?なんか以外だ。
775 名前: 774 [sage] 投稿日: 04/03/26 15:37
×以外 → ○意外
0754デフォルトの名無しさん
NGNGどなたかお助けください。
以下の様に動いているプログラムで、sub()の中で再度ファイルを
オープン・クローズしてますが、それをやらないで例えばoutを引数として
渡して、実際にはプログラムのいろいろな所からよく呼び出されるsub()
を実行したいと思っているのですが、out を引数としてプロトタイプの
中で宣言するとエラーが起こってしまいます。なにかよい方法はあります
でしょうか。
よろしくお願いします。
#include <stdio.h>
#include <fstream.h>
void sub()
{
ofstream out;
out.open("log.txt", ios::app);
out << "sub executed" << endl;
out.close();
}
void main()
{
ofstream out;
out.open("log.txt", ios::app);
out << "log started" << endl;
sub();
out.close();
}
0755ここまでしか持ってない
NGNGvoid sub(ostream &out);
778 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 17:13
古いヘッダ使うな
779 名前: Help me please! [sage] 投稿日: 04/03/26 17:19
777さん ありがとうございます。それでうまく行きました。
ofstream は渡せないかと思って、voidにキャストしたりして
わけがわからなくなっておりました。レファレンスすれば
よかったのですね。
0756デフォルトの名無しさん
NGNG亀レスになるがポインタでもええよ。要するにofstreamオブジェクト
をローカル変数と見なして(というか実際ローカル変数)、そのスコー
プが外れないように注意すればよい。
0757デフォルトの名無しさん
NGNG参照カウンタ方式じゃないようです。
g++3.2.2では参照カウンタ方式の様です。
パフォーマンス的にどうなんでしょう。
スレッド安全とか言い出すとコピーした方が
早いって事でしょうか?
0758デフォルトの名無しさん
NGNGあまり関係なさそう。
copy-on-writeはC++では当たり前のように使われる最適化手法
だな。
0759auto_ptrの質問
NGNG暗黙の変換による予期せぬ動作を避けるためですか?
生ポインタを使った既存コードを、例外フリーにするため auto_ptr に変更中ですが、
p => p.get() の書き換えが大量に必要になるため、以下のラッパークラスで処理する
ことを考えています。
template<class T> class my_auto_ptr : public std::auto_ptr<T> {
public:
explicit my_auto_ptr(T* p = 0) : std::auto_ptr<T>(p) {}
bool operator!() const { return get() == NULL; }
operator T*() const { return get(); }
};
これで問題が起こるケースは、my_auto_ptr<T> p(...); delete p; にて二重デリート、
が思いつきますが、他にありますでしょうか。
0760デフォルトの名無しさん
NGNG>これで問題が起こるケースは、my_auto_ptr<T> p(...); delete p; にて二重デリート、
operator deleteをprivateにしてみては?
>他にありますでしょうか
printf("%d", p);
は
printf("%d", (T*)p);
としないとmy_auto_ptrのインスタンスが渡されますね。
0761デフォルトの名無しさん
NGNG一読をお勧めします。個人的には、関数にポインタを渡すときにgetと
releaseの二つが可能なのであって、勝手にgetを呼び出してしまうのは
危険なような気がします。まあ、関数にreleaseして渡すぐらいなら
auto_ptr引数にするって発想もあるんだろうけど。
書き換えの手間って言ってもコンパイルエラーを直すだけでは?
それ以前に"auto_ptrを使う=newを利用する"なんでしょうけど
そんなにnewを使いまくるってのもいかがなものかと。
0762auto_ptrの質問
NGNGありがとうございました。printf() の場合には気付いていませんでした。
operator delete()をprivateにするのは良いアイデアですね。
新たに書き起こすならば、素直にauto_ptrを使い、get/release を使いますが、
今回は、既存のコードの変更行数を少なくする(ただし安全を満たす範囲内で)が重要なのです。
たしかにコンパイルエラーの箇所を get() 利用に直すだけで済むのですが、変更行数が多いと
工程管理上、派生する問題が大きくなるので避けたいという、政治的な動機です。
手動で書き換えても、暗黙変換させても、どちらにしても実際のバイナリコード変化量は変わら
ないというのは承知しています。
0763デフォルトの名無しさん
NGNG勝手に話に割り込みますが、何を持ってスレッドセーフとなるのでしょうか。
shared_ptrを見てもロックをかけてるようには見えないのですが。
マルチプロセッサなんかでカウントの増加と減少が同時に起こったりはしないのですか?
0764デフォルトの名無しさん
NGNG> shared_ptrを見てもロックをかけてるようには見えないのですが。
boost/detail/shared_count.hpp を BOOST_HAS_THREADS で検索しる。
0765デフォルトの名無しさん
NGNG当方、VC++6でダイアログベースのプログラムを組んでいて
ある特定のキーが押されたかを判定したいのですが,
ダイアログにコントロールを乗せるとキーが押されたというメッセージがうまく届かないらしいのです。
何かいい解決方法はないでしょうか。,
0766デフォルトの名無しさん
NGNG0767デフォルトの名無しさん
NGNGわたしはVC++など買える身分でないので、お答えできません。
相応しい人がいるスレに移動してください。
0768デフォルトの名無しさん
NGNGそれを人に強制するのもなんなので俺が誘導。
>>765
あなたが質問すべきスレはこちらですね。
★初心者にVisual C++を教えるスレ★ Part11
http://pc5.2ch.net/test/read.cgi/tech/1077965179/
それとついでに、そちらに書き込むときはもっと具体的に書きましょう。
なにキーを押してなんというメッセージがどこからどこに届くはずだったのに
どうなった、ぐらいは書かないと答えようがありませんよ。
0769デフォルトの名無しさん
NGNGあ、、、
こういうことやらなきゃいけないだろうとは思っていたけど、
これだと汎用性無くなっちゃいますよね。
そんなマイナーな環境を使うことが無い自分には知ったこっちゃ無い話ではあるけど。
こういう排他制御の標準も決めるべきだよなぁ。
0770デフォルトの名無しさん
NGNG完全にすれ違いだったようですね
お騒がせしました。
0771デフォルトの名無しさん
NGNGtry
{
errno = 0;
std::ofstream output( ... );
output.exceptions( std::ios::badbit | std::ios::failbit );
...
output.close();
}
catch( std::exceptions const& e )
{
throw std::runtime_error( ( errno != 0 ) ? std::strerror( errno ) : e.what() );
}
そこで質問なんですけど、C++例外処理とerrnoの親和性ってどうなんでしょうか?
とりあえず、ファイルが開けなかったりする単純なケースでは上手く動いてくれているみたいです。
上のようなコードでとんちんかんなエラーを報告してしまわないか、少し心配です。
0772デフォルトの名無しさん
NGNGC++の標準ライブラリはerrnoに一切関知しない。だから
Cのstdio.hと同等な結果を得ようとするならばerrnoは自前で
セットする必要がある。それは例外が投げられた後である。
逆にCのライブラリを呼んでerrnoがセットされたら、該当する
C++の例外を投げるように設計する。
0773auto_ptrの質問
NGNG> operator deleteをprivateにしてみては?
やってみたら、期待した効果がありませんでした。
my_auto_ptr<T> p;
delete p; // no error
delete &p; // error by private operator my_auto_ptr<T>::delete().
前者に対して、errorになることを期待したのですが、甘かった。
0774デフォルトの名無しさん
NGNGを起こしたりするな。
本によって、#include <iostream.h> の .h や using namespace std; があったりなかったりするな。
コンパイラによっては、.h がないとインクルードできなかったり、using namespace std; があると
std の識別子が認識できずエラーになったり、string のオブジェクトを使うとエラーになって、試しに
#include の .h を取り除くと通ったりとか、cout の書式整形用の識別子を認識できずエラーになったり
してめちゃくちゃやのお。
正しい C++ を学習するには正しい本と正しいコンパイラを選ばなければならないか。
0775デフォルトの名無しさん
NGNG�dでもない目にあうと思う。特にC++は。
0776デフォルトの名無しさん
NGNG本はまずはプログラミング言語C++第3版。
<iostream.h>は古い規格(1989年以前)の書き方だね。
コンパイラは、たとえばVisual C++ 6.0はその1989以前のもの。
Visual C++ 7.1は現行規格対応。
0777デフォルトの名無しさん
NGNGVC6はそこまでは古くもない気もするが、というか
1989じゃなくて1999かな。
0779デフォルトの名無しさん
NGNGまともにC++使えるようになりたいんなら、
入門書とEffective C++くらいは目に通しておこうや。
適当にサイトみてメチャクチャなプログラム書き出して、
2chで質問してるやつがここ数日多すぎるよ...。
0780デフォルトの名無しさん
NGNGんな感じだな。
まじめに勉強する気があったら「プログラミング言語C++ 3rd」は手元においておけ。
値は張るがC++を学ぶ以上、必須だ。
大抵の疑問はこれ見れば解決するし。
0781デフォルトの名無しさん
NGNGポインタの配列にこだわっているのはポリモーフィズムを使用したいためです。
例えば以下の例ではCTestオブジェクトへのポインタの値でソートするのではなく、CTestのm_Numメンバの値でソートしたい場合どのようにすればよいのでしょう。
自分で調べたなかではgreaterがつかえそうなきがするのですが、greater自体を良く知らないもので....
やはりソート処理を独自に一から組むしかないのでしょうか、せっかくlist::sort()が用意されているのに自分で一から組むのはかっこ悪いし、どうかよろしくおねがいします。
0782デフォルトの名無しさん
NGNG#include <list>
using namespace std;
class CTest
{
int m_Num;
public:
int GetNum() const { return m_Num; }
void SetNum( int Num ) { m_Num = Num; }
bool operator>( const CTest& obj ) { return m_Num > obj.GetNum(); }
bool operator<( const CTest& obj ) { return m_Num < obj.GetNum(); }
};
void main()
{
list< CTest* > l_pTests;
for ( int i = 0; i < 10; ++i )
{
CTest* pTest = new CTest;
pTest->SetNum(rand());
l_pTests.push_back(pTest);
}
l_pTests.sort(); // ポインタの値ではなく、m_Numの値でソート出来るようにしたい
list< CTest* >::iterator itCur, itEnd = l_pTests.end();
for ( itCur = l_pTests.begin(); itCur != itEnd; ++itCur )
{
cout << (*itCur) << ' ' << (*itCur)->GetNum() << endl;
delete (*itCur);
}
getchar();
}
0783デフォルトの名無しさん
NGNGbool operator ()(const CTest *lhs, const CTest *rhs) const {
return *lhs < *rhs;
}
};
l_pTests.sort(sorter());
CTest::operator<()()をconstにしないと、このままじゃ通らないけどな。
0784781
NGNGclass CLapTest
{
public:
CTest*m_pTest;
bool operator>( const CLapTest& obj ) { return m_pTest->GetNum() > obj.m_pTest->GetNum(); }
bool operator<( const CLapTest& obj ) { return m_pTest->GetNum() < obj.m_pTest->GetNum(); }
};
void main()
{
list< CLapTest > l_LapTests;
for ( int i = 0; i < 10; ++i )
{
CLapTest LapTest;
LapTest.m_pTest = new CTest;
LapTest.m_pTest->SetNum(rand());
l_LapTests.push_back(LapTest);
}
l_LapTests.sort();
list< CLapTest >::iterator itCur, itEnd = l_LapTests.end();
for ( itCur = l_LapTests.begin(); itCur != itEnd; ++itCur )
{
cout << (*itCur).m_pTest->GetNum() << endl;
delete (*itCur).m_pTest;
}
getchar();
}
0785781
NGNGありがとうございました、そちらの方法で組んで行こうと思います。
0786781
NGNGerror C2664: 'void __thiscall std::list<class CTest *,class std::allocator<class CTest *> >::sort(struct std::greater<class CTest *>)' : 1 番目の引数を 'struct sorter' から 'st
ruct std::greater<class CTest *>' に変換できません。 (新しい機能 ; ヘルプを参照)
なのでsorterを次のように変更してコンパイルエラーは解消することが出来ましたが、l_pTests.sort( sorter() );を実行しても"キタ━━━━(゚∀゚)━━━━ッ!"が表示されず思うようにソートしてくれません。
struct sorter : public std::greater<class CTest *>
{
bool operator()(const CTest *lhs, const CTest *rhs) const {
assert(!"キタ━━━━(゚∀゚)━━━━ッ!!");
return *lhs < *rhs;
}
};
VC++6.0では無理なのでしょうか、それともエラーの修正方法が間違っているのでしょうか?
0787デフォルトの名無しさん
NGNGoperator >(const CTest&, const CTest&) を定義しとけ。
0788デフォルトの名無しさん
NGNGnamespace {
bool Compare(CTest* lhs,CTest* rhs,){
return lhs->GetNum() < rhs->GetNum();
}
}
// main内
l_pTests.sort(Compare);
これでとりあえず動くんでない?
0789デフォルトの名無しさん
NGNGerror C2664: 'void __thiscall std::list<class CTest *,class std::allocator<class CTest *> >::sort(struct std::greater<class CTest *>)' : 1 番目の引数を 'bool (class CTest *,cl
ass CTest *)' から 'struct std::greater<class CTest *>' に変換できません。 (新しい機能 ; ヘルプを参照)
コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。
>787さんの方法でやってもだめでした。
bool operator>(const CTest& lhs, const CTest& rhs)
{
cout << "キタ━━━━(゚∀゚)━━━━ッ!!" << endl; // 表示されない
return lhs.GetNum() > rhs.GetNum();
}
bool operator<(const CTest& lhs, const CTest& rhs)
{
cout << "キタ━━━━(゚∀゚)━━━━ッ!!" << endl; // 表示されない
return lhs.GetNum() < rhs.GetNum();
}
協力してくださりありがとうございました。
0790デフォルトの名無しさん
NGNGstd::sort()にlistのbegin()とend()を渡してみたら?
比較関数/関数オブジェクトは他の人が書いてるのをそのまま使って。
0791デフォルトの名無しさん
NGNGoperator >(const CTest*, const CTest*)って定義できたっけか?
std::greater< CTest * >を定義しちまう手もあるかも。
0792デフォルトの名無しさん
NGNGstd::sortはRandomAccessIteratorを要求する。
>>971
>operator >(const CTest*, const CTest*)って定義できたっけか?
できない
>std::greater< CTest * >を定義しちまう手もあるかも。
できたとしても好ましくないかと。
0793デフォルトの名無しさん
NGNG(boost::shared_ptr自体、std::greater<boost::shared_ptr<T> >を
定義してるけどナ)
0794781
NGNG今回のことでC++をまだまだ理解できてないなと痛感しましたので、「プログラミング言語C++ 3rd」を買って勉強することにしました。
そんでもって.NETにさっさと移行したいとも思います。
どうもありがとうございました。
0795デフォルトの名無しさん
NGNG0796デフォルトの名無しさん
NGNGから
>そんでもって.NETにさっさと移行したいとも思います
へなぜ至るのかよくわからん
0797796
NGNGだったら勘違いした、すまん
0798デフォルトの名無しさん
NGNG#include <vector>
#include <algorithm>
using namespace std;
struct TEST;
struct test_compared : public binary_function<TEST*, TEST*, bool>
{
bool operator()(const TEST*& x, const TEST*& y) const
{
ユーザー定義の処理
}
};
int main()
{
vector<TEST> array;
・・(なんらかの処理)・・
sort(array.begin(), array.end(), test_compared());
・・(以下省略)
}
0800798
NGNG×vector<TEST> array;
↓
○vector<TEST*> array;
0801デフォルトの名無しさん
NGNGここもまちがってるぞ。
0802デフォルトの名無しさん
NGNG0803デフォルトの名無しさん
NGNGまちがってるって事は、
コンパイル通らないorランタイムエラー発生って事?
是非、模範的な記述方法をお教えくださいな。
0804デフォルトの名無しさん
NGNG#include <iostream>
using namespace std;
class CTest {
private:
int m_Num;
public:
explicit CTest(int num) : m_Num(num) {}
int getNum() const { return m_Num; }
};
struct CTCompare : public binary_function<CTest*, CTest*, bool> {
bool operator()(const CTest* lhs, const CTest* rhs) const {
return lhs->getNum() < rhs->getNum();
}
};
int main(int argc, char* argv[]){
list<CTest*> ctests;
for (int i = 0; i < 10; ++i) {
ctests.push_back(new CTest(rand()));
}
ctests.sort(CTCompare());
list<CTest*>::iterator end(ctests.end());
for (list<CTest*>::iterator it(ctests.begin()); it != end; ++it) {
cout << (*it)->getNum() << endl;
}
return 0;
}
//自分でdeleteしてね(w
0805デフォルトの名無しさん
NGNGなるほど、std::less<int*>などはそもそも間違ってるって事ですね。
template<class _Ty>
struct less : binary_function<_Ty, _Ty, bool> {
bool operator()(const _Ty& _X, const _Ty& _Y) const
{return (_X < _Y); }
};
上のテンプレート(VC6のもの)を参考にしてポインタ型を当てはめてみたんですが、
単なる無意味なアドレス比較に相当するstd::less<int*>などは、
本来エラーが発生しなければいけないって事ですね?
つまり、コンパイラが間違っているorテンプレートが不正って事でOK?
で、模範的な記述に修正すると以下のようにすべきって事ですね。
template<class _Ty>
struct less : binary_function<_Ty, _Ty, bool> {
bool operator()(const _Ty _X, const _Ty _Y) const
{return (_X < _Y); }
};
0806デフォルトの名無しさん
NGNGでも、>>798は他人が見て一瞬戸惑う罠。
0807デフォルトの名無しさん
NGNG>模範的な記述に修正すると以下のようにすべきって事ですね。
んなこたーない。
つか、やめれ。コピー処理が大量発生する。
0808デフォルトの名無しさん
NGNGポインタのリファレンスを取るオーバーヘッドが無駄だなぁってことで
>804な感じ
0809デフォルトの名無しさん
NGNGリファレンスによる実行時のオーバヘッドについては多分ないんだろうけど、
人間様がソース見たときにギョッとするオーバヘッドはあるな、確実にw
0810デフォルトの名無しさん
NGNGポインタ位の小さなオブジェクトであれば、わざわざリファレンスにするまでもないと思うし、
むしろ逆に逆参照を2回しなければならない分オーバヘッドは増えるような気がする。
コンパイラが値渡しに最適化するかもしれないけど。
0811デフォルトの名無しさん
NGNGそのためのfunctorなわけですし.
0812デフォルトの名無しさん
NGNGそれは参照がオーバヘッドを生ずると言う意味か?
それは違うと思うが・・・。
0813デフォルトの名無しさん
NGNG> それは参照がオーバヘッドを生ずると言う意味か?
リファレンスはポインタを用いて実装されているだろうし、参照渡しされたポインタそのものを
更に逆参照しているわけだから、ポインタを値渡しするよりはオーバヘッドは大きくなるはず。
0814デフォルトの名無しさん
NGNGだったら、参照先を変更できず、また、
参照を使う場合に必ず初期化しなければいけないのは何故?
私的見解だが、コンパイラにとって参照は単なる変数のエイリアスだと思うが?
我々がインスタンスをもった変数と思っているものは
コンパイラにとっては所詮アドレスにすぎず、
同じアドレスと解釈される変数が増えただけという認識なのだが。
リファレンスがポインタで実装されているという明文化された規格などが
あるようであれば教えて欲しい。
0815デフォルトの名無しさん
NGNG関数の引数としての参照がどの変数のエイリアスなのか
コンパイル時に決定できると?(インライン化される場合を除いて)
0816デフォルトの名無しさん
NGNGん?
その関数に渡される変数は、そもそもコンパイル時にアドレスが決まるの?
どのアドレス位置で変数用メモリが確保されるかは、スタックの状態次第じゃないの?
0817デフォルトの名無しさん
NGNGint i;
int &r =i;
上の場合は確かに
>我々がインスタンスをもった変数と思っているものは
>コンパイラにとっては所詮アドレスにすぎず、
>同じアドレスと解釈される変数が増えただけという認識なのだが。
この通りだとは思うのですが,
void f(int & r){ r = 2; }
この場合は,rがどの変数のエイリアスであるかは実行時まで分からないですから
void f(int *const p){ *p = 2; }
とまったく等価(インターフェイスの差異を除いて)であり,
従って参照のdereferenceのオーバーヘッドがかかると思うのですが,どうなんでしょう?
0818デフォルトの名無しさん
NGNG実行時まで分からないことが、
どうしてオーバーヘッドになると思うの?
逆参照は何も参照変数だけじゃなくて
普通の変数でも普通に行われてるのでは?
0819デフォルトの名無しさん
NGNGvoid f(int i):
上2つは、オーバヘッドは同じ。32ビットだから。
OK?
0820817
NGNGassembleも読めないC++初心者なので,何か大きな勘違いをしているのかも知れないのですが
>逆参照は何も参照変数だけじゃなくて
>普通の変数でも普通に行われてるのでは?
確かにそうだと思います.ですが,例えば819さんの例では
(関数の呼び出しの部分「だけ」に関しては819さんの言うとおりだと思います)
void f(int i/*スタックにiが置かれそのアドレスが引き渡される*/){
i; // 引き渡されたアドレスをdereferenceして値iを得る
}
void f(const int & r/*スタックにint*が置かれそのアドレスが引き渡される*/){
r; // 引き渡されたアドレスをdereferenceしてint*の値を得て,
//さらにそのint*をdereferenceして(参照の場合ここが余計にかかる)intの値を得る.
}
こういうイメージだったのですが何か間違っているのでしょうか?
0821デフォルトの名無しさん
NGNG> 逆参照は何も参照変数だけじゃなくて普通の変数でも普通に行われてるのでは?
参照の場合は逆参照が1つ余計に必要になり、それがオーバヘッドになるということじゃないの?
Tへの参照を引数に取る関数は、Tへのポインタを引数に取る関数としてコンパイルされるとすると、
Tへのポインタ型の仮引数を読んで、更にそのTへのポインタ型の値を逆参照する必要がある。
それに対して、T型を値渡しで引数に取る関数は仮引数を読むだけでいい。
明らかに1回の余計な逆参照が生じている。逆参照の存在が問題なのではなく、その回数が問題になる。
> 実行時まで分からないことが、どうしてオーバーヘッドになると思うの?
実行時まで判らないのは、生成されるコードではなくて参照されるオブジェクトの位置でしょ。
参照が前述の様な実装をされているとすれば、引き渡されるポインタの値。
それが違うことによって、実行速度が変化するとは思えない。
0822デフォルトの名無しさん
NGNG禿の本に書いてあったような気がする
0823デフォルトの名無しさん
NGNGおk
0824_
NGNG0825_
NGNG0826デフォルトの名無しさん
NGNG間違ってないと思いますよ。
以下VS.net2003での最適化無しの場合です。
アセンブラ読めなくてもなんとなくわかってもらえるかと。
void test(int& a)
{
printf("a:%d", a);
}
mov eax,dword ptr [a]
mov ecx,dword ptr [eax]
push ecx
push offset string "a:%d"
call _printf
add esp,8
void test(int a)
{
printf("a:%d", a);
}
mov eax,dword ptr [a]
push eax
push offset string "a:%d"
call _printf
add esp,8
0827デフォルトの名無しさん
NGNGVC++6.0で確認したが
f(int a){ printf("a:%d", aaa); }
f(int& a){ printf("a:%d", aaa); }
f(int* a){ printf("a:%d", *aaa);}
がいずれも同じコードになった。
全く同じだった。VS.NETは違うんだね。
以下、混合モードから抜粋。
3つとも一緒だったの1つだけ貼る。
push ebp
mov ebp,esp
sub esp,40h
push ebx
push esi
push edi
lea edi,[ebp-40h]
mov ecx,10h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]
mov eax,dword ptr [ebp+8]
push eax
push offset string "a:%d" (0043d01c)
call printf (00408900)
add esp,8
0828デフォルトの名無しさん
NGNGぶっちゃけ、参照だけじゃなく変数はすべて逆参照されるポインタ
その本の内容は言葉足らず。もしくは間違っている。
0829デフォルトの名無しさん
NGNG> ぶっちゃけ、参照だけじゃなく変数はすべて逆参照されるポインタ
その主張でレジスタ上の変数はどう説明されるのでしょう?
0830デフォルトの名無しさん
NGNG何にせよ、参照変数オーバヘッド伝説は 糸冬 了。
0831デフォルトの名無しさん
NGNG関数の引数で、値渡しならレジスタに乗るものが参照渡しだと乗せられない。
現実的な差があるだろ。
0832デフォルトの名無しさん
NGNG0833デフォルトの名無しさん
NGNGVC++6.0持ってない?
私に確認するより、デバッグで混合モードを見て頂けると有難いのだが。
違っているのを報告してもらえれば万事解決。
0834デフォルトの名無しさん
NGNGそれだと最適化されてるかなんか勘違いしてると思う。
その出力コードだとたとえばポインタ版だと
aのアドレスではなくaの中身がスタックに直接積まれてるので
関数内でaのアドレスが参照できないよ。
0835デフォルトの名無しさん
NGNGvoid Func1(int aaa){printf("a:%d", aaa); } void Func2(int* aaa){printf("a:%d", *aaa);}void Func3(int& aaa){printf("a:%d", aaa);}
int main(){
int num = 100;int* p_num = #
Func1(num);Func2(&num);Func2(p_num);Func3(num);
return 0;
}
=====以下、混合モードの表示======
34: Func1(num);
00401185 mov ecx,dword ptr [ebp-4]
00401188 push ecx
00401189 call @ILT+25(Func1) (0040101e)
0040118E add esp,4
35: Func2(&num);
00401191 lea edx,[ebp-4]
00401194 push edx
00401195 call @ILT+40(Func2) (0040102d)
0040119A add esp,4
36: Func2(p_num);
0040119D mov eax,dword ptr [ebp-8]
004011A0 push eax
004011A1 call @ILT+40(Func2) (0040102d)
004011A6 add esp,4
37: Func3(num);
004011A9 lea ecx,[ebp-4]
004011AC push ecx
004011AD call @ILT+10(Func3) (0040100f)
004011B2 add esp,4
0836デフォルトの名無しさん
NGNG(;´Д`)私に言われても・・・。
VC++.NET版を張ってくれるヤシは居らんかね?
0837デフォルトの名無しさん
NGNGvoid f2(int * i) { printf("%d\n", *i); }
void f3(int i) { printf("%d\n", i); }
このコードをg++ -S すると以下の出力が得られました。
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=148
長くなったので宿題スレッドのアップローダにあげてあります。
0838デフォルトの名無しさん
NGNGvoid test(int* a)
{
printf("%p:%d", a, *a);
}
mov eax,dword ptr [a]
mov ecx,dword ptr [eax]
push ecx
mov edx,dword ptr [a]
push edx
push offset string "%p:%d"
call _printf
add esp,0Ch
0839デフォルトの名無しさん
NGNGロジックとかアルゴリズムの方が
実行速度にはるかに影響を与えている罠。
0840デフォルトの名無しさん
NGNGあらたにvoid Func4(int*& aaa);も追加して試してみた。
3つ一緒というのは間違いでした。
同じだったのは、void Func2(int* aaa)とvoid Func3(int& aaa)。
void Func1(int aaa)はコードが1つ少ない。
void Func4(int*& aaa);はコードが1つ多い。
よって、VC6.0++では、
1.(int )
2.(int* )、(int&) 同等
3.(int*& )
の順番にコードが短い。お騒がせしました。
0841840
NGNG>なんか勘違いしてると思う。
その通りだったみたいです。失礼しました。
GCC、VC6.0、VC.NETいずれの場合も
int* int& が同じコードを吐くという事でよろしいでしょうか?
0842デフォルトの名無しさん
NGNGinline関数で&で受けるもの(特にconst&)は、うまく最適化される場合もあった気がする。
*で受けると配列かどうかわからないけど、&で受けると配列ではないことがわかるから。
0843デフォルトの名無しさん
NGNG0844_
NGNGstatic const char* str[] = { "a", "b", "c" };
は駄目でした。
0845デフォルトの名無しさん
NGNGclass Hoge{
static const char* str[];
};
//定義
const char *Hoge::str[] = {"a","b","c"};
だったか。
0846デフォルトの名無しさん
NGNGなんか別のスレでも同じような回答をしたばかりなのだが・・・
クラス宣言内で初期化できるのは static constな整数だけ。
それも即値でしか初期化できない。
これ以外の静的メンバは必ずクラス宣言外で定義が必要だし、
そこで初期化するしかない。
なお、クラス宣言内で初期化した static constな整数には実体がない。
実体が必要になるときは、これまたクラス宣言外で定義が必要。
以上禿本から要約。
0848デフォルトの名無しさん
NGNG{
public:
template<class T> T* func()
{ return (T*)NULL; }
};
template<typename T> T* func()
{ return (T*)NULL; }
A a;
int* p1 = func<int>(); // (1)OK
int* p2 = a.func<int>(); // (2)error C2062: 型 'int' は不要です。
(1)が良くて(2)がダメな理由がわかりません。
なぜメンバ関数だとダメなのでしょうか?
0849848
NGNGどっちでも同じですけど。
0850848
NGNG0851デフォルトの名無しさん
NGNG諸般の事情があるなら別だけどさ、SP6入れてるってことは遊びだろ?
0852デフォルトの名無しさん
NGNG851さんのおっしゃるとおりVC6でテンプレートを使うのはお勧めできません.
0854デフォルトの名無しさん
NGNGそれ考えるとVC6.0の方がまだマシだとおもふ。
0855デフォルトの名無しさん
NGNGとやってもだめか?本来は冗長な書き方だが。
0856848
NGNGerror C2951: テンプレートの宣言はグローバル スコープまたは名前空間スコープでだけ可能です。
error C2059: 構文エラー : 'newline'
と出ました。
0857デフォルトの名無しさん
NGNG困ったのう。
0858デフォルトの名無しさん
NGNG普通にNULLいれればいじゃん。
0860デフォルトの名無しさん
NGNGMIDIアプリで、
txtに変換されたMIDIデータを読みこんで、設定した伴奏を自動で(txtで)付け加え、
それをMIDIに戻す、というのを作ろうとしています。
伴奏を付け加えるのは何とかできそうなんですが、
肝心のMIDIデータの吸い出し方が判りません。
良い本やHPなど紹介して頂ければと思います。よろしくお願いします。
0861デフォルトの名無しさん
NGNGハイ、次の方どうぞ
0862デフォルトの名無しさん
NGNGmemcpy で普通にコピーみたいな感じでしょうか?
0863デフォルトの名無しさん
NGNG判らないからってそそういう言い方はないだろう。
ま、俺もわからんけど。
0864デフォルトの名無しさん
NGNGvector<char> c;
string s;
c.assign(s.begin(), s.end());
0865863
NGNGMIDIのデータ構造ってどうなってるんですか、っていう立派な質問ではある。
初心者も来る所だから、すれ違いで気に入らん人は文句言うだけでなく誘導すべし。
ttp://www.pluto.dti.ne.jp/~daiki/Midi/Midi.html
0866862
NGNGそうか、vector<char> -> string とまったく逆に書けばよかったんですね…
ありがとうございました
0867デフォルトの名無しさん
NGNG0868デフォルトの名無しさん
NGNG0869デフォルトの名無しさん
NGNGちなみにmemcpyを使うなら下の書き方かな?
vector<char> v;
string s;
v.resize(s.size());
memcpy(&v[0], s.c_str(), s.size());
0870デフォルトの名無しさん
NGNGs.c_str()よりは、&s[0]のほうがいいかも?
0871デフォルトの名無しさん
NGNGstringは要素が連続した領域に格納されることが保証されているの?
vectorは問題ないはずだけどね。
0872デフォルトの名無しさん
NGNG保証されてなかったら、string::c_str()なんて関数を公開しない罠。
むしろ、vectorじゃないか?保証がないのは。
0873デフォルトの名無しさん
NGNGEffectiveSTLだったか何かにvectorの連続性は保証されるって書いてあったと思うぞ。
0874869
NGNG私も疑問に思ったので標準を漁りました.
まず,周知の通りvectorは&v[0]で取れるメモリの連続性は保証されています.
一方でstringは内部表現が連続したメモリであることは保証されていません.
(標準の21には空間の連続性に対する表明が見つかりませんでした)
また,Effective STLの第16項も同様に言っています.
そして,string::c_strは必ずしも内部表現の配列の先頭を返すとは限らないようです.
(標準21.3.6)
>872
むしろ内部の連続性が保証されていないのでc_strを公開している,というのが正しいようです.
0875デフォルトの名無しさん
NGNGc_strは、内部表現を得るための物ではなく、
stringと意味的に等しい物を得る物だよ。
0876デフォルトの名無しさん
NGNG0877869
NGNGc_strが中でstringの内部表現をコピーしているのかも知れませんから.(ここは実装依存でしょう)
というわけでおとなしくiteratorを使うのが良いのでしょう.>864
0878デフォルトの名無しさん
NGNGキーが何か押された場合別の処理に進む方法っていうのは何かありませんか?
0879デフォルトの名無しさん
NGNG>むしろ内部の連続性が保証されていないのでc_strを公開している,というのが正しいようです
では、どんな時にc_str()を使うのか教えていただきたい。
cのヌル終端文字列だからc_str()って名前なんじゃないかと思うのですが・・・。
つまり、C標準関数やその他の関数のconst char*引数に使うための代物では?
保証されないという事は、stringの文字列バッファの中身をCの関数に渡しちゃダメって事ですよね。
vecorのような1つの要素が大きな容量である配列の連続性が保証されていて、
stringのような1つの要素が1バイトである配列の連続性が保証されていないのは知りませんでした。
明らかな連続性を前提にしているから明記してないだけだとばかり思ってました。
そうであれば、stringから従来型のchar[]へ、バッファコピーする際の推奨されるコピー方法は何でしょうか?
0880デフォルトの名無しさん
NGNGstd::stringの内部表現がCの文字列と全く互換性がない場合にはc_str()が互換性のあるものに
コンバートしてそれを返すだけ。よってstrcpy等のソース側にはc_str()を渡せる
0881デフォルトの名無しさん
NGNG0882デフォルトの名無しさん
NGNGdata()はcharT *を返す。イテレータではなく連続した領域へのポインタである。[21.3.6 4]
つーことは(s.size() > 0なら) &s[0] は s.data() と同等であり、連続した領域の
先頭アドレスが得られるはずだな。
0883デフォルトの名無しさん
NGNG回答ありがとうございました。
今までどおりc_str()でconst char*に使う事にします。
iteratorではC関数に渡すときアドレスが連続じゃないかもしれないみたいなので。
0884デフォルトの名無しさん
NGNGstd::ropeにもc_str()があるわけだが。
0885デフォルトの名無しさん
NGNG0886デフォルトの名無しさん
NGNGどこに標準の話をしていると書いてあるよ?
0887デフォルトの名無しさん
NGNG> stringから従来型のchar[]へ、バッファコピーする際の推奨されるコピー方法
そらやっぱり string::copy() なんじゃないの?
0888デフォルトの名無しさん
NGNGピアソン覗いたら英語しかないっす・・・。
(というかピアソンは用意してないっす)
当方、本の間違いに気づけるほど力ないっす(´・ω・`)
0889デフォルトの名無しさん
NGNG>『std::』rope
って書いてあるからじゃ? 標準じゃなきゃ、std内には入れられないんじゃなかったっけ?
だからいつのまに標準に、と聞いてるのかと。
0890デフォルトの名無しさん
NGNGSTLportとかSGI STLじゃん。知らんのか?標準ではなくても
std::に入っている。
0891デフォルトの名無しさん
NGNG0892デフォルトの名無しさん
NGNG0893デフォルトの名無しさん
NGNGWin32APIスレに逝くべきだよ。
0894892
NGNG0895892
NGNG0896デフォルトの名無しさん
NGNGというより、スレの趣旨が判らないほどに理解が混乱しているのなら、
むやみに質問を書き込まずに冷静に頭を整理した方がいいよ。
0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNGで、できたのが次のような方法。実験はVC6で行いました。
【定義】
typedef void (CObject::*METHOD_HANDLER)(CObject *Sender);
// たとえばメインフレームクラス
class CMainFrame : public CFrameWnd
{
:
private:
void MainFrameHandler(int Hoge);
:
};
【使うとき】
CObject *pInstance;
METHOD_HANDLER pHandler;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
:
:
pInstance = this;
pHandler = (METHOD_HANDLER)&CMainFrame::MainFrameHandler;
}
で、使うときはこんな具合。
pInstance->*pHandler(5963);
一応意図した動作はしていますが、こんなんで大丈夫なんでしょうか。
インスタンスとオフセット情報さえあれば型は何でもいいのかな?
0899898
NGNG×typedef void (CObject::*METHOD_HANDLER)(CObject *Sender);
↓
○typedef void (CObject::*METHOD_HANDLER)(int Hoge);
0900デフォルトの名無しさん
NGNG標準ではないものがstd名前空間に入っていることは、規格上あり得ない。
なので std::rope という表現ができること自体、規格違反。
889が正しい。
0901デフォルトの名無しさん
NGNGならお前はSTLportは一切使うな。これでOK。
0902デフォルトの名無しさん
NGNG(・∀・)ニヤニヤ
0903デフォルトの名無しさん
NGNGハッシュコンテナとかC++標準じゃないよね?
0904デフォルトの名無しさん
NGNGSTLportはSGI STLを改良し続けて、事実上のフリーソフトに
なっている。だからstd::ropeやstd::hash_map、std::slistや
std::identity、std::project(他にもたくさん)を含んでいる。これ
はSGI STL直系のSTLである事を示している。
それらは標準外である事は十も承知だし、移植性を問題に
する場合は一切使ってないが(というかあまり使わないよね)、
どうも>>900は俺がそれらの標準外のコンテナや関数オブジェクト
を標準であると勘違いしていると思いこんでいるらしく、しつこく
規格違反だとかstdに入れるべきでないとか的はずれなレス
ばかり返しやがる。
随分と標準がお好きなようだな>>900は。
0905デフォルトの名無しさん
NGNG> 専用の別スレへどうぞ。
ここって 結構ピュアなC++スレでしょ?ちがったっけ?
0906デフォルトの名無しさん
NGNG0907デフォルトの名無しさん
NGNGなんか論点をあさっての方向に勘違いしてねぇか?
現状のSTLportがどうなってるかなんてのは問題じゃなくて、単に
「標準C++で規定されてないものをstd名前空間に入れるのは行儀悪い」
ってだけの話だろ?
0908デフォルトの名無しさん
NGNGおいおい、俺のレスをちゃんと読んでから書いてるのか?
「標準C++で規定されてないものをstd名前空間に入れるのは行儀悪い」
という点については否定してないだろ。
STLportの行儀悪さについては「十も承知」とちゃんと書いてるだろ。
何が言いたいんだよ。
0909デフォルトの名無しさん
NGNGその通りだけど、>>901=>>904 がかわいそうだから、もう勘弁してあげようよ。
0910デフォルトの名無しさん
NGNGを返す文盲厨だと証明されますた。
0911デフォルトの名無しさん
NGNG(・∀・)ニヤニヤ
0912デフォルトの名無しさん
NGNG0913デフォルトの名無しさん
NGNG次スレまではこの流れでキボンヌ。(ワラ
0914デフォルトの名無しさん
NGNG同意(w
ここまでベタな (・∀・)ニヤニヤ はあんまりいないしね。
春も終わっちゃうから最後のお楽しみ。
で、rope.c_str() で何が言いたかったの?
0915デフォルトの名無しさん
NGNG>>904
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&q=%E4%B8%80%E3%82%82%E6%89%BF%E7%9F%A5&lr=
http://www.google.co.jp/search?q=%E5%8D%81%E3%82%82%E6%89%BF%E7%9F%A5&ie=UTF-8&oe=UTF-8&hl=ja&lr=
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&q=%E7%99%BE%E3%82%82%E6%89%BF%E7%9F%A5&lr=
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&q=%E5%8D%83%E3%82%82%E6%89%BF%E7%9F%A5&lr=
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&q=%E4%B8%87%E3%82%82%E6%89%BF%E7%9F%A5&lr=
0916デフォルトの名無しさん
NGNG「百も承知」と書いて欲しかったのかよ。完全な重箱の隅を突く
アホだな。
>>914
何がニヤニヤだよ。反論できないだけだろ知障。
0917デフォルトの名無しさん
NGNG標準STLの正しい理解は極めて重要。
たまに病的なまでに規格に詳しい人もいるが、
まあ、みんなに良い知識を提供してくれるのだから歓迎すべきだね。
0918デフォルトの名無しさん
NGNGわかったような口を利くな。
0919デフォルトの名無しさん
NGNG0920デフォルトの名無しさん
NGNGで、破滅的なソースを書いて、プロジェクトから外される。
そして、あとを引きついだ人間が酷い目にあう、と。
アフォプロジェクトの黄金パターンだな。
0921デフォルトの名無しさん
NGNG漏れの印象では>916>918ときてるように思ったんだが
0922デフォルトの名無しさん
NGNGここまでスルーされているのも泣ける。
0923デフォルトの名無しさん
NGNG練習問題の模範解答みたいなものって、どっかにありますか?
0924デフォルトの名無しさん
NGNGえ?知らないのか?
「プログラミング言語C++:ソリューション」、アジソン・ウェスレィ/アスキー、
ISBN4-7561-3136-0
英語名は「C++ Solutions Companion to The C++ Programming Language,
Third Edition、author: David Vandevoorde」だから適当にぐぐると
PDFやCHMぐらいは落ちてるかも。(できるだけ買おう)
0925デフォルトの名無しさん
NGNG(試したコード:エラー)
struct B;
struct A
{
void test(B& b){b.hello();}
};
struct B
{
void test(A& a){}
void hello(){}
};
int main(){}
0926デフォルトの名無しさん
NGNGstruct A
{
void test(B& b);
};
struct B
{
void test(A& a){}
void hello(){}
};
void A::test(B& b){b.hello();}
これでどーよ?
0927925
NGNGできました!
void A::test(B& b){b.hello();}
をBの定義の後に記述すればよいのですね。
0928デフォルトの名無しさん
NGNGThe C++ Standard Libraryも手元にあったほうが良いのかなぁ?
0929デフォルトの名無しさん
NGNGコンパイル時チェックにするっていうのは、初めはすげーと思ったけど、めんどくさすぎで
現実的ではなさすぎ。
なんかうまいこと簡単にやってくれるようなクラステンプレートみたいなもんはないかね?
boost::noncopyable使うだろう、というところで俺の頭はパンクした。
0930デフォルトの名無しさん
NGNGそこで変数の宣言についての質問なのですが、
Aというクラスがあり、A.cpp内でしか使われない変数というのは
Aのプライベートメンバ変数として宣言するのがいいのか、それともA.cppの中で
グローバル変数(staticをつけて)として宣言した方がいいのでしょうか。
Aオブジェクトが複数存在する可能性がある場合はグローバル変数として宣言するしかないと思いますが、
ひとつしか存在しない場合はどちらも同じような気がします。
どなたかアドバイスよろしくお願いします。
0931デフォルトの名無しさん
NGNG0932デフォルトの名無しさん
NGNGすいません。激しく出直してきます。
ちなみにstaticで解決できるわけですが、A.cppのグローバル変数とどちらがよいか、
というのはありますか?
0933デフォルトの名無しさん
NGNG0934デフォルトの名無しさん
NGNG逆だよ。グローバル変数だとインスタンスが複数になるときに困る。
0935デフォルトの名無しさん
NGNG0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG0938デフォルトの名無しさん
NGNGソリューションエクスプローラの項目が表示メニューを見ても
見つかりませんでした。
どこにあるのか教えてください。
0939デフォルトの名無しさん
NGNGすれ立てるまでも無い・・・の100か?だったらVC6にはソリューションエクスプローラは無い。
つーかスレ違い
0941デフォルトの名無しさん
NGNG930にstatic付き、って書いてあるよ。
まあC++的には無名名前空間だろうけど。
>932
基本的にクラスに関係するものならクラスの中に入れるべきだが、
何か理由があって、ヘッダに宣言を書きたくない場合はソースに埋め込む。
0942デフォルトの名無しさん
NGNGこれはもう格言だから。
#たとえば、「インスタンスが一個しかない」という前提を忘れた時に
#まとめて不幸がやってくるだろ?
0943デフォルトの名無しさん
NGNGコーディングをしない方が悪いと思うが。
0944デフォルトの名無しさん
NGNGSingletonにしてもだめか?
0946929
NGNG0947928
NGNGだいたい分かっている(つもり)なんですが役に立つでしょうか?
5000円(でしたっけ?)は結構大きい出費なので
0948デフォルトの名無しさん
NGNGあった方が良いかなんて人それぞれだろ
何が必要なのか、人に聞くのもいいがちったあ自分でも考えろや
それでも分からんのなら、このスレに出てきた書籍全部買え
0949デフォルトの名無しさん
NGNGグローバル変数を使ったときにインスタンスが複数になった場合の不都合とは
具体的にどのようなものなのでしょうか?
自分はC++とDirectXでゲームを作っておりまして、
頂点バッファ・テクスチャへのポインタなどをA.cppのstatic変数として宣言しております。
(staticメンバにしたほうがよいというのはこのスレをみて知りました…)
それでAの関数であるDraw();内で使っています。
これは複数でも単体でも今のところ不都合はありません。
>>942さんの格言通りこれからコーディングしなおすつもりではありますが
これから何かで使うかもしれないので複数になると出る不都合を教えていただけないでしょうか?
よろしくお願いします。
0950デフォルトの名無しさん
NGNGそうだね。C++的には無名空間。
staticは推奨されてないからね。
なんでstaticを使わないことを推奨されてるのかは、知らない。
誰か教えて。
ヘッダに書きたくないときは pimpl にすればよろし。
0951デフォルトの名無しさん
NGNG948の言うとおり。
928がどんな奴なのかわからないと、
無いよりあった方が良いとしか言えない。
俺は持ってないけどな。
0952デフォルトの名無しさん
NGNGオブジェクト指向について、一度勉強しなさい。
その変数がオブジェクトの状態をあらわしてたら困るでしょ。
お勧めとは言い切れないけど、このサイトとかを参考にどぞー。
http://kmaebashi.com/programmer/object/intro.html
0953初心者
NGNGvector<int> a(N);
なんか操作
delete a?
とdeleteする時はどうすればいいのでしょうか?
0954デフォルトの名無しさん
NGNGnew したポインタを要素にしているという話なら(おすすめしないが)
それぞれの要素を注意深く手動で解放しないといかん
0955デフォルトの名無しさん
NGNGint i;
として
delete i;
はしないだろ?
と言っておく。
int *pInt = new int;
としたら
delete int;
が必要。
vector<int>という型(クラス)なので、
vector<int> a;
にdeleteはいらない。
OK? >953
0956デフォルトの名無しさん
NGNGつーか、初心者を剽窃したいなら初心者スレに逝けよ。
0957デフォルトの名無しさん
NGNG0958デフォルトの名無しさん
NGNG0959942
NGNG「グローバル変数はどこからでも誰にでも参照も変更できる」
ということは、つまりプログラムを修正したい場合、*全*ソース
コードを舐め回して影響が無いかどうかをチェックする必要が
あるということ。プログラムの規模が大きくなればなるほど、
この影響は無視できなくなる。
staticにすれば、影響範囲はClassの中だけにとどまる。
ローカルにすれば、関数内だけにとどまる。
というか、オブジェクト指向でいくんなら、
もはやグローバルという用語は忘れて
「Publicか」「Privateか」という思考に切り替えた方がいいよ。
0960デフォルトの名無しさん
NGNGvector<void*> v;
色々
vector<vector<void*>::iterator> v2;
for (vector<void*>::iterator it = v.begin(); it != v.end(); ++it)
{
if ( /* it はもう必要ないなら*/ )
{
v2.push_back(it);
delete (*it);
}
}
for (vector<vector<void*>::iterator>::iterator it = v2.begin(); it != v2.end(); ++it)
v.erase(*it);
っていうコードなんだけど、もっと綺麗に書く方法ないかな?
0961初心
NGNG.cppってファイル作ってどうすりゃいいの?
もうわかんない…
0962デフォルトの名無しさん
NGNGtypedef vector<void*>::iterator iterator;
iterator const end = v.end();
iterator end_of_the_held = v.begin();
for (iterator it = v.begin(); it != end; ++it)
{
if ( /* it はもう必要ないなら*/ )
{
delete *it;
}
else
{
*end_of_the_held = *it;
++end_of_the_held;
}
}
v.erase(end_of_the_held, end);
0963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
NGNGBorland C++ Compiler 5.5.1とTurbo Debugger 5.5の入手から簡単な使用までのガイド
http://www.cmagazine.jp/beginner/bcc/
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/
0965デフォルトの名無しさん
NGNGconst iterator mid = partition(v.begin(), v.end(), /* まだ必要 */);
for_each(mid, v.end(), deleter<void>());
v.erase(mid, v.end());
0966デフォルトの名無しさん
NGNG>剽窃:他人の作品・学説などを自分のものとして発表すること。
つまり、初心者がどっかで書いてたものをぱくったって言いたいのかな?w
0967デフォルトの名無しさん
NGNG必要かどうかの判定が *it ではなく it を使っているとしたら、そうはできないよね。
0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG「あたり」じゃなくて「そのもの」だと思われ。
0970デフォルトの名無しさん
NGNGint func(LPVOID*) {
?
}
このようなLPVOID*型を引数にもち、そのポインタのポインタに
何らかの4バイトの結果を入れ、戻り値としてint型を返す関数が
あったとします。
LPVOID pbuf;
func((LPVOID*)&pbuf);//戻り値は無視する。
このように使えばその後で
wsprintf(buf, "%d", *(DWORD*)pbuf);
のようにして4バイトの値を得ることができました。
そこで、LPVOID pbuf;と宣言していたものを、LPDWORD pbuf;
とだけ変更してもうまくいきました。
DWORD *pbuf;とだけ変更した場合もうまくいきました。
DWORD pbuf[1];とだけ変更した場合もうまくいくと思ったのですが、
wsprintf(buf, "%d", *(DWORD*)pbuf);の結果が他の宣言の場合と
異なり、予想外だったのです。
func関数にはメモリの実体のポインタのポインタを指定すれば
いいようなんですが、なぜDWORD pbuf[1];とするとうまくいかなかった
のでしょうか?
0971デフォルトの名無しさん
NGNGDWORD * pbuf;に対してのsizeof(pbuf)と、
DWORD pbuf[1];に対してのsizeof(pbuf)は
それぞれ幾つ?
0972デフォルトの名無しさん
NGNGfunc(LPVOID* pp)は、*(DWORD *)pp = 値 みたいな書き換えをしてるんだよな?
つまり、呼出元が渡したポインタ自身を書き換えると。
で、DWORD pbuf[1]; して、それを func((LPVOID*)&pbuf);として、
funcがポインタのつもりで書き換えてるんだよな?
でもこの場合pbufはポインタではないので
(LPVOID*)&pbuf は、 ポインタではなく最初の要素のアドレスを返す)
この場合のみアドレスではなく要素を書き換えていることになる感じ。
ちなみにLPVOIDとかLPDWORDとかはC++ではなくMicrosoftなどの勝手typedefだし
c-style cast前提なのはC++ではなくCの流儀だな。
0973デフォルトの名無しさん
NGNGDWORD * pbuf;に対してのsizeof(pbuf)はポインタのサイズだから普通は4。
DWORD pbuf[1];に対してのsizeof(pbuf)もポインタのサイズだから普通は4。
これで間違いないでしょうか?
0974デフォルトの名無しさん
NGNG>DWORD pbuf[1];に対してのsizeof(pbuf)もポインタのサイズだから普通は4。
違う。DWORD一個のサイズ。まあ4というのは一緒だがたまたまだな。
Win64なんかだとポインタのサイズは8だったり。
0975デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNG0977デフォルトの名無しさん
NGNGおかげでバッティングだらけじゃないか。
なんでみんなstdなんだよヽ(`Д´)ノ
0978デフォルトの名無しさん
NGNGなんだなんだ?using namespace std; 厨が暴れているぞ。
0979デフォルトの名無しさん
NGNGヘッダでやってるってことかしら。
0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNGみたいな書き方を実現する方法ってあるでしょうか?
String s = (String)"str1"+"str2";
しか思いつかないのです
0983デフォルトの名無しさん
NGNG0984デフォルトの名無しさん
NGNG右辺の型が任意の場合だと、キャストしかないですかね
0985デフォルトの名無しさん
NGNG多分。
s += str2;でいいじゃん
0986デフォルトの名無しさん
NGNGそのケースのみならそれでも良いのですが
どうもjavaの癖がついてしまっていろいろ面倒なのです。
スッキリしました。感謝。
0987デフォルトの名無しさん
NGNG任意の型の文字列化にキャストって……どの程度一般的な型を想定してる?
もっと広範な用途で任意の型と文字列ベースのやり取りするなら std::stringstream が使える。
構文は不格好になるし牛刀な感じはあるが、標準ライブラリの範囲であれば他にない。
キャスト式で見た目きれいに書きたいのなら boost::lexical_cast 使ってみるのも。
0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNG0990デフォルトの名無しさん
NGNG0991デフォルトの名無しさん
NGNGcppll読んでるけどしたらばのcppll BBSもなかなか面白い。
0992デフォルトの名無しさん
NGNG俺にはレベルが高すぎてサパーリ
0993デフォルトの名無しさん
NGNGアーカイブで読めるし無理に購読しようとは思わん。
下手に投稿しちゃうとスパム来るようになるし・・・
0994デフォルトの名無しさん
NGNGそれよりFree News ServerとかIEでftpやる時にメールアドレスが
まともに登録されているとスパムが来るようになる罠。
http://pc5.2ch.net/test/read.cgi/tech/1082047479/l50
0997デフォルトの名無しさん
NGNG0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。