C++相談室 part61
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/03/09(日) 19:37:43ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
0002デフォルトの名無しさん
2008/03/09(日) 19:38:18[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2008/03/09(日) 19:38:41Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0004デフォルトの名無しさん
2008/03/09(日) 19:39:05[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
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://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0005デフォルトの名無しさん
2008/03/09(日) 19:39:25環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0006デフォルトの名無しさん
2008/03/09(日) 19:43:29C++相談室 part60
http://pc11.2ch.net/test/read.cgi/tech/1200044614/
0007デフォルトの名無しさん
2008/03/09(日) 19:46:54サンクス、連投で制限食らった
0008デフォルトの名無しさん
2008/03/09(日) 20:02:21とりあえず、お前が俺の言っていることを理解出来ていないことだけは分かった
お薦めの本があって、それを教えることには全く反対しないが、
自分で調べたり、情報を探したりしようとしない奴は
大体どうしようもない
一応補足
前スレ984のように聞いてみること自体は別に良いと思う
本を紹介してもらわないと先に進めない、ということでなければ
0009デフォルトの名無しさん
2008/03/09(日) 20:05:410010デフォルトの名無しさん
2008/03/09(日) 20:06:480011デフォルトの名無しさん
2008/03/09(日) 20:14:48無能にレスしても無駄のようだな・・・
>>10
初心者に本だけでなく入門サイト探してみたら?って言うのは
アドバイスにならないのか?
自分自身の経験から言っているんだけど
ある程度理解出来てくるとcppllのアーカイブとかも参考になるし
0012デフォルトの名無しさん
2008/03/09(日) 20:31:24今回の様な議論が過去あったからこそそういったスレがあるんだから
0013デフォルトの名無しさん
2008/03/09(日) 20:40:52俺は別に質問者にレスしてるつもりないし・・・
前スレの985のレスが気に食わない人が居るようなので、
レス返してるだけ
0014デフォルトの名無しさん
2008/03/10(月) 00:04:40案外質問した人が突っ掛ってたりしてなw
んなわけないか。
0015デフォルトの名無しさん
2008/03/10(月) 01:09:34doはどういう風に処理したらいいでしょうか
アクションゲームとかでAn enemy moves.(敵は動く)とした場合、
moveメソッドはenemyオブジェクトの位置を示すメンバ変数を操作すると思います。
すると、moveはenemyオブジェクトのメンバ関数であるべきと思えるのですが、
他のオブジェクトの位置とかが影響する場合、
enemyオブジェクトをメンバにもつクラス(WorldとかGameとか)に、
全てのオブジェクトを動かすメンバ関数を用意した方が、
他のオブジェクトを参照でき適切に処理できそうです
このような機能を持つメソッドを、皆さんはどの位置に配置していますか?
0016デフォルトの名無しさん
2008/03/10(月) 01:17:01WorldやGameからすべてのenemyのmoveメソッドを呼ぶ様にすればいいんじゃね?
ていうかC++関係ないな
0017デフォルトの名無しさん
2008/03/10(月) 01:23:43もし本当にゲームのことだったら
http://pc11.2ch.net/test/read.cgi/gamedev/1155209226/
とかで聞いた方が良さそう。
それかこの板のクラス設計とかのスレ。
俺だったら、大まかにStrategyパターン的な感じで書くかな。
enemyとかのユニット情報を持った環境(orフィールド)オブジェクトを
参照していじる敵戦略クラス・・・とか。
0018デフォルトの名無しさん
2008/03/10(月) 01:31:46すみません、自身がCからC++に移行して、
クラス設計に右往左往しているもので、ここで聞いてしまいました
>>17
あ、そんなスレがあったとは知りませんでした
moveメソッドは引数にしたがってオブジェクトの変数を変えるだけ
moveメソッドに渡す引数を敵戦略クラスないし、Worldクラスで決定するって方向で考えて見ます
(moveメソッドの内容が二行で終わりそうだ……。他のメソッドとまとめよう)
ありがとうございました
0019デフォルトの名無しさん
2008/03/10(月) 01:34:51ちなみに、17のはゲ製板のスレね。
0020デフォルトの名無しさん
2008/03/10(月) 01:40:44002117
2008/03/10(月) 02:11:11敵戦略クラスは忘れた方が良いw
0022デフォルトの名無しさん
2008/03/10(月) 03:05:22なんて書けたんだね、、、知らなかったよ(;´Д`)
0023デフォルトの名無しさん
2008/03/10(月) 03:20:08一通り文法をかじったなら、今度は仕様書を読んでそれを確かなものにした方がいい。流れとしては。
0024デフォルトの名無しさん
2008/03/10(月) 22:21:40class Class
{
public:
int Method();
};
こんなので、
void F()
{
printf( "%d\n", Class().Method() );
}
な感じ。
0025デフォルトの名無しさん
2008/03/10(月) 22:38:15な感じ?
0026デフォルトの名無しさん
2008/03/10(月) 22:47:080027デフォルトの名無しさん
2008/03/10(月) 23:37:58a[0]はclassA,a[1]はclassB,a[2]はclassC、……という風に
classA、classBは同じpublicなメンバを持っているのですが、
メンバ関数の中身とそこで使うprivateなメンバが異なっています
0028デフォルトの名無しさん
2008/03/10(月) 23:49:47そういうのこそ、ポリモーフィズムでしょ
0029デフォルトの名無しさん
2008/03/10(月) 23:59:11関数の多重定義のことでしょうか
ClassAとClassBの異なるメンバもひとつのクラスにまとめて、
使わないメンバがあっても気にしない、という方針でもいいんですが、
無駄にメモリを消費するのがイヤなもので
0030デフォルトの名無しさん
2008/03/11(火) 00:01:24関連というか共通項があるからこそ1つの配列に入れるんだろう?
0031デフォルトの名無しさん
2008/03/11(火) 00:06:44仮想関数ってやつだ。
class Base {
public:
virtual ~Base() {}
virtual void func() = 0; // 共通のメンバ関数
};
class A : public Base {
public: virtual void func() { /* classAの処理 */ }
private: /* classAのメンバ変数 */
};
class B : public Base {
public: virtual void func() { /* classBの処理 */ }
private: /* classBのメンバ変数 */
};
このようにしておいて、たとえば
Base* p1 = new A;
Base* p2 = new B;
とすれば、
p1->func(); // A::funcが呼ばれる
p2->func(); // B::funcが呼ばれる
となる。
あとはvector<Base*>にすれば万事解決では。
0032デフォルトの名無しさん
2008/03/11(火) 00:09:100033デフォルトの名無しさん
2008/03/11(火) 00:43:37アクションゲームで
A:単純な移動しかせず体当たりでダメージを生む敵
B:主人公の位置などを頼りに複雑なアルゴリズムで動き多彩な攻撃をする敵
こんな感じでAの方が圧倒的に必要なメンバ変数が少なく、
かつAの方が数が多いので、Bに合わせてメンバ関数を増やすとメモリを食らってしまうのです
>>31
>Base* p1 = new A;
AがBaseを継承していると、こんな代入も可能なのですか……
ありがとうございました
>>32
ググってみましたが、new演算子を使いまくるなら、便利そうですね
仕様に慣れるよう練習してみます
あちがとうございました
0034デフォルトの名無しさん
2008/03/11(火) 00:44:13×Bに合わせてメンバ関数を
○Bに合わせてメンバ変数を
0035デフォルトの名無しさん
2008/03/11(火) 02:31:06とりあえず
継承、多態(ポリモーフィズム)、オーバーライド
等を調べるんだ
AとBの共通する部分を基本クラス(やinterface)としてくくりだせ
0036デフォルトの名無しさん
2008/03/11(火) 11:10:02なめて読んでたら「自己記述の必然性」が全く理解できない。
どうにか「だから単純なC++→C」のコンバーターじゃ駄目なんだよって
一言で説明できないか?
0037デフォルトの名無しさん
2008/03/11(火) 11:49:30何だかよく分からないな。でもあの人はたまに哲学よりのトンデモを平気で書いたりするから気にしちゃいけないよ。
0038デフォルトの名無しさん
2008/03/11(火) 12:02:24でも話題が古いなあ。
0039デフォルトの名無しさん
2008/03/11(火) 12:23:12って誰かに刷り込まれたんかな
頭悪いな
0040デフォルトの名無しさん
2008/03/11(火) 12:26:330041デフォルトの名無しさん
2008/03/12(水) 00:28:22殆どの言語は自己記述可能だが
と書けばミもフタもないのか
0042デフォルトの名無しさん
2008/03/12(水) 02:44:490043デフォルトの名無しさん
2008/03/12(水) 05:26:590044デフォルトの名無しさん
2008/03/12(水) 05:33:360045デフォルトの名無しさん
2008/03/12(水) 05:48:230046デフォルトの名無しさん
2008/03/12(水) 10:24:060047デフォルトの名無しさん
2008/03/12(水) 11:16:520048デフォルトの名無しさん
2008/03/12(水) 13:28:47ってことを言いたいんだろ?読んでないけど。
0049デフォルトの名無しさん
2008/03/12(水) 21:59:43って感じ
0050デフォルトの名無しさん
2008/03/12(水) 22:01:01DummyMap dmap;
....
DummyMap::iterator it = dmap.find(index);
Dummy& dummy = (it != dmap.end()) ? it->second : dmap[index];
っていうこと(イメージ)をしたいんだが、\
findして、insertすると少なくとも2回の走査が行われていて、無駄な感じがする。
どうすべきか、アドバイスをくだされ。
0051デフォルトの名無しさん
2008/03/12(水) 22:02:34これじゃ普通にdmap[index]すればいいじゃねーか。
出直してくる。
0052デフォルトの名無しさん
2008/03/12(水) 22:41:37http://www.enjoykorea.jp/tbbs/read.php?board_id=teconomy&page=3&nid=3433452&start_range=3433445&end_range=3433484
日本の大事な税金で作ったものを何で韓国人にタダでつかわせるんだ!
苦情メールを送ろう!
JAXA http://www.jaxa.jp/pr/inquiries/index_j.html
文部科学省 http://www.mext.go.jp/mail/index.htm
御意見・お問い合わせ専用メールアドレス voice_atmark_mext.go.jp
全く他人事じゃないんですけど>ロシア
宇宙ステーションをただで使わせて写真とらせるとかいってますが・・
抗議してくれ。
朝鮮人どもまじで死んでくれ。
0053デフォルトの名無しさん
2008/03/12(水) 23:42:33定型はこう、かな
iterator it = map.lower_bound(key);
if(it == map.end() || it->first != key) {
it = map.insert(it, Dummy());
}
Dummy &d = it->second;
0054デフォルトの名無しさん
2008/03/13(木) 00:02:54これは問題なければ良いんだけど、正確にはlessを使えとかそういう話、無かったっけ?
0055デフォルトの名無しさん
2008/03/13(木) 00:24:47lower_boundの戻り値はpairじゃないよな。確かキーだよな。
ソート基準がデフォのlessならこうか。
if(it != map.end() || !(key < *it)) {
//found
} else {
//not found
}
0056デフォルトの名無しさん
2008/03/13(木) 00:26:26if(it != map.end() && !(key < *it)) {
//found
} else {
//not found
}
0057デフォルトの名無しさん
2008/03/13(木) 00:37:32lower_bound()の戻り値はpairだよ。
・・・というより、map<k, v>::value_typeがpair<k, v>だ、と説明するほうが、根本的で適切かな。
std::コンテナ::iteiratorは、std::コンテナ::value_typeのポインタ的に動作するわけだから。
>>53-54
「厳密には」こう書くべき。
if (it == map.end() || map.key_comp()(key, it->first) {
0058デフォルトの名無しさん
2008/03/13(木) 00:38:36- map<k, v>::value_typeがpair<k, v>
+ map<k, v>::value_typeがpair<const k, v>
0059デフォルトの名無しさん
2008/03/13(木) 00:46:26ああ、そうだね。elementの型がpairだた。スマソ。
0060デフォルトの名無しさん
2008/03/16(日) 05:51:190061デフォルトの名無しさん
2008/03/16(日) 05:55:48class A
{
B b;
};
class B
{
A a;
};
と書いたところ、
エラー出ます><。
どう対処すればいいですか?
0062デフォルトの名無しさん
2008/03/16(日) 06:04:28A の中に B がある。
その B の中に A がある。
その A の中に B が・・・
あり得ない。
とりあえず何をしたいのか整理しよう。
大抵の場合は、
1. クラス設計を変更する。
2. a と b のどちらかを参照にする。
のどちらかになる。
0063デフォルトの名無しさん
2008/03/16(日) 06:31:590064デフォルトの名無しさん
2008/03/16(日) 07:41:30Aの中に持ちたいのはBそのものじゃなくて、Bの参照なんじゃね?
0065デフォルトの名無しさん
2008/03/16(日) 15:02:01循環して持ちたいのはよくあること。
やるなら>>64のようにすればいい。
同じような質問見つけてきたんで参考にどうぞ。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36231&forum=7
0066デフォルトの名無しさん
2008/03/16(日) 15:45:330067デフォルトの名無しさん
2008/03/17(月) 03:49:28クラスのコンストラクタで関数名の後ろにつけている初期化みたいなものの意味を教えてください
hoge::test() : a(0),b(0),c(0)
{
...
}
この場合だとa=0,b=0,c=0?
だとしたらなぜ...のところに書かないのですか?
0068デフォルトの名無しさん
2008/03/17(月) 04:07:500069デフォルトの名無しさん
2008/03/17(月) 04:11:10hoge::hoge() : a(0),b(0),c(0)
{
...
}
のことだよね
aが変数だと問題ない?けど
aがクラスの場合、aのコンストラクタに0という引数渡すということ。
class a{
public:
a(int value);
};
みたいなクラスの場合、aのコンストラクタに数値渡さないと作成できないし
0070デフォルトの名無しさん
2008/03/17(月) 04:29:44class A{
public:
A(int value);
};
class hoge
{
A a;
public:
hoge() : a(0)
{
...
}
};
ってこと
この場合
...の所に a = 0; って書けない
0071デフォルトの名無しさん
2008/03/17(月) 08:54:36前者は初期化で、後者は何らかの初期化、または未初期化で構築の後、代入だな。
どちらでも良い場合はあるけど、意味は明確に違う。
例えばconstが絡んだ場合とか、
class hoge{
const int a; //constなので代入できない。
};
>>69のようにメンバの構築に引数が必要な場合とか。
未初期化な変数を嫌ったり、デフォルトコンストラクタの後に代入するような
効率の悪さを嫌ったり、色々あるからできるだけ初期化を使う。
0072デフォルトの名無しさん
2008/03/17(月) 10:11:47Class::Method():field(0),field1(0)
{
}
なんて書いてあってさ、
何だよコンパイラバグってんじゃねーか!とか思ったころがあった
0073デフォルトの名無しさん
2008/03/17(月) 10:39:230074デフォルトの名無しさん
2008/03/17(月) 10:40:42基底クラスの初期化も、この形式じゃないと出来ないよ。
もちろん、引数なしのデフォルトコンストラクタでの初期化は可能だけど。
007572
2008/03/17(月) 11:55:05これかな。
やっぱり古いのもあってか、<string.h>とか、
namespace、例外の話はまったくなかった。
それ意外と、多少の誤植を除けば、解り安くもなければ解りづらくもない中立的な本だった。
まぁ、今となっては読むべき本じゃないわな
0076デフォルトの名無しさん
2008/03/17(月) 13:02:500077デフォルトの名無しさん
2008/03/17(月) 15:16:38おまえが、↓に行け
C++上級者が集まるスレ
http://pc11.2ch.net/test/read.cgi/tech/1095113801/
0078デフォルトの名無しさん
2008/03/17(月) 16:49:26a(){
b();
}
b(){
// ログに戻り先アドレスを記録
/* 処理1 */
// ログに戻り先アドレスを記録
/* 処理2 */
// ログに戻り先アドレスを記録
return;
}
あたりをつけるために、上のように処理の区切りで関数の戻り先アドレスをログにはき出そうと思うんですが、
戻り先アドレスをどのように参照していいかが分かりません。
もし分かりましたら、参照方法を教えてください。
よろしくお願いします。
0079デフォルトの名無しさん
2008/03/17(月) 17:02:460080デフォルトの名無しさん
2008/03/17(月) 17:17:10そこまで推測できているならデバッガでスタックにトリガ張ればすぐだろうし、
そうでなくてもコンパイラにスタックのチェックをするオプションがあったりしないか?
そもそもバッファオーバフローだと判っているなら関数内のポインタを全部洗えばいいだけじゃん。
# 巨大関数だったらしらねw
0081デフォルトの名無しさん
2008/03/17(月) 17:27:32失礼しました。
Windows2000 VC++6です。
>>80
それが、1ヶ月に1度位しか発生しないエラーなのでトレースが困難なんです。
各所にログを埋め込み、関数から戻ってこないのは確認できたので、戻り先アドレスが壊されているらしいと推測したんです。
次はどこで壊されるかをログに記録し、また1ヶ月待ってみようと思いましてw
0082デフォルトの名無しさん
2008/03/17(月) 17:30:160083デフォルトの名無しさん
2008/03/17(月) 17:46:56>79の時点でスレ違いだと気付こう。
>そうでなくてもコンパイラにスタックのチェックをするオプションがあったりしないか?
0084デフォルトの名無しさん
2008/03/17(月) 18:21:17申し訳ありませんでした。
色々なアドバイスありがとうございました。
0085デフォルトの名無しさん
2008/03/17(月) 21:45:50ひょっとして、コピーする手段がない?
0086デフォルトの名無しさん
2008/03/17(月) 21:51:54まぁなんというか頑張れ
0087デフォルトの名無しさん
2008/03/17(月) 22:03:170088デフォルトの名無しさん
2008/03/17(月) 22:47:280089デフォルトの名無しさん
2008/03/18(火) 00:27:05*だけじゃ駄目なん?
0090デフォルトの名無しさん
2008/03/18(火) 01:01:240091デフォルトの名無しさん
2008/03/18(火) 01:23:090092デフォルトの名無しさん
2008/03/18(火) 01:24:56当然おすすめはしない。
0093デフォルトの名無しさん
2008/03/18(火) 01:32:09class X {
protected:
int val;
};
class Y : public X {
public:
void f(Y* p) { p->val = 0; } // OK
void g(X* p) { p->val = 0; } // エラー
};
0094デフォルトの名無しさん
2008/03/18(火) 01:53:29Y::X::valはYから見ればpublic
0095デフォルトの名無しさん
2008/03/18(火) 01:55:26いずれにせよYからX::valは触れない。Y::X::valなら触れる。
0097デフォルトの名無しさん
2008/03/18(火) 02:21:17class Y2 : public X {
void f(Y* p) { p->val = 0; }
};
というXを継承した別のクラスを作ってみよう。YとY2は別のクラスなのでY2から
Yのprotected属性のメンバ変数が変更出来てはまずいのに、もしこのような
ルールがなかったら上の例で可能になってしまう。
モジュールの隠蔽が破られないように特別なルールが作られているわけだ。
009893
2008/03/18(火) 02:33:250099デフォルトの名無しさん
2008/03/18(火) 07:13:26単にマイナスをつけて、-str.length()とするとイミフな数値しか出ません。
何でうまくいかないんでしょうか?
0100デフォルトの名無しさん
2008/03/18(火) 07:39:13size_typeはsize_tのunsigned intみたいだからですね。
0101デフォルトの名無しさん
2008/03/18(火) 20:26:400102デフォルトの名無しさん
2008/03/18(火) 20:37:42環境依存の話すんなくそったれ
0103デフォルトの名無しさん
2008/03/18(火) 22:02:400104デフォルトの名無しさん
2008/03/18(火) 22:14:290105デフォルトの名無しさん
2008/03/18(火) 22:23:31少なくともsize_typeは符号無しということは標準で決まっている事柄だったと思う。
0106デフォルトの名無しさん
2008/03/18(火) 23:49:31unsigned intとどこに書いてある?
0107デフォルトの名無しさん
2008/03/19(水) 00:00:400108デフォルトの名無しさん
2008/03/19(水) 00:22:24それは規格のどこにも書いていないが、
例えばもし99=100が使っている実装のsize_typeが
仮にunsigned longやunsigned shortだったとしても、
99=100は同じように質問して同じように解決していたに違いない。
たまたま100の使っている実装でsize_typeがunsigned intだったこと以外は
標準C++で普遍的に成り立つ話じゃないか。
0109デフォルトの名無しさん
2008/03/19(水) 00:24:39ただしbit数は決まってない。
0110デフォルトの名無しさん
2008/03/19(水) 06:33:43頭の悪い子って、「話の行きがかりで登場したディテール」と「そのディテールに依存した話」の違いが
わからないから困るよね。
少なくとも、「環境依存の話すんなくそったれ」と「unsigned intとどこに書いてある?」の2レスより、
「でも規格で決まってるのはunsignedってことだけだから注意」とか書くほうが簡潔で有用。
非・馬鹿は最初からこう書く。
0111デフォルトの名無しさん
2008/03/19(水) 07:24:460112デフォルトの名無しさん
2008/03/19(水) 09:04:060113デフォルトの名無しさん
2008/03/19(水) 12:28:38その後に std::getline(std::cin, buf, '\n'); とかやらせると残った改行文字だけ読み込んでしまいます。
バッファをクリアする方法がないかと調べてみたのですが、
環境に依存せず確実にクリアする方法はない、という記述がありました。
こういう場合はそもそもstd::cinを使わないようにするのがよいのでしょうか?
fgetsとかを代わりに使えば改行文字まで読み込んでくれるみたいなのですが、
std::cinの方がすっきりしたコードになるので、他に問題を回避する方法がないか探しています。
0114デフォルトの名無しさん
2008/03/19(水) 12:45:02cin.ignoreを呼ぶとかcin.getを繰り返すとかで十分では?
0115デフォルトの名無しさん
2008/03/19(水) 12:49:09この場合はバッファに残るのが改行文字一個だけと分かってるから、それで十分なんですね。
ありがとうございました。
0116デフォルトの名無しさん
2008/03/19(水) 15:15:14string line;
getline(cin,line);
stringstream linestream(line);
0117デフォルトの名無しさん
2008/03/20(木) 15:40:59みたいなのを、グローバル変数を使って
const int Max = 1000;
とした方が良い(型指定ができるから)、と読んでる本で出てきました。
色んな所で「グローバル変数はできるだけ使うな」と言われていたのでびっくりしてしまったのですが、
こうやってconstにして#defineの代わりにするのは例外的によく使われるものなのでしょうか?
0118デフォルトの名無しさん
2008/03/20(木) 15:46:500119デフォルトの名無しさん
2008/03/20(木) 15:52:080120デフォルトの名無しさん
2008/03/20(木) 15:56:36グローバル変数がダメなだってだけ覚えてて、なぜダメなのか考えたこと無いみたいだね?
大雑把に言うとどこで変更してるか分からないから把握しづらいといったとこです
const つけた場合(やろうと思えばできるけれど)変更できないので、そういう害は無い
0121デフォルトの名無しさん
2008/03/20(木) 15:58:480122デフォルトの名無しさん
2008/03/20(木) 16:53:57別の翻訳単位で参照する可能性のある“数値”なら#define定義のあるヘッダを各自インクルードすればいい。
0123デフォルトの名無しさん
2008/03/20(木) 17:11:37なに言ってんの?w
0124デフォルトの名無しさん
2008/03/20(木) 17:12:310125デフォルトの名無しさん
2008/03/20(木) 17:17:00グローバル変数に限らず、「○○はよくない」などと言われる物は絶対にダメという意味ではない。
○○以外の有効な手段があればそれを選べという意味であって、○○が有効となる限られたケースでは使っていい。
0126デフォルトの名無しさん
2008/03/20(木) 17:18:310127デフォルトの名無しさん
2008/03/20(木) 18:31:27基本的にマクロは(特定の使い方以外)使わない方がいい。
マクロはプリプロセスで処理されてしまうため、コンパイルエラー時に酷い目に会う。
グローバル変数も使い方が難しいけど、コンパイラが識別できるものなのでマクロより余っ程マシ。
エラーが発生してもあくまで“変数”なので、マクロと違って識別名が普通に表示されるので
トレースしやすい。
因みに言うと、グローバル変数にするかどうかは「その値がどの範囲まで影響するか/正しいか」というのを
考えて決めるべき。プログラム中で一意な定数は積極的にconstグローバル変数にすべきだわな。
……しかし、こういう「疑問点を自ら追求する力を付ける」のがゆとり教育だったはずなんだけどね。
やっぱり失敗だったのか……
0128デフォルトの名無しさん
2008/03/20(木) 18:37:150129デフォルトの名無しさん
2008/03/20(木) 18:41:28「const リンケージ」でググって下さい。
>>117
C++で、それはただの定数で
変数のように書き換えることは出来ません。
グローバル変数が嫌われる主な理由は、
どこで書き換えられるか、把握し辛いことにあるため、
定数には当てはまりません。
0130デフォルトの名無しさん
2008/03/20(木) 18:56:400131デフォルトの名無しさん
2008/03/20(木) 20:02:06(const 定数はアドレスを取得しようと思えばできるが、
アドレスを取得しさえしなければデータがデータメモリ上に置かれるとは限らない)
2. const 定数は名前空間に所属できる。
(マクロには名前空間がないため、名前被りが発生する可能性が大きい)
3. 値を求めるのに何らかの処理を伴う定数を使う場合、マクロだと毎回コードが埋め込まれてしまう。
(最適化が効く範囲ならいいのだが)
4. const 定数の方がコンパイルエラーが読みやすい。
(マクロの場合、置換後のテキストを元にしてエラーが出力されてしまう)
5. マクロの場合、型を明確に指定するには明示的なキャストが必要になる場合がある。
(見た目の問題でしかないと言われればそれまでだが)
6. ローカルスコープ内であっても、マクロ定数と同名の識別子を作ることはできない。
(作れない方がいいという意見もあるのかもしれないが)
7. const 定数を使うと副作用が一切無いことが明示される。
(キャスト演算子をオーバーロードしているクラスのオブジェクトの場合は例外だが)
0132デフォルトの名無しさん
2008/03/21(金) 11:21:21動的配列を解放するときは要素数とかバイト数を指定しなくても
delete [] p;
でokですが、これはポインタpが指している動的配列の先頭バイトの
前に4byteの領域が確保されていて、ここに動的配列のバイトサイズ
が格納されているから、delete時にサイズを指定する必要がないと
聞いたことがあります。
しかし、動的配列の総バイト数はわかるとしても、要素のバイト数
の情報はどこに格納されているのでしょうか?
int *p; なら1要素のバイト数は4、double *p; なら1要素のバイト数は
8ですが、実行時にこの情報はどこから取得するのでしょうか?
ポインタpそのものは先頭1バイトのアドレス情報しか保持して
ませんから、こういう疑問をもった次第です。
0133デフォルトの名無しさん
2008/03/21(金) 11:30:24そうでなければ cout << *p << endl; とかやったときに何が表示されるか未定義になってしまうじゃないか。
0134デフォルトの名無しさん
2008/03/21(金) 12:15:53ありがとうございます。
ポインタは、単に先頭バイトのアドレスを格納する4バイトの記憶
場所をもっているだけでなく、動的データ(または動的配列の要素)
のバイト数とか、データが文字なのか、整数なのか、実数なのか、
といった情報も裏側にもっている。これらの情報はポインタが指す
動的変数や動的配列側にではなく、ポインタ側にある。
という理解でよろしいでしょうか?
0135デフォルトの名無しさん
2008/03/21(金) 12:21:02違う。ポインタの型によって静的に決まる
0136デフォルトの名無しさん
2008/03/21(金) 12:21:500137デフォルトの名無しさん
2008/03/21(金) 12:23:04あとポインタが4バイトとは限らないぞ。
0138デフォルトの名無しさん
2008/03/21(金) 12:30:09文字型変数、整数型変数、実数型変数がコンパイル時に静的に
型付けされているのと同じというのは概念的にわかります。
しかし、自分が質問しているのは、その静的な型付けをどのよう
なしくみで実装しているのか?ということだろうと思います。
この段階にくると、コンパイラやアセンブラが理解できないと
無理なんでしょうけど。
0139デフォルトの名無しさん
2008/03/21(金) 12:50:07と、考えて良い。
コンパイルする時点では、当然型が分かるので、それを使う。
この段階というか、かなり基礎。
※RTTIは上記が理解出来た上で。
0140デフォルトの名無しさん
2008/03/21(金) 12:59:28いっぺん、自作クラスにoperator newとoperator deleteを実装してみればいいんじゃないかな。
乱暴な説明だけど、C++には「確保/削除するバイト数を受け取る、new/delete一族の大ボス的存在」である
::operator new(size_t)と::operator delete(void*, size_t)があって(他にも多重定義があるけど、とりあえず今はこの2例)、
たとえば int* p = new int; なんてのは、int* p = ::operator new(sizeof(int)); みたいにコンパイル時に解釈される。
同じく、後にdelete p; が出てきたら、pがint型のポインタなのはコンパイラにはわかるから(てか俺等にだってわかる)、
こっちは ::operator delete(p, sizeof(int)); になる。
0141デフォルトの名無しさん
2008/03/21(金) 13:24:09>int* p = new int; なんてのは、int* p = ::operator new(sizeof(int));
int *p= new int [100]; は int *p=::operator new(sizeof(int)*100);
みたいになるんでしょうけど、要素のサイズが2バイトなのか4バイト
なのかの情報をコンパイル時にポインタに付加しておかないと、p[i]の
アクセスがうまくいかないのではないかと思うのですが、どうでしょうか?
0142デフォルトの名無しさん
2008/03/21(金) 13:25:59p[i]のpの型はコンパイル時に分かってるんだから
0143デフォルトの名無しさん
2008/03/21(金) 13:44:43delete[] p;するときに、各要素のデストラクタを起動しなければならないわけだけど、
要素数は p = new T[count]; のcountで、実行時に変わる可能性のあるものだから、
ポインタの前かなんかに隠しておかなければならないわけ。
ちなみに、メモリブロックを単純に解放するだけなら要素数を隠しておく必要はないよ。
free()にサイズを指定しないでしょ?
メモリマネージャはメモリブロックの総バイト数をどこかに隠しておくかもしれないけど、それは別の話。
あとは、
T *p;
for(size_t i = 0; i < count; i++){
p->destruct();
++p; //←これ
}
これの++pがどうコンパイルされるかという、>>139が言うようにC言語レベルの基本的な話。
0144デフォルトの名無しさん
2008/03/21(金) 13:56:21> p[i]のアクセス
たとえばintが4byteの環境だとすると、p[i] と書かれた箇所はネイティブコードにおいては
「pのアドレス+i*4byteのメモリアドレスへ行ってそこから先4byte分に書き込まれているビット配列を〜」
という風に、既にintが「4byte」というミもフタも無い表現に変わっているから、型情報も何も関係無いよ。
0145デフォルトの名無しさん
2008/03/21(金) 14:27:51p[i]というコードはコンパイルすると、アドレスはp+4*iといった意味の命令が生成される。
4が出てくる理由はpの宣言int* pによるもの(intが4byteの環境の場合)。
0146145
2008/03/21(金) 14:36:280147141
2008/03/21(金) 17:03:54>>144 さんと >>145 さんの説明で
4byteという要素バイト数の情報をポインタp自体が保持して
いるのではなく、p[i]にアクセスする際にコンパイラがp+4*i
を計算する命令を生成しているだけ、ということがやっと理解
できました。
0148デフォルトの名無しさん
2008/03/21(金) 18:35:45配列のサイズは型から静的に決まる、と。
というか、アップキャストはできない。
そこが鍵だな。
0149デフォルトの名無しさん
2008/03/21(金) 18:36:13○要素のサイズ
0150デフォルトの名無しさん
2008/03/21(金) 18:44:36読み出したりするにはどうするのがお薦めなのでしょうか?
例えば
string s("# foo 30 bar 0.1 xlajkdfl;ajkds");
から 30, 0.1 を抜く場合。
int n;
double x;
sscanf(s.c_str(),"# foo %d bar %lf",&n,&x);
としたりするのですが、もっと「本来」の方法はあるのでしょうか?
どうも workaround 的な気がするので。
0151デフォルトの名無しさん
2008/03/21(金) 18:48:300152デフォルトの名無しさん
2008/03/21(金) 18:51:360153デフォルトの名無しさん
2008/03/21(金) 19:53:080154デフォルトの名無しさん
2008/03/21(金) 20:00:280155デフォルトの名無しさん
2008/03/21(金) 20:29:16そういうのが必要になる状況ってあまり無くない?
0156デフォルトの名無しさん
2008/03/21(金) 21:08:24俺はソースコード解析したい時によくでる。
字句解析ライブラリもってこいって話だよな・・・
0157デフォルトの名無しさん
2008/03/21(金) 21:51:06そうなら、分割の話から入るだろうし。
もしかして自然言語文からの抽出とかかな?
0158150
2008/03/21(金) 23:35:25主にデータファイルをフォーマットし直したり、それを処理する場合です。
例えばデータフォーマットの情報などた先頭にあったりして、その情報を
元に解析したりする場合です。無視して決め打ちする事も可能な場合も多い
ですが、安全性のために整合性をチェックしています。
>>154 さんの方法が私には合っていると思います。普段 Ruby とかも使って
いて正規表現も使っているのに惰性で C 的にを使い続けてる自分の頭の堅さ
には呆れました。基本的に以下のようなコードで対応することを考えています。
まだあまり考えていないのでもう少しエレガントに書けるだろうとは思います。
string s("# foo 30 bar 0.1 xlajkdfl;ajkds");
boost::regex r0("^# foo ([0-9.]+) bar ([0-9.]+).+");
boost::match_results<std::string::const_iterator> mr;
if(boost::regex_match(s,mr,r0)){
const int n = boost::lexical_cast<int>(mr.str(1));
const double x = boost::lexical_cast<double>(mr.str(2));
cout << n<<"\t"<<x<<endl;
}
0159デフォルトの名無しさん
2008/03/22(土) 00:19:27それまさに字句解析の範疇な気がするけど・・・w
まぁ正規表現で簡単に済めばそれで良いと思うけどね。
0160デフォルトの名無しさん
2008/03/22(土) 12:44:30> まぁ正規表現で簡単に済めばそれで良いと思うけどね。
regex ってかなり強力だと思う。テキストから情報拾う場合
に regex では簡単に通用しない場合ってどういうケース?
0161デフォルトの名無しさん
2008/03/22(土) 13:14:39ネストした括弧の対応を取るとか
0162デフォルトの名無しさん
2008/03/22(土) 14:07:160163デフォルトの名無しさん
2008/03/22(土) 14:15:50俺だと char ごと読み取って '(' ')' を +1, -1 でカウントするとか
低レベルな事を考えちゃうけど。
0164デフォルトの名無しさん
2008/03/22(土) 14:52:00→xpressive ではパターンの自己再帰記述が可能。
→正規表現の枠を超える表現力を持つ(文脈自由文法)。
→xpressive だとネストの対応が可能。
0165デフォルトの名無しさん
2008/03/22(土) 15:01:280166デフォルトの名無しさん
2008/03/22(土) 15:21:10Karlsson の本は目を通したけど感じは判ってよいけど便利な本
という感じではない。秀和から出てる稲葉さんは本厚いし内容あるのかな。
0167デフォルトの名無しさん
2008/03/22(土) 17:31:22おおまかな概念と使用例が載ってる
boostもう使ってるよ〜という人にはあまり必要ないかも
0168デフォルトの名無しさん
2008/03/22(土) 17:31:23基底クラスへのポインタを使って読み取りたいのですが、どうすればいいでしょう
基底クラスへのポインタの配列に、いろいろな派生クラスを突っ込んでいる状態なので、
直接アクセスすることは出来ません
0169デフォルトの名無しさん
2008/03/22(土) 17:49:420170デフォルトの名無しさん
2008/03/22(土) 17:54:12C++ Template Metaprogramming
0171デフォルトの名無しさん
2008/03/22(土) 17:56:20普通に仮想関数で
struct Base { virtual StaticMemberType GetStaticMember()=0; };
struct DerivedA : public Base {
StaticMemberType GetStaticMember { return DerivedA::staticMemember; }
};
あるいはRTTI使ってマルチメソッド。
0172171
2008/03/22(土) 17:59:130173デフォルトの名無しさん
2008/03/22(土) 18:22:26ありがとうございました
0174デフォルトの名無しさん
2008/03/22(土) 21:56:34どうもありがとうございます。実はその本は持っていて次に読む予定。
しかし、これも洞察には優れているとは思うけど、便利な本では
ないかも。面白そうなんで期待してるけど。
0175デフォルトの名無しさん
2008/03/22(土) 22:03:15面白くないよ。mplの単なるリファレンス。
0176デフォルトの名無しさん
2008/03/23(日) 00:53:31メモリの消費量はまるまるDLL分増えるのでしょうか
それとも使った機能の分だけ増えるのでしょうか
0177デフォルトの名無しさん
2008/03/23(日) 01:03:350178デフォルトの名無しさん
2008/03/23(日) 01:12:30物理メモリはコードについては使った分
データはシラネ
0179デフォルトの名無しさん
2008/03/23(日) 01:30:13使いたいライブラリが8MBくらいあるもので、
まるまる増えるのはちょっとアレかな、と思って質問しました
改変可なので、必要な部分だけ取り出そうと思います
0180デフォルトの名無しさん
2008/03/23(日) 03:06:24その機能は、一部のクラス(と言っても10個ぐらいある><)
にしか利用できないって設計の場合
一部のクラスをfriendする以外に何か方法はありませんか?
0181デフォルトの名無しさん
2008/03/23(日) 03:13:010182デフォルトの名無しさん
2008/03/23(日) 09:41:11freind じゃダメな理由を書いた方が答えが得られやすいと思う。
0183>>182
2008/03/23(日) 09:42:51freind ⇒ friend
0184デフォルトの名無しさん
2008/03/23(日) 09:45:07普通、friendは最終手段だし
0185デフォルトの名無しさん
2008/03/23(日) 12:07:260186>>182
2008/03/23(日) 13:05:050187デフォルトの名無しさん
2008/03/23(日) 13:58:48friendによる依存は妥当だと思う。
0188デフォルトの名無しさん
2008/03/23(日) 14:45:51Manager を取得するクラスを作って、
その1つだけを friend にすれば?
0189180
2008/03/23(日) 14:58:22下手すれば私のリアルfriendより多いぐらい
それが悔しくて
0190デフォルトの名無しさん
2008/03/23(日) 14:59:160191184
2008/03/23(日) 15:01:240192デフォルトの名無しさん
2008/03/23(日) 15:02:430193デフォルトの名無しさん
2008/03/23(日) 15:09:280194デフォルトの名無しさん
2008/03/23(日) 15:14:480195デフォルトの名無しさん
2008/03/23(日) 15:25:030196デフォルトの名無しさん
2008/03/23(日) 15:42:230197デフォルトの名無しさん
2008/03/23(日) 16:01:39____
|← reject| boostの中の人 singleton ユーザー
. ̄.|| ̄ ̄ ┗(^o^ )┳(`Д´)┳(^o^ )┛≡=-
|| ┏┗ ┗┗ ┏┗ ≡=-
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0198デフォルトの名無しさん
2008/03/23(日) 16:06:070199デフォルトの名無しさん
2008/03/23(日) 16:34:52Managerのインスタンスを受け取る関数の引数に関数オブジェクトを使って
内部で一定のアルゴリズムで正しい値を返すもの(パスワードの暗号化みたいな)にのみそのインスタンスを渡してやる風にすればいいんじゃね?
更にインスタンスを受け取る関数をテンプレート化してやり、欲しい権限までのクラス型インスタンスを返すようにしてやればアクセス制限も出来て完璧!
とここまで考えてわざわざこんなことしてもオーバーヘッドが大きいだけなことに気づいた
そもそも何の意味があるんだっけか
0200デフォルトの名無しさん
2008/03/23(日) 16:45:120201デフォルトの名無しさん
2008/03/23(日) 16:57:350202デフォルトの名無しさん
2008/03/23(日) 17:02:41これらの方法は、Managerクラスの許可なく好き勝手に権限のあるクラスを作れる。
そういうのを>>180は制限したいんじゃないの?
0203>>182
2008/03/23(日) 17:08:28そう言うのは最悪。
あとから見て、継承が本当に必要だったのか、単に特定のメソッドを
使わせるために継承しているのかがわからなくなるから。
0204201
2008/03/23(日) 17:21:39意味がよく分からないけど、、、「特定にメソッドを使わせるために継承が必要かどうかがわからなくなる」ってこと?
そんなこと言ってたら何もできない。
friendだったら、なぜfriendにしたか分からなくならないの?
friend よりいいと思うけどな。
friend じゃprivateのメンバにアクセスできてしまう。
Managerクラスを機能を利用するんだから、継承しかないでしょ。
使う側のクラスに持たせるとなると、コンストラクタとかはpublicになってしまうし。
0205デフォルトの名無しさん
2008/03/23(日) 17:40:32Managerの中のstaticでない変数とか勝手に作られない?
0206デフォルトの名無しさん
2008/03/23(日) 17:41:03Manager クラスじゃなくて単に許可コントロール用の class を作る
というのは有りじゃない?そういう例をまともな本で見た記憶がある。
0207デフォルトの名無しさん
2008/03/23(日) 17:42:272度と地球へは戻れなかった…。
鉱物と生物の中間の生命体となり
永遠に宇宙空間をさまようのだ。
そして死にたいと思っても死ねないので
―そのうちカーズは考えるのをやめた。
全部globalにすればいいじゃん
0208デフォルトの名無しさん
2008/03/23(日) 17:44:01電波の缶詰の人のサンプルもそうだった
ライブラリ的なものを
外部からいじられないようにするためだったら
そんな感じでもいいんじゃまいか
村八分
0209デフォルトの名無しさん
2008/03/23(日) 17:47:19class FriendClassA; // 前方宣言
class FriendClassB;
class Manager
{
public:
class Friend { public: virtual void authorize(Manager* m) = 0; };
void getInstance(Friend* p)
{
if( dynamic_cast<FriendClassA*>(p) ||
dynamic_cast<FriendClassB*>(p) ||
/* 権限のあるクラスかをチェック */ )
{
p->authorize(this);
}
}
};
0210デフォルトの名無しさん
2008/03/23(日) 18:25:34friendでいいじゃんって話になるも
0211デフォルトの名無しさん
2008/03/23(日) 18:40:51class Manager
{
public:
template <class Unauthorized>
static void authorizedProc(unauthorizedClass * p)
{ std::cout << "not authorized" << std::endl; }
template <>
static void authorizedProc(authorizedClassA * p)
{ p->Proc(m_instance); }
// 以下許可するクラス分同じコード
private:
Manager m_instance;
};
冗長だし検証してないけど。
0212デフォルトの名無しさん
2008/03/23(日) 18:45:30ファクトリクラスを通すようにする。
で、そのファクトリクラスを friend にして、
そこで Manager クラスを取得して、
各クラスにそれを渡すようにする。
設定関数は各クラスの共通基底クラスに作って、
それをファクトリクラスの friend にする。
0213デフォルトの名無しさん
2008/03/23(日) 18:46:54余計なクラス情報がくっつくって本当ですか?
0214デフォルトの名無しさん
2008/03/23(日) 18:52:41特定のコンパイラでそういう事があるとかいうんだったら俺は知らない。
0215デフォルトの名無しさん
2008/03/23(日) 18:55:110216デフォルトの名無しさん
2008/03/23(日) 18:57:34マングリング名にクラス情報がくっつくって話だと思う。
0217デフォルトの名無しさん
2008/03/23(日) 18:59:55言ってたのはシリコンバレー帰りの先輩です
純粋なCの構造体にするにはやはりextern "C"が必要なのですね。
ありがとうございました。
0218デフォルトの名無しさん
2008/03/23(日) 19:00:36どこからそういう判断をしたんだ?w
0219デフォルトの名無しさん
2008/03/23(日) 19:01:520220デフォルトの名無しさん
2008/03/23(日) 19:02:10構造体名って C でそもそも何らかのマングリングされるの?
0221デフォルトの名無しさん
2008/03/23(日) 19:07:590222デフォルトの名無しさん
2008/03/23(日) 19:10:41純粋な C の構造体かどうかなんて
どう区別するんだろうか。
0223>>182
2008/03/23(日) 19:46:38まじめな話、もう一度継承についてちゃんと勉強した方がいいと思う。
(>>205 の内容を理解できてる?)
継承はアクセス制限のためにあるものじゃない。
極端な話、全てが public であったとしても、継承は有用。
これに対して、friend は純粋にアクセス制限を回避するもので、かつ
アクセス制限を回避する以外の機能は無いから、なぜ friend にしたか
がわからなくなることはない。
(もちろん、なせアクセス制限を回避する必要があるかはどっかに書いて
おく必要があるだろうけど。)
>>206
それならアリだと思う。
0225201
2008/03/23(日) 20:00:37>継承はアクセス制限のためにあるものじゃない。
>極端な話、全てが public であったとしても、継承は有用。
だから、継承が駄目なんですか?
継承は色んな意味で使えて「わかりにくい」から駄目ってこと?
0226デフォルトの名無しさん
2008/03/23(日) 20:00:370227デフォルトの名無しさん
2008/03/23(日) 20:02:29あとは各クラスのオブジェクト生成を外部から隠せばいい。
0228>>182
2008/03/23(日) 21:01:54> 作られるけど。外から参照されたくないものはpublicにしなけらばいいじゃん
おいおい、ほんとにもう少し勉強してからこいよ。
引っ込みつかなくなってるだけならいいけど、マジでそう思ってるとしたら
ちょっとまずいよ。
まずい理由の一つは、private でもその変数が見えなくなるわけじゃない、
アクセスできなくなるだけだから。
この違いわかってる?
>>225
> 継承は色んな意味で使えて「わかりにくい」から駄目ってこと?
>>203 に書いたのはそう言うこと。
それしか方法が無いならしょうがないけど、friend と言うもっといい方法があ
るのにわざわざ使わないのは、別の意図があるようにとられる危険性が高い。
0229201
2008/03/23(日) 21:17:23>マジでそう思ってるとしたらちょっとまずいよ。
Managerを継承していないクラスから参照されたくない場合はpublicにすれば良いって事だよ?
>まずい理由の一つは、private でもその変数が見えなくなるわけじゃない、
>アクセスできなくなるだけだから。
「見える」→メンバ変数の値が取得できる。(getter)
「アクセス」→メンバ変数の値が書きかえれる。(setter)
って意味で言ってるのなら
getter、setter定義してやれば、当然見えるしアクセスも可能。
0230デフォルトの名無しさん
2008/03/23(日) 21:42:53Managerは1つのクライアント(Managerを使うクラスオブジェクト)の管理のみ引き受けるもので、
クライアントと同数のManagerオブジェクトが必要と考えているのではないだろうか。
0231>>182
2008/03/23(日) 22:07:14> 「見える」→メンバ変数の値が取得できる。(getter)
> 「アクセス」→メンバ変数の値が書きかえれる。(setter)
ほら、全然理解できてない。
簡単な例でいうと、
int a, b;
class X {
private: int a;
};
class Y: public X {
int foo(){ return a; }
int bar(){ return b; }
};
ってやると、foo() の中で X::a をアクセスしようとするからエラーになるよね。
もし、C++ の private が変数を「見えなくする」なら bar() の b と同じように、
foo() は ::a を返すはずだろ?
これが、「見えなくなること」と「アクセスできなくなること」の違いなわけ。
これによる、影響は自分で調べてみてね。
>>230
まあ、それはそれでそれこそもっとよく考えろとしか言えないわけだが...
0232デフォルトの名無しさん
2008/03/23(日) 22:11:420233デフォルトの名無しさん
2008/03/23(日) 22:12:430234デフォルトの名無しさん
2008/03/23(日) 22:56:010235デフォルトの名無しさん
2008/03/23(日) 22:57:56初心者スレでやれ
ウザイ
0236デフォルトの名無しさん
2008/03/23(日) 23:03:270237>>182
2008/03/23(日) 23:14:58まあ、10個ぐらいなら全部 friend 宣言してもいいと思うけど。
もしかして君も >>201 みたいに理解できてないやつなの? (w
0238デフォルトの名無しさん
2008/03/23(日) 23:32:29まぁ、それはともかく、>>180にfriendなどを使ってまで
制限する必要性があるのか、疑問だな。
クラスごと使わせなくするとこにfriendを使用している時点でおかしいと思う。
無名名前空間やdetails名前空間で十分なんじゃないか?
0239201
2008/03/23(日) 23:44:18>foo() の中で X::a をアクセスしようとするからエラーになるよね。
アクセッサをManagerの方に定義することを考えていたんだけどな。
「見える」「見えない」の話じゃんくてprivateだからだろ。
>もし、C++ の private が変数を「見えなくする」なら bar() の b と同じように、
foo() は ::a を返すはずだろ?
グローバル変数よりメンバ変数を参照しにいくのは知ってます。
Managerの方に「一部のクラス」に使わせたい機能だけ、protected または public にして
一部のクラスがManagerを継承すればいい。
Manager のprivateのメンバには「一部のクラス」も参照できない。
「一部のクラス」以外にManagerクラスのインスタンスを作られるのが困る場合は
コンストラクタなどをprotectedにすればいいんでは?
「一部のクラス」に対してManagerは一つらしいので、また違ってきますが・・・・
0240デフォルトの名無しさん
2008/03/23(日) 23:58:52-- friends.cpp
#include "A.h"
#include "B.h"
namespace
{
class Manager {};
Manger& manager();
}
void A::f() { manager().a(); }
void B::g() { manager().b(); }
0241>>182
2008/03/24(月) 00:06:26> まぁ、それはともかく、>>180にfriendなどを使ってまで
> 制限する必要性があるのか、疑問だな。
それは、>>180 に聞いてもらわないとダメだけど、そう言う状況はありえると思うよ。
例えば、デバッグのためにマネージャの状態を直接見たりいじったりするクラスとか。
ただ 10個もあるのは、ちょっと多すぎるような気はするけどね。
>>239
頼むから、もう少し勉強してからレスしてくれ。
全然俺の言ってることが理解できてないよ。
0242デフォルトの名無しさん
2008/03/24(月) 00:08:400243デフォルトの名無しさん
2008/03/24(月) 00:51:50やり方は色々ある。って話に落ち着けていいんじゃないのw
メイヤーズもそんなことeffective c++に書いてたでしょ。
0244デフォルトの名無しさん
2008/03/24(月) 05:56:56「そいつの中にあるもの」の質はともかく、
「そいつの中にあるものを説明する能力」はどっこいどっこいです。
0245デフォルトの名無しさん
2008/03/24(月) 17:47:39YはXを継承しています。これらのクラスに対応する
インターフェイスのクラスIXとIYを以下のように定義しました。
しかし、コンパイルエラーでした。クラスYは抽象クラス
とみなされたようです。でも、クラスYはf()の定義も
g()の定義も持っているので抽象クラスではないように思えます。
XとYのインターフェイスを作る方法を教えて下さい。
class IX {
virtual void f() = 0;
};
class X : public IX {
void f() {}
};
class IY : public IX {
virtual void g() = 0;
};
class Y : public X, public IY {
void g() {}
};
int main()
{
Y y; // エラー(抽象クラスあるいは構造体のオブジェクトが宣言されています)
return 0;
}
0246デフォルトの名無しさん
2008/03/24(月) 17:54:22↑ ↑
X IY
↑↑
Y
という継承木になっている。
X::IX::f は定義されているが、
IY::IX::f は定義されていない。
インタフェースクラスを作るなら、IX を仮想継承する必要がある。
ただ、それでも Y で f を定義する必要がある。
あと、インタフェースクラスに限らず、基底クラスには
必ず仮想デストラクタを定義するのを忘れないように。
0247デフォルトの名無しさん
2008/03/24(月) 18:14:09ありがとうございます。
以下のように変更したらエラーが警告になりました。
この警告は無視していいような気がします。
>あと、インタフェースクラスに限らず、基底クラスには
>必ず仮想デストラクタを定義するのを忘れないように。
OKです。
class IX {
virtual void f() = 0;
};
class X : virtual public IX {
void f() {}
};
class IY : virtual public IX {
virtual void g() = 0;
};
class Y : public X, public IY {
void g() {}
};
int main()
{
Y y; // 警告('Y' : 2 つ以上のメンバが同じ名前を持っています。'X::f' から継承します。)
return 0;
}
0248デフォルトの名無しさん
2008/03/24(月) 18:50:40まあ、今回の場合は IY::f に実装がないから X::f を使いますよという警告だけど、
Y に void f() { X::f(); } と書いておくのが無難。
0249デフォルトの名無しさん
2008/03/24(月) 19:06:35{
T( int );
}
を
T *T_array = new T [100];
は出来ないじゃん?
#placement new使えってのはなしで。
std::vectorはどうやってこういうコンストラクタが引数を持ってるクラスを受け入れてるの?
0250デフォルトの名無しさん
2008/03/24(月) 19:07:200251デフォルトの名無しさん
2008/03/24(月) 19:11:33上の例では void f() 1個だけですが、実際のIXは純粋仮想関数を
22個もっています。Yに22個の関数をわざわざ定義するのはなんだか
無駄な気がするのですが。。。
0252デフォルトの名無しさん
2008/03/24(月) 19:18:29まあ、面倒なら今のところは無視してもいいかもしれない。
コメントでも書いとこう。
0253デフォルトの名無しさん
2008/03/24(月) 19:26:44頼むから、もう少しまともな説明してくれ。
0254デフォルトの名無しさん
2008/03/24(月) 19:31:33わかりました。ありがとうございました。
0255デフォルトの名無しさん
2008/03/24(月) 19:31:460256デフォルトの名無しさん
2008/03/24(月) 19:34:11拡張性もある程度考慮するなら基底クラス作ってそれだけ friend 。
あとは本人がどうしたいか、だな。
0257デフォルトの名無しさん
2008/03/24(月) 20:12:41非常に初歩的な内容だし、あの説明で理解できないなら、
もうあきらめた方がいいぞ。
0258デフォルトの名無しさん
2008/03/24(月) 22:58:500259180
2008/03/24(月) 23:04:330260デフォルトの名無しさん
2008/03/24(月) 23:59:31struct P{ B *temp; }
B( P p ){ swap( *this, *(p.temp) ); }
operator P (){ P p; p.temp = this; return p; }
};
B Return(){ return B(); }
void Accept( B &b ){};
------------
Accept( Return() ); //Error
俺、何間違えてるの?
0261デフォルトの名無しさん
2008/03/25(火) 00:06:500262デフォルトの名無しさん
2008/03/25(火) 00:07:130263デフォルトの名無しさん
2008/03/25(火) 00:09:500264デフォルトの名無しさん
2008/03/25(火) 00:11:000265デフォルトの名無しさん
2008/03/25(火) 00:11:540266デフォルトの名無しさん
2008/03/25(火) 00:11:550267デフォルトの名無しさん
2008/03/25(火) 01:12:43Humanは抽象クラスとして用いるつもりです
このときHumanにあるstaticメソッドを一回だけ呼び出したいときってどうすればいいでしょうか?
Humanのコンストラクタで呼び出したとすると、TanakaやAsouのコンストラクタでも呼び出されますよね
static bool initのような変数をフラグとして使う方法は思いついたのですが、
もっとスマートな方法はないのでしょうか?
0268デフォルトの名無しさん
2008/03/25(火) 01:16:38自分で一からやろうと思うとどうしても乱雑になる。
マルチスレッドが入ってくるともっと面倒くさくなる。
0269デフォルトの名無しさん
2008/03/25(火) 01:25:21人生、かな?
0270デフォルトの名無しさん
2008/03/25(火) 01:49:26そのメソッドを呼び出したいのは、Human派生のオブジェクトを生成したタイミングなの?
0272デフォルトの名無しさん
2008/03/25(火) 02:30:23であれば、全てが始まる前に自分で一度だけ呼ぶのが良いと思うな。
0273デフォルトの名無しさん
2008/03/25(火) 02:31:52それはstaticな変数をフラグにするよりダメじゃねぇかw
0274267
2008/03/25(火) 02:39:11あぁそうか、そもそもstaticなメソッドなわけだから
int main(){
Human::onlyOnceCalled()
みたいなかんじで
最初の方で適当に呼んでおくってのもありかもしれませんね
一回だけしか呼ばないって保証がないような気もしますが
0275デフォルトの名無しさん
2008/03/25(火) 02:49:38必ず最初に読んでしまってよいなら、クラスにスタティックなメンバを定義して
それの初期化の中で実行させてみては?
// human.h
class Human() {
// 中略
class Initializer { Initializer() { onlyOnceCalled(); } };
static Initializer init;
};
// human.cpp
Human::Initializer Human::init;
文法間違ってたらすまん
0276275
2008/03/25(火) 02:51:47そこは適当におぎなって
0278デフォルトの名無しさん
2008/03/25(火) 03:05:20initialization orderを気にするならこんな感じかな。
class Human() {
class Initializer {
Initializer() { onlyOnceCalled(); }
public:
static void Initialize() { static Initializer instance; }
};
};
これで、Initializer::Initializeを呼んだタイミングで一度だけ初期化されるようになるよ。ただしこの場合は複数スレッドとかが動き出す前に呼んでね。
0279260
2008/03/25(火) 09:32:50gccだと通らないんだけど・・・
0280デフォルトの名無しさん
2008/03/25(火) 09:53:30どこを見てそう思うんだよ・・・
指摘してくれてるだろ
>>263
>>266
あとAcceptがReturnの返す一時オブジェクトを参照してるから何とかしよう
0281デフォルトの名無しさん
2008/03/25(火) 11:14:49まずは省略や手抜きをせずに、Bの定義を全部書け。
そして何をしたいのかはっきりさせろ。
0282260
2008/03/25(火) 16:02:29http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%89%80%E6%9C%89%E6%A8%A9%E7%A7%BB%E5%8B%95%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF(Move_Constructor)
に書いてあることってnon-const referenceを受けるべきとろこに一時オブジェクトを渡せるって話だと思って、
渡してみたらコンパイラ通らないどーん。な状況。
0283デフォルトの名無しさん
2008/03/25(火) 16:44:42これで通った
struct B{
struct P{ B *temp; };
B(){}
B(P p){ swap( *this, *(p.temp) ); }
operator P () { P p; p.temp = this; return p; }
};
B Return(){ return B(); }
void Accept( B b ){};
int main(){ Accept( Return() ); }
0284デフォルトの名無しさん
2008/03/25(火) 17:14:200285デフォルトの名無しさん
2008/03/25(火) 17:18:44抽象クラスにおいて、自分自身のクラスへのポインタの引数を取るメソッドは不可能なのでしょうか?
たとえばこういうコードです
class Human {
void foo(Human *human) = 0;
};
コンパイルエラーになってしまいますが、なぜそうなるのか分かりません
抽象クラスだから、インスタンスを作れないので
void (Human human);
のようなメソッドはだめですよね、でもポインタならいけると思うのですが
0286デフォルトの名無しさん
2008/03/25(火) 17:20:520287デフォルトの名無しさん
2008/03/25(火) 17:23:26virtual書いてみたらどうかな?
0288デフォルトの名無しさん
2008/03/25(火) 17:27:020289285
2008/03/25(火) 17:32:20すいません元のコードではvirtualをつけてました
thisポインタは分かるのですが、この抽象クラスを継承したクラスの間でやりとりしたいことがあるのです
不勉強なので間違ってるかもしれませんが、「関連」というのをやりたいのです。
>>285の例でやるなら、一般的にはHumanクラスにHuman *hoge;みたいなポインタをメンバに持たせて関連付けするそうですが
関数の引数でやれないかと思いまして
0290デフォルトの名無しさん
2008/03/25(火) 17:35:09const参照でもいいかもしれないけど、それ以上所有権を動かせなくならない?
0291デフォルトの名無しさん
2008/03/25(火) 17:45:20void Accept(B& b) {}
B b = Return();
Accept(b);
の方が良くないかな、それ以前に何のためのPなんだ?
0292デフォルトの名無しさん
2008/03/25(火) 17:47:47どういう一般的例なのかちょっと分からないけど、
処理と情報を分ける実装の方が個人的にはスッキリするかな
んで、そのプログラムvirtualつけてエラーが出る理由が分からないんだけど…
0293デフォルトの名無しさん
2008/03/25(火) 17:49:24ごめん、俺が悪かった
0294292
2008/03/25(火) 18:06:34すいませんすごく単純なクラスを作り直し、実験してみると、エラーはでませんでした。
「抽象クラスをインスタンス化することができません」というエラーメッセージだったので、
質問させていただいたのですが、おそらく他のところにエラー.の原因があると思うのでもう一度見直してみます
0296デフォルトの名無しさん
2008/03/25(火) 19:45:31もう知っているかもしれないけど、
C++0xでは非const参照でも一時オブジェクトを受けられるようになる(右辺値参照)。
0297デフォルトの名無しさん
2008/03/25(火) 22:07:180298デフォルトの名無しさん
2008/03/25(火) 22:23:460299デフォルトの名無しさん
2008/03/25(火) 22:33:41BやらPやらの例も、そもそもswapがないでコンパイル止まるしな。
0300デフォルトの名無しさん
2008/03/25(火) 22:34:020301デフォルトの名無しさん
2008/03/25(火) 22:45:08簡単に言うと「swapでおk」ってこと。
0302260
2008/03/25(火) 23:08:35コンパイル通った。
>>283と一緒かな?
class D {
public:
struct Proxy { Proxy( D *d ):d_( d ){}; D *d_; };
operator struct Proxy () { return Proxy( this ); };
D( struct Proxy p ) {};
void operator = ( struct Proxy p ){};
D(){};
D( D &rhs ){};
void operator = ( D &rhs ){};
};
D Return() { return D(); }
int main( int, char** ){
D d = R();
return 0;
}
Accept( D &d );ってのは間違ってたかも。
ようは、
D( const D &rhs )だと、オーナーシップの移譲とかでrhsに変更加えられない。で、
D( D &rhs )だと、右辺値を渡せない。
だから、Proxyを返して、ごにょごにょする。って話なのか。
0303デフォルトの名無しさん
2008/03/27(木) 00:31:14ビルドエラーが出るんですけど、そもそもそんなの出来ない?
0304デフォルトの名無しさん
2008/03/27(木) 00:54:49できない。
関数ポインタとメンバ関数ポインタは別物。
0305デフォルトの名無しさん
2008/03/27(木) 01:38:47Windowsのコールバック関数みたいに
こっちから引数を渡せれば、どうにでもできる。
0306デフォルトの名無しさん
2008/03/27(木) 01:54:41sizeofを使ってポインタサイズを調べてみると、あれびっくりサイズがデカイって分るよ。
どうやっても入りません、キャストしたら情報ロストします。
0307デフォルトの名無しさん
2008/03/27(木) 02:00:59いろいろ勘違いしてるような。
0308デフォルトの名無しさん
2008/03/27(木) 02:24:05どこを?
具体的にどうぞ。
0310デフォルトの名無しさん
2008/03/27(木) 02:49:530311デフォルトの名無しさん
2008/03/27(木) 02:56:20要するに、メンバ関数ポインタがさす関数はvirtualである事もあって
インスタンスに仕込まれた仮想テーブルを参照して、関数テーブルのうちどの位置にあるものかを取得する必要がある。
また、関数はvirtualでないケースもある、この場合仮想テーブルには関数のアドレス情報はないので、関数メンバポインタ内に情報がなければならない。
関数メンバポインタはこれら複合情報で構成された構造体となっている。
0312デフォルトの名無しさん
2008/03/27(木) 03:03:530313デフォルトの名無しさん
2008/03/27(木) 06:03:12であるがゆえに「要するに」から始まっているのは間違いだと思う。
0314デフォルトの名無しさん
2008/03/27(木) 07:26:14関数ポインタには入れられないが、
実体とメンバ関数ポインタの対を構造体にしたものを引数に取る
ラッパ関数を通して呼ぶことはできる。
もちろん、C 側ではその構造体を直接扱うことはできないから、
void * を通すなり不完全型を利用してポインタで扱うなりする必要はあるけど。
0315デフォルトの名無しさん
2008/03/27(木) 07:39:53>>305はCのライブラリのコールバック使うときとかの対処法の話じゃね?
大抵はvoid*のパラメータ持ってるし。
0316デフォルトの名無しさん
2008/03/27(木) 07:46:120317デフォルトの名無しさん
2008/03/27(木) 08:15:45インスタンス増えたら関数も増えるとか思ってるのだろうか、理解に苦しむ
http://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
0318303
2008/03/27(木) 08:50:26そしてその時呼んだ実体に関数ポインタによって帰ってくるようにしたいんです
0319デフォルトの名無しさん
2008/03/27(木) 09:03:260320デフォルトの名無しさん
2008/03/27(木) 09:20:50非staticメンバ関数/インスタンスメソッドの事だとみんな理解してるよ。
>>318
コールバック関数のパラメタを汎用ポインタとかで指定できるなら、そこにオブジェクトのアドレスを入れて、コールバック関数内でキャストしてメンバ関数を呼ぶ。
パラメタを指定できないなら、コールバック関数から見えるスコープの変数にオブジェクトのアドレスを入れておき、コールバック関数からメンバ関数を呼ぶ。
0321デフォルトの名無しさん
2008/03/27(木) 10:10:150322デフォルトの名無しさん
2008/03/27(木) 10:31:11往生際が悪い、素直に自分の知識不足でしたと認めろ
0323デフォルトの名無しさん
2008/03/27(木) 11:13:55そのあたりは処理系依存だろ
0324デフォルトの名無しさん
2008/03/27(木) 13:09:21やったこともあるんだけど、ほんとは extern "C" と extern "C++" の違いで
型が遭わないはずなんだよね。
だからって対応策がわかんないし、使ったことのあるコンパイラでは全部通るから
そのまま使っちゃうんだけどさ。
0325デフォルトの名無しさん
2008/03/27(木) 13:35:22"C" とかの修飾は、識別子を外部にどういう規則で公開するかという点についての指定であって、スタックフレームの作り方の指定ではない。
機種依存なので、そっちにいけと事になるが、cdeclとpascalが違えば "C" を付加しても動作しない。
C型のスタックフレームを持つ関数として登録可能な関数なら、C型のコールバックに登録する事ができるという事。
そうでないなら、コンパイルが通ったとしてもうまくいかない。
0326デフォルトの名無しさん
2008/03/27(木) 13:52:21スタックフレームとか実装に立ち入った話はしてない。言語概念上の型が違うんだよ。
0327デフォルトの名無しさん
2008/03/27(木) 13:53:59力いっぱいデタラメぶちかまさない
0328デフォルトの名無しさん
2008/03/27(木) 13:58:420329デフォルトの名無しさん
2008/03/27(木) 14:03:56気持ちはわかる。きっとみんなこれらは同じものとして使ってるだろうし、
動作も問題ないだろうさ。
でも規格ではエラーにならないとダメなんだよ。はっきり書いてあるから。
7.5 "Linkage specifications" p1 より
> ... Two function types with different language linkages are distinct types even
> if they are otherwise identical.
gcc でもバグ扱いだ。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316
0330デフォルトの名無しさん
2008/03/27(木) 14:06:37自分を嘘と虚栄で塗り固めるような真似はやめた方がいい、どこに突っ込み入っているのかすら理解できていないだろ。
0331デフォルトの名無しさん
2008/03/27(木) 14:10:440332デフォルトの名無しさん
2008/03/27(木) 14:11:100334デフォルトの名無しさん
2008/03/27(木) 14:16:32何を根拠にそんなこと言うのか知らないけど、じゃぁ静的メンバ関数の
language linkage は "C++" 以外の何になるのさ?
0335デフォルトの名無しさん
2008/03/27(木) 16:56:260336デフォルトの名無しさん
2008/03/27(木) 17:04:34静的メンバ関数のリンケージは内部リンケージで
その根拠は外部に公開されないから
逆にextern "C++"と同じという根拠は?
0337デフォルトの名無しさん
2008/03/27(木) 17:05:020338デフォルトの名無しさん
2008/03/27(木) 17:20:530339デフォルトの名無しさん
2008/03/27(木) 18:55:41配列宣言しているオブジェクトの
コンストラクタ引数を設定するにはどうしたらいいですか?
0340デフォルトの名無しさん
2008/03/27(木) 19:03:37Test0 objects[10];
...
};
Test::Test()
:objects[0]( 10 )
,objects[1]( 8 )
...
{
}
こんなかんじをやりたいのです。
もちろん、これではエラーです
0341デフォルトの名無しさん
2008/03/27(木) 20:36:48できないよ。
0342デフォルトの名無しさん
2008/03/27(木) 20:51:07http://www.geocities.jp/ky_webid/cpp/language/012.html
0343デフォルトの名無しさん
2008/03/27(木) 20:57:51vector<Test>にひとつひとつpush_back()するか
ポインタの配列にしてひとつひとつnewすればいいんでないの
0344デフォルトの名無しさん
2008/03/27(木) 21:55:56for(int i=0; i<10; i++){
...
}
for(int i=0; i<10; i++){
...
}
って書いたら
iの再定義っておこられた
拡張子cppになってるのに
0345デフォルトの名無しさん
2008/03/27(木) 21:57:250346デフォルトの名無しさん
2008/03/27(木) 21:58:460347デフォルトの名無しさん
2008/03/27(木) 21:59:23びっくりするくらいみんな知ってる。
規格準拠していないんだから何も問題ない。
0348デフォルトの名無しさん
2008/03/27(木) 22:01:35#define for if(0); else for
魔法のおまじない
0349デフォルトの名無しさん
2008/03/27(木) 22:01:590350デフォルトの名無しさん
2008/03/27(木) 22:03:210351デフォルトの名無しさん
2008/03/27(木) 22:04:000352デフォルトの名無しさん
2008/03/27(木) 22:29:04だいたい、「関数ポインタ型」それ自体にはリンケージなんか無いだろ。
それともこーゆーコードが通るコンパイラでもあるのかっつーの。
typedef static void (*hoge)();
typedef extern void (*foo)();
typedef extern "C" void (*var)();
0353デフォルトの名無しさん
2008/03/27(木) 22:36:23こういうのならたまにやる。
0354デフォルトの名無しさん
2008/03/27(木) 22:36:460355デフォルトの名無しさん
2008/03/27(木) 22:48:31ARM、ISOのドラフト
0356デフォルトの名無しさん
2008/03/27(木) 22:49:53>>344 なていたらくでか
0357デフォルトの名無しさん
2008/03/27(木) 22:58:27forの中で定義した変数の有効範囲が
直後のループ本体に限られるようになったのは
結構遅かったのでは?D&Eでも軽く触れられていたし。
それに加え過去の互換性のためVC6はあれがデフォルトになったんだと思う。
0358デフォルトの名無しさん
2008/03/27(木) 23:27:370359デフォルトの名無しさん
2008/03/27(木) 23:47:27最近のコンパイラで、forの変数の有効範囲が限られるようになってるのに最近気づいて思わずGJと叫んだ。
0360デフォルトの名無しさん
2008/03/28(金) 00:10:34まあ 1998 年と言えば規格が出る年だしな。
開発期間とか考えると多少前の仕様に準じようとしてたと考えるのが妥当だけど、
その時期ならドラフトとはいえかなりな部分まで練られてると思うんだけどな。
まあ、想像でしかないので本当にギリギリになって入れられた仕様なのかもしんないけど。
VC6 はテンプレートまわりがバグ持ちすぎてかなり酷いが、
テンプレートも遅くに入った仕様だからな・・・。
new がデフォで bad_alloc 投げないとか、とにかく色々と酷い上に、
しばらく次のコンパイラが出なかったという・・・。
0361デフォルトの名無しさん
2008/03/28(金) 00:18:58VS2005から入った俺としては結構苦痛
まあでもテンプレートさえなければインテリセンス反映が早いのはよい
0362デフォルトの名無しさん
2008/03/28(金) 00:36:24問題なのは次のコンパイラがさっさと出なかった事
お陰で変に普及しちまって、このスレでもVC++6.0でコンパイルできません的な質問が絶えない
0363デフォルトの名無しさん
2008/03/28(金) 00:38:120364デフォルトの名無しさん
2008/03/28(金) 00:53:13過去のシステムヘッダに, for で宣言した変数が
その後も生きることに依存したコードがあったっていう……
0365デフォルトの名無しさん
2008/03/28(金) 00:56:00のおまじないと使ったあとでATLをincludeすると
怒られるちゅーか
0366デフォルトの名無しさん
2008/03/28(金) 01:14:53そして満を持して登場した 2002 が糞だったという罠。
そして 2003 で大きく改善されるという二重の罠。
アカデミックだと無料アップグレードできないという三重の罠。
0367デフォルトの名無しさん
2008/03/28(金) 01:16:500368デフォルトの名無しさん
2008/03/28(金) 01:55:570369デフォルトの名無しさん
2008/03/28(金) 02:11:01ややこしくて嫌になるが、内部とか外部とかがある「リンケージ」と
"C" とか "C++" とかがある「言語リンケージ」("language linkage") とは
別物。 >324,329 が言ってるのは言語リンケージのほうなんで、話がまるで
かみ合ってない。
0370デフォルトの名無しさん
2008/03/28(金) 03:12:43逆にextern "C++"と同じという根拠は?ってのが哀愁をソソル
0371デフォルトの名無しさん
2008/03/28(金) 03:26:11素の「リンケージ」の話だとしてもおかしい。静的メンバ関数のリンケージは
ほとんど外部リンケージになる。例外は関数内のクラスのメンバの場合とかね。
0372デフォルトの名無しさん
2008/03/28(金) 03:29:08クラスの宣言されたスコープや、クラス内での private なり public なりに
従うだろ、常考。
0373デフォルトの名無しさん
2008/03/28(金) 03:50:380374デフォルトの名無しさん
2008/03/28(金) 05:40:450375デフォルトの名無しさん
2008/03/28(金) 07:19:260376デフォルトの名無しさん
2008/03/28(金) 08:03:31public, privateと内部リンケージ, 外部リンケージはまた別の話だ
0377デフォルトの名無しさん
2008/03/28(金) 08:07:530378デフォルトの名無しさん
2008/03/28(金) 09:26:26もともとがCへのトランスレータだった事を考えれば自然に合点が行くね。
for( int i = 0 ; .... ) { ... }
変換後
{
int i ;
for( i = 0 ; .... ) { ... }
}
0379デフォルトの名無しさん
2008/03/28(金) 09:47:14C++の仕様書を見ればいいと思うお
0380デフォルトの名無しさん
2008/03/28(金) 09:57:02リンカなどの外部に公開され得るのはクラスであって内部リンケージであるメンバが同様に公開されているように見えるのは処理系の都合
0381デフォルトの名無しさん
2008/03/28(金) 11:33:58クラスが外部リンケージを持つときに、メンバ関数が外部リンケージを持つかどうか は処理系依存だと言っているのならそれは違うよ
0382デフォルトの名無しさん
2008/03/29(土) 03:01:240383デフォルトの名無しさん
2008/03/30(日) 01:04:010384デフォルトの名無しさん
2008/03/30(日) 01:07:31>>5
0385デフォルトの名無しさん
2008/03/30(日) 15:11:26型が1個と100個じゃ大違いだろ
0386デフォルトの名無しさん
2008/03/30(日) 15:17:080387デフォルトの名無しさん
2008/03/30(日) 15:27:00int IsCompileTimeBecomeLongerByUsingTemplate() {
return ENVIRONMENT_DEPENDENT;
}
0388デフォルトの名無しさん
2008/03/30(日) 16:25:460389デフォルトの名無しさん
2008/03/30(日) 16:28:21質問者に応じて別の回答をするように特殊化するんだよ。
0390デフォルトの名無しさん
2008/03/30(日) 16:36:16{
throw spoon();
}
0391デフォルトの名無しさん
2008/03/30(日) 16:59:300392デフォルトの名無しさん
2008/03/30(日) 17:30:09// Writing a collection to cout, in C++0x:
for_each( w.begin(), w.end(),
[]( const Widget& w ) { cout << w << " "; } );
0393デフォルトの名無しさん
2008/03/30(日) 17:59:380394デフォルトの名無しさん
2008/03/31(月) 01:28:230395デフォルトの名無しさん
2008/03/31(月) 01:37:290396デフォルトの名無しさん
2008/03/31(月) 02:07:44http://web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/
0397デフォルトの名無しさん
2008/03/31(月) 05:36:51RTTIありでオブジェクトファイルを生成したいが
外部libなどがRTTIを含んでいない場合は
自分側もそれにあわせてRTTIなしで組まなければ成らないのでしょうか?
0398デフォルトの名無しさん
2008/03/31(月) 10:26:48自分が知るVC++では、外部のオブジェクトに対してtypeidやdynamic_castをしなければ、
自プログラムがRTTI有効でも、問題なくリンクして実行できる。
逆にそうでない処理系も世の中あるかもしれない。
0399デフォルトの名無しさん
2008/03/31(月) 12:28:13リンクでエラーが出たらオプション変えればいいんじゃないか?
が切れていてBorland C++ Compilerがダウンロードできないんだけど
0401デフォルトの名無しさん
2008/03/31(月) 17:25:43普通にアクセスできるしスレ違いですさようなら
0402デフォルトの名無しさん
2008/04/01(火) 02:25:470403397
2008/04/01(火) 02:34:57環境依存てことですかね〜。
>>399
vcとのクロス開発あたりだとエラーがでてしまうのです;;
根本的になにをやりたいかというと、
シリアライズ機能を自前で実装しようと考えていまして
実装の際にRTTIのtypeidを利用して組むとらくそうなのですが・・・
ない場合はMFCやwxWidgetのようなクラス毎にマクロを仕組んで
独自の機構を作るしかないのかなって悩んでしまって・・
※boostのシリアライズという選択肢もありますが、boostが対応していない環境も考慮しました。
0404デフォルトの名無しさん
2008/04/01(火) 06:49:14DLL超えとか、コンパイラ/オプションの違うlibを混ぜるとか
するとハマるよ?
0405デフォルトの名無しさん
2008/04/01(火) 06:58:03libのクラスをもう一度派生させたのを使ってみてはどうかな?
念のために聞くけど、そのlibをコンパイルしたコンパイラと使ってるコンパイラの種類とバージョンはあってる?
0406397
2008/04/02(水) 04:43:48こちらはそこを懸念してるんですが、出来上がったものを使うのは私ではないのでなんとも・・・
>405
バージョンのほうはあってますが、こちらでつくったモジュールがどのようなケースで使用されるか
をすべて網羅するわけにはいかないので・・
派生というかstubのようなものをproxyとして使用する感じでしょうか?
なんというか、それなりの状況でも使用に耐えうるもの、となると
結局RTTIははずさなければならないのかな、と思いました。
0407デフォルトの名無しさん
2008/04/02(水) 05:08:21http://builder.japan.zdnet.com/sp/c-programming-language/story/0%2C3800083430%2C20370255%2C00.htm
0408デフォルトの名無しさん
2008/04/02(水) 06:12:08class X {
int i;
public:
int j;
void f() {}
};
というような場合に、
X
X::j
X::f()
みたいに出力できるとうれしいのですが……。自分で字句解析するしかないかな。
0409デフォルトの名無しさん
2008/04/02(水) 06:47:390410デフォルトの名無しさん
2008/04/02(水) 08:45:55他で散々話題になっているんだからここでまで張らなくていいよ。
0411デフォルトの名無しさん
2008/04/03(木) 00:16:30doxygenで可能。privateは出てこない(設定で変えられるかも)
0412デフォルトの名無しさん
2008/04/05(土) 13:46:160413デフォルトの名無しさん
2008/04/05(土) 14:19:430414デフォルトの名無しさん
2008/04/05(土) 14:49:220415デフォルトの名無しさん
2008/04/05(土) 16:47:51.defファイルをがんがって作る
0416デフォルトの名無しさん
2008/04/05(土) 20:14:210417デフォルトの名無しさん
2008/04/07(月) 17:03:38インターフェース自動生成ツールが最近でてきてるけど
ちょっと複雑なコードだと自動生成に失敗するみたいだ
まだ発展途上のツールだから仕方ないのか
gccxmlに渡すオプションを考えればうまくいくのか
どうなんでしょうか?
0418デフォルトの名無しさん
2008/04/07(月) 20:28:21P173〜181 にかけての auto_ptr についての説明中に、
T* pt( new T(1) );
auto_ptr<T> pt( new T );
auto_ptr<T> a( source() );
↑どう見ても関数呼び出しに見えるのですが、
初期化子と解釈しないとどうも前後の説明から辻褄が合いません。
ですが、手元にある数冊の参考書を調べてもググってみても
以上のような構文は「コンストラクタ初期化リスト」以外には見あたりませんでした。
これは関数呼び出しなのでしょうか?それとも初期化子なのでしょうか?
もし、初期化子だとしたら、このような構文が出てきたときに
どのようにして見分けたら良いのでしょうか?
また、関数呼び出しのように見える初期化子の使い方についても
よろしくご教示願います。
0419デフォルトの名無しさん
2008/04/07(月) 20:34:160420デフォルトの名無しさん
2008/04/07(月) 20:43:27int i(0);
上のふたつは等価、という話なのかな?
typename identifier(typename, typename, ...); // プロトタイプ宣言
typename identifier(arg1, arg2, ...); // 初期化
identifier(arg1, arg2, ...); // 関数呼び出し
ただし、C++では、関数宣言として解析できるものは関数宣言と見なすので、
list<int> data(istream_iterator<int>(cin), istream_iterator<int>());
は(cinの内容で初期化したlistの宣言ではなく)関数宣言になる。
0421デフォルトの名無しさん
2008/04/07(月) 21:26:48なんてことは出来ないですかね?
0422デフォルトの名無しさん
2008/04/07(月) 21:32:310423デフォルトの名無しさん
2008/04/07(月) 22:43:420424デフォルトの名無しさん
2008/04/07(月) 23:49:20全部のメンバにゲッタを設定するのも面倒ですし
0425デフォルトの名無しさん
2008/04/07(月) 23:49:20その本持ってるが、その部分に間違いはない。
auto_ptrのメンバ関数のインターフェース見れば疑問は無くなるはず。
0426デフォルトの名無しさん
2008/04/08(火) 00:19:52面倒でも書く。
0427デフォルトの名無しさん
2008/04/08(火) 00:32:34class A{
public:
int aho;
};
const A baka; //全部リードオンリーなクラス
0428デフォルトの名無しさん
2008/04/08(火) 00:46:55必要になるまでゲッタなんて書かなきゃいい。
0429デフォルトの名無しさん
2008/04/08(火) 00:59:50constは?
0430デフォルトの名無しさん
2008/04/08(火) 01:07:460431デフォルトの名無しさん
2008/04/08(火) 01:08:06struct B : public A
{};
}
ができた. class AのデータだけにはCからアクセスできるのかも
methodは無理か?
0432デフォルトの名無しさん
2008/04/08(火) 01:25:030433デフォルトの名無しさん
2008/04/08(火) 08:03:03class A {
int member_prv;
public:
const int & member;
A() : member(member_prv) {}
}
まあ何だ、C++にはReadOnlyなプロパティを書く構文的な補助がないから、素直にgetter書いとけ。
0434デフォルトの名無しさん
2008/04/08(火) 12:05:30#define readonly(TYPE, ID)\
public: TYPE ID() const { return _##ID; }\
private: TYPE _##ID
class C {
readonly(int, priv);
readonly(unsigned int, b1) : 16;
readonly(unsigned int, b2) : 16;
public:
C() {}
};
0435デフォルトの名無しさん
2008/04/08(火) 17:57:59よく使われるようですが、なくても良いような気がします。例えば、
プログラミング言語C++のp.599にある bind2nd の定義のtypenameを取って
コンパイルしてみましたが、コンパイルが通って、テストコードがきちんと
動きました。typenameの存在意義を教えていただけないでしょうか。
こういう場合にtypenameがなければ困るという分かりやすい例が欲しいです。
// ----- プログラミング言語C++(p.599)より -----
template <class BinOp>
class my_binder2nd : public unary_function<BinOp::first_argument_type, BinOp::result_type> { // my_を付けて実験
protected:
BinOp op;
typename BinOp::second_argument_type arg2; // このtypenameを取ってみた。
public:
my_binder2nd(const BinOp& x, const typename BinOp::second_argument_type& v) // このtypenameも取った。
: op(x), arg2(v) {}
result_type operator()(const argument_type& x) const { return op(x, arg2); }
};
template<class BinOp, class T> my_binder2nd<BinOp> my_bind2nd(const BinOp& op, const T& v)
{
return my_binder2nd<BinOp>(op, v);
0436デフォルトの名無しさん
2008/04/08(火) 18:30:35http://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html
0437デフォルトの名無しさん
2008/04/08(火) 18:33:460438デフォルトの名無しさん
2008/04/08(火) 22:18:030439デフォルトの名無しさん
2008/04/09(水) 04:22:44なるほど、理解できました。でもコンパイラが十分賢ければtypenameは不要だと
言えそうですね。コンパイラはテンプレートの解析時においては typename
を付けていない T::something が型かどうか分かりませんが、実際にコードを
生成するときには分かるので、本質的には曖昧さの問題はないように思えます。
0440デフォルトの名無しさん
2008/04/09(水) 08:02:130441デフォルトの名無しさん
2008/04/09(水) 15:23:39プログラムの改変を行っているのですが、前任者が作業ごとにファイルをわけています。
AAA.cppみたいなのがいっぱいあります。ヘッダファイルも同じ名前でたくさんあります。
0442デフォルトの名無しさん
2008/04/09(水) 16:03:35http://7ujm.net/C++/extern.html
内容は見てない。
0443デフォルトの名無しさん
2008/04/09(水) 18:11:09今やVBC#でもms単位で計測しないと実行速度違いがわからないぐらいですし
出来ないこともないですよね
0444デフォルトの名無しさん
2008/04/09(水) 18:34:02場合によりけり
あと、その話題はこのスレ向きじゃない
0445デフォルトの名無しさん
2008/04/09(水) 18:54:39んな事ないよ
OpenGL Viewerが前回のバージョンから恐らくC#になったんだと
思うが、やはり動作がもさもさする。
0446デフォルトの名無しさん
2008/04/09(水) 19:32:09ゲームとかms単位が命取り
ms以下単位だったら考えてやる
0447デフォルトの名無しさん
2008/04/09(水) 19:34:040448デフォルトの名無しさん
2008/04/09(水) 19:42:540449デフォルトの名無しさん
2008/04/09(水) 19:48:47そういうファイル構成はC++では一般的。
その同名のヘッダーを読み込みば、十分アクセスできるはず。その前任者のソースをよく読んでC++を勉強すること。
C++はexternを滅多に使わないからね。
0450デフォルトの名無しさん
2008/04/09(水) 19:55:450451デフォルトの名無しさん
2008/04/09(水) 19:57:04全然やばくない。世界はもっと広い。
0452デフォルトの名無しさん
2008/04/09(水) 20:26:56T::something が型でも値でもコンパイルできてしまう場合は困るでしょう?
多分どちらかは間違っているんだから
0453デフォルトの名無しさん
2008/04/09(水) 21:06:55んなわけないだろ
プロがXNAで開発してるとでも思ってるのか?
0454デフォルトの名無しさん
2008/04/09(水) 21:56:020455デフォルトの名無しさん
2008/04/09(水) 22:26:410456デフォルトの名無しさん
2008/04/09(水) 23:32:25std::cout
がおかしくなる原因になってるらしくなんとかしたい
#define __streambuf なにか
にできればいいのだけど voidに置き換えるとコンパイルとおらない
何か適当なクラスでもないでしょうか?
0457デフォルトの名無しさん
2008/04/09(水) 23:38:170458456
2008/04/10(木) 00:12:16さらにその処理系から呼び出すcのプログラム中でもリンクしてるのが
問題なってる可能性があるような気がしています
なので
#define __streambuf Hoge
できると多分うまくいくのではないかと
0459デフォルトの名無しさん
2008/04/10(木) 00:17:470460デフォルトの名無しさん
2008/04/10(木) 00:22:13多言語から呼び出すってっ、もしかすると他言語からDLL呼び出しすることってことかな?
だったらライブラリの初期化がうまく言ってないんじゃないか?dllmainはこねこねした?
0461デフォルトの名無しさん
2008/04/10(木) 00:23:420464デフォルトの名無しさん
2008/04/10(木) 07:50:43MTでコンパイルしないといけない決まりでもあるの?
0465デフォルトの名無しさん
2008/04/10(木) 08:21:08ある。
DLLをコンパイルするときはMTでする必要がある。プロジェクトの作成でDLLを選択すると自動的にマルチスレッドランタイムライブラリが選択される。
呼ぶ側はどっちでもいい。
0466デフォルトの名無しさん
2008/04/10(木) 11:49:02何の処理系の話か知らないがVisualC++なら
シングルスレッドのランタイムの静的ライブラリをリンクしたシングルスレッド専用のDLLを普通に作れる
0467デフォルトの名無しさん
2008/04/10(木) 11:57:210468デフォルトの名無しさん
2008/04/10(木) 12:10:14ライブラリを使って問題無いはず、という保証はあるんだろうか?
あと、普通に C++ で呼び出すとかなぜしないのだろうか。
(これは状況がわからんとなんとも言えないけど)
0469デフォルトの名無しさん
2008/04/10(木) 14:18:03使い分けるのでしょうか?
std::type_info はクラスの中でその他はクラスの外が多いのですが。
0470デフォルトの名無しさん
2008/04/10(木) 15:34:040471デフォルトの名無しさん
2008/04/10(木) 17:04:360472デフォルトの名無しさん
2008/04/10(木) 17:05:090473デフォルトの名無しさん
2008/04/10(木) 17:30:44いいならそうすればいいような気がするが。中身の情報が必要な
場合に member にしてるんじゃないの?普通に生じる状況だと思うけど。
0474デフォルトの名無しさん
2008/04/10(木) 17:43:05メンバに出来ないものは外に書く。
以上。
0475デフォルトの名無しさん
2008/04/10(木) 18:05:52euc-jpにする方法ありますか?
Linuxのeuc-jp環境でプログラミング行っており、
gcc version 4.1.2 です。
0476デフォルトの名無しさん
2008/04/10(木) 18:18:070477デフォルトの名無しさん
2008/04/10(木) 18:40:500478デフォルトの名無しさん
2008/04/10(木) 19:06:32friend を使って非メンバーにすることもある。
0479デフォルトの名無しさん
2008/04/10(木) 20:50:360480デフォルトの名無しさん
2008/04/10(木) 20:59:53operator=, +=等はメンバに。operator==, <<, +等は非メンバ(場合によってはfriend)にしてる。
0481デフォルトの名無しさん
2008/04/10(木) 21:08:54もう忘れちゃったけど。
グローバルにop ==を置くことでカプセル化が上がるとか
その話とはまた別?
0482デフォルトの名無しさん
2008/04/10(木) 21:20:100483デフォルトの名無しさん
2008/04/10(木) 22:12:02「できるだけ非メンバーかつ非 friend の関数を書くようにしよう」
というのがありました。
0484デフォルトの名無しさん
2008/04/10(木) 22:19:02オブジェクト指向なんてうんこ
0485デフォルトの名無しさん
2008/04/10(木) 23:00:41現実的にメタプログラミングするのには必要だけど。
個人的にはデストラクタを推すね。
2行目は同意。
0486デフォルトの名無しさん
2008/04/10(木) 23:08:04RAII 万歳!
0487デフォルトの名無しさん
2008/04/10(木) 23:25:350488デフォルトの名無しさん
2008/04/10(木) 23:58:560489デフォルトの名無しさん
2008/04/11(金) 00:01:31プログラマの資格なしだぜ
0491デフォルトの名無しさん
2008/04/11(金) 00:14:49メモリリークどころの騒ぎじゃない
0492デフォルトの名無しさん
2008/04/11(金) 00:17:31デストラクタ
0493デフォルトの名無しさん
2008/04/11(金) 00:20:23呼び出さないといけないんじゃなかったっけ?
0494デフォルトの名無しさん
2008/04/11(金) 00:25:56DB接続とかファイルハンドルにクリティカルセクションだの
なんでも閉じてくれる。
0495デフォルトの名無しさん
2008/04/11(金) 00:28:48http://pc11.2ch.net/test/read.cgi/tech/1200044614/496-
496 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:44:30
つまるところc++ではデストラクタに頼るべき。
497 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:54:04
C++はつまるところデストラクタのことだからな
closeさせといてガベージコレクタがあるとか抜かす言語は笑えるな
intは回収できるが巨大なファイルリソースはリークするわけだ
498 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:06:22
日本語でおk
499 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:08:34
>closeさせといてガベージコレクタがあるとか
禿げあがる程同意。
C#はusing(o1,o2,...){}があるから多少マシだけど、
forみたいにusing用のスコープ作るから
スコープ違いが混じるとネストして見辛くなる。
どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。
javaのtry-finally-closeに至っては論外。
しかもcloseで例外出たらfinally内で潰さないと
try内で発生したより重要な例外が消されるし・・・。
500 :デフォルトの名無しさん [sage] :2008/02/15(金) 16:33:04
>どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。
そして言語はC++/CLIへと進化するのであった、まる
0496デフォルトの名無しさん
2008/04/11(金) 00:34:08明示的にcloseしない場合、メモリに余裕があればfinalizeは呼ばれず、
DB接続も閉じられない
そしてコネクションプールのタイムアウトで死に始める業務アプリ
鳴り始めるサポートデスクの電話機達
0497デフォルトの名無しさん
2008/04/11(金) 00:39:21プログラマと名乗るくらいならC++くらいできる頭を持って欲しい・・
0498デフォルトの名無しさん
2008/04/11(金) 00:59:540499デフォルトの名無しさん
2008/04/11(金) 01:00:32ttp://mag.autumn.org/Content.modf?id=20050506023118
0500デフォルトの名無しさん
2008/04/11(金) 01:00:40無駄を削ぎ落として細部を明確にした言語が望まれるというのもわかるよ。
それとGCの有用性とは別の話だが。
0501デフォルトの名無しさん
2008/04/11(金) 01:03:52リソース周りは優秀だったりする
0502デフォルトの名無しさん
2008/04/11(金) 01:26:110503デフォルトの名無しさん
2008/04/11(金) 01:26:350504デフォルトの名無しさん
2008/04/11(金) 01:55:30C++習いたてです。
0505デフォルトの名無しさん
2008/04/11(金) 07:46:34scopedとでもして識別子が入ってるブロックの最後でdisposeしてくれたほうがよかった
0506デフォルトの名無しさん
2008/04/11(金) 08:50:00#include <iostream>
struct S { virtual void hoge() = 0; // 純粋仮想のみ };
struct S1 : public S { void hoge() { std::cout << "S1" << std::endl; }};
struct S2 : public S { void hoge() { std::cout << "S2" << std::endl; }};
int main()
{
S1 s1;
S2 s2;
S& r1 = s1;
S& r2 = s2;
r1.hoge();
r2.hoge();
r1 = r2; // 基本クラスの参照を代入
r1.hoge();
r2.hoge();
return 0;
}
VC8で上記のコードを実行すると
S1
S2
S1
S2
と表示されました。
r1 = r2;はS::operator=を呼ぶだけなので何も変わらない、と理解したのですが、
これはC++的に正しい挙動なのでしょうか?
それとも未定義でたまたまこうなっているだけなのでしょうか?
0507デフォルトの名無しさん
2008/04/11(金) 08:55:40> struct S { virtual void hoge() = 0; // 純粋仮想のみ };
は
> struct S { virtual void hoge() = 0; /* 純粋仮想のみ */ };
です。
0508デフォルトの名無しさん
2008/04/11(金) 08:56:430509デフォルトの名無しさん
2008/04/11(金) 08:57:180510デフォルトの名無しさん
2008/04/11(金) 09:00:15それはS = Sの一般的な代入に関して考えるとかなり狂っているから諦めろって言う話でっていう
0511デフォルトの名無しさん
2008/04/11(金) 12:27:47同意。finalizeって呼ばれるとは限らないとか。ほんとに気休め程度だね。
0512デフォルトの名無しさん
2008/04/11(金) 13:29:20代入や他オブジェクトでの初期化でvptrは変更されない。
0513デフォルトの名無しさん
2008/04/11(金) 15:56:17class B { class C {}; };
VC8.0 では class C から class A の x が参照できますがこれは C++ の仕様ですか?
0514デフォルトの名無しさん
2008/04/11(金) 19:00:01ないでしょうか?
readableじゃないのならあるのですが、読めないと意味ないのです
0515デフォルトの名無しさん
2008/04/12(土) 16:01:170516デフォルトの名無しさん
2008/04/12(土) 16:08:220517デフォルトの名無しさん
2008/04/13(日) 23:17:27それが今何番目の要素なのかを知る関数はないですか?
0518デフォルトの名無しさん
2008/04/13(日) 23:20:51std::distance
0519デフォルトの名無しさん
2008/04/13(日) 23:21:190520デフォルトの名無しさん
2008/04/13(日) 23:55:080521デフォルトの名無しさん
2008/04/14(月) 01:34:09ここ読むとC++よりもJAVAのほうがリソース管理に関して
優れているように思えるんだけど
0522デフォルトの名無しさん
2008/04/14(月) 01:42:170523デフォルトの名無しさん
2008/04/14(月) 01:46:30そんな事いったらC++も保守性を犠牲にパフォーマンスを高める余地のある言語と言えるけど。
ただJavaの場合は“余地”どころかプログラマに選択をさせない完全な“切捨て”であるけどね。
だからプログラマが手段を選択できる余地の残っているC++の方が優れている。終了。
0524デフォルトの名無しさん
2008/04/14(月) 01:49:220525デフォルトの名無しさん
2008/04/14(月) 02:15:33という話が >>495 にあるよ
jdbcでoracle使ったことがある人は知ってると思うけど、
closeし損ねるとリークしてそのうち動かなくなるんだよね
これを注意深く追ってると、「なんだかCでやってんのと変わらんなあ」
と思うぜ、実際。
0526デフォルトの名無しさん
2008/04/14(月) 02:27:320527デフォルトの名無しさん
2008/04/14(月) 07:08:37「RAIIが発明されるまでのC++」については、Javaのほうが
リソース管理が優れていた、と云わざるを得ない、けどねぇ。
0528デフォルトの名無しさん
2008/04/14(月) 07:25:04ファイルハンドルが足りない時には
ファイルクラスのインスタンスへのガベコレを
優先的にやってくれるとか。
0529デフォルトの名無しさん
2008/04/14(月) 10:47:50> 「RAIIが発明されるまでのC++」
って具体的に何を指すの? RAII ってプログラミング
ポリシーだと思うんだけど。「発明」されたっていまいちピンと来ない。
0530デフォルトの名無しさん
2008/04/14(月) 11:04:02未だに RAII を取り入れない C++ があるとは信じられないのかもしれないが。
0531デフォルトの名無しさん
2008/04/14(月) 12:21:55デストラクタを活用するべき
0532デフォルトの名無しさん
2008/04/14(月) 12:25:180533デフォルトの名無しさん
2008/04/14(月) 12:50:09C with class の話ですか?
C++は初期のARMがかかれた頃から散々言われていますけど。
0534デフォルトの名無しさん
2008/04/14(月) 18:05:47強いて言えば、テンプレートがなかった頃には、
auto_ptrや(削除子付きの)boost::shared_ptrのような
汎用的なものは作りづらかったと思う。
それでも、fstreamみたいに個別に作っていく手があったはずだけど。
0535デフォルトの名無しさん
2008/04/14(月) 21:38:580536デフォルトの名無しさん
2008/04/14(月) 22:33:50今は糞設計かどうかなんて関係ない。
0537デフォルトの名無しさん
2008/04/14(月) 23:13:37するにはどうすればよいの?
0538デフォルトの名無しさん
2008/04/15(火) 00:45:20クラスって新しい container 作ってんの?
普通に vector とかにオブジェクト入れて iterator 使うとかいう話
じゃないんだよね?
0539デフォルトの名無しさん
2008/04/15(火) 02:36:340540デフォルトの名無しさん
2008/04/15(火) 07:56:33なんでできないの?
0541デフォルトの名無しさん
2008/04/15(火) 08:59:060542デフォルトの名無しさん
2008/04/15(火) 09:20:530543デフォルトの名無しさん
2008/04/15(火) 16:55:570544デフォルトの名無しさん
2008/04/15(火) 16:56:46叫ぶやつはジェロニモだ
0545デフォルトの名無しさん
2008/04/15(火) 17:24:270546デフォルトの名無しさん
2008/04/15(火) 21:52:480547デフォルトの名無しさん
2008/04/15(火) 21:58:180548デフォルトの名無しさん
2008/04/15(火) 22:09:230549デフォルトの名無しさん
2008/04/15(火) 22:14:510550デフォルトの名無しさん
2008/04/15(火) 22:20:43テンプレート勉強すりゃわかることだろうに
0551デフォルトの名無しさん
2008/04/15(火) 22:32:59自分で考えて解決する楽しさを知らないやつは(ry
0553デフォルトの名無しさん
2008/04/15(火) 22:36:31わかりにくかったので聞いてみました。
0554デフォルトの名無しさん
2008/04/15(火) 22:43:22流れとしてはわりと的を射ている気がするw
0555デフォルトの名無しさん
2008/04/15(火) 23:01:58クラステンプレートが正しい。だってあれはテンプレートだから
クラステンプレートをテンプレートクラスというのは
鉄パイプをパイプ鉄というようなもの
0556デフォルトの名無しさん
2008/04/15(火) 23:16:18わかりやすい表現ありがとうございます。
教科書には
クラステンプレートはテンプレートクラスから導出できる。
クラステンプレートは非テンプレートクラスから導出できる。
テンプレートクラスはクラステンプレートから導出できる。
非テンプレートクラスはクラステンプレートから導出できる。
と書いてあるのですが・・・
0557デフォルトの名無しさん
2008/04/15(火) 23:24:080558デフォルトの名無しさん
2008/04/15(火) 23:25:340559デフォルトの名無しさん
2008/04/15(火) 23:26:560560デフォルトの名無しさん
2008/04/15(火) 23:26:59>http://www.ed.kuki.tus.ac.jp/cgi-bin/vahwebx.exe/Ja_JP/cforaix/Extract/0/glossary/czgt.htm
クラス・テンプレート(class template)
暗黙的にまたは明示的にインスタンスを生成されるか、または特殊化されると、クラス型を作成するテンプレート。
テンプレート・クラス(template class)
クラス・テンプレート(class template)によって生成されるクラス・インスタンス。
0561デフォルトの名無しさん
2008/04/16(水) 00:01:310562デフォルトの名無しさん
2008/04/16(水) 00:03:460563デフォルトの名無しさん
2008/04/16(水) 00:49:24boost::any相当のものってないよね?
困った困った
0564デフォルトの名無しさん
2008/04/16(水) 01:41:230565デフォルトの名無しさん
2008/04/16(水) 01:51:09newでいうbad_allocの例外をキャッチするような感じ。
0566565
2008/04/16(水) 02:26:50bad_alloc使えた...
0567デフォルトの名無しさん
2008/04/16(水) 03:21:12無いなら作れば?
大したもんでもないっしょ。
0568デフォルトの名無しさん
2008/04/16(水) 13:24:51プレイする上で、まったく同じ動作をするものです。
Cでは主に構造体で、C++ではVectorで管理していました。
C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、
そんなもんでしょうか?
0569デフォルトの名無しさん
2008/04/16(水) 13:41:18完全に同一ソースでもバイナリレベルでは例外処理が入ったり、実行時型判定が入ったりする
0570デフォルトの名無しさん
2008/04/16(水) 13:42:03Vector は std::vector のこと?
そうなると構造体と std::vector とでは役割が違うので、置き換えれるわけ無いんだけど。
・・・もしかして
struct S { int a, b, c } s;
s.a = s.b + s.c;
これを
std::vector<int> s(3);
s[0] = s[1] + s[2];
にしたってこと?
まぁプログラムが違うんならメモリ消費量が違うのはあたりまえなんで、
あんまり気にしてもしょうがないと思う。同じになるはずっていう根拠でもなければ。
0571デフォルトの名無しさん
2008/04/16(水) 13:49:570572568
2008/04/16(水) 14:33:50消費メモリが数十MByte単位で変わってくると、さすがに気になったので質問しました。
C++の設計に改善点がまだあるような気もします。
0573デフォルトの名無しさん
2008/04/16(水) 16:51:230574デフォルトの名無しさん
2008/04/16(水) 17:15:02これだけ読んだら、普通はもうちょっとささやかな差を想像するよね。
その想像をベースにして皆が一般的なことを回答したところで、いきなり
> 消費メモリが数十MByte単位で変わってくると、
っていう、量に関する新情報を出すっていうのは、広義の「情報小出し質問」だと思うよ。
自分だけが知っている状況を他人に説明するときは、発信する前に
「相手はこの説明に触れて、真っ先にどんなものを想像するだろうか?」
っていう思考を巡らせるべき。
で回答だけど、「構造体とvector」以外に両者のソースがどう違ってるかがわからないと、何とも言えない。
質問文に登場した要素だけで考えるなら、STLの使い方をどこかで根本的に間違えているんじゃないか
って気がするけども。
0575デフォルトの名無しさん
2008/04/16(水) 18:22:21デフォルトコンストラクタで生成した反復子やそれを代入した
反復子に対する操作の結果は定義されているでしょうか?
0576デフォルトの名無しさん
2008/04/16(水) 20:42:11このサイトを見ながらC++の基礎を勉強しているのですが、このページのデストラクタのサンプルプログラムを
VC++2008EEに打ち込んでも「消滅しました」のメッセージが出ないのですが、
これはVC++側の処理の問題でしょうか?
0577デフォルトの名無しさん
2008/04/16(水) 20:44:49virtualが抜けてるからとかそんなんじゃね?
0578デフォルトの名無しさん
2008/04/16(水) 20:51:17あまりを出さなくてよい、簡単な割り勘のようなのを作っているのですが、
-
#include<stdio.h>
int main(void)
{
int a,b,c;
/*計算の入力 金額*/
printf("金額を入力してください");
scanf("d%",&a);
/*人数*/
printf("人数を入力してください");
scanf("%d",&b);
/*計算と結果の表示*/
c=a/b;
printf("%d/%d=\t%d\n",a,b,c);
return 0;
}
-
これを実行させると、金額を入力してEnterキーを押した時点で変な数字が出てきてしまいます…
なにか足りない気がしますが、何処がおかしいのでしょうか…?
ご教授よろしくお願いします。
0579デフォルトの名無しさん
2008/04/16(水) 20:51:27情報が足りなさ過ぎる。
0580デフォルトの名無しさん
2008/04/16(水) 20:52:050581デフォルトの名無しさん
2008/04/16(水) 20:53:09d%
0582デフォルトの名無しさん
2008/04/16(水) 20:53:29打ち間違い?
0583576
2008/04/16(水) 21:15:39スミマセン。。。
//dest_sample.cppのコードをまるっきりそのまま書いて実行したところ、
実行結果例の下2行の「消滅しました」のつく文だけ表示されません。
問題なくコンパイルできますし、上4行の「生成されました」と「呼び出されました」
の付く文は正常に表示されます。
試しに、筆者が書いたものをコピー&ペーストして実行してみましたが、
やはり「消滅しました」のつく、下2行の文が表示されません。
~Nanika(){
cout << "Nanikaのインスタンス" << datum << "が消滅しました。" << endl;
が完全に無視されているような状態です。
宜しくお願いします。
0584デフォルトの名無しさん
2008/04/16(水) 21:29:480585デフォルトの名無しさん
2008/04/16(水) 21:39:59あるソースファイルのnamespaceで囲まれた関数を別のソースファイルでexternしたいのですが、
どうすればいいかわかりません。コンパイルエラーになります。
名前空間名を付けて呼び出してもだめで・・・。
aaa.cpp-----------------------------------
#include <stdio.h>
namespace hoge
{
void Func()
{
printf("HELLO\n");
return 0;
}
}
bbb.cpp------------------------------------
extern void hoge::Func(); ←コンパイルエラー
void main()
{
hoge::Func() ← コンパイルエラー
Func(); ← コンパイルエラー
return;
}
-----------------------------------------
bbb.cppからaaa.cppの名前空間が見えてないっぽいんですがこんな場合どうしたらいいのかわかりません。
ネットでも検索したのですが、複数ファイルに分ける事ができる記述はあっても
やり方が乗ってないので困ってます。どなたかお願いします。
0586デフォルトの名無しさん
2008/04/16(水) 21:41:050587デフォルトの名無しさん
2008/04/16(水) 21:41:27void Func();
}
int main()
{
hoge::Func();
}
0588デフォルトの名無しさん
2008/04/16(水) 21:45:140589デフォルトの名無しさん
2008/04/16(水) 22:00:46bbb.cppでexternする場合はコレもnamespaceで囲んであげないといけないと言うことでしょうか!?
やってみたのですがVC++6.0なせいか hogeがシンタックスエラーを起こしてます。
VC++対応していない?明日会社でやってみます。
>>587
586さんと似てるのですが、externしなくてもよいと言うことでしょうか?
これまたVC++6.0ではhogeがシンタックエラーを起こしています。
明日やってみます。
0590デフォルトの名無しさん
2008/04/16(水) 22:56:430591デフォルトの名無しさん
2008/04/16(水) 22:57:300592デフォルトの名無しさん
2008/04/16(水) 22:59:45VC++2008でやってみたけど、ちゃんと表示されたよ。
0593デフォルトの名無しさん
2008/04/16(水) 23:09:05グローバルで生成したというオチではないだろうなw
0594デフォルトの名無しさん
2008/04/16(水) 23:12:02グローバル変数にしても cout に問題はないと思う。
というか、グローバルにしても表示された。
0595デフォルトの名無しさん
2008/04/17(木) 01:48:09template<typename TChar>
class TCHoge
{
public:
typedef boost::basic_regex<TChar> regex_type;
static int Func(regex_type reg){ return 0; }//ok
//static int Func(regex_type::flag_type flag){ return 0; } // NG1
//static int Func(boost::basic_regex<TChar>::flag_type flag){ return 0; } // NG2
static int Func2(boost::basic_regex<char>::flag_type flag){ return 0; } //OK
};
Window2000
Visual C++ 2005 express edition
boost 1.34.1
NG1 のように記述したいのですが,以下のようなエラーとなってしまいます.
warning C4346: 'boost::basic_regex<charT>::flag_type' : 依存名は型ではありません。
error C2061: 構文エラー : 識別子 'flag_type'
VC6.0 では問題なかったのですが,どのように記述すれば良いでしょうか?
0596デフォルトの名無しさん
2008/04/17(木) 02:07:22○typename boost::basic_regex<TChar>::flag_type
だっけ?あまり自信ないや
0597595
2008/04/17(木) 03:25:08これから typename をつけまくる作業に戻ります…
それでは.
0598デフォルトの名無しさん
2008/04/17(木) 03:48:20基本的には全部未定義。唯一、デフォルトコンストラクタで初期化したイテレータに、
そうではない値を代入することができる、ってことになるみたい。
24.1p5 の "Iterators can also have singular values ..." あたりにそんなことが
書いてあって、デフォルトコンストラクタで作った Forward iterator は singular value を
持つ(ことがある)とされている。
要するに未初期化のポインタやヌルポインタと同じ扱いってことね。
0599デフォルトの名無しさん
2008/04/17(木) 07:27:26VC6 だと逆にエラーになるから
もし VC6 でもコンパイルしたいということになりそうなら
後で切り替えられるようにマクロにしといた方がいい。
0600デフォルトの名無しさん
2008/04/17(木) 08:28:19boostでもVC6は切ってるし
0601デフォルトの名無しさん
2008/04/17(木) 10:52:55プロトタイプ宣言したヘッダファイルを作れ。
つーか、チミのやりかたではnamespaceつくらなくてもアウチなんだけど
0602デフォルトの名無しさん
2008/04/17(木) 12:52:38class ClassA { HogePtr pHoge_; };
class ClassB { HogePtr pHoge_; };
この時、typedef boost::shared_ptr<Hoge> HogePtr;はどこに書くのが理にかなっているのでしょうか?
Hoge.h?それともClassA.hとClassB.h?
0603デフォルトの名無しさん
2008/04/17(木) 12:56:08typedef しないという選択肢は無いのかね?
ほんとに HogePtr に意味があるなら Hoge.h だろうね。
0604602
2008/04/17(木) 13:00:36すみませんtypedefしない選択肢もありました。
Hoge.hでtypedefするか、typedefしないかの2択ですね。
ありがとうございました。
0605デフォルトの名無しさん
2008/04/17(木) 21:40:19public:
typedef boost::shared_ptr<Hoge> ptr_t;
};
というのはどうですか?
0606デフォルトの名無しさん
2008/04/17(木) 23:27:03typedef 名をつかうってんなら、いっそ
template class <T> class ClassAImpl { typedef boost::shared_ptr<T> Ptr; ... };
で、
typedef ClassAImpl<Hoge> ClassA;
あたりまでやっちゃうのも悪くないと思うよ。
0607デフォルトの名無しさん
2008/04/18(金) 01:14:56return std::string( src.rbegin( ), std::rend( ) );
}
これくらいシンプルな感じで実装する方法ないですか?
0608デフォルトの名無しさん
2008/04/18(金) 01:21:010609デフォルトの名無しさん
2008/04/18(金) 01:29:320610デフォルトの名無しさん
2008/04/18(金) 01:32:28人に説明する手間を惜しむのは(・A・)イクナイ!!
0611デフォルトの名無しさん
2008/04/18(金) 01:40:34すいません。>>609ってことです。しかもstd::rend( )って何だよ・・・orz
当然できんだろ、って思ってたらコンパイルエラーになるんすね。
やっぱcopy使うのが一番まともでしょうか?
0612602
2008/04/18(金) 01:45:35なるほど、それもありましたか。
>>606
ClassAとHogeの分離は考えてなかったです。
考えていたのは、
1、クラステンプレート実体化のコードが長くなるので、stlやboostはtypedefして使うものだと思っていた。
2、shared_ptrを使うという事は、2つ以上のクラス(スコープ)で型を使う事になるので、typedefを1箇所(Hoge.h)にだけ書いて、参照したほうがいいのではないか?
3、しかし、shared_ptrに入れて使うかどうかは、Hoge.hをインクルードして使う側の選択肢であって、使う側の可能性をHoge.hに書いてしまうのはどうか?
といったことで悩んでいました。
0613デフォルトの名無しさん
2008/04/18(金) 02:14:07よくわからんが std::reverse でも使っとけ
0614デフォルトの名無しさん
2008/04/18(金) 02:24:360615デフォルトの名無しさん
2008/04/18(金) 11:03:18make_reverse_range(src) // boost::range_ex
src|reversed // pstade::oven
非標準のライブラリ使ってもいいならこんな感じで簡単に書ける
>>612
HogePtrをtemplateにして
template template parameterでboost::shared_ptr等を与える
// hoge.h
struct Hoge { ... };
template< template<typename T> class Pointer >
struct HogePtr {
typedef Pointer<Hoge> type;
};
// client code
#include "hoge.h"
template< typename T > struct raw_pointer { typedef T *type; };
HogePtr<raw_ptr> raw;
#include <boost/shared_ptr.hpp>
HogePtr<boost::shared_ptr> shared;
これならhoge.hppで#includeしなくてもよくなる筈
0616デフォルトの名無しさん
2008/04/18(金) 13:57:34×HogePtr<raw_ptr> raw;
○HogePtr<raw_ptr>::type::type raw;
×HogePtr<boost::shared_ptr> shared;
○HogePtr<boost::shared_ptr>::type shared;
ではなくて?
そもそもhoge.hppでshared_ptr.hppの#includeを避けるなら
// client code
Hoge* raw;
boost::shared_ptr<Hoge> shared;
でいいじゃん?
0617デフォルトの名無しさん
2008/04/18(金) 22:57:32>>582
返信遅くなってしまいました…
そんな単純なミスだったんですね…
ありがとうございました。
0618デフォルトの名無しさん
2008/04/19(土) 15:15:17コンストラクタ内で"this"を使っても警告も何も出ないけど大丈夫なんですか?
警告が出てるのはインスタンスが生成されていることが保証されて無い状態で
そのポインタを読んでいることが原因になっていると考えているのですが、
だとすると、コンストラクタ内で使っても同じことですよね。
警告が出ないのは、そのポインタの先を使用しなければおkって事なんですかね・・。
0619デフォルトの名無しさん
2008/04/19(土) 15:20:45どんな値がはいってるかは知らないけどね
0620618
2008/04/19(土) 15:58:08>>コンストラクタ内ではメンバの実体は既に生成されているから問題ない
なのに
>>どんな値がはいってるかは知らないけどね
とは?
実体は生成されているけど、thisが指しているのはどこか分からないよ
ってことですか?
それとも、実体の中身に何が入っているか分からないよってことですか?
0621デフォルトの名無しさん
2008/04/19(土) 16:00:420623デフォルトの名無しさん
2008/04/19(土) 16:14:000625デフォルトの名無しさん
2008/04/19(土) 16:18:41だから、this は存在する。
存在するが、その実体は完全に生成されていないので、
その実体を操作しようとすると色々な不具合が生じる。
1. メンバ変数が全て生成されている保証は無い。
→ メンバ変数に触る関数を呼ぶとヤバい。
2. 仮想関数の呼び出しが正常に働かない。
→ class B : public A { B() : c(this) { } void hoge(); C c; };
とした時、B のコンストラクタ内から仮想関数 hoge を呼ぶと
どんな状況であろうが B::hoge が呼ばれるが、
C のコンストラクタ内から渡されたポインタを使って仮想関数 hoge を呼ぼうとすると
どんな状況であろうが A::hoge が呼ばれる。
B の基本的な初期化が済んでないので、B::hoge を呼ぶ事は非常に危険ということでそうなるのだが、
もちろん A::hoge が呼ばれてしまう事も危険っちゃ危険だ。
0626618
2008/04/19(土) 16:37:18>>1. メンバ変数が全て生成されている保証は無い。
>> → メンバ変数に触る関数を呼ぶとヤバい。
これだと、例えば,
class AAA {
public:
// 危険?
AAA(){
this->value = 5;
};
// こちらにしなくてはならない?
AAA():value( 5 ){
};
void test(){
cout<<value<<endl;
};
private:
int value;
}
ということ?
0627デフォルトの名無しさん
2008/04/19(土) 16:55:31普通、メンバ関数は、コンストラクタによって適切に初期化済みであることを
前提にして書かれているから、
コンストラクタの途中で呼び出すのは、一般的には危険ということ。
0628デフォルトの名無しさん
2008/04/19(土) 17:18:51ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6276.txt
0629デフォルトの名無しさん
2008/04/19(土) 18:02:59実装的には値が不定なだけだと思うけど、
未定義ではあると思うよ。
0630デフォルトの名無しさん
2008/04/19(土) 18:04:280631デフォルトの名無しさん
2008/04/19(土) 18:08:30どっちの仮想関数が呼ばれるかって仕様で決まってんのか?
0632デフォルトの名無しさん
2008/04/19(土) 18:15:06基底のコンストラクタから、
派生の仮想関数が呼ばれない、とかの話と勘違いしてない?
0633デフォルトの名無しさん
2008/04/19(土) 18:17:170634デフォルトの名無しさん
2008/04/19(土) 18:32:06VC++だと__declspec(novtable)を付けたクラスでは
vtblの初期化が行われないなんて独自拡張がある。
(最派生クラスだけnovtable無しにして使う)
これ使っていないか?
0635デフォルトの名無しさん
2008/04/19(土) 19:41:56コード縮むし
0636デフォルトの名無しさん
2008/04/19(土) 20:55:37|┃
|┃ ≡ _、_
____.|ミ\___( <_,` )
|┃=___ \
|┃ ≡ )ATL 人 \ ガラッ
0637デフォルトの名無しさん
2008/04/19(土) 21:20:55void f(){
Derived v;
}
this->vptr = &Base::vtbl → Base::メンバ初期化 → Base::ctor
→ this->vptr = &Derived::vtbl → Derived::メンバ初期化(定義順にctor) → Derived::ctor
Derived::dtor → Derived::メンバ破棄(定義逆順にdtor) → this->vptr = &Base::vtbl
→ Base::dtor → Base::メンバ破棄(定義逆順にdtor) → this->vptr = 不定値
こういう流れになるはず。VC6も。
0638637
2008/04/19(土) 21:28:41× Base::メンバ初期化
○ Base::定義順にメンバ初期化
× Derived::メンバ初期化(定義順にctor)
○ Derived::定義順にメンバ初期化
ctorは「メンバの暗黙の初期化・初期化リストによる初期化」を含まないコンストラクタの中身。
dtorは「メンバのデストラクタ呼び出し」を含まないデストラクタの中身。
0639デフォルトの名無しさん
2008/04/19(土) 23:10:47宣言のみの必要な定義のいらないこれらの様なものを自分でも書くとき、
一般的にどのコンパイラでも単にexternを付けておけば良いんでしょうか?
0640デフォルトの名無しさん
2008/04/19(土) 23:21:000641デフォルトの名無しさん
2008/04/19(土) 23:25:460642デフォルトの名無しさん
2008/04/22(火) 15:26:08template<class T> void f( typename A<T>::B ) {}
と定義して
f( A<int>::B() );
とすると
'void f(A<T>::B)' : テンプレート 引数を 'T' に対して減少できませんでした
というエラーが出るのですが、入れ子クラスではテンプレートの引数を推測でき
ないのでしょうか?
0643デフォルトの名無しさん
2008/04/22(火) 15:49:31を
f<int>( A<int>::B() );
と推測できないかってこと?
それは無理がありすぎるな。
0644デフォルトの名無しさん
2008/04/22(火) 17:09:44推論を抑えるため、引数の型をtypename mpl::identity<T>::typeにしている。
0645デフォルトの名無しさん
2008/04/22(火) 19:09:03そうするとfを関数オブジェクトにしないといけなくなってC++の暗黒面に突入する…と
本当にunk言語だな
0646デフォルトの名無しさん
2008/04/23(水) 17:10:39std::auto_ptr<char> x( new int );
はコンパイルエラーにならないんですか?
0647デフォルトの名無しさん
2008/04/23(水) 17:19:090648デフォルトの名無しさん
2008/04/23(水) 17:23:340649デフォルトの名無しさん
2008/04/23(水) 22:11:042008ではエラーになったぞ。
0650デフォルトの名無しさん
2008/04/24(木) 00:38:290651デフォルトの名無しさん
2008/04/24(木) 09:47:200652デフォルトの名無しさん
2008/04/24(木) 12:12:58Microsoft Visual Studio 2005
Version 8.0.50727.762 (SP.050727-7600)
だとなぜかエラーになりません。
もしかして C++ コンパイラはエラーを出す義務はないのかな?
0653デフォルトの名無しさん
2008/04/24(木) 13:26:29コンパイラのバグか、誰かがヘッダ書き換えちゃったとか。
0654デフォルトの名無しさん
2008/04/24(木) 15:07:19変換されてから std::auto_ptr<char> に変換されていました。
std::auto_ptr_ref<T> は void* 型でポインタを記憶しているので
int 型は消えていました。
memory ヘッダーを確かめると確かにエラーが出ないはずです。
この動作は std::auto_ptr の仕様でしょうか?
0655デフォルトの名無しさん
2008/04/24(木) 15:34:39ttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
0656デフォルトの名無しさん
2008/04/24(木) 15:45:29それほど悪いコンパイラとSTLじゃなかったはずだが。
とりあえず>>654の話から想像すると、
rvalueとlvalueの境を越えるための、あまり汎用的に使い道のない、
汚いトリックを使ってauto_ptrを実装しているが(オーバーロードとtemplate argument deductionのわずかな違いを利用するやつ)
普通に使う際にも、そのトリックが働いてしまうって事かな。
STLの実装の問題っぽいかなぁ。
ふつうauto_ptr_refのメンバをvoid *にしなければならない理由はないよな。
0657デフォルトの名無しさん
2008/04/24(木) 15:48:53あ、>>656に加えて、auto_ptr_refのコンストラクタがexplicitじゃないのか。
だめじゃん、P.J. Plaugerさん。
0658デフォルトの名無しさん
2008/04/24(木) 19:51:53リソースの 切り離し / 復元 を実行するメソッドの命名に困っているのですが
この意味に近くて使いやすい単語のペアはありませんかね?
機能的に必ず対になるものです。
候補としては
[Detach / Restore] Detach の対義語は Attach だしな
[Detach / Attach] Attach は「復元」では無い気がする
[Destruction / Resotre] Destが長い
[Destroy / Restore] Destory は Create のペアとして使ってきたので控えたい
ですが、どうも腑に落ちません。
0659デフォルトの名無しさん
2008/04/24(木) 19:58:10切り離しとその反対なら、Detach / Attach だろうし、
復元とその反対なら、Save / Restore だろう。
Destruction なんて破壊しちゃうわけでさ、英語以前に日本語の
「切り離し」「復元」ってのがそもそも違うんじゃないか?
0660658
2008/04/24(木) 20:08:51> 英語以前に日本語の「切り離し」「復元」ってのがそもそも違うんじゃないか?
うーむ・・仰るとおりですね
切り離しを実行すると 消失 という状態になる処理だったので
それを元に戻す意味で 復元 と考えていたのですが
もう少し考え直してみます。 ありがとうございました
0661デフォルトの名無しさん
2008/04/24(木) 20:12:44オフスクリーンビットマップやら何やらの準備とか。
0662デフォルトの名無しさん
2008/04/24(木) 21:22:360663デフォルトの名無しさん
2008/04/24(木) 22:20:14Disconnect / ReConnect とか、Detach / ReAttach とかは?
0664658
2008/04/24(木) 22:43:04Prepare
今回は使いそうに無いけど、ひとつ賢くなりました
>>662
そういえば DirectInput に Acquire / UnAcquire (だったかな)ってのがありますね
これ良いかも
>>663
Disconnect / ReConnect
接続とはちょっと違うんですわ
ありがとうございました
スマートに命名出来るように、もうすこし設計から見直すことにします
0665デフォルトの名無しさん
2008/04/24(木) 22:50:04このようなテンプレートテンプレートパラメータが
なぜこんな書き方ができるのか今一理解できません。
誰か上手いこと説明してください
0666デフォルトの名無しさん
2008/04/24(木) 22:59:29コンパイラが対応したからだろ・・・
0667デフォルトの名無しさん
2008/04/24(木) 23:34:09template <class X> と書くんだから
template <class A> class T を渡せる奴は
template <template <class A> class T> と書けるようにするのが自然だろう。
むしろ他にどんな書き方があるのかと問いたい。
0668デフォルトの名無しさん
2008/04/24(木) 23:54:08あぁ納得。
<template <class A>
最初の例だとAの部分が無かったので混乱してました
0669デフォルトの名無しさん
2008/04/25(金) 20:13:29ttp://msdn2.microsoft.com/ja-jp/library/c4ts6d5a(VS.80).aspx
を見るのすべてのメソッドに例外指定がないんですけど。
今まで std::exception が例外を投げないことを前提にプログラムを作ってきたんですが。
0670デフォルトの名無しさん
2008/04/26(土) 01:47:180671デフォルトの名無しさん
2008/04/26(土) 02:01:340672デフォルトの名無しさん
2008/04/26(土) 10:46:10unexpected() が呼ばれて落ちる事もあるので
「throw() がついてないからどんな例外が呼ばれるか分からないから
落ちる可能性があるかもしれないのか不安だよ!」
ってのは意外とナンセンスな悩み。
0673デフォルトの名無しさん
2008/04/26(土) 11:32:34ナンセンスな私的だな。例外安全性について勉強し直せば。
0674デフォルトの名無しさん
2008/04/26(土) 11:35:43つまり例外指定はあんま意味ナス
0675デフォルトの名無しさん
2008/04/26(土) 11:40:29ユーザはthrow()を見て、例外不送出であることを期待してコードを書く事ができる。
unexpected()が呼ばれる事で、その関数の例外指定に問題があるか、実装に問題がある事をユーザ/実装者が知る事ができる。
0676デフォルトの名無しさん
2008/04/26(土) 11:58:310677デフォルトの名無しさん
2008/04/26(土) 12:02:46なのにそれ以外の例外が投げられるという例外中の例外がunexpectedなのだな。例外にも階層があるんだね。
0678デフォルトの名無しさん
2008/04/26(土) 12:16:40空のthrow()だけ対応していなかったっけ?
0679デフォルトの名無しさん
2008/04/26(土) 12:31:32なんかそんな気もする
帰ったら確認してみるよ
0680デフォルトの名無しさん
2008/04/26(土) 12:38:39そだよ。
書いても警告が出るだけだから。
0681676, 679
2008/04/26(土) 20:00:39Debugビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。
実行時はthrow()指定無視
Releaseビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。
実行時はthrow文のところでterminateによりabort
のようだ
0682デフォルトの名無しさん
2008/04/26(土) 20:22:06早くSP1出して欲しい
でも年末とか言ってたような希ガス・・・・orz
0683デフォルトの名無しさん
2008/04/26(土) 21:26:34例外指定があろうとなかろうと、
投げてくる(こない)例外の種類は、規格通りだから安心して使っていいよ。
0684デフォルトの名無しさん
2008/04/26(土) 22:13:35f の呼び出しで a を生成するときに起きる例外は f の中で発生する
例外ですか,それとも外で発生する例外ですか?
0685デフォルトの名無しさん
2008/04/26(土) 22:16:420687デフォルトの名無しさん
2008/04/26(土) 22:31:580688デフォルトの名無しさん
2008/04/27(日) 17:46:33connectメソッド使ってサーバに接続要求して
サーバ側でACCEPTメッセージちゃんと受け取って
接続できてるのに戻り値が0にならないのは何で?
0689デフォルトの名無しさん
2008/04/27(日) 17:58:540690デフォルトの名無しさん
2008/04/27(日) 18:06:54やってんだけどわかんないんだ
非同期通信の場合WSAEWOULDBLOCKが返されるのは正常
という記事は見つけたんだけど、鯖立ててない状態で接続しても
WSAEWOULDBLOCKしか返らないからエラー処理出来なくて困ったちゃん
0691デフォルトの名無しさん
2008/04/27(日) 18:16:49>With a nonblocking socket, the connection attempt cannot be completed immediately.
>In this case, this function will return SOCKET_ERROR and WSAGetLastError will
>return WSAEWOULDBLOCK.
0692デフォルトの名無しさん
2008/04/27(日) 20:46:47namespace Aにあるクラスまたは構造体のオブジェクトを、
namespace Bのクラスに引数として渡したいのですが、どのように
記述すればいいのでしょう?出来ればnamespace AとBは別々に、
それがダメならnamespace Aの中にBがいるように出来ればと
思っています。
C++を触りはじめたばかりでわかっていないことが多いのですが、
よろしくお願いします。
0693デフォルトの名無しさん
2008/04/27(日) 21:26:360694デフォルトの名無しさん
2008/04/28(月) 15:26:11オブジェクトに変換できるでしょうか?
0695デフォルトの名無しさん
2008/04/28(月) 16:28:10符号なし整数で、difference_typeの全ての非負数を表す事ができる。
としか書かれてないから、実装依存じゃないかな。
0696デフォルトの名無しさん
2008/04/28(月) 16:38:32Visual Studio 2005をつかっています。
クラスのコンストラクタ内で動的に2次元配列を生成し、
ファイルから値を入力したいのですが、
デバッグ(ローカル,this,vec_x内)で確認すると、2次元配列にはなっているのですが、
行数、列数で共に1となってしまっています。
int **vec_x;
int **vec_y;
と宣言し、コンストラクタ内で、
vec_x = new int * [ size_y ];
vec_y = new int * [ size_y ];
for(i = 0; i<size_y; i++){
vec_x[i] = new int[size_x];
vec_y[i] = new int[size_x];
}
size_y,size_xは初回のnewの次点ですでに、
300,200となっていることは確認済みです。
0697デフォルトの名無しさん
2008/04/28(月) 16:43:38何を根拠に行数、列数が1と判断したのか詳しく。
つーか、vector<vector< int> >使ったら?
0698デフォルトの名無しさん
2008/04/28(月) 16:48:51デバッガでは配列の要素数は型情報として存在しない限り
表示されないというか new [hoge] で取ったサイズは表示されないというか、
要するにただのポインタなので要素は1つしか表示されないというか、
まぁそんな感じ。
0699696
2008/04/28(月) 16:51:46デバッグで、ローカル変数タブからです。
this以下、vec_x(int **)を見ると、
(int *)に対応するところが1段しかありませんでした。
さらに、その下(?)の階層にも要素はひとつしかありませんでした。
>>698
その要素に値を入力したとき、
うまく領域が確保できていればどう表示されるんでしょうか。
0700デフォルトの名無しさん
2008/04/28(月) 16:59:05詳細は>698の通り。そのデバッガは(newで確保した)可変長配列に対応していないのだろう。
確保できていたかどうかを知る手段はない。
確保に失敗したかどうかは例外が送出されるので受け取ればいい。
つーか、>697の最終行。
0701696
2008/04/28(月) 17:13:14ifstream ifs("FILE_NAME");
ifs >> size_x >> size_y;
for( i = 0;i<size_y;i++){
for( j = 0;j < size_x; j++){
ifs >> vec_x[i][j] >> vec_y[i][j];
}
}
としています。
入力ファイルの中身は、
整数(半角スペース)整数
整数(半角スペース)整数
...
となっており、最初にsize_x,size_yを入力しています。
size_x,size_y,vec_x[0][0]は正しく入力されたのですが、
vex_y[0][0]には正しい値は入っていません。
その後のvex_x,vec_yの各要素の値に関しても同様に正しい値は入力されませんでした。
>>697
STLはややこしくて全く手をつけていません。
お恥ずかしい限りですが…。
0702デフォルトの名無しさん
2008/04/28(月) 17:30:54g++ で一応試したけど、配列は >>696 で問題無いよ。
俺も STL 使った方がいろいろと簡単だとは思うけど。
0703デフォルトの名無しさん
2008/04/28(月) 17:40:17頻繁に使うものと滅多に使わないものが「同じ大きさ」に見えるんで、
無駄に全容を眺めてしまって、「難しそうだなぁ」という気持ちばかり膨らんでいく。
実際には「STLを使う」ってのは、その殆どがつまり「コンテナを使う」ってことで、
これ自体はめちゃくちゃ簡単な話だよ。
0704696
2008/04/28(月) 18:00:02STLを勉強してみたいと思います。
今回は(x,y)のようなベクトルによって構成された、
2次元配列を二つ作ることを考えています。
vector<vector< int> > vect1(size_y,vector<int>(size_x));
として、vect1[y][x]として要素にアクセスすればいいのでしょうか。
ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=162
この場合のコンストラクタの動作が理解できません。
第二引数のvector<int>(size_x)でvect1を初期化するのでしょうか。
0705デフォルトの名無しさん
2008/04/28(月) 18:57:24それで使い方はいいよ。
違うよ。2個目の引数は vect1 の各要素を初期化というか instantiate してる。
constructor は 2 つ引数あるときは個数と各要素。
0706デフォルトの名無しさん
2008/04/29(火) 21:50:55下の文に引用が無いから
> それで使い方はいいよ。
> 違うよ。
が繋がった感じで、なんかワロタ
0707デフォルトの名無しさん
2008/05/01(木) 13:42:23Virtual付いてると宣言だけじゃ駄目なんでしょうか?
環境はBCB5+XPです
class a {
public:
void Test1() {};
virtual void Test2() {};
};
class b : public a {
private:
void Test1(); //OK
virtual void Test2(); //リンカエラーが出る
};
0708デフォルトの名無しさん
2008/05/01(木) 13:56:010709デフォルトの名無しさん
2008/05/01(木) 13:58:160710デフォルトの名無しさん
2008/05/01(木) 14:13:48a.Test2()で実体があるから、問題ないんじゃないかと思ってたけど
違うのか。
すごく勉強になったよ。ありがとう〜
0711デフォルトの名無しさん
2008/05/01(木) 15:04:23private:
using a::Test1;
using a::Test2;
};
やりたいのはこういうことか?
0712デフォルトの名無しさん
2008/05/01(木) 17:43:05この書き方は知らなかった。
usingについて調べてみます。
0713デフォルトの名無しさん
2008/05/04(日) 23:24:42買ったけどC++のソース部分読めない
たじゅけて
0714デフォルトの名無しさん
2008/05/05(月) 00:30:030715デフォルトの名無しさん
2008/05/05(月) 00:47:170716デフォルトの名無しさん
2008/05/05(月) 07:55:38当社では、「落丁・乱丁」の場合のみお取替えをさせていただいております。
大変申し訳ありませんが、「ソースコードが理解できない」お客様につきましては、
対応いたしかねますので、ご了承いただけますよう重ねてお願いいたします。
0717デフォルトの名無しさん
2008/05/05(月) 13:45:51何がそんなに難しいの? template とかの勉強が必要なのかな?
0718デフォルトの名無しさん
2008/05/06(火) 00:30:530719デフォルトの名無しさん
2008/05/06(火) 00:38:160720デフォルトの名無しさん
2008/05/06(火) 10:14:01http://www.seshop.com/detail.asp?pid=9025
0721デフォルトの名無しさん
2008/05/06(火) 11:32:550722デフォルトの名無しさん
2008/05/06(火) 11:39:15{
static int i (0);
struct Local
{
static void increment ()
{
++ i;
}
};
Local::increment ();
}
関数内のクラスのstaticメンバ関数(Local::increment)から
関数内の変数(i)を触れるのは規格に合ってる?
g++.real (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
では触れるのだけど.
0723デフォルトの名無しさん
2008/05/06(火) 14:12:30別に矛盾はないと思うし。
スタティックなメンバ変数ってのは、スコープ限定のグローバル変数みたいなもんだしね。
0724デフォルトの名無しさん
2008/05/06(火) 15:28:06そういう事なんだろうね。俺も >>722 さんの code 見てちょっと
えっ?て思ったけど、気分悪いがはっきりと間違っているとも言えない。
実際 compile してみると走るし(g++ 4.1.1)。どちらの static でも
外せば compile しない。
0726デフォルトの名無しさん
2008/05/06(火) 23:05:22ってnewでやる場合どう書けばいいですか?
0727デフォルトの名無しさん
2008/05/06(火) 23:07:390728デフォルトの名無しさん
2008/05/06(火) 23:26:29もっと分かるように質問しろお( ^ω^)
0729デフォルトの名無しさん
2008/05/06(火) 23:31:010730デフォルトの名無しさん
2008/05/06(火) 23:32:22どうやればいいか教えてください
コンパイラはVCです
0731デフォルトの名無しさん
2008/05/06(火) 23:34:110732デフォルトの名無しさん
2008/05/06(火) 23:36:49ありがとうございます
0733デフォルトの名無しさん
2008/05/07(水) 00:02:34{
struct T
{
void operator()( int i ){ printf( "%d\n", i ); }
};
for_each( vec.begin(), vec.end(), T() );
}
こういう奴で、struct TをFのスコープ外にすると通るんだけど、
スコープ内だと通らない。
なんで?
なんで?って考えちゃダメ?
0734デフォルトの名無しさん
2008/05/07(水) 00:04:20関数ないクラス、構造体はtemplateクラスやtemplate関数にtemplate引数として渡せないと仕様で決まっている。
0735デフォルトの名無しさん
2008/05/07(水) 00:05:23x 関数ないクラス
o C++仕様もまともに知らない奴は死ね
0736デフォルトの名無しさん
2008/05/07(水) 00:07:32o 関数内
こういうことだろ
0737デフォルトの名無しさん
2008/05/07(水) 00:18:35o べ、別にあんたの為に修正してやってるんじゃないんだからねっ!
0738デフォルトの名無しさん
2008/05/07(水) 00:35:33C++STDの14.3.1.2で不可になってますな。
コンパイル時に特定する必要があるので、外部リンケージの無い要素を指定できないんですな。
そういう意味で文字列リテラルも不可。
#文字列リテラルを実引数にできると色々と面白いんだけど、しようがないか……
0739デフォルトの名無しさん
2008/05/07(水) 00:49:270740デフォルトの名無しさん
2008/05/07(水) 18:10:55評価者:ミカ 評価:★★★★★
ミカと同じ名前で同じ歳の子がこんなひどい人生を送るなんて!!
信じられない!!
一晩中泣きました!!
評価者:サナエ 評価:★★★★☆
これがあたしたちのリアル。
評価者:ち†ょ⊃ 評価:★★★★★
寝ゐ前|ニ言売ゐ女台め†ニяа止маω†ょ<τ
冫欠σ日シ立L≠†ょカヽ〃яа学木交|ニ彳テL≠маU†ニ
0741デフォルトの名無しさん
2008/05/07(水) 19:53:49寝る前に読み始めたら止まんなくて
次の日泣きながら学校に行きました
同じ文字を複数の文字にあてたり、いきなりローマ字とか出てくるとワケワカメになるね。
0742デフォルトの名無しさん
2008/05/07(水) 20:39:31評価者:ラスコーリニコフ 評価:★★★★★
僕と同じ名前で同じ歳の人がこんなひどい人生を送るなんて!!
信じられない!!
一晩中泣きました!!
評価者:ドストエフスキー 評価:★★★★☆
これがあたしたちのリアル。
評価者:ポルフィーリィ 評価:★★★★★
予審前に読み始めたら止まんなくて
次の日泣きながら仕事に行きました
0743デフォルトの名無しさん
2008/05/08(木) 00:57:43自演してる奴がいるぞ
しかも評価は控えめw
0744デフォルトの名無しさん
2008/05/09(金) 16:17:28. __ __ _
,i,_,i_ ,-,_ ,-i,_,l 、 :.. :. ≡=-i'__l,
| `i /'-' `i //l l iコ==ラ`'i ti
| lヽi li, → | lヽl li → l i,,l l | → ./ /l/
| l-'l |,l | | // l `"|iコ='' / /
. 'Fヲ|,H E三l_l_A | .i .| / /
,i_| .| | | || | i' /l .l,
-'‐' | || |_ l l .ヽ,ヽ,
‐' ' `‐' -'-' -'-'
脱ぐ たたむ プログラムを src と dest を
つくる まちがえる。
0745デフォルトの名無しさん
2008/05/09(金) 19:02:05>評価者:ポルフィーリィ 評価:★★★★★
>予審前に読み始めたら止まんなくて
>次の日泣きながら仕事に行きました
あんたが言うせりふやない。
0746デフォルトの名無しさん
2008/05/09(金) 19:23:43ワロタ
0747デフォルトの名無しさん
2008/05/10(土) 15:18:13そのキー(座標)の要素に値を代入、変更する処理を行おうと思っています。
現在、
class XYZ
{
int x;
int y;
int z;
int value;
};
としてXYZの配列を計算したい領域分だけ確保しているのですが
任意のx,y,zで値の変更があった場合,そのキーの要素を検索して参照、代入する方法として
何かよい方法はありませんでしょうか?
よろしくお願いいたします。
0748デフォルトの名無しさん
2008/05/10(土) 15:20:470749デフォルトの名無しさん
2008/05/10(土) 15:30:18m[x][y][z] = value;
0750デフォルトの名無しさん
2008/05/10(土) 15:45:350751デフォルトの名無しさん
2008/05/10(土) 15:56:350752デフォルトの名無しさん
2008/05/10(土) 17:33:03言いたいことがよくわからない。
キーが与えられたら要素を返す method と代入する method (というか
メンバ関数)を作るってことじゃないの?変更がどうあるのかもよくわからん。
0753デフォルトの名無しさん
2008/05/10(土) 17:47:520754デフォルトの名無しさん
2008/05/10(土) 17:52:373次元座標値ってどんな領域なのよ?
まず問題の概要を説明しやがれ
このスカポンタン
0755デフォルトの名無しさん
2008/05/10(土) 17:55:46そこは重要じゃないだろ
0756デフォルトの名無しさん
2008/05/10(土) 18:01:09#include<map>
class XYZ {
int x, y, z;
public:
XYZ(int x, int y, int z) : x(x), y(y), z(z) {}
bool operator<(const XYZ& rhs) const {
return x < rhs.x || (x == rhs.x && (y < rhs.y || (y == rhs.y && z < rhs.z)));
}
};
int main()
{
std::map<XYZ,int> m;
m[XYZ(0,1,2)] = 100;
}
0757デフォルトの名無しさん
2008/05/11(日) 05:35:20としているコードを見かけますが、
わざわざ<new>をインクルードするのなぜなのでしょうか?
インクルードしなくてもnewは普通に使えますよね?
0758デフォルトの名無しさん
2008/05/11(日) 11:02:53単に習慣でインクルードしてるだけかもしれないし。
0759デフォルトの名無しさん
2008/05/11(日) 11:14:42普通の new を使うためにインクルードするヘッダファイルではない。
0760デフォルトの名無しさん
2008/05/11(日) 11:23:57precement newやnew演算子のオーバーロードをするときに使う。
0761デフォルトの名無しさん
2008/05/11(日) 11:28:160762デフォルトの名無しさん
2008/05/11(日) 11:28:520763デフォルトの名無しさん
2008/05/11(日) 11:29:540764デフォルトの名無しさん
2008/05/11(日) 12:34:181分間枕元に立ってくれるための
おまじないだと、先輩から聞いたことがる。
0765デフォルトの名無しさん
2008/05/11(日) 15:51:390766デフォルトの名無しさん
2008/05/12(月) 00:39:48bool is_w() const {...}
...
};
struct vstring_ref { // デフォルトコピーコンストラクタ使用
const xstring_traits* tr_;
const char* begin_;
const char* end_;
const wchar_t* wbegin(){return tr_->is_w() ? reinterpret_cast<const wchar_t*>(begin_) : NULL;}
...
};
struct vstring_buffer {
const xstring_traits* tr_;
char* begin_;
char* end_;
...
};
struct vstring {...}; // コピーでメモリ再確保
0767766
2008/05/12(月) 00:40:35やっぱ引数がconst std::stringだと
std::string以外から受け取る場合のコストが気持ち悪いし、
const char* でことあるごとにstrlenとかするのも無駄だし、
WindowsだとTCHARとかの場合もあるけど、
WinAPIに関係無い部分にまで<tchar.h>入れるの嫌だし。
で、ただでさえ多い文字列クラスをさらに増やすのかと
葛藤しつつも自作文字列クラスを・・・。
皆はやっぱり普通にstd::string?
Windowsの場合は、
typedef std::basic_string<TCHAR>する人もいるよね。
0768766
2008/05/12(月) 00:41:33○引数がconst std::string&
0769デフォルトの名無しさん
2008/05/12(月) 00:55:18std::basic_string<TCHAR>のtypedefもWindowsプログラムならよく使う。
767も言うコストが気になるならRangeを引数に取るテンプレートにする。
0770デフォルトの名無しさん
2008/05/12(月) 01:29:45書く気はさらさらないので、欺瞞的なTCHARの使用はなるべく避けてWCHARにしてる。
0771デフォルトの名無しさん
2008/05/12(月) 01:44:18mbcs じゃほとんど動かんコードになってる。
0772デフォルトの名無しさん
2008/05/12(月) 07:10:43文字数が必要ならこうする手も。
void hoge(const char* str, size_t len) { }
inline void hoge(const std::string& str) { hoge(str.c_str(), str.length()); }
0773デフォルトの名無しさん
2008/05/13(火) 13:28:400774デフォルトの名無しさん
2008/05/13(火) 13:44:30外からprivateな基本クラスにはアクセスできない
0775デフォルトの名無しさん
2008/05/13(火) 13:48:230776デフォルトの名無しさん
2008/05/13(火) 17:32:360777デフォルトの名無しさん
2008/05/13(火) 17:41:240778デフォルトの名無しさん
2008/05/13(火) 17:47:31friend関数はクラスのメンバではないから・・・かな?
class A {
private:
friend void foo() { ... } // メンバのように見えるけど実はグローバル関数なのでアクセス制御は効かない
};
int main() {
foo();
}
0779デフォルトの名無しさん
2008/05/13(火) 17:48:130780デフォルトの名無しさん
2008/05/13(火) 19:36:070781デフォルトの名無しさん
2008/05/13(火) 19:54:24コンパイルが通らなくなったんですね。C++0xはまだなのに
こういう仕様変更はひそかにやってるんですか?
それとも、もともと規格書にはこう決められていてやっと
Vc++2005で対応できた、ということですか?
0782デフォルトの名無しさん
2008/05/13(火) 20:31:33わかんない部分は無理して使う必要はないし。
でも、わかった後それを使うと今までだらだら長く書いていたコードがすっかりコンパクトにまとまってショックを受けることが多々ある。
0783デフォルトの名無しさん
2008/05/13(火) 20:43:20それは後者
でも前者みたいなひそかな変更もVC++はよくやる。
いや、きちんと文書化されているけどね。
例えばtype traits支援とかC99の%a書式とか。
0784デフォルトの名無しさん
2008/05/15(木) 12:41:47ttp://www.hyuki.com/yukiwiki/wiki.cgi?WhyINoLongerLikeOrUseCPlusPlus
悔しいけど納得した。
0785デフォルトの名無しさん
2008/05/15(木) 13:24:390786デフォルトの名無しさん
2008/05/15(木) 14:04:260787デフォルトの名無しさん
2008/05/15(木) 14:14:04時間の掛かる修正
度重なる保守
0788デフォルトの名無しさん
2008/05/15(木) 14:15:270789デフォルトの名無しさん
2008/05/15(木) 14:30:050790デフォルトの名無しさん
2008/05/15(木) 14:57:100791デフォルトの名無しさん
2008/05/15(木) 15:08:56気を付けないと保守が大変というのはわかる。
ただ、どの言語でも保守の問題はあるし、気を付ければ
そんなに問題ないと思ってるけど。まぁ、5年後になんて
言っているかはわからんが。
0792デフォルトの名無しさん
2008/05/15(木) 15:57:49演算子オーバロードは危険だと思ったなら、単にその機能を使わなければよい。
参照は不要でポインタがあれば十分だと思ったなら、単にその機能を使わなければよい。
添え字が範囲の中にあるかテストしてほしいと思ったなら、at()メンバ関数を使えばよい。
なぜ、C++の全機能 vs Cの比較なんだろう?
C+α(Better C) vs Cの比較をしないのはなぜだ?
要するに、マヌケだってことだ。
0793デフォルトの名無しさん
2008/05/15(木) 16:00:18C++に過剰に複雑なところがあるのは同意なので、
その人(翻訳者でなく)がC++嫌ですって言うこと自体に批判は特に無いけど、
ちょっとツッコミ書くてst。
>C の方を使いたくなる
別に複雑な機能を使わなくても、
・#defineマクロ(MAXなど)の代わり程度のtemplate
・fopen,fcloseみたいなのをRAIIに扱うための極薄ラッパー
などの簡単で便利なものだけ「better C+おまけ」程度に使えば良いと思う。
巧みで知識もあると言う割には、要領が悪い気がしないでもない。
>Java や Groovy に
そこでGroovyは無いと思う・・・
俺もjava好きだから良いんだけど、
もうちょっと他の言語も挙げれば良いのに・・・
0794デフォルトの名無しさん
2008/05/15(木) 16:17:12ググったら実質両方Javaでワロタw
0795デフォルトの名無しさん
2008/05/15(木) 16:22:57> C+α(Better C) vs Cの比較をしないのはなぜだ?
自分一人で遊んでいるときしか、そういう使い方がうまくいかないからでは。
0796デフォルトの名無しさん
2008/05/15(木) 20:19:220797デフォルトの名無しさん
2008/05/15(木) 21:02:02> C++の全機能を使わなければならない、という規約でもあったのだろうか?
あるとしたら逆だろう。○○しか使ってはいけない、という規約が無くてカオス化する。
あるいは、そういう規約がちゃんと機能して、自分の仕事がうまくいっているとしても、
「ここまでの規約が無ければ収拾つかなくなるC++って・・・」という虚しさは感じることになる。
「C++に文句を言う奴は、C++を使い切れないマヌケだけ」
というのは、C++信者の反撃としては割とお約束だし、部分的には当たっている。
実際、「一人でちょっとしたものを作ることさえできない」人間の八つ当たりも結構見られるし。
ただ、C++の難点というのは、主に「個人の能力ではどうにもならないところ」に表れるものであって、
この話を個人の能力に全部収めて着地させようというのは、わかっててやってるなら
いかにも姑息な「問題のすり替え」ではある。
0798デフォルトの名無しさん
2008/05/15(木) 21:14:38ってどこだろう
0799デフォルトの名無しさん
2008/05/15(木) 21:19:29そういう風にして複数の脳味噌によって構築された「すんげえ規模」とか。
0800デフォルトの名無しさん
2008/05/15(木) 21:21:470801デフォルトの名無しさん
2008/05/15(木) 21:37:500802デフォルトの名無しさん
2008/05/15(木) 21:39:21それはC++に限った話じゃないな
CでもJavaでもPHPでもよくある話だ
>>800
ABIが規定されていてうまく機能している言語ってあります?
ちなみに、自分はC++信者なわけではない
素直な感想と疑問
0803デフォルトの名無しさん
2008/05/15(木) 22:46:45どの言語でも仕事で coding する時は文法的に正しければなんでも良い
なんてことは無いはずだが。規約を全く無くせば収拾つかなくなると思うが。
規約を決めるのを C++ に限ったことではない。
元の記事はむしろ binary の compatibility を問題にしてるんじゃないかな。
0804デフォルトの名無しさん
2008/05/15(木) 23:05:02「有るか無いかでいったら、どの言語にだってあるぞ」
というのは確かにその通りだけど、この場合はC++の「度合いのひどさ」を問題にしているわけで、
ゼロじゃないからどの言語もみんな仲間! ってのは、話の持って行き方としてちょっと違うと思う。
0805デフォルトの名無しさん
2008/05/15(木) 23:15:56でもJavaぐらいだと>>799の問題は似たようなものな気がするけど
だんだん複雑になってきてるし
ある程度表現力が高い言語になると普遍的な問題じゃないかな
C++だとまともに書けない人でもJavaなら書けるのだろうか
そんな人がPythonならまともに書けるのか?
0806デフォルトの名無しさん
2008/05/15(木) 23:39:39名前マングリングに関しては確かにC++のは委員会とかの人も
普通に「どうにかしたい」って思ってそうだけど、
実質、ABIがさえ合えば問題無し、って程簡単じゃないから
再コンパイルした方が良い。
UNIX、Linux系ではオプションの変更程度で再makeすることも多いし。
それに完全にバイナリで使うなら.soとか.dllで考え方が良い。
0807デフォルトの名無しさん
2008/05/15(木) 23:46:070808デフォルトの名無しさん
2008/05/16(金) 00:27:21compile し直そうが残る問題が多いけど。特に保守性考えると。
件の ABI の問題は compile し直せばいい問題じゃないの?
(だから問題になりえないと言っているわけではないが)
ちょっと違うことを問題にしていて議論が混ざってる気がする。
0809デフォルトの名無しさん
2008/05/16(金) 21:20:35代入演算子をprotectedないしprivateにしたいんですが、
実装はデフォルトで生成されるものそのままでいいんです
class Hoge
{
// さまざまなメンバ変数(代入演算子があったりなかったりする)
Hage hage;
Fuga fuga;
int hensuu;
protected:
Hoge& operator=(const Hoge&);
};
ってやったらリンクエラーになるんですがどうすればいいでしょう
イチイチ中身書くのも面倒で・・・
0810デフォルトの名無しさん
2008/05/16(金) 22:07:430811デフォルトの名無しさん
2008/05/16(金) 23:25:470812デフォルトの名無しさん
2008/05/16(金) 23:26:250813デフォルトの名無しさん
2008/05/17(土) 01:09:30こういう時ってどうすればいいのでしょうか??
ご教示いただけると幸いです。
0814デフォルトの名無しさん
2008/05/17(土) 01:16:560815デフォルトの名無しさん
2008/05/17(土) 01:21:39いえ、const char [] 型に0x00を含む文字列を格納して、cout とかで出力しようとすると0x00以降が出力されないんです。
0816デフォルトの名無しさん
2008/05/17(土) 01:22:370817デフォルトの名無しさん
2008/05/17(土) 01:22:590818デフォルトの名無しさん
2008/05/17(土) 01:24:21たとえばstr.resize(10000,'\0'); cout<<str;とする。
0819デフォルトの名無しさん
2008/05/17(土) 01:24:530820デフォルトの名無しさん
2008/05/17(土) 01:25:580821デフォルトの名無しさん
2008/05/17(土) 01:27:560を含むなら長さを自分で指定するmemcpyやmemcmpを使う。
0822デフォルトの名無しさん
2008/05/17(土) 01:28:55char配列の内容がNTCSであることを仮定している関数・APIに
NTCSでないchar配列を突っ込んでいることが間違いなだけ
0823デフォルトの名無しさん
2008/05/17(土) 01:47:420x00を入れると格納はされているけど出力できていなかったということですね。
長さを指定したら出力できました。
レス下さった方々ありがとうございましたm(_ _)m
0824デフォルトの名無しさん
2008/05/18(日) 02:40:02目標は,動画編集アプリケーションの作成です。
C++(C++/CLI win32api), VC++, C#, Java
の中なら,どれを選択すべきでしょうか?
(ちなみに,上記4つと、C,PHP, JSP/Servletの基礎は習得致しました。)
0825デフォルトの名無しさん
2008/05/18(日) 02:44:46まずJavaが消えるでしょう
0826デフォルトの名無しさん
2008/05/18(日) 02:51:190827デフォルトの名無しさん
2008/05/18(日) 02:55:090828デフォルトの名無しさん
2008/05/18(日) 02:59:260829デフォルトの名無しさん
2008/05/18(日) 03:01:010830824
2008/05/18(日) 03:03:26この"C++"とは、VC or C++Builder どっちを指しているのでしょうか?
C++で動画編集アプリケーション作成する場合、参考になる本はありますか?
ご教授お願いします
0831デフォルトの名無しさん
2008/05/18(日) 03:05:32経験者歓迎っつうのは仕事で使った事あるかという事だが
0832デフォルトの名無しさん
2008/05/18(日) 03:46:190833824
2008/05/18(日) 04:07:35>>826
>>827
>>831
>>832
さん。ありがとうございました。
まず、DirectXの勉強をいたします。。
もし、オススメの本をご存知なら、教えてください。
お願いいたします。
現段階で私が選らんだ本は、
マスタリングDirectXプログラミング
DirectX ゲームグラフィックス プログラミング Ver. 2.1 Vista
です。
0834デフォルトの名無しさん
2008/05/18(日) 09:53:45動画編集といいつつ、実はニコ動投稿用を想定してるとかなら、C#で十分な気も。
プログラミングの勉強という意味ならC++でいいと思うけど。
0835デフォルトの名無しさん
2008/05/18(日) 11:41:49DirectShow だっしょ
0836デフォルトの名無しさん
2008/05/18(日) 13:22:19cClass &operator = (const cClass &a)
{
ここでデフォルトの「=」を使いたい!
・
・
・
}
0837デフォルトの名無しさん
2008/05/18(日) 13:37:23デフォルトの = が定義されないから
無理やね。残念ながら。
0838デフォルトの名無しさん
2008/05/18(日) 13:51:00ありがとう
0839824
2008/05/18(日) 14:24:49レス、ありがとうございます。
今回は,ニコ動投稿を考えていません。
(ただ,面白そうなので,そのうちアプリケーションに追加したいと思ってます)
主に,プログラミングの勉強です。
>>835
!!!
ありがとうございます。
現時点では,洋書はすらすらと読めません。
そのため,和書のDirectX本でDirectXの基礎を勉強する。
それから,英語・DirectShowの勉強を始めます。
皆さん,本当にありがとうございました。
0840デフォルトの名無しさん
2008/05/18(日) 15:02:380841デフォルトの名無しさん
2008/05/18(日) 15:14:15Part4立てちゃってもいいかも。
0842デフォルトの名無しさん
2008/05/18(日) 20:18:01おお、そうだった
自分も苦労したのに、もう忘れてる
0843デフォルトの名無しさん
2008/05/18(日) 20:49:57part3は半月もせずに落ちたんだな
0844デフォルトの名無しさん
2008/05/18(日) 23:43:45要はCOMなので分かってればそうそう難しくもない
0845デフォルトの名無しさん
2008/05/18(日) 23:49:08あー頭が割れるくぉおおぉぉx
COMがぁCOMがぁ襲ってくるよぉ
ハァハァハァ
0846デフォルトの名無しさん
2008/05/19(月) 00:13:38string s;
s = 10;
ofstream fout("test.txt");
fout << s;
このプログラムで出力したtest.txtをバイナリエディタで見てみると、
0x0D 0x0A
となっています。0x0Dってのはなんなのでしょう。
11の時はちゃんと0x0Bだけになっているし、20の時はちゃんと0x14だけになっています。
なぜか10の時だけ0x0Dが付加されてます。
0847デフォルトの名無しさん
2008/05/19(月) 00:16:140848デフォルトの名無しさん
2008/05/19(月) 00:28:20バイナリモードで開けばおk
0849デフォルトの名無しさん
2008/05/19(月) 00:34:46まずここが間違い。
stringstreamを使うこと。
0850846
2008/05/19(月) 00:40:40ありがとうございましたm(_ _)m
すいませんついでにもう1つ教えていただきたいのですが、
string s;
s = 20;
ofstream("test.txt");
fout << s;
のような感じにすると、バイナリの0x14がちゃんと出力されるので
string型オブジェクト = int型の値
の代入で、うまいぐあいにstring型に変換してくれるのだと思っていたのですが、
ふと2バイト以上必要な数値はどうなるのだろうと思って
s = 512;
fout << s;
のようにしてみると、0x00が出力されてしまいました。
2バイト以上必要な数値でもうまくstring型のオブジェクトに格納するにはどのようにすればよいのでしょうか??
アドバイスいただけると幸いです。
0851846
2008/05/19(月) 00:44:27すいませんリロードしないで書き込んでました。
stringstream ss;
ss << (char)20;
のような感じでうまくいきました!ありがとうございましたm(_ _)m
0852デフォルトの名無しさん
2008/05/19(月) 00:44:270853846
2008/05/19(月) 00:59:41stringstream ss;
ss << 512;
とすると、stringstreamでも0x00が出力されてしまっていました。
このやり方では2バイト必要な文字の場合は最後の1バイトしか出力されないようなのですが、
stringオブジェクトに 例えば 10進数の513をバイナリの0x01 0x01 と格納したいような時はどうすればよいでしょうか・・
>>852
ありがとうございます。調べてみます。
0854846
2008/05/19(月) 01:01:09○2バイト必要な数字
ですね。。度々すいません。
0855デフォルトの名無しさん
2008/05/19(月) 01:03:27それはstring型に変換しているとは言わないと思うんだが・・・。
バイト列を出力したいのか、文字列を出力したいのははっきりさせた方がいい。
文字列なら、例えば10進数で"20" "512"と出力されるだろう。
0856デフォルトの名無しさん
2008/05/19(月) 01:05:130857デフォルトの名無しさん
2008/05/19(月) 01:13:35ネットワークエンディアン(ビッグエンディアン)とかで出した方が良いと思う。
0858デフォルトの名無しさん
2008/05/19(月) 08:35:42int i = 513;
ofstream fout("result.bin", ios::binary);
fout.write((char*)&i, sizeof(i));
たぶんこんな感じ(テストしてないから間違ってるかも、あと環境依存がある)。
0859デフォルトの名無しさん
2008/05/20(火) 09:38:31s = 20 っていう代入はエラーにならないんだな。この代入演算子は危ないだけのような
気がする。 char 1文字にしたけりゃ assign() 使えばいいし。
0860デフォルトの名無しさん
2008/05/20(火) 10:14:18それって、stringクラスにint型からの型変換は定義されてないけど、
int型の代入演算子は定義されてる、ってこと?
0861デフォルトの名無しさん
2008/05/20(火) 10:25:07char 型を受け取る代入演算子に int が食われてる。
0862デフォルトの名無しさん
2008/05/20(火) 10:44:14g++ -Wall してみたけど、そうだね。
string s(20);
string s=20;
はだめで
string s; s=20; は warning 無しで OKってのは紛らわしい。
ついでに入ってるは DC4 とかだし。
0863デフォルトの名無しさん
2008/05/20(火) 11:01:480864デフォルトの名無しさん
2008/05/20(火) 11:09:120865デフォルトの名無しさん
2008/05/20(火) 11:10:220866デフォルトの名無しさん
2008/05/20(火) 12:49:46細かいクラスの実装まで理解しないとプログラムできないのか・・・
オブジェクト指向って、そう言うことしなくても
プログラムできるのがウリじゃなかった?
0867デフォルトの名無しさん
2008/05/20(火) 13:05:35> オブジェクト指向って、そう言うことしなくても
> プログラムできるのがウリじゃなかった?
ちゃんとドキュメントがあれば問題はない。
0868デフォルトの名無しさん
2008/05/20(火) 13:09:43あと、 stringstream はやめにしてこれからは sstream を使って頂戴って話になってなかったっけ?
0869デフォルトの名無しさん
2008/05/20(火) 13:10:340870デフォルトの名無しさん
2008/05/20(火) 13:52:48何が言いたいんだかよくわからん。重箱の隅をつついたような
あいまいなコーディングをせず、安全第一でしなきゃいかんでしょ。
> 結局、ヘタしたらソースまで読んで、
> 細かいクラスの実装まで理解しないとプログラムできないのか・・・
どんな言語でも「ヘタしたらソースまで読んで…」というのは
当てはまると思うけどね。「ヘタしたら」なんだから。
0871デフォルトの名無しさん
2008/05/20(火) 17:05:23夢の言語と比較しての批判でしょう、たぶん。
0872デフォルトの名無しさん
2008/05/20(火) 18:12:46仕事で書くソースにboostを使いたくない事だけは確か。
少なくとも俺はね・・・。
>>866
そういうウリは無いよ。
>>868
strstreamは使うな、の間違いじゃね?
sstreamはstringstream使うときにincludeするファイル名だよ。
0873デフォルトの名無しさん
2008/05/20(火) 19:06:4510年以上前から欠陥品って言われてるような標準のfunctionalとかstream系のような
欠陥品をそのまま使うなんてありえない、boostで提供される改良版使いたいっていう主張ね
boostって標準ライブラリの欠点を補うようなものも多いし
そういうのなら仕事でもガンガン使えると思うんだけどどうか
0874デフォルトの名無しさん
2008/05/20(火) 19:18:240875デフォルトの名無しさん
2008/05/20(火) 22:31:19COM COM たっぷりCOM
0876デフォルトの名無しさん
2008/05/20(火) 22:57:06他の言語で書いて速さが必要な箇所だけC++で書けばそれでいいんじゃなかろうか
0877デフォルトの名無しさん
2008/05/20(火) 23:02:35Cと違って他言語から呼び出すのは難しいけど
Win限定ならC#でGUI書いてキツイ所はC++/CLIとかできるし
0878デフォルトの名無しさん
2008/05/20(火) 23:02:53C++ は全部を知ろうと思ったら大変だよ。C 全ても含まれるし
かなり重複がある。それでついでに STL+boost 位は必要。
ただ、それ全てを知る必要は無いけどな。
0879デフォルトの名無しさん
2008/05/20(火) 23:13:20MFCとATL覚えるのに手一杯でさ・・・
0880846
2008/05/20(火) 23:14:47fout.write((char*)&i, sizeof(i));
これでうまく行きました。
スタンダードMIDIファイルを吐くプログラムを作ってて、ビックエンディアンで並べないといけないところがあったのですが
ss << p[3] << p[2] << p[1] << p[0];
みたいな感じで書いてなんとかなりました。
ありがとうございましたm(_ _)m
0881デフォルトの名無しさん
2008/05/20(火) 23:21:53boost は便利なものがあるから、あることを知っていて何か
「これはあるべきだけど無い!」みたいなものがあったときに
探すと良いと思う。かなりの確率である。
boost 全てについて学ぼうなんて考えない方が良い。
0882デフォルトの名無しさん
2008/05/20(火) 23:26:29tr1に入った奴位は覚えとけばいいんじゃね
shared_ptrとか便利だよ
0883デフォルトの名無しさん
2008/05/20(火) 23:28:100884デフォルトの名無しさん
2008/05/20(火) 23:42:47作ってみたけどなかなかboostまでいかない
どうしてなんだろう
0885デフォルトの名無しさん
2008/05/20(火) 23:47:490886デフォルトの名無しさん
2008/05/20(火) 23:54:51心配するなって。ものによると思うよ。
自分に必要なものなら、これだ!ってわかるさ。
あと、比較的簡単に入れるのも多い。
ただ、初め何を言ってるのかさーっぱりのもある。
0887デフォルトの名無しさん
2008/05/21(水) 00:02:09boost:anyの関数名だけみて
oreore:any作ってみたが
全然あっちの方がいけてるって話
発想レベルが腐ってるんだろうな
0888デフォルトの名無しさん
2008/05/21(水) 00:04:32でも書いてみるってのはいいと思うぞ。
自分でやれば、Boostの実装がいいってのが実感できる。
0889デフォルトの名無しさん
2008/05/21(水) 00:05:040890デフォルトの名無しさん
2008/05/21(水) 00:08:53コピーコンストラクタで一部の値だけ新しい値を与えてオブジェクトを生成したいのですが、こういう書き方はアリ(普通に使うか)でしょうか?
class Base
{
public:
Base( int newID, const Base& rhs ) : m_id( newID ), m_param( rhs.m_param ){}
virtual ~Base(){}
private:
int m_id;
int m_param;
};
class Derived : public Base
{
public:
Derived( int newID, const Derived& rhs ) : Base( newID, static_cast<const Base&>( rhs ) ), m_name( rhs.m_name ){}
virtual ~Derived(){}
private:
string m_name;
}
0891デフォルトの名無しさん
2008/05/21(水) 00:13:50標準ライブラリでもlocaleでそういうことやっている。
0892デフォルトの名無しさん
2008/05/21(水) 00:50:38親クラスの型なんてどうやってチェックしてんだかさっぱわからん
0893デフォルトの名無しさん
2008/05/21(水) 00:54:30そのうちどこのコンパイラも似たようなものを用意するに違いない。
0894デフォルトの名無しさん
2008/05/21(水) 08:28:05boostはあらゆる環境で使えるわけだが、
VC++固有の話をしただけじゃ全然わかったことになってないぞ
0895デフォルトの名無しさん
2008/05/21(水) 18:20:490896デフォルトの名無しさん
2008/05/22(木) 13:20:28例外というのは関数の戻り値によるエラー処理と違ってどういうメリットがあるんですか?
なんか例外はBasicのGoto文みたいで流れが読めなくて気持ち悪いんですけど。
0897デフォルトの名無しさん
2008/05/22(木) 13:37:11戻り値の確認を忘れるヘマを避けられる。
あと、戻り値を持たないコンストラクタからも使える。
0898デフォルトの名無しさん
2008/05/22(木) 13:39:12例えば
int foo() {
if (bar() == 失敗) return 失敗;
if (baz() == 失敗) return 失敗;
if (hoge() == 失敗) return 失敗;
return 成功;
}
のようなものを
void foo() {
bar();
baz();
hoge();
}
と書いて失敗を例外で投げればコードが簡潔
あとコンストラクタなどの戻り値を取れない関数でエラーを返すのに使ったり使わなかったり
0899デフォルトの名無しさん
2008/05/22(木) 13:42:21「コンストラクタから例外を投げるな!」
って、どこかで聞いた気がするけど、そうでもないのか?
0900デフォルトの名無しさん
2008/05/22(木) 13:46:57「デストラクタから例外を投げるな!」
の間違いでは?
0901デフォルトの名無しさん
2008/05/22(木) 13:49:14例外安全を心掛けないと資源リークする可能性がやや上がるというだけ。
deleteとかを生で使うな、auto_ptr/shared_ptrとかvectorとかを使え、で大体済む話。
0902デフォルトの名無しさん
2008/05/22(木) 14:02:32ttp://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html
0903デフォルトの名無しさん
2008/05/22(木) 14:15:290904デフォルトの名無しさん
2008/05/22(木) 16:11:34まずfunction-try-catch使うとか、throw;書くとかして例外を投げなおせよ。
0905デフォルトの名無しさん
2008/05/22(木) 16:18:54普通は↓だし。
struct foo {
std::auto_ptr<A> a;
std::auto_ptr<B> b;
foo() : a(new A), b(new B){
...
}
};
0906デフォルトの名無しさん
2008/05/22(木) 17:30:52処理の流れとか気にしなくても良い
0907デフォルトの名無しさん
2008/05/22(木) 22:05:150908デフォルトの名無しさん
2008/05/22(木) 22:25:44コンストラクタで例外を発生させないためだけに、コンストラクタと
それに続く処理を分けたメソッドを作るのは、俺はダサいと思う。
0909デフォルトの名無しさん
2008/05/22(木) 22:35:000910デフォルトの名無しさん
2008/05/22(木) 22:36:59ttp://shinh.skr.jp/loki/SmallObj.html
MemoryPoolのBigObject Class FがUseMemoryPool<C, 4000>を継承していますが
UseMemoryPool<F>でなくても良いんでしょうか?
0911デフォルトの名無しさん
2008/05/22(木) 22:37:59絶対に確保に失敗しないリソースがあるなら別だけど
0912デフォルトの名無しさん
2008/05/22(木) 22:47:36出力ストリーム(std::ostream &)またはファイル名(const char *)
を引数に取るコンストラクタを作りたいのですが、どうやるのが一番スマートでしょうか?
とりあえず以下のようにしてみたのですが、
class Logger {
private:
std::ostream *logOs;
public:
Logger(std::ostream &os = std::cout): logOs(&os) {}
Logger(const char *file): logOs(new std::ofstream(file)) {
if (!*logOs) { /* エラー処理 */ }
}
~Logger() { delete logOs; }
};
これでは不十分で、コンストラクタの引数が出力ストリームのときは
デストラクタでlogOsをdeleteしないようにする処理も必要です(ダサい)。
また、デストラクタでdeleteすること自体もできればやめたいです。
そのためにはlogOsをポインタではなくstd::ostream自身にする必要があると思い、まず
class Logger {
private:
std::ostream logOs;
public:
Logger(std::ostream &os = std::cout): logOs(os) {}
};
とだけ書いてみたところ、以下のようなエラー(他にも色々)が出ました。
が、意味が分かりません。orz
/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/ios_base.h:779: error: 'std::ios_base::ios_base(const std::ios_base&)' is private
グダグダと書いてしまいましたが、何かアドバイスがあればお願いします。
0913デフォルトの名無しさん
2008/05/22(木) 23:07:04エラーの内容は、「std::ostreamのコピーコンストラクタは使用が禁止されているからlogOs(os)はできないよ」
前者のクラスの設計について思ったんだが、一つ目のコンストラクタではクラス外からオブジェクトを持ってきているのに
二つ目ではクラス内で完結していて、しかもデストラクタでdeleteしている。何故こんなに中途半端なのか?という疑問。
クラスを横断するオブジェクトを保持したいのならauto_ptrなりshared_ptrなりを使えば良いし、
そうでないならクラス内でヒープから持ってくるオブジェクトも完結させる。
0914デフォルトの名無しさん
2008/05/22(木) 23:15:21直前で散々話題になってるのに・・・w
生のdelete使うなw
>どうやるのが一番スマートでしょうか?
まず、スマートポインタを使う。
俺ならファイル名貰うコンストラクタなんて作らない。
std::ostream&か、std::auto_ptr<std::ostream>を貰う。
0915デフォルトの名無しさん
2008/05/22(木) 23:15:58class Logger {
std::ostream * pOs;
std::ostream & rOs;
public:
Logger(std::ostream & os) : pOs(NULL), rOs(os) {}
Logger(const char * file) : pOs(new std::ofstream(file)), rOs(*pOs) {}
~Logger() { delete pOs; }
};
とりあえずオリジナルのLoggerを尊重してみた。
ただ何かイマイチだね。うまく言えないけど。
0916デフォルトの名無しさん
2008/05/22(木) 23:21:010917デフォルトの名無しさん
2008/05/22(木) 23:23:360918デフォルトの名無しさん
2008/05/22(木) 23:26:19delete するかどうかのフラグを持ったスマートポインタを使えばいいのさ。
0919デフォルトの名無しさん
2008/05/22(木) 23:32:09ここまで読んで思った。
ostreamのポインタってすごく気持ち悪いの俺だけ?
0920912
2008/05/23(金) 01:03:31>>913
エラーの意味は分かりました。禁止されている理由については以下を読んで何となく分かりました。
http://imt.uni-paderborn.de/download/solaris/Sun_Studio_11/CD1/kits/ide/packages/SPJAhtstd/reloc/SUNWspro/prod/lib/locale/ja/html/manuals/stdlib/user_guide/loc_io/13_2.htm
後半はちょっと意味が分かりませんでした。orz
>>914, 919
確かにストリームに加えてファイル名まで指定可能にするというのは欲張りというか、
綺麗な設計ではないのかもしれません。ストリームのみ指定可能とすればよいなら
std::ostream &logOsで簡単に実現可能なんですよね。
std::ostream *は私も気持ち悪いです。
0921912
2008/05/23(金) 01:12:50なるほどです。あとは >>914 さんが指摘しているように、
pOsをスマートポインタにすれば今のところ最もスマートな方法だと思います。
ストリームとファイル名の両方を指定可能にするには、
std::ostream * の使用は避けられないのかもしれません。
0922デフォルトの名無しさん
2008/05/23(金) 01:30:40「そんなに」ってどういうこと?
最低限の auto_ptr を使うだけでも何か引き換えにするものがあるとでも言うの?
0923デフォルトの名無しさん
2008/05/23(金) 11:00:27class Logger {
std::ostream & rOs;
public:
Logger(std::ostream & os) : rOs(os) {}
};
class FileLogger: public Logger {
std::ofstream ofs;
public:
FileLogger(const char * file) : Logger(ofs), ofs(file) {}
};
0924デフォルトの名無しさん
2008/05/23(金) 13:15:00タスクマネージャーの空き容量より小さい値でも確保できないときがあります。
これは、メモリの断片化などで連続領域が確保できない。
ということでよろしいのでしょうか?
また、これを回避して大容量の連続領域を確保する方法はあるのでしょうか?
ちなみに、空き容量1.9GBで500MBの連続領域が確保できませんでした。
確保の関数はnewを使っています。
よろしくお願いします。
0925デフォルトの名無しさん
2008/05/23(金) 13:25:43仮想記憶だからプロセス間での断片化は関係ないはずだが。
0926デフォルトの名無しさん
2008/05/23(金) 14:01:07VC6ならプロジェクトオプションに /Zm何たら と指定すればいいんだ
僕は頭が悪いのにC++を使っているよ
0927912
2008/05/23(金) 14:55:06なるほど、継承を使ってostream &とofstreamを組み合わせるわけですね。
で、>>915 と見比べながら考えていたら、
継承を使わなくても実現できるのではと思い、
class Logger {
std::ofstream ofs;
std::ostream &rOs;
public:
Logger(std::ostream &os): ofs(0), rOs(os) {}
Logger(const char *file): ofs(file), rOs(ofs) {}
};
としたところ、これでも動きました!
なぜ >>915 を見たときに思いつかなかったんだろう?
ostreamとofstreamを混在させるという発想がなかった
のかもしれません。
ちなみにofsとrOsの宣言の順番を逆にしても、つまり初期化子を
rOs(ofs), ofs(file) としても動きました。ちょっと不思議です。
0928デフォルトの名無しさん
2008/05/23(金) 14:57:18C++の問題というわけではないので、環境依存スレで聞いた方が良いよ
XPだと標準設定で512MBまでは確保できたと思うが、レジストリの値とか確認してみると良い
0929デフォルトの名無しさん
2008/05/23(金) 15:04:59メンバ変数は宣言した順に初期化される。
初期化子の順番は関係ない。
0930デフォルトの名無しさん
2008/05/23(金) 15:43:40template< const char* T >
void basic_test( const char* test )
{
puts( T ); // ファイル名
puts( test ); // 書き込み
}
int _tmain(int argc, _TCHAR* argv[])
{
basic_test< "test.log" >( "test" );
return 0;
}
こんな感じで使いたい
0931デフォルトの名無しさん
2008/05/23(金) 15:51:200932デフォルトの名無しさん
2008/05/23(金) 16:10:35>>926
>>928
回答ありがとうございました。
環境依存スレでも質問してみたいと思います。
0933デフォルトの名無しさん
2008/05/23(金) 16:29:23できませんでした
0934912
2008/05/23(金) 16:43:25失礼、説明不足でした。
ofsとrOsの変数宣言の順番と初期化子の順番の両方を逆にしても
動いたということです。つまりrOs→ofsの順番にした場合、
Logger(const char *file): rOs(ofs), ofs(file) {}
というコンストラクタにおいて、rOs(ofs)が先に実行されるはずですが、
ofsが初期化されていないのに実行できるのかという疑問があります。
もしかすると、初期化における代入の依存関係を見て
ofsが先に初期化されたりするんでしょうか。
0935デフォルトの名無しさん
2008/05/23(金) 17:15:23初期化リストの並びは初期化の順番に関係ない
あくまでもメンバ変数の宣言順に実行される
0936デフォルトの名無しさん
2008/05/23(金) 18:14:59ちゃんと読んでやれよ・・・w
>>934
普通に未初期化のまま、ofsの参照が渡ってる。
あまり良くない方法ではあるものの、
未初期化のインスタンスの
メンバにアクセスしなければ問題無い。
なので、そのLoggerの実装なら大丈夫。
0937912
2008/05/23(金) 21:12:07> 普通に未初期化のまま、ofsの参照が渡ってる。
色々試してみて理解できました。
初期化子においてrOs(ofs)が先に実行される時点では
ofsは存在さえしないと思っていたんですが、存在はしていて、
ただし初期化されていない(=引数なしでコンストラクタが呼ばれてofsが生成された)
状態なんですね。
0938デフォルトの名無しさん
2008/05/23(金) 21:37:48いや、ofsのコンストラクタは呼ばれてない。
メモリが確保されてるだけ。(アドレスは確定してる)
0939デフォルトの名無しさん
2008/05/23(金) 21:40:34未定義動作な匂いがプンプンするんだが。
0940デフォルトの名無しさん
2008/05/23(金) 21:46:42キモイから俺は参照もしないけど。
0941デフォルトの名無しさん
2008/05/23(金) 22:01:38というか折角分離したのに何故わざわざくっつけるんだ?>>927
0942912
2008/05/23(金) 22:03:38なるほど、そういうことですか。
それなら処理時間のオーバーヘッドもほとんどないですね。とはいえ、
>>940
確かにキモいので私も実際にはofs→rOsの順番にしときますが。
0943デフォルトの名無しさん
2008/05/23(金) 23:12:21>というか折角分離したのに
あ、俺もそれ思ったw
0944912
2008/05/24(土) 10:51:36ファイル名を引数にとるコンストラクタ以外のインタフェース(メソッド関数)
が実装を含めて同じだからです。
逆に分離した場合、FileLoggerの方で記述されるのは
・メソッド変数ofsの追加
・ファイル名を引数にとるコンストラクタの追加
のみです。これだけのために分離するメリットを感じませんでした。
一つのクラスにまとめるデメリット、分離するメリットがあれば教えてください。
0945デフォルトの名無しさん
2008/05/24(土) 10:58:48分離してあればファイル以外の ostream に対しても同じクラスがそのまま使える。
(同じことだけど、)混ぜてあると別の ostream に対して使う場合に ofstream が無駄になる。
0946デフォルトの名無しさん
2008/05/24(土) 11:31:21ostream
ofstream
ostringstream
Logger
FileLogger
MemoryLogger
void f1(Logger& log){
...
}
void f2(){
FileLogger log("a.log");
f1(log);
}
void f3(){
MemoryLogger log;
f1(log);
}
0947デフォルトの名無しさん
2008/05/24(土) 11:41:29標準出力だろうがファイル出力だろうがstring型の変数への出力だろうが
もっと極端なこと言えばFTPでファイルうpする処理だろうが、
何かを出力する処理ならばostreamに対応した処理を1回書けばいい、
っていうのがostreamの理念。
その関数を呼ぶ側であらかじめ出力したい対象に対応する
ostream(の派生クラス)を勝手に作っておいて、
osteream対応関数を呼び出せば、
あとはostream(の派生クラス)が良きに計らって
実際の出力対象に出力してくれてる。
0948912
2008/05/24(土) 11:46:19一つのクラスにまとめているとムダなメンバ変数がどんどん増えてしまう
(もしかするとメンバ変数も増えるかも)ので、クラスを分類しておく方が
いいわけですね。
(LoggerとFileLoggerだけを例にとってもofstreamがムダになってる。)
0949デフォルトの名無しさん
2008/05/24(土) 11:50:360950912
2008/05/24(土) 11:55:17ん?そう考えていくと、ostream自身にログを出力するメンバ関数を
追加したくなってきますね。そうすればofstreamでもstringstreamでも
そのログ出力関数をそのまま使えるし。
(つまりFileLogger, StringLoggerのような派生クラスを作る必要がない。)
そういう考えって変?
# 変じゃないとしても、実現方法が分からない…。
0951デフォルトの名無しさん
2008/05/24(土) 12:08:090952デフォルトの名無しさん
2008/05/24(土) 12:12:33うん、正直なくてもいいと思う。
Loggerを"利用する側"でファイルに出力して欲しいなーと思ったときは
std::ofstream ofs(filename);
Logger logger(ofs);
すればいい。
Logger側で何に出力してるかを気にする必要がなくなる。
0953デフォルトの名無しさん
2008/05/24(土) 12:29:07やはり派生してメンバを追加したくなるな。
FileLoggerに最大出力行数を設定して行が溢れたら自動的に
ログファイルの先頭から削除とか。
実際にするかどうかはともかく、将来の拡張に柔軟というのは
考慮に値する特性だと思う。
0954デフォルトの名無しさん
2008/05/24(土) 12:35:34役割を考えるとそれはちょっと違うかな。
ofstreamはストリームで、ログはストリームとは限らないだろう?
ログを出力先はファイルでもメモリでもなく、
システムに用意された関数かもしれない。
Loggerの役割は、ログを出すこと。
ostreamに出力するのも、ログ出力の実装の一例に過ぎないと考えた方がいい。
0955デフォルトの名無しさん
2008/05/24(土) 13:59:480956デフォルトの名無しさん
2008/05/24(土) 17:23:550957912
2008/05/24(土) 18:01:44>>950のような発想をしたんですが、
基本的には>>952のような方法で利用すれば十分ですよね。
と考えると、>>927 のようにファイル名を引数にとるコンストラクタまで
用意するのは車輪の再発明っぽくてあまり美しくないなあと思いました。
>>953,954
ログ出力の実装をostreamの派生クラスによって変えたいかもしれない、
ログ出力の適用先がostream以外にもあるかもしれない、ということですね。
参考になりました。
0958デフォルトの名無しさん
2008/05/24(土) 18:20:45Boost.Iostreamsがある。
http://www.boost.org/doc/libs/1_35_0/libs/iostreams/doc/tutorial/container_sink.html
write()関数と、適切なtypedef2つ(もしくは継承)で書き込みストリームが出来上がる。
読み取りストリームもほぼ同じ感じ。
0959デフォルトの名無しさん
2008/05/24(土) 19:51:07返信ありがとうございます
Javaで駄目だと言われていたので気にしていたのですが…
注意事項というのは、コンストラクタ抜ける前にポインタを使われたりすると問題が起きる、といったようなものですか?
0960デフォルトの名無しさん
2008/05/24(土) 20:25:51Javaで駄目だというのも同じ理由。
初期化が完了していないため、
そのオブジェクトのメソッド(C++ではメンバ関数)などを呼ぶと
予期せぬ状態になる。
逆にいえば、JavaでもC++でも、そのオブジェクトを扱わずに
ポインタ(or参照)を保存するだけに留めるなら問題無い。
ちなみに >>936-940n で同じ話が。
0961デフォルトの名無しさん
2008/05/24(土) 23:36:570962デフォルトの名無しさん
2008/05/24(土) 23:43:46マーセンさん
シーリ・マーセン
0963デフォルトの名無しさん
2008/05/24(土) 23:45:02ファイン・デュアセルフ
0964デフォルトの名無しさん
2008/05/25(日) 00:14:450965デフォルトの名無しさん
2008/05/25(日) 00:20:10モーツァルト
0966デフォルトの名無しさん
2008/05/25(日) 00:23:450967デフォルトの名無しさん
2008/05/25(日) 00:27:30セルゲイ=ストイコビッチ
0968デフォルトの名無しさん
2008/05/25(日) 03:00:46禿
0969デフォルトの名無しさん
2008/05/25(日) 09:26:50inline _com_error& _com_error::operator=(const _com_error& that) throw()
{
if (this != &that) {
this->_com_error::~_com_error();
this->_com_error::_com_error(that); // ココ
}
return *this;
}
よく複数のコンストラクタで同じ処理をしたい場合、コンストラクタから
別のコンストラクタを呼び出すことはできないから初期化関数を
作ること、とされていますが、上記コードがOKならばコンストラクタから
別のコンストラクタを呼び出してもいいように思えます。
実際.net 2003でやってみましたが、問題なく動作します。msの独自仕様なんでしょうか?
0970969
2008/05/25(日) 09:42:46this->をはずすと上手く動いているように見えます。
テストコードはこんな感じです。
class Cls
{
public:
Cls(void){printf("ctor\n");}
Cls(int i){ Cls::Cls();}//ココ
};
int main(void)
{
Cls c; // ctor
Cls c2(1); // ctor
return 0;
}
0971デフォルトの名無しさん
2008/05/25(日) 10:00:030972デフォルトの名無しさん
2008/05/25(日) 10:33:37とりあえず、コンストラクタでthisのアドレス出してみたら?
std::cout << "ctor " << this << std::endl;
0973デフォルトの名無しさん
2008/05/25(日) 10:43:33以下のようにして、thisとkの値をモニタしながらステップ実行してみよう。
class Cls
{
private:
int k;
public:
Cls(void)
{
printf("ctor\n");
}
Cls(int i)
{
k=3;
Cls::Cls();
}//ココ
};
0974973
2008/05/25(日) 10:45:22class Cls
{
private:
int k;
public:
Cls(void)
{
k=5;
printf("ctor\n");
}
Cls(int i)
{
k=3;
Cls::Cls();
}//ココ
};
0975デフォルトの名無しさん
2008/05/25(日) 10:47:10placement newを使う方法ならどのコンパイラでも使える。
#include <new>
T& T::operator =(const T& y)
{
if (this != &y)
{
this->~T();
new(this) T(y);
}
return *this;
}
しかし、コンストラクタの中で例外が起こると非常にまずい
(thisがデストラクタされて状態不定のまま)などの理由で勧められない。
代入演算子をコピーコンストラクタで実装したいという目的に限れば、
Exceptional C++でも紹介されているswapを使う方法がいい。
//その1
T& T::operator =(const T& y)
{
T t(y);
swap(t); //Tのメンバ関数として作っておく
return *this;
}
//その2
T& T::operator =(T y)
{
swap(y);
return *this;
}
0976デフォルトの名無しさん
2008/05/25(日) 10:54:51T & operator =(const T & t)
{
if(this != &t) {
T(t).swap(*this);
}
return *this;
}
0977969
2008/05/25(日) 14:06:49>少なくともbccのほうのコードは、一時オブジェクトが作られて、そのコンストラクタが呼ばれてるだけだと思うけど。
そうでした orz bcc、vc7.1とも。
vc7.1でthisをつけた場合は一時オブジェクトは作られず、自身のコンストラクタ呼び出しになりました。
>>975
placement newはできるんですね。
976が975のその1より低コストというのは、
if(this != &t)が効いてるんですか?それともT(t).swap(*this);の方ですか?
また私はその1でもif(this != &y)にすべき気がするんですが。。。
0978デフォルトの名無しさん
2008/05/25(日) 14:08:310979デフォルトの名無しさん
2008/05/25(日) 14:18:520980デフォルトの名無しさん
2008/05/25(日) 14:22:48どれの?
0981デフォルトの名無しさん
2008/05/25(日) 14:49:18> vc7.1でthisをつけた場合は一時オブジェクトは作られず、自身のコンストラクタ呼び出しになりました。
は標準C++的にはアウトだと思います
ISO/IEC 14882 Second edition 2003-10-15 にも
12.1 Constructors
Constructors do not have names.
とあります。コンストラクタには名前がないのです。つまり明示的に呼び出すことは出来ない
0982デフォルトの名無しさん
2008/05/25(日) 15:12:55「コンストラクタからコンストラクタを呼び出す C++」
0983デフォルトの名無しさん
2008/05/25(日) 15:37:230984デフォルトの名無しさん
2008/05/25(日) 15:55:510985デフォルトの名無しさん
2008/05/25(日) 16:02:32class A {
A(){ this(10); }
A(int n){}
};
//C++的に書くと↓のようなもの
struct A{
A():A(10){}
A(int n){}
};
0986969
2008/05/25(日) 16:08:21T t(y);
swap(t);
より
T(t).swap(*this);
の方がコピー回数が少ないのかなと思いましたが、そんなことないですよね?
>>981
ありがとうございます。名前がないというのは面白いですね。
>>983
欲しいです。初期化子を重複して書かないといけないのが嫌なんですよ。
0987デフォルトの名無しさん
2008/05/25(日) 16:09:48それじゃだめなの?
0988デフォルトの名無しさん
2008/05/25(日) 16:13:17メンバ追加したときに変更箇所が離れてると面倒
ということでC++0xマダー?
0989デフォルトの名無しさん
2008/05/25(日) 16:14:070990デフォルトの名無しさん
2008/05/25(日) 20:11:460991デフォルトの名無しさん
2008/05/25(日) 23:37:410992デフォルトの名無しさん
2008/05/26(月) 00:54:020993デフォルトの名無しさん
2008/05/26(月) 10:25:080994デフォルトの名無しさん
2008/05/26(月) 20:19:02関数がある時点でPODでないのでは。
0995デフォルトの名無しさん
2008/05/26(月) 21:03:410996デフォルトの名無しさん
2008/05/26(月) 23:09:57non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator
and no user-defined destructor. Similarly,
a POD-union is an aggregate union that has no non-static data
members of type non-POD-struct, non-POD-union (or array of such types) or reference, and has no userdefined
copy assignment operator and no user-defined destructor.
A POD class is a class that is either a
POD-struct or a POD-union.
0997デフォルトの名無しさん
2008/05/26(月) 23:25:35non-static data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).
0998デフォルトの名無しさん
2008/05/27(火) 11:25:130999デフォルトの名無しさん
2008/05/27(火) 13:15:541000デフォルトの名無しさん
2008/05/27(火) 13:56:57_.||___|_____||_
.. / /||___|^ l
.. (・ω・`)//|| |口| |ω・` )
. ./(^(^ .//||...|| |口| |c )
... / // ||...|| |口| ||し 新スレです
....... (・ω・`) //.... ||...|| |口| || 楽しく使ってね
/(^(^ // .... .||...|| |口| || 仲良く使ってね
"" :::'' |/ |/ '' " ::: ⌒ :: ⌒⌒⌒ :: "" `
:: ,, ::::: ,, ; ̄ ̄ ̄ "、 :::: " ,, , ::: " :: " ::::
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。