C++相談室 part79
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/03/18(木) 02:25:38ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part78
http://pc12.2ch.net/test/read.cgi/tech/1266070683/
0002デフォルトの名無しさん
2010/03/18(木) 02:26:21[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.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?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2010/03/18(木) 02:27:18[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 C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2010/03/18(木) 02:28:03amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん
2010/03/18(木) 02:28:48Effective 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/
■長いソースを貼るときはここへ。■
http://codepad.org/
0006デフォルトの名無しさん
2010/03/18(木) 02:29:39環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0007デフォルトの名無しさん
2010/03/18(木) 02:31:480008デフォルトの名無しさん
2010/03/18(木) 04:00:550009デフォルトの名無しさん
2010/03/18(木) 04:43:55と思って前スレ以外の名前も確認してみたけどそうでもなかった。
あとこれもちゃんとみとけよ。
☆★☆★☆スーパープログラマー 梶本裕介☆★☆★☆ (dat落ち)
http://pc11.2ch.net/test/read.cgi/prog/1260433369/
日記より
『大阪でプログラマとかしてる25歳の男の子です.
C++標準化委員会にエキスパートメンバとして参加させていただいたりしています.
世にも恐ろしいことにもうすぐ社長さんになるらしいです・・・』
* 公式サイト
http://lunaticengine.org/
■その他スレは無いが捕らえておくべき人達■
→ 悪の同盟 わんくま(επιστημηのアジト) ←
http://www.wankuma.com/
;^_^) C++0x学園用の務員 江添亮 (^_^;
http://cpplover.blogspot.com/
(^o^)/~~ オワタ系モダン翻訳係 アキラ (。ヮ゚)ノ~~
http://d.hatena.ne.jp/faith_and_brave/
( @〜@) 「エット」が口癖のキュートな二次元中毒エキスパート Cryolite
http://d.hatena.ne.jp/Cryolite/
(滝汗 >_<) スーパーマルチアルゴリズマー 稲葉 一浩 (>_< 滝汗)
http://www.kmonos.net/wlog/
0010デフォルトの名無しさん
2010/03/18(木) 04:46:53http://qb5.2ch.net/test/read.cgi/saku/1029860223/
400 名前:名無し[sage] 投稿日:2009/12/17(木) 23:47:58 HOST:p1015-ipbf14wakayama.wakayama.ocn.ne.jp
削除対象アドレス:
http://pc11.2ch.net/test/read.cgi/prog/1260433369/
削除理由・詳細・その他:
板の趣旨に関係のないスレッド
401 名前:仕様書無しさん[sage] 投稿日:2009/12/18(金) 00:20:43 HOST:softbank221030178167.bbtec.net
>>400
なぜ梶本裕介先生のスレッドが削除されなければならないのでしょうか?
梶本裕介先生はプログラマーであるし、スレッドの内容も先生がプログラマーであるが故の話題(プログラミングや技術発表など)が書き込まれています。
趣旨に関係のないスレッドではないと思います。
0011前スレの>>890
2010/03/18(木) 10:06:55C++でのプログラミングって、さっさと書いて作るのを優先して
コードの最適化とかの作業は後回しにすべきなのでしょうか?
それとも最初に書くときから細かい所の最適化に気を配るべきなのでしょうか。
前スレの>>890
template<typename T>
void foo(const T& arg){
if(T::hoge_flag){
func_true(arg);
}
else{
func_false(arg);
}
return;
}
とかです。
0012デフォルトの名無しさん
2010/03/18(木) 10:36:31そんな事一概に言えないだろ
組み込みに使うのかPCで使うのか、開発期間や費用によっても違うし
ただ大規模なプログラムなら、最適化よりもバグの出にくいコーディングを
真っ先に心がけるべき
致命的なバグのあるソフトは価値がない
0013デフォルトの名無しさん
2010/03/18(木) 10:37:53Cと同じで、これはただのギャンブルに過ぎないよ
>最初に書くときから細かい所の最適化に気を配る
なもんで、http://pc12.2ch.net/test/read.cgi/tech/1266070683/892
0014デフォルトの名無しさん
2010/03/18(木) 10:38:29ありがとうございます。
やっぱり一概には言えませんよね。
> 致命的なバグのあるソフトは価値がない
肝に銘じておきます。
0015デフォルトの名無しさん
2010/03/18(木) 10:39:08組み込みのことは知らないが、
開発期間が少ない→最適化は後
費用が少ない→最適化は後
大規模→最適化は後
じゃない?
0016デフォルトの名無しさん
2010/03/18(木) 10:39:28ギャンブル・・・つまりコンパイラが
本当に最適化してくれるかは分からないという
ことですね。
0017デフォルトの名無しさん
2010/03/18(木) 10:40:26最適化が先ってあまり聞かないよな。
・・・必死に最適化しといて、やっぱりそこ使わなくなった
なんてことがたまにあったりして泣きそうになる。
0018デフォルトの名無しさん
2010/03/18(木) 10:42:00うん。その細かいところがボトルネックになるかどうかなんてトータルで動かさないとわかんない
設計さえちゃんとしてれば後からボトルネック部分を解消するのはうまくいく。
0019デフォルトの名無しさん
2010/03/18(木) 10:43:03並のプログラマならパフォーマンスが足りないと思ったときにプロファイラ見ながら
アルゴリズムを変更したり最適化を詰めていったりするのが現実的なところじゃねの
002011
2010/03/18(木) 11:03:43みなさんありがとうございます。
細かいことがいちいち気になって先に進めない性格なのですが、
とりあえず書き上げて完成させてから最適化を考えようと思います。
0021デフォルトの名無しさん
2010/03/18(木) 11:08:07プログラム全体の実行時間の70%〜80%を20%〜30%の部分が占めている
という有名な法則だ
要するに全部書き上げてからプロファイラなどで速度のボトルネックになっている
部分を20%〜30%程度書き換えるだけで十分速くなるという事だな
0022デフォルトの名無しさん
2010/03/18(木) 11:46:07Effective C++で紹介されていた経験則か。
0023デフォルトの名無しさん
2010/03/18(木) 12:52:530024デフォルトの名無しさん
2010/03/18(木) 13:17:460025デフォルトの名無しさん
2010/03/18(木) 14:23:41http://ja.wikipedia.org/wiki/%E6%9C%80%E9%81%A9%E5%8C%96_%28%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6%29
0026デフォルトの名無しさん
2010/03/18(木) 14:58:580027デフォルトの名無しさん
2010/03/18(木) 15:33:09実行速度に支障がでなければおk
「全部最適化しないと遅くて使えない!」っていうんならプロジェクト全体がクリティカルなだけ。
0028デフォルトの名無しさん
2010/03/18(木) 15:40:22そんなプログラムは死んでも組みたくないなw
0029デフォルトの名無しさん
2010/03/18(木) 15:51:46> 「全部最適化しないと遅くて使えない!」
そりゃプロジェクト自体が無謀なんだろうなwwww
0030デフォルトの名無しさん
2010/03/18(木) 16:45:01出力させるときに2通りあるような気がします。
よろしくお願い申し上げます。
0031デフォルトの名無しさん
2010/03/18(木) 17:30:35-0.0001 の小数を切り捨てると -0
0032デフォルトの名無しさん
2010/03/18(木) 17:36:07読みやすさの最適化はちょくちょくやった方がいいと思うの
0033デフォルトの名無しさん
2010/03/18(木) 17:37:340034デフォルトの名無しさん
2010/03/18(木) 18:02:25なるほど。
出力させると違うけど、値としては同じなのですか?
-0==0
は規格でどうなっているのでしょうか?
0035デフォルトの名無しさん
2010/03/18(木) 18:02:550036デフォルトの名無しさん
2010/03/18(木) 18:12:02値が同じだったらなんで出力が変わったりするんだい?
普通は「aもbも出力すると同じなのにa==bが真になりません、なんでですか?」
という質問をする。
0037デフォルトの名無しさん
2010/03/18(木) 18:24:02規格では符号bitが異なるだけだとおもうよ。
003834
2010/03/18(木) 18:26:20> 値が同じだったらなんで出力が変わったりするんだい?
不思議ですよね。
私も不思議です。
ttp://codepad.org/azTmUcr3
>>37
なるほど、そうなのですか。
ありがとうございます。
0039デフォルトの名無しさん
2010/03/18(木) 18:30:09「演算子'=='がtrueを返す」だとすればそれはC++規格上浮動小数点数の処理系依存
0040デフォルトの名無しさん
2010/03/18(木) 18:59:13このクラスのデストラクタ関数内で、hogeを呼び出すのってありですか?
デザイン的にあまりよろしくないとかありますか?
0041デフォルトの名無しさん
2010/03/18(木) 19:02:27それが仮想関数だと公開スコープとかによっては考え物。
004234
2010/03/18(木) 19:11:58ああ、なるほど。
> 「演算子'=='がtrueを返す」だとすればそれはC++規格上浮動小数点数の処理系依存
処理系依存なのですか。
ありがとうございます。
0043デフォルトの名無しさん
2010/03/18(木) 20:27:54テンプレートと組み合わせて使ったら死にそうな思いをしたよ。
Conceptさんが居れば全部丸く収まるのかなぁ。
0044デフォルトの名無しさん
2010/03/18(木) 20:49:53どう死に損なったのかkwsk
0045デフォルトの名無しさん
2010/03/18(木) 21:05:58悪夢はVC++にて発生した。
気付いちゃえば簡単だったんだが、
boolean ? ClassA() : flag ? ClassB() : ClassC()
で、ClassBがClassA型に暗黙に型変換できなかったみたいで、
じゃあ逆にキャストしてくれよと思ったがそれがなんかうまくいかなかった。
(ClassCの兼ね合いか?)
うん、うまく説明出来なくてゴメン。
ネストされたtemplateが変に絡み合っていて、
VC++の吐くエラーメッセージがここから発生してないところがミソだった。
テンプレートコンストラクタのところがおかしいみたいなこといわれて
その辺を頑張ってデバッグしてしまっていた。
結局
boolean ? static_cast<ClassB>(ClassA()) : flag ? ClassB() : ClassC()
これで全部解決したのだが、泣きそうになった。
0046デフォルトの名無しさん
2010/03/18(木) 21:06:37パターン的には呼び出さない方がおかしいと思うよ。
>>43
俺は特に三項演算子で問題になったことはないなあ。
三項演算子 C?A:B は型を持つから、AとBの型を意識してないと
テンプレートの特殊化が思い通りにならない、ということはあるかもしれん。
autoさんが居ればif文に書き換えやすくなるから多少楽になると思う。
0047デフォルトの名無しさん
2010/03/18(木) 21:12:470048デフォルトの名無しさん
2010/03/18(木) 21:14:380049デフォルトの名無しさん
2010/03/18(木) 21:16:51flag ? ClassB() : ClassC()の部分の型ががClassCになって、
ClassCとClassAの間で変換できないからエラーになったと見た
0050デフォルトの名無しさん
2010/03/18(木) 21:23:21型システムに由来するコンパイルエラー。
三項演算子の型については boost の foreach で活用されているらしく、
http://www.artima.com/cppsource/foreach.html
なんかは興味深い(が、役に立たない)
0051デフォルトの名無しさん
2010/03/18(木) 21:26:26だれが想定したろうかww
005245
2010/03/18(木) 21:28:04そこが悪いと言わずに
テンプレートコンストラクタのところがおかしいみたいなことを
言ってきたコンパイラが悪いんじゃねぇかという気がしてきた。
あと、VC++ではこの様に通らなかったのに
gccではコンパイルが通って正常動作していたところが
さらに俺の涙を誘った。
0053デフォルトの名無しさん
2010/03/18(木) 21:45:15俺も気をつけよう…っつか、うち三項演算子禁止だw
0054デフォルトの名無しさん
2010/03/18(木) 22:11:32うまく頭に落ちてこない…
0055デフォルトの名無しさん
2010/03/18(木) 22:21:350056デフォルトの名無しさん
2010/03/18(木) 22:41:54デザパタは知ってるだけじゃ何に使えるのかわからない。
しかし、使うべきときがくれば勝手に覚える。
実際に書いてるコードがデザパタに合致することがよくある。そのときデザパタの知識があれば、有効に使える。
デザパタという形でコードに名前がついてるのは非常に便利。
0057デフォルトの名無しさん
2010/03/18(木) 22:55:15STLのアルゴリズム、 for_each とかはその典型だ
コンテナのアロケータなんかはストラテジーパターンだ
mem_fun や bind1st とかはアダプターパターンだ
0058デフォルトの名無しさん
2010/03/18(木) 22:57:14→じゃあデザパタの名前は別に覚えなくていいか
→設計時の会話で使うので結局名前も覚えないといけない
0059デフォルトの名無しさん
2010/03/18(木) 23:15:29static_cast<void>とか最近まで知らなくて、わざわざvoid用に特殊化してたよ。
0060デフォルトの名無しさん
2010/03/18(木) 23:57:34職場でデザパタで会話したこととかないな
パターンつっても、よりイディオムとして細分化されてたり
あるいは複合してたりもするせいか、
あまりデザパタの名前に実益を感じたこともない
0061デフォルトの名無しさん
2010/03/19(金) 00:05:49だからやっぱり三項演算子が悪いわけなじゃいなと
彼も結論づけているようだぞ。
0062デフォルトの名無しさん
2010/03/19(金) 00:06:190064デフォルトの名無しさん
2010/03/19(金) 00:34:39コードレビューしたときに、ここオブザーバパターン使えるんじゃね?とか。
0065デフォルトの名無しさん
2010/03/19(金) 09:08:40一番簡単なのはT* tを内部に持ってTを動的生成して
未初期化のときはNULLポインタを持つ事で区別、だとおもうのですが
使い方によってはnewによる動的生成を繰り返す事になりそうですが、やはりコスト高になってしまうでしょうか?
0066デフォルトの名無しさん
2010/03/19(金) 10:34:52そりゃnewしないのと比べればコスト高だろうが、それが対象のアプリで問題になるとは
限らない。実測しないとわからないよ。
0067デフォルトの名無しさん
2010/03/19(金) 12:18:32簡単な実装方法として、デフォルトコンストラクタのコストを無視できるとするならば、
template class<T>
class opt
{
0068デフォルトの名無しさん
2010/03/19(金) 12:21:43簡単な実装方法として、デフォルトコンストラクタのコストを無視できるとするならば、
template class<T>
class opt
{
bool valid;
T value;
};
もし、気になるなら placement new を使う。
class opt
{
bool valid;
char value[sizeof(T)]; //ここにplacement newを行う。
};
0069デフォルトの名無しさん
2010/03/19(金) 13:22:531、普通のテンプレート関数は実態が一つにまとめられるようですが
特殊化で型が確定したテンプレート関数は一つにまとめられない?
(VCでそんな感じのエラーが)
2、仮想関数を持つクラスのサイズが、無いクラスより大きくなるのは
コンパイラ依存?仮想化テーブルを持たせない実装も存在する?
気が向いたらでいいので教えてください。
0070デフォルトの名無しさん
2010/03/19(金) 13:39:50stringクラスのインスタンスがあったとき、
そのインスタンスが構築された際のコンストラクタにNULLが
引数として渡されたかどうかを確かめることは出来ますか?
string s(NULL);
0071デフォルトの名無しさん
2010/03/19(金) 13:50:06それ規格に違反してる
NULLで初期化は許されていない
0072デフォルトの名無しさん
2010/03/19(金) 13:58:17基本はプログラム中に同じものの定義はひとつだけ(ODR)なんだけど、
いくつか条件付で複数の定義が認められているものがある。
規格の 3.2 p5 より。
> There can be more than one definition of a class type, enumeration type,
> inline function with external linkage, class template, non-static
> function template, static data member of a class template, member
> function of a class template, or template specialization for which some
> template parameters are not specified in a program provided that each
> definition appears in a different translation unit, and provided the
> definitions satisfy the following requirements. ...
順に並べ上げると、
・クラス
・列挙
・外部リンケージを持つ inline 関数
・クラステンプレート
・非 static 関数テンプレート
・クラステンプレートの static データメンバ
・クラステンプレートのメンバ関数
・いくつかのテンプレート引数が特定されていないテンプレート特殊化
が該当する。こいつらは複数のコンパイル単位にあっても、それらが同じ内容で
あれば(この条件の詳細は上記の引用の続きにある)認められる。
「特殊化で型が確定したテンプレート関数」はこれらに該当しないので、定義を
ひとつだけにする(.cppに置く)必要がある。
0073デフォルトの名無しさん
2010/03/19(金) 13:58:40ありがとうございます
でも警告も出ずにコンパイルは出来ちゃうんですよね。g++
実行時に吹き飛ぶんだからそこで気がつけというのが常識として認知されているということですね
0074デフォルトの名無しさん
2010/03/19(金) 14:00:54仮想関数を持つためにはどうしてもオブジェクトに情報を足さないといけないので、
サイズを増やさないような実装は思いつくだけでも困難だと思う。おそらく存在しない。
0075デフォルトの名無しさん
2010/03/19(金) 14:05:32参考: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#466
0076デフォルトの名無しさん
2010/03/19(金) 14:17:23それでは遅い
規格票読め
0077デフォルトの名無しさん
2010/03/19(金) 14:28:06わかりました。ありがとうございました。
0078デフォルトの名無しさん
2010/03/19(金) 15:25:32ヒントだけでも教えてもらえないでしょうか
vsprintfのstd::string版があればいいのですが
0079デフォルトの名無しさん
2010/03/19(金) 15:33:18激しく同意
0080デフォルトの名無しさん
2010/03/19(金) 15:48:01vsprintf()の結果を返せばいいだけではなくて?
0081デフォルトの名無しさん
2010/03/19(金) 15:49:32boost.format
boostが使えないのなら、vsnprintf()を使って自作するんだね
少なくともgccとVC++では使えるが、戻り値の仕様に差異があるので注意
0082デフォルトの名無しさん
2010/03/19(金) 17:02:460083デフォルトの名無しさん
2010/03/19(金) 19:32:31NULLはC++の標準のマクロじゃないよ。
C++というかSTLではNULLを使わなくてすむようになっている。NULLを使わなければ、実行時に吹っ飛ぶ可能性は減らせる。
0084デフォルトの名無しさん
2010/03/19(金) 20:57:050085デフォルトの名無しさん
2010/03/19(金) 21:56:280086デフォルトの名無しさん
2010/03/19(金) 22:03:38>>70
コンストラクタを呼ぶ前にNULLでないかチェックすればいい。
コンパイラはコードが文法的に正しいかをチェックしているのであって、
プログラマーの意図に沿っているかをチェックしているわけではないよ。
>>78
std::stringにはconst char*を受け取るコンストラクタがある。
char[BUFFER_SIZE] buff;
sprintf(buff, "うんたらかんたら");
return std::string(buff);
出力形式にあまりこだわらないならstd::stringstreamを使った方が無難。
0087デフォルトの名無しさん
2010/03/20(土) 00:14:12(ごちゃごちゃしていてすみません。)
このコードで、
NS_C::get_tripled(const T& arg)
で、
if(T型を受け取る自前のget_tripledが用意されている){
〜〜
}
としていますがこんな分岐をコンパイル時に出来ませんでしょうか。
テンプレートメタプログラミングを使っても、無理でしょうか。
つまり、自前のget_tripled関数が用意されているClassAのときは
NS_C::get_tripled<ClassA>はそちらを呼び出して返すだけのコードが生成され、
自前のget_tripled関数が用意されていないClassBのときは
NS_C::get_tripled<ClassB>は代替実装を用いて返す
ということです。
よろしくお願い申し上げます。
0088デフォルトの名無しさん
2010/03/20(土) 01:33:31これじゃだめなのか
0089デフォルトの名無しさん
2010/03/20(土) 12:25:57ありがとうございます。
それでいけました。
009087
2010/03/20(土) 12:45:42std::swapの特殊化では、
using std::swap; swap(〜, 〜);
としておけば特殊化したswap<MyClass>があればそちらが選ばれ,
もしなければstd::swapが選ばれるというルールがあるため
うまく解決するということはEffective C++に書いてあった
のですが、今回のケースでは特殊化とは違いますよね。
私の考えでは
//////////////////////////////////////////////////////
NS_A::ClassA中でfriend宣言されているget_tripled関数は、
NS_A::ClassA<double> a=20;でNS_A::ClassA<double>がインスタンス化されるのと
同時に 生成され、その関数はテンプレートではない。
すなわち
�@非テンプレート関数double NS_A::get_tripled(const ClassA<double>& arg){return arg.num*3;}
が生成される。
�A一方NS_C::get_tripledは関数テンプレートであり、こちらもオーバーロード解決の候補になる。
だが、非テンプレート関数�@とテンプレート関数�Aでは前者が優先されるという
ルールがあるため、�@が選択される
//////////////////////////////////////////////////////
と思うのですが、これで合っていますでしょうか?
0091デフォルトの名無しさん
2010/03/20(土) 13:42:44>同時に 生成され、その関数はテンプレートではない。
どちらもテンプレートパラメータがあるんだからテンプレートでしょ
friend関数側の方が優先されるのは、引数の推論が働いた時に
friend関数のconst ClassA<T>&という引数の型がClassA<double>に対して
NS_Cの関数の引数であるconst T&よりも一致するから
009287
2010/03/20(土) 14:05:44ありがとうございます。
> friend関数のconst ClassA<T>&という引数の型がClassA<double>に対して
> NS_Cの関数の引数であるconst T&よりも一致するから
なるほど。
ということは、部分特殊化されている方が優先されるのと同じような
判断基準でより一致していると考えるのでしょうか。
ttp://ja.wikibooks.org/wiki/More_C++_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)
> そのような friend 関数はテンプレートではないが、新しい friend 関数を「生成」するための
> 工場(factory)としてテンプレートのようなものとなる。
> 新しい非テンプレート関数が Foo の特殊化ごとに生成される。
となっていたため、
私は>同時に 生成され、その関数はテンプレートではない。
と書いたのですが、このwikibooksの方が誤りでしょうか。
0093デフォルトの名無しさん
2010/03/20(土) 15:21:10今調べてみたがオレの間違いだ。申し訳ない
>>90で正しい
Barton-Nackmanトリックってやつで
クラステンプレートのインスタンス化に伴って、
テンプレートではない関数を生成できるようにする手法らしいね
テンプレート引数の推論を必要としないから通常の多重定義のルールに従うそうだ
0095デフォルトの名無しさん
2010/03/20(土) 16:05:49便乗質問させてください。
クラステンプレートは、それをインスタンス化させても使われていないメンバ関数までは
インスタンス化されず、バイナリにも含まれないと習った気がします。
これは >>87氏の NS_A::ClassA<T>をT=doubleでインスタンス化させても、
使っていないメンバ関数(ないですけど、仮にあったとしたら)はインスタンス化されないということ
だと理解しています。
ではBarton-Nackman trickで
�@非テンプレート関数double NS_A::get_tripled(const ClassA<double>& arg){return arg.num*3;}
が「生成」されるとありますが、この場合は
例え使われていなくても必ずバイナリにも含まれるのでしょうか。
以上の話はexplicit instantiationしていないものとして、です。
(explicit instantiationしていたら含まれるでしょうが。)
どなたかよろしくお願い申し上げます。
0096デフォルトの名無しさん
2010/03/20(土) 17:33:19これがエラーにならないなら含まれないんじゃないの
009795
2010/03/20(土) 17:49:52ありがとうございます。
そうやって調べる発想には到底至りませんでした。
Comeau C/C++のWebサイトで試しても通りましたので、
含まれないようですね。
感謝申し上げます。
0098デフォルトの名無しさん
2010/03/20(土) 19:26:07class string {
public:
string(const char*);
} ;
void f(string, string, bool = false) ; // 1
void f(string, bool = false) ; // 2
void g()
{
f(“Hello”, “Goodbye”) ;// 2が呼ばれる
}
なぜか。まずオーバーロードの解決をするために、一つ目の引数を見る。
これはどちらの関数も、string型を取る。string型はコンストラクタにconst char *型を取るので、
コンパイラはstring型に変換できる。二つ目の引数はどうか。関数1はstring型を引数に取るが、
関数2はboolである。人間的に考えると、関数1を呼んで欲しい。し
かし、規格では、関数2が呼ばれるのが正しい挙動だ。
なぜかというと、コンストラクタを使って変換するより、ポインタをboolに変換するほうが、
規格上、より高い候補になるからだ。そんなわけで、コンパイラは、関数2を、正しく、呼ぶことになる。。
ttp://cpplover.blogspot.com/2008/06/coverload-resolution.html
言われてみればなるほどと思うけど、なんて気持ち悪いんだ。
0099デフォルトの名無しさん
2010/03/20(土) 19:57:080100デフォルトの名無しさん
2010/03/20(土) 20:10:05この場合だとどのコンストラクタにつければいいん?
0101デフォルトの名無しさん
2010/03/20(土) 20:17:310102デフォルトの名無しさん
2010/03/20(土) 20:25:32全てのコンストラクタに付ける?
それとも暗示的に変換して欲しいの以外につける?
それとも全部つけないで呼び出し時にキャストする?
普通はどんな感じにしてるんだ?
0103デフォルトの名無しさん
2010/03/20(土) 20:28:09クラス設計として暗黙変換を必要としているとき以外は、暗黙変換を許さないように付ける。
安全重視。
0104デフォルトの名無しさん
2010/03/20(土) 20:30:10今まで良くわからなかったからまるで付けてなかったけど
ちゃんと付けることにするよ
0105デフォルトの名無しさん
2010/03/20(土) 20:45:400106デフォルトの名無しさん
2010/03/20(土) 20:49:12explicitを付け忘れてもコンパイラは涼しい顔でコンパイルしてしまうけど、constはエラーが出るから楽だよ。
0108デフォルトの名無しさん
2010/03/20(土) 22:57:300109デフォルトの名無しさん
2010/03/20(土) 23:01:200110デフォルトの名無しさん
2010/03/20(土) 23:06:30つければいいわけですね わかります
0111デフォルトの名無しさん
2010/03/21(日) 01:12:22void advance(Iterator& iter, Distance offset)
{
std::_advance( iter, offset, typename iterator_traits<Iterator>::iterator_category() );
}
の実引数typename iterator_traits<Iterator>::iterator_category() の意味[特に最後の()]が
さっぱりわかりません。これ、無名オブジェクトのコンストラクタなんですか?
0112デフォルトの名無しさん
2010/03/21(日) 03:14:38「typename iterator_traits<Iterator>::iterator_category」型のコンストラクタを呼び出している。
この型はイテレータの種類(単方向/双方向/ランダムアクセス)を特定するために使われている。
(詳細は http://www.sgi.com/tech/stl/iterator_traits.html など)
多分std::_advanceはテンプレート関数で、イテレータの種類ごとに特殊化されて、
最適な方法でイテレータの増減を行うようになっている。
テンプレート関数なので引数からテンプレート引数を推定させることができて、
型情報を伝えるために、無名オブジェクトを渡している。
0113デフォルトの名無しさん
2010/03/21(日) 09:01:080114デフォルトの名無しさん
2010/03/21(日) 12:07:48friend class Test;
はダメでした。
0115デフォルトの名無しさん
2010/03/21(日) 12:10:25ないです。
わざとそう言う仕様になっているのです。
じゃないと他人がTestクラスを継承して作ったクラスでそのクラスにアクセスできちゃうじゃない。
0116デフォルトの名無しさん
2010/03/21(日) 12:11:53privateメンバ関数のテストとか
0117デフォルトの名無しさん
2010/03/21(日) 12:12:080118114
2010/03/21(日) 12:13:08無理を承知で何とかなりませんか?
0119デフォルトの名無しさん
2010/03/21(日) 12:15:170120デフォルトの名無しさん
2010/03/21(日) 12:15:28テストの時だけpublicにしちゃえば?
#ifdef DEGUG
#define private public
#define protected public
#endif
って。
0121デフォルトの名無しさん
2010/03/21(日) 12:17:54だからそれじゃコンパイルが通らないこともあるんだって
前スレから俺が言ってるじゃないか!!
template <class T>
に適用してみ。
0122デフォルトの名無しさん
2010/03/21(日) 12:26:20template <typename T>
と書いとけばいい話
0123114
2010/03/21(日) 12:46:11良いアイディアだと思うのですが、それもちょっと。
もしくは可能なら
friend namespace UnitTest;
でも良いです。
とにかくユニットテストからprivate変数にアクセスしたいのです。
0124デフォルトの名無しさん
2010/03/21(日) 12:47:59>>43以降で話題になっていたでござる
0125120
2010/03/21(日) 12:48:06全てをfriend指定しないで>>120しないのに
全てからprivate変数にアクセスしたいわけでしょ。
さすがにマジで不可能。
0126114
2010/03/21(日) 12:55:220127デフォルトの名無しさん
2010/03/21(日) 12:58:01居ない。
というか>>120の何がいやなの?
厳密に言うと未定義の動作だから?
0128114
2010/03/21(日) 13:04:030129デフォルトの名無しさん
2010/03/21(日) 13:05:19インスタンスアドレスからのオフセットを頑張って取得
多重継承でも絡んでないかぎりイケるんじゃね
0130デフォルトの名無しさん
2010/03/21(日) 13:22:18public/protectedメンバ関数を叩いたときの挙動さえ確認しとけばいいんじゃないのか
privateをわざわざほじくり出してその関数だけでテストして何になるんだ?
0131デフォルトの名無しさん
2010/03/21(日) 13:26:130132デフォルトの名無しさん
2010/03/21(日) 14:39:250133デフォルトの名無しさん
2010/03/21(日) 15:34:41Testからfriend指定したクラスや関数は、派生クラスの新規メンバーを知らないんだから
できても意味がなくね?
簡単なソースだしてみ?
0134デフォルトの名無しさん
2010/03/21(日) 16:46:52基本はブラックボックじゃね?
0135デフォルトの名無しさん
2010/03/21(日) 17:54:170136デフォルトの名無しさん
2010/03/21(日) 18:13:43例えば
#define explicit
だったらこれでオーバーロード解決が変わったりするから
デバッグ版とリリース版で(厳密に言えば)ソースが違うといえるけど、
private指定をpublic指定にする場合では、
コンパイルエラーにはなるかもしれんが
オーバーロードの解釈が変わったりはしないじゃん。
そうでなきゃもう設計が合わないとしか言わざるを得ない。
0137デフォルトの名無しさん
2010/03/21(日) 19:15:23超マイナー。ホンの一部しか使用していないね。
ホワイトボックスよりも判りやすいけど。
0138デフォルトの名無しさん
2010/03/21(日) 23:21:11『Effective C++』を読んだときのように目から鱗が落ちる思いですが、
それにしても難しすぎませんか?
『Effective C++』は間を空けて2周読み大体理解したつもりなのですが、
『Exceptional C++』もやはり全部 理解しないとダメでしょうか。
0139デフォルトの名無しさん
2010/03/21(日) 23:22:440140デフォルトの名無しさん
2010/03/21(日) 23:23:00使わないなら理解しなくてもいいけど知ってた方がいいことには変わりない
0142デフォルトの名無しさん
2010/03/22(月) 01:57:30リンクした他人のモジュールが例外を投げてくるかもしれんから
例外安全は常に考慮すべきと思うがね
depthシリーズって似た名前が多いから
どの本に何が書いてあってあったか記憶が薄れてきてるけど
たしかMoreも読まないと補足されてない事があったような
0143デフォルトの名無しさん
2010/03/22(月) 01:59:32また、そのためのルールのために10ページ追加する言語。
糞過ぎですよね?
0144デフォルトの名無しさん
2010/03/22(月) 02:07:37糞だと思うならC++以外の言語を使えばいいだけのこと
C++の言語仕様を決めてる人達の考えは
嫌なら使わなければいい
ってことなんじゃないかな?
0145デフォルトの名無しさん
2010/03/22(月) 03:03:180146デフォルトの名無しさん
2010/03/22(月) 03:30:00こんな風に文字列テーブルを初期化したいんですが
どう書けばいいんでしょうか
class MyClass
{
private:
WCHAR * table[] = { "aa", "bbb", "あ", "c" };
}
0147デフォルトの名無しさん
2010/03/22(月) 03:34:23VC++でコンパイルしてみると
error C2059: 構文エラー : '{'
というエラーが出ます
class MyClass
{
private:
WCHAR * table[] = { L"aa", L"bbb", L"あ", L"c" };
}
0148デフォルトの名無しさん
2010/03/22(月) 03:49:55Testを継承させたということは単体テストをする前提でコード書いたんだろう。
はじめからテストすることを前提に書いたものに「friend指定が必要だった!」とか言っても
単なるオマヌケでしかないなあ。
0149デフォルトの名無しさん
2010/03/22(月) 03:55:59無理。現行のC++の規格ではメンバ変数の宣言でその初期化を指定することはできない。
更に、メンバ変数の配列の初期化は面倒くさい。
class MyClass
{
private:
WCHAR * table[4];
public:
MyClass()
{
this->table[0] = L"aa"; this->table[1] = L"bbb";
this->table[2] = L"あ"; this->table[3] = L"c";
}// end of ctor
};// end of class
C++0xが来たら>>147みたいな書き方ができるかもしれない?
0150デフォルトの名無しさん
2010/03/22(月) 04:25:33ありがとうございます
一つずつ入れていきます
0151デフォルトの名無しさん
2010/03/22(月) 04:28:55};// end of class
丁寧なコメントだが、漏れにはウザく感じる
0152デフォルトの名無しさん
2010/03/22(月) 04:34:590153デフォルトの名無しさん
2010/03/22(月) 04:37:49親切だしね
ただ漏れ個人が、余計なものに感じてしまうだけ
0154デフォルトの名無しさん
2010/03/22(月) 04:38:150155デフォルトの名無しさん
2010/03/22(月) 04:52:24何故Lでそれを表現するのか、というのを訊いてるのかな?
そういや何故なんだろう。
0156デフォルトの名無しさん
2010/03/22(月) 07:41:090157デフォルトの名無しさん
2010/03/22(月) 07:48:470158デフォルトの名無しさん
2010/03/22(月) 07:53:42数値で L を最後に付けるのに合わせたんだと思う
>>157
突っ込みどころ満載で突っ込む気も失せるくらいひどいな
0159デフォルトの名無しさん
2010/03/22(月) 07:56:360160デフォルトの名無しさん
2010/03/22(月) 07:57:130161デフォルトの名無しさん
2010/03/22(月) 08:06:42table が変更されない単なる文字列テーブルなら静的メンバを使用する事は可能だ
class MyClass
{
private:
static const WCHAR* table[];
};
const WCHAR* MyClass::table[] = { L"aa", L"bbb", L"あ", L"c" };
MyClass のインスタンスに table の実態は存在せず外部変数として定義した領域へのリンクみたいなイメージとなるので
美しくないと言われればそれまでだが記述は簡単だ
0162デフォルトの名無しさん
2010/03/22(月) 08:14:55関数内にstatic constなテーブルを持ちそのポインタを返す初期化関数を用意して、コンストラクタで呼ぶ。
>146で言うtableを動的に使いたいなら、上に書いたポインタからコピーする関数も用意する。
0163デフォルトの名無しさん
2010/03/22(月) 08:24:18残念ながら無理だけど
// .h側
class MyClass
{
private:
static const WCHAR* table[];
static const int table_size;
};
// .cpp側
const WCHAR* MyClass::table[] = { L"aa", L"bbb", L"あ", L"c" };
const int MyClass::table_size = (sizeof table / sizeof table[0]);
というのは可能だけど、この table_size を使って
int a[MyClass::table_size]; とはできないね
0164デフォルトの名無しさん
2010/03/22(月) 08:26:03MyClass.cpp 内(というか MyClass::table の実体定義が見える場所)なら
sizeof できるので、
private なら特に問題ないか
0165デフォルトの名無しさん
2010/03/22(月) 09:11:06定義順によっては sizeof table はエラーになるよ(処理系によるかもしれないけど)
class 定義
変数定義
sizeof table
の順に並んでれば問題無いけど
class 定義
sizeof table
変数定義
の順に並んでいると sizeof table を解釈してる時には table のサイズが未定なのでエラーになる
0166デフォルトの名無しさん
2010/03/22(月) 09:11:510167デフォルトの名無しさん
2010/03/22(月) 09:28:44{
using namespace FooLib;
return 0;
}
これはmain関数の中でのみ名前空間を有効にするってことでしょうか?
0168デフォルトの名無しさん
2010/03/22(月) 09:31:14そう。
0169デフォルトの名無しさん
2010/03/22(月) 09:39:31そりゃそうなんだけど、並び順で sizeof がエラーになるケースって珍しくないか?
0170デフォルトの名無しさん
2010/03/22(月) 09:56:00別に
#include <iostream>
extern int a[];
int main() { std::cout << sizeof a << std::endl; }
int a[] = { 1, 2, 3 };
でもエラーになるで
根本的な理由はサイズが決まる前に sizeof を使ってる事
「使うための情報が揃ってない位置では使えない」が基本の C/C++ では
とりたてて珍しい事でもないっしょ
むしろ、class 内の関数定義内では宣言前のメンバも使える
って方が珍しい例だな
0171デフォルトの名無しさん
2010/03/22(月) 10:04:07typedef WCHAR*(&WCP_R)[4];
WCP_R table;
Myclass():table(G()){};
WCP_R G(){static WCHAR*r[4]={ L"aa", L"bbb", L"あ", L"c" };return r;}
0172デフォルトの名無しさん
2010/03/22(月) 10:04:38確かにクラス内の静的メンバも extern と似てるって言えば似てるからなぁ、実体はどっかに有るからって投げやりな態度が
0173デフォルトの名無しさん
2010/03/22(月) 10:06:43普通に static メンバにすればいいだろw
0174デフォルトの名無しさん
2010/03/22(月) 10:10:02こういう使い方もあるんだ。今度からはこうしよう。
0175デフォルトの名無しさん
2010/03/22(月) 10:12:140176デフォルトの名無しさん
2010/03/22(月) 10:14:56配列のサイズがクラス内で定義されてる定数で決まる場合は無理だけどね
0177デフォルトの名無しさん
2010/03/22(月) 10:18:20Gxx()を増やせばバージョン増やせます。デフォr[4]、時たま書き換え用r[4]など
0178デフォルトの名無しさん
2010/03/22(月) 10:21:560179デフォルトの名無しさん
2010/03/22(月) 10:22:390180デフォルトの名無しさん
2010/03/22(月) 11:37:59int x[10]; = array<int, 10> x;
// あれ、どっかで見たぞこんなの
0181デフォルトの名無しさん
2010/03/22(月) 11:43:230182デフォルトの名無しさん
2010/03/22(月) 12:20:540183デフォルトの名無しさん
2010/03/22(月) 13:37:38Fizz Buzzプログラムをタイムアタックで書いてみたんだが、
ttp://codepad.org/sLoFZRzG
こうなった。
1.人生初のFizz Buzzプログラム
2.エディタを開いた瞬間からソースコードに最後の文字を入力して名前を付けて保存(aaa.cpp)するまでを計測
3.入力補完なし、キーボードショートカットによるコピペ可
この条件で3分30秒かかったんだが、俺合格すか?
#include <iostream>とか書いている間にアルゴリズムを考えた。
0184デフォルトの名無しさん
2010/03/22(月) 13:42:26const 付けちゃう所がC++中毒になっているんだなぁと痛感した。
0185デフォルトの名無しさん
2010/03/22(月) 13:43:500186183
2010/03/22(月) 13:50:47俺はこの時間だったorz
まあもう一度やればたぶん2分はぎりぎり切れるとは思う。
0187デフォルトの名無しさん
2010/03/22(月) 13:54:310188デフォルトの名無しさん
2010/03/22(月) 13:55:22日本語キーボードがおぼつかない状態で
すっげータイプミスしながらさっき適当にやったら
1:50弱だったが
0189デフォルトの名無しさん
2010/03/22(月) 14:33:18型チェックがあるから
C++は3項演算子を使った解答ってあまり見つからんね
他言語ならすぐ出てくるのに。
ちょっと考えて思いついたのがこんな無理やりなやつ
for(int i=1;i<=1000;++i){
char buf[256];
cout << ((i%15==0)?"FizzBuzz":(i%5==0)?"Buzz":(i%3==0)?"Fizz":(sprintf(buf,"%d",i),(const char*)buf)) << endl;
}
0190デフォルトの名無しさん
2010/03/22(月) 14:34:45素直に組めばいいのさ
0191デフォルトの名無しさん
2010/03/22(月) 15:01:170192デフォルトの名無しさん
2010/03/22(月) 15:09:46using namespace std;
int mod(int x,int y){return x-y*(x/y);}
int main(){
for(int i=1;i<1000;++i){
if(mod(i,15)==0){cout << "FizzBuzz" << " ";}
else if(mod(i,3)==0){cout << "Fizz" << " ";}
else if(mod(i,5)==0){cout << "Buzz" << " ";}
else{cout << i << " ";}
}
return 0;
}
1:46秒
0193デフォルトの名無しさん
2010/03/22(月) 15:13:490194デフォルトの名無しさん
2010/03/22(月) 15:16:040195デフォルトの名無しさん
2010/03/22(月) 17:08:56stringへの参照でしょうかそれともコピーが返ってくるのでしょうか
0196デフォルトの名無しさん
2010/03/22(月) 17:14:19http://www.cplusplus.com/reference/iostream/stringstream/str/
0197デフォルトの名無しさん
2010/03/22(月) 17:17:260198デフォルトの名無しさん
2010/03/22(月) 18:53:20そのくせCより遅いってwww
Cに追加した仕様は全部無駄ってことですよねw
0199デフォルトの名無しさん
2010/03/22(月) 18:56:46開発速度的に
あとstd::sort的に
0200デフォルトの名無しさん
2010/03/22(月) 18:59:23サンプルコードupして語ってくれ
0201デフォルトの名無しさん
2010/03/22(月) 19:08:12可搬性を高めるようなC++的に良いとされる書き方があり、
その場合はトレードオフで実行速度または仕様の簡潔さを
犠牲にしているだけ。
追加した仕様が無駄という訳ではない。
0202デフォルトの名無しさん
2010/03/22(月) 19:28:57よそじw
0203デフォルトの名無しさん
2010/03/22(月) 20:04:580204デフォルトの名無しさん
2010/03/22(月) 21:15:370205デフォルトの名無しさん
2010/03/22(月) 21:42:210206デフォルトの名無しさん
2010/03/22(月) 22:05:560207デフォルトの名無しさん
2010/03/22(月) 22:07:44> すっげータイプミスしながらさっき適当にやったら
> 1:50弱だったが
待てよ、俺なんか普通に入力支援なしで#include <iostream>って打つだけでも一苦労だったぞ!
早すぎだろタイプミスしながらその速度はおかしいだろ
0208デフォルトの名無しさん
2010/03/22(月) 22:15:42関数定義の引数を打ち込みながらローカル変数何が必要かななんて同時に考えられんし。
0209デフォルトの名無しさん
2010/03/22(月) 22:28:34俺は#include <iostream>は息をするかのごとく書けた。
病気だと思った。
0210デフォルトの名無しさん
2010/03/22(月) 22:30:470211デフォルトの名無しさん
2010/03/23(火) 00:48:0413 41 288 52
みたいにスペース(あるいはその他の区切り文字)で区切られて数字が並んでるときに
13,41,288・・・
と順番に取得していきたいのだけど,C++だと自分で書くしか無いのでしょうか。
0212デフォルトの名無しさん
2010/03/23(火) 01:13:33sscanf(), stringstream
0213デフォルトの名無しさん
2010/03/23(火) 05:11:05ありがとうございます
その方法がやりたかったことに近いです
勉強になりました
0214デフォルトの名無しさん
2010/03/23(火) 09:23:42#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
int i;
string str;
ifstream file( argv[1] );
if( !file ){
cout << "ERROR" << endl;
exit(1);
}
while( file >> str ) {}
file.seekg( ios::beg );
file >> str;
cout << str << endl;
file.close();
}
希望としては、このプログラムでファイルの一行目を抜き出したいのですが
結果として最終行が抜き出されます。ファイルシークができてない!?
どなたかご存知方ご教授お願いします。
0215デフォルトの名無しさん
2010/03/23(火) 09:30:560216デフォルトの名無しさん
2010/03/23(火) 09:34:12それも試しましたが同じ結果でした・・・
0217デフォルトの名無しさん
2010/03/23(火) 09:36:010218デフォルトの名無しさん
2010/03/23(火) 09:41:19確かにそうですが、一度最終行まで読み込んだ後にシーク処理を行いたいのです。
なにか他にいい方法ないでしょうか・・・。
こんな朝早くから愚問にお答えいただきありがとうございます。
0219デフォルトの名無しさん
2010/03/23(火) 09:43:43file.clear();
file.seekg( 0, ios::beg );
0220デフォルトの名無しさん
2010/03/23(火) 09:49:06ありがとうございます!希望通りの動作になりました!
0221デフォルトの名無しさん
2010/03/23(火) 11:29:12どうすれば???
0222デフォルトの名無しさん
2010/03/23(火) 12:54:30そうではなくstring自身をソートするのは可能でしょうか。
string data = "hoge";
とあったときsort(data)が"egho"を返すようにしたいのですが。
(つまりdataの中身をアルファベット順にソート)
一旦vectorに一字ずつ格納してsortといった手順になってしまうのでしょうか。
0223デフォルトの名無しさん
2010/03/23(火) 12:57:430224デフォルトの名無しさん
2010/03/23(火) 13:28:16マルチバイト突っ込んだときのことは知らないけど
0225デフォルトの名無しさん
2010/03/23(火) 13:50:040226デフォルトの名無しさん
2010/03/23(火) 14:12:47デフォルトコンストラクタがないから
0227デフォルトの名無しさん
2010/03/23(火) 14:13:44デフォコンはあります。
0228デフォルトの名無しさん
2010/03/23(火) 14:14:31間違えた
A a(); はAを返す関数a()の宣言だから
0229デフォルトの名無しさん
2010/03/23(火) 14:16:38ありがとうございます。
A a();と区別させる方法は無いのなら諦めます。
0230デフォルトの名無しさん
2010/03/23(火) 18:19:30ttp://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E7%92%B0%E5%A2%83
標準ライブラリの大部分がサポートされない。フリースタンディング環境でもサポートされる標準ライブラリを以下に挙げる。
C++の場合、<exception>、<limits>、<cstdarg>、<cstddef>、<cstdlib>(abort、atexit、およびexitのみ)、<new>、および<typeinfo>
組み込みってこれだけでプログラミングしてるの?
マジ?頭痛くなるどころのさわぎじゃねぇぞ
0231デフォルトの名無しさん
2010/03/23(火) 18:57:07組み込みでも標準ライブラリは一通り使えるけど、↑は極端な環境だね。
0232デフォルトの名無しさん
2010/03/23(火) 20:33:27小さなシステムなら特に珍しくもないよ
そもそもそういったシステムは標準ライブラリそのものの出番が少ない
コンソールなんてないし、ヒープも定義しなかったりするからな
0233デフォルトの名無しさん
2010/03/23(火) 20:57:320234デフォルトの名無しさん
2010/03/23(火) 21:00:130235デフォルトの名無しさん
2010/03/23(火) 23:50:24template <class U> ::boost::type_traits::yes_type is_class_tester(void(U::*)(void));
template <class U> ::boost::type_traits::no_type is_class_tester(...);
特にvoid(U::*)(void)は何を意味してるんでしょうか?デストラクタへのポインタ?
0236デフォルトの名無しさん
2010/03/24(水) 00:04:340237デフォルトの名無しさん
2010/03/24(水) 00:57:370238デフォルトの名無しさん
2010/03/24(水) 01:06:22void (U::*)(void)は「Uのvoid (void)のシグネチャを持つメンバ関数へのポインタ」。
そこらへんの話は詳しくは「C++テンプレートテクニック」の5-3に書いてある
http://www.amazon.co.jp/C-%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%CE%B5%CF%80%CE%B9%CF%83%CF%84%CE%B7%CE%BC%CE%B7/dp/4797354534
説明を試みたけど俺では上手く説明できそうにない
0239デフォルトの名無しさん
2010/03/24(水) 01:06:57例えばClassの中身が以下になっていたとする。
struct Class{ int a, b; };
int Class::* memptrとした時、memptrには&Class::aや&Class::bを入れられる。
memptr = &Class::a; //memptrはClass::aを指す
これがどういうことかというと、例えばClassのインスタンスを適当に作る。
Class obj;
メンバポインタはClass::aとClass::bを区別なく動的に使用できる仕組み。
obj.*memptr = 10;
obj.a; //10
勿論memptrに&Class::bも入れられるから、
memptr = &Class::a;
obj.*memptr = 10; //obj.a = 10
memptr = &Class::b;
obj.*memptr = 8; //obj.b = 8
この様な動作ができる。
メンバ変数に対して使えるならメンバ関数にも適用できる。その時の型の修飾がReturnType (Class::*)(ArgType);
0240デフォルトの名無しさん
2010/03/24(水) 01:16:08Uがクラスだったらメンバ関数へのポインタに変換可能性があるから
yes_type返して、クラスじゃないなら変換可能性がないから
可変長引数側のno_type返して、メタ関数使ってsizeofで比較するんだっけか?
多分yes_typeかno_typeのどちらかが配列とかだったよな
標準ライブラリとかと同じでtype_traitsとか中身見ねえわ
0241235
2010/03/24(水) 01:24:20メンバ関数へのポインタは分かるんですが、void(U::*)(void)が構造体のどのメンバに引っかかって上の関数の呼び出しが優先されるのかが分からなかったんです。
struct Hoge{};
is_class_tester( (Hoge*)NULL ); // <-何でvoid(U::*)(void)が選択されるのか?メンバもないのに・・・
0242デフォルトの名無しさん
2010/03/24(水) 01:25:060243デフォルトの名無しさん
2010/03/24(水) 01:58:10関数のメンバポインタを取得する void(U::*)(void)という「形」が合っているかをチェックしている。
初めて目にした人は「どのメンバに該当したのか?」が気になるところだが、
コンパイラは単に「Uはメンバ関数を持つか?」だけを見ている。
…という説明をしても何を言っているかさっぱりだと思うが、
C++の型は
・charやintなどの予約語の型
・enum
・classとstruct
などのようなグループ分けがされていて、
「U::*」という構文が許可されているのはclassとstructのみ。
そのため、SFINAEの規則によってclass以外の型に対しては
>>235の前者のオーバーロードは候補から除外される。
これで理解できないなら>>237か>>238の本を買って読むことをお勧めする。
というよりこういうことに興味があるなら読んでおくべし。
なお、よく考えれば分かることだが、void(U::*)(void)という型は
Uがそのようなメンバ関数を持っていなかったとしても文法的・意味的に「正しい」。
単に、正規の手段でその型に代入できる、意味のある値を生成することが不可能なので使い道がないだけ。
0244デフォルトの名無しさん
2010/03/24(水) 15:25:34>>243
> これで理解できないなら>>237か>>238の本を買って読むことをお勧めする。
> というよりこういうことに興味があるなら読んでおくべし。
俺は普通にC++を使いたいだけで、最低限の気をつけるべき事とかは
勉強するけど、変態的プログラミングは自分ではしたくない!と思っています。
こんな私はそこは勉強しなくても大丈夫でしょうか。
0245デフォルトの名無しさん
2010/03/24(水) 15:40:360246デフォルトの名無しさん
2010/03/24(水) 15:40:540247デフォルトの名無しさん
2010/03/24(水) 15:52:02やたらと難しい言葉を使いたがる人がいるのも似ているかと
うまく使えば冗長な文章がスッキリまとまるところも似ているかと
0248デフォルトの名無しさん
2010/03/24(水) 15:54:44無駄がなくなるまで直すと一番無駄がなくなるんだよな。
0249デフォルトの名無しさん
2010/03/24(水) 18:27:380250デフォルトの名無しさん
2010/03/24(水) 18:28:45テンプレのamazonのリンクは全部英語ですが、日本語の本でお勧めなのないですか?
0251デフォルトの名無しさん
2010/03/24(水) 18:32:540252デフォルトの名無しさん
2010/03/24(水) 18:39:47java使えるって言ってももう何年も前だし、やったのも大学一年生程度(しかも評価甘いし、やること少ない)です
わかるようなもんでしょうか?
具体的には関数とか定義して、、、ての程度しかわかりません
0253252
2010/03/24(水) 19:01:41多分effectiveではわからないからもっと簡単そうなこれならわかるC++から始めてみます
質問にのってくれてありがとうございます
0255デフォルトの名無しさん
2010/03/24(水) 19:13:51型の別名を与えるようなtypedefの使い方って
プログラマの意識の問題だと思っていいんでしょうか
たとえば何かをメートルで返す測量関数があって
typedef int METER;
METER measure(){return 1; /*仮の実装*/}
int n=measure(); //return typeと型が違うが、実態はintなので何も言われない
0256デフォルトの名無しさん
2010/03/24(水) 19:22:24uint32_t みたいに環境が変わっても対応できるようにするとか
テンプレート引数を使った型を typedef して外部からも使えるようにするとか
後から型を変えられるようにするとか
同じ型を使うことを強調したいときとか
そんなところ
0257デフォルトの名無しさん
2010/03/24(水) 19:31:57> uint32_t みたいに環境が変わっても対応できるようにする
>>255が懸念しているのは、
uint32_t foo;
int bar = foo;
とあった時に、環境が変わったときに初めて問題が表面化することを避けられないということなのでは?
0258デフォルトの名無しさん
2010/03/24(水) 19:51:49自分で気をつけるしかないのよね
残念ながら
0259デフォルトの名無しさん
2010/03/24(水) 20:28:080260デフォルトの名無しさん
2010/03/24(水) 20:51:510261デフォルトの名無しさん
2010/03/24(水) 22:15:47後、Dには固めるテンプルを振りかけたいです
0262デフォルトの名無しさん
2010/03/24(水) 22:35:440263デフォルトの名無しさん
2010/03/24(水) 22:36:25class MyClass{
〜〜〜〜
};
こんな自作クラスには、T型を取得できるようにするtypedefを用意するなどといった
コンセンサスはありますでしょうか。
template<typename T>
class MyClass{
〜〜〜〜
public :
typedef T value_type;
};
などです。
文化的なコンセンサスなどがよく分からないので
こちらのスレで質問させていただきました。
よろしくお願い申し上げます。
0264デフォルトの名無しさん
2010/03/24(水) 22:42:15むしろ推奨
0265デフォルトの名無しさん
2010/03/24(水) 22:46:51そんなコンセンサスは特にないと思う
コンテナや関数オブジェクトなんかはSTLやboostに倣うべきだけど
そうでなく、必要ないならつけない方がいいと思う
正反対の意見が続いちゃったけど
0266デフォルトの名無しさん
2010/03/24(水) 22:47:02言語仕様に取り込まれるかと思いきや延期されたので
STLにならってvalue_typeでいいんじゃね
0267デフォルトの名無しさん
2010/03/24(水) 22:48:11むしろって何だよ
むしろってのは相手の言うことと両立しないことを述べる時に使う言葉だぞ?
厳密には
ttp://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E3%83%A0%E3%82%B7%E3%83%AD&dtype=0&dname=0na&stype=1&pagenum=1&index=20915117920400
だが。
0268デフォルトの名無しさん
2010/03/24(水) 22:49:41まあ指定しても損はないと思うので指定しておくことにします。
ありがとうございました。
0269デフォルトの名無しさん
2010/03/24(水) 22:55:12君はそれに対して懐疑的な意見を持っているように読み取れるが、むしろそれは推奨されている手法である
じゃないの?
0271デフォルトの名無しさん
2010/03/24(水) 23:14:38それ以外もしくは要素の型でないのなら、traitsで部分特殊化を作るしかない。
0272デフォルトの名無しさん
2010/03/24(水) 23:18:36"簡単に"まとまっている所ってありますでしょうか。
0273デフォルトの名無しさん
2010/03/24(水) 23:19:54どうしてこれはエラーにならないんでしょう?
http://codepad.org/hhWRunbl
Factory::create_int();やFactory::create_Hoge();みたいな感じで解釈されるから?
0274デフォルトの名無しさん
2010/03/24(水) 23:22:46これのどれとどれがエラーになりそうだと思ったって事?
0275272
2010/03/24(水) 23:29:15同名だからダメかなぁと思ってた。
class Factory{
public:
template<typename T>
TFoo<T> create(){ return TFoo<T>(); }
Foo create(){ return Foo(); }
};
0276274
2010/03/24(水) 23:35:15int main (int argc, char * const argv[]) {
Factory fac;
TFoo<Hoge> hoge = fac.create<Hoge>(); //�@ �A
Foo foo = fac.create(); // �B
return 0;
}
Hoge //�@
TFoo //�A
TFoo// �B
この対応になっていることは
おわかり頂けるだろうか。
0277272
2010/03/24(水) 23:49:212がTFoo<Hoge>のコンストラクタで出力される。
3でTFoo<int>のコンストラクタで出力される
ですよね?
0278274
2010/03/24(水) 23:55:41そうです。
それが分かるんならもう分かるんでね?
テンプレートの方はcreate<T>って名前で(Tしだいで
名前が変わりうる。)、非テンプレートの方はcreateって名前だと
思えば。
0279272
2010/03/25(木) 00:13:25言われてみれば、グローバル名前空間に作ったテンプレート関数は使い回してたのに、
クラスだけは変に解釈してたみたいです。
おまけにテンプレの勉強用にと買った本の最初の方に疑似コード付きで乗ってたし、、、
ありがとう。よし、すっきりしたから風呂入って寝る。
0280274
2010/03/25(木) 00:13:25『C++の仕様上 認められています』
と断言して、
納得いかなくてもそう思ってもらうしかないような。
ttp://codepad.org/PYlvK3e2
このコードでは勝手に引数の型を見てcreateという名前を持つテンプレート関数と非テンプレート関数を
どっちを呼び出すか決定されるけど、
この引数がなくなっても同じ。
ttp://codepad.org/bFMt364W
どっちがよりマッチするかと言えば非テンプレート関数の方だから
非テンプレート関数ばっか呼ばれる結果となる。
ただし明示的にテンプレート引数を指定したらそりゃそっちが呼ばれるでしょうよ。
0281デフォルトの名無しさん
2010/03/25(木) 00:20:390282デフォルトの名無しさん
2010/03/25(木) 00:28:31traits はイディオムやパターンの類です
型世界のストラテジーパターンみたいなもん
std::numeric_limits なんかも traits の一つです
0283デフォルトの名無しさん
2010/03/25(木) 11:59:11解凍とリスト取得できるのでいいんですが。
外国製が良いです、
0284デフォルトの名無しさん
2010/03/25(木) 12:23:530285283
2010/03/25(木) 13:52:20多いです。
速くとれるやつが良いんですが、
0286デフォルトの名無しさん
2010/03/25(木) 13:53:320287デフォルトの名無しさん
2010/03/25(木) 14:25:200289デフォルトの名無しさん
2010/03/25(木) 17:21:46{
memory_swap(&a, &b, sizeof(X));
}
代入とかならメモリだけ移してもダメなのは分かるんだけど
swapならメモリ交換するだけでいいのでは?
0290デフォルトの名無しさん
2010/03/25(木) 17:49:42メンバー変数へのポインタを外で保持している可能性があるからダメ
引数に与えたクラスがXの派生クラスの可能性がある。
0291デフォルトの名無しさん
2010/03/25(木) 21:50:04扱いたいのですが、std::stringで扱えますか?
0292デフォルトの名無しさん
2010/03/25(木) 21:53:510293デフォルトの名無しさん
2010/03/25(木) 21:53:59&s[0]を渡してで止まる。
0294デフォルトの名無しさん
2010/03/25(木) 21:55:22へんなの教えるな。それはいろいろとC++な手間かかるうえに
連結とか人間の手間も増える
0295デフォルトの名無しさん
2010/03/25(木) 21:56:41ポインタ取りたいときは c_str() の代わりに data() 使うといい
0296デフォルトの名無しさん
2010/03/25(木) 21:58:41あとは違いなし。
charに0付近の値を入れたら駄目とかは無い。
0297デフォルトの名無しさん
2010/03/25(木) 22:19:16str += "hoge\0piyo";
だけじゃ hoge しか追加されないから
扱いやすいかというと微妙な所はあるが
終端をちゃんと指定してやれば扱えたはず
0298デフォルトの名無しさん
2010/03/25(木) 22:23:170299デフォルトの名無しさん
2010/03/25(木) 22:55:100300291
2010/03/25(木) 23:06:19なるほど、ちゃんとしかるべく気をつければOKなのですね。
0301デフォルトの名無しさん
2010/03/25(木) 23:08:04良いかもしれないと俺は思う。
ただバイト列を多用するならだけど。
0302デフォルトの名無しさん
2010/03/26(金) 00:57:23{
private:
static const int TEISU = 10;
static const int TEISU_ARRAY[2][2] =
{
{ 1, 2},
{ 3, 4},
};
};
TEISUはコンパイルエラーにならないのにTEISU_ARRAYはコンパイルエラーになります。
どうなってますか。
ちなみにTEISU_ARRAYをclass A{ }の外に出したらコンパイルエラーになりませんでした。
0303デフォルトの名無しさん
2010/03/26(金) 00:59:35C++0xをまたーり待ちましょう
0304デフォルトの名無しさん
2010/03/26(金) 15:01:06バージョンアップ
0305デフォルトの名無しさん
2010/03/26(金) 16:23:160306デフォルトの名無しさん
2010/03/26(金) 17:51:32昔のC++はデストラクタが
 ̄MyClass() {};
なんて表示されてたのかな。
0307デフォルトの名無しさん
2010/03/26(金) 19:24:150308デフォルトの名無しさん
2010/03/26(金) 19:56:360309デフォルトの名無しさん
2010/03/26(金) 20:46:580310デフォルトの名無しさん
2010/03/26(金) 20:59:21Changelog見たけどかなりの更新量だなあ…
0311デフォルトの名無しさん
2010/03/26(金) 21:37:32これってどういう意味ですか?
0312デフォルトの名無しさん
2010/03/26(金) 21:45:21ただし multi_array_ref はデータを参照で持っているため、メモリ領域を持たない。
0313デフォルトの名無しさん
2010/03/26(金) 22:07:34何気にそれでも大しておかしくないよな。
もうちょっとデストラクタの記法もどうにかならなかったのだろうか。
0x7Eってデストラクタ以外にも使ったっけ?
ビット演算かなんかの単項演算子で合った気がする。
0314デフォルトの名無しさん
2010/03/26(金) 22:12:23~はnotの意味だから逆コンストラクタであってると思う・・・・苦しすぎる
0315デフォルトの名無しさん
2010/03/26(金) 22:12:560316デフォルトの名無しさん
2010/03/26(金) 22:23:25ああ、否定か。
苦し紛れに適当に空いている文字を付けたのかと思ったよ。
0317デフォルトの名無しさん
2010/03/26(金) 22:50:13!MyClass() {};
…こっちも苦しいな
0318デフォルトの名無しさん
2010/03/26(金) 22:55:550320デフォルトの名無しさん
2010/03/26(金) 23:02:050321デフォルトの名無しさん
2010/03/26(金) 23:07:07よく考えたもんだな
0322デフォルトの名無しさん
2010/03/26(金) 23:07:14C#のファイナライザがそれだったような
0323デフォルトの名無しさん
2010/03/26(金) 23:18:410324デフォルトの名無しさん
2010/03/26(金) 23:27:14ttp://apollon.cc.u-tokyo.ac.jp/~watanabe/int/switch.html
おお、長年の疑問が解けたよーな。
でもこれだけ多くの分岐でないと意味ないな。
0325デフォルトの名無しさん
2010/03/26(金) 23:28:01補足アリガトン
0326デフォルトの名無しさん
2010/03/26(金) 23:32:33switchよりもハッシュテーブルとか仮想関数を使うけどな。
0327デフォルトの名無しさん
2010/03/26(金) 23:44:14ハッシュテーブルとか仮想関数の守備範囲と
enum&switchの守備範囲は
そんな同じじゃないと思うが。
0328デフォルトの名無しさん
2010/03/26(金) 23:46:24甲int *a;
乙int* a;
丙int * a;
どれがいいのでしょうか。
どれも同じ意味なのですが、
int *a,b,c;
と書いたとき、aだけはint *型、bとcは普通のint型になります。
もし乙だと
int* a,b,c;
と書いたとき非常に勘違いしやすそうに思います。
折衷案の丙も
int * a,b,c;
なんか気持ち悪いですよね。
ただ、同時に宣言する変数が1つだけの場合、型はintではなくint *型なのだから
int* a;
も捨てがたいです。
どれが良いとか推奨とか有名人が勧めていたとかありますでしょうか。
ポインタ*でなく参照&でも同じ事だと思いますが。
0329デフォルトの名無しさん
2010/03/26(金) 23:50:10乙に一票
それぞれのメンバにコメント書くために複数同時宣言はしない。
*まで含めて型として扱うし
0330デフォルトの名無しさん
2010/03/26(金) 23:54:270331328
2010/03/27(土) 00:01:33発想の転換ですね。
ちなみに私は乙派です。
int* a;
MyClass& obj;
0332デフォルトの名無しさん
2010/03/27(土) 00:06:03同じ行に書かないというのが前提で、それぞれは甲で記述します。
キャストの際もstatic_cast<int *>と甲、または丙方式です。
0333デフォルトの名無しさん
2010/03/27(土) 00:07:42「俺がイチから言語を設計していたら、ひとつの宣言文で複数の変数を宣言できるようには、絶対にしなかった」
出典はD&E
0334デフォルトの名無しさん
2010/03/27(土) 00:09:43Knuth先生がそういうなら信じる
0335デフォルトの名無しさん
2010/03/27(土) 00:34:53彼が証明する事実は素晴らしいが
彼のアドバイスは天才の世迷い言だと受け止めるのが凡人の生きる道
文芸的プログラミングを誰が実践できるんだ
0336デフォルトの名無しさん
2010/03/27(土) 01:26:23constも前と後ろ両方の書き方あるけど、
A) const int*
B) int const*
普段Aで書いてるけど、多重ポインタになってるとき
int *const *
とかはBの方がいいのか?と思ったりもする。
0337デフォルトの名無しさん
2010/03/27(土) 01:42:590338デフォルトの名無しさん
2010/03/27(土) 01:54:37絶対譲らん
0339デフォルトの名無しさん
2010/03/27(土) 02:32:20それって
int const*
と
int *const
の意味が違うのを判って言ってるんだよね?
0340デフォルトの名無しさん
2010/03/27(土) 02:57:18int const y, *const q;
constなint型の 変数x
constなint型の ポインタp
int型の constな変数y
int型の constなポインタq
でいいのか?
0341デフォルトの名無しさん
2010/03/27(土) 02:59:430342デフォルトの名無しさん
2010/03/27(土) 03:25:04const int x;
int const x;
は一緒。
const int *p;
int const *p;
も一緒
const int * const p;
は違う
0343デフォルトの名無しさん
2010/03/27(土) 03:34:43そこは
int型の定数y
intへのポインタ型の定数q
とかに。
0344デフォルトの名無しさん
2010/03/27(土) 04:54:12使った事無い
これが必要なシーン教えて
0345デフォルトの名無しさん
2010/03/27(土) 05:01:03static int const foo[] = {1, 2, 3, };
int const * const p = foo;
必要と言うより、安全策だな。
0346デフォルトの名無しさん
2010/03/27(土) 06:39:29const LPCSTR Hoge = "Hoge";
こういうのはよく使う
これは
const char* const Hoge = "Hoge";
と同じ意味
0347デフォルトの名無しさん
2010/03/27(土) 11:25:25Product*const* getAll();
みたいな二重ポインタ返すのはあるな。
一番外側にconstはうっかり防止だな。
0348デフォルトの名無しさん
2010/03/27(土) 12:07:04普通の const int を(グローバルな定数宣言ではなく)自動変数として使わない頻度と変わらないだろう
ポインタ属性とは関係ない気がする
0349デフォルトの名無しさん
2010/03/27(土) 12:25:350350デフォルトの名無しさん
2010/03/27(土) 13:27:08ワンウェイクラッチをcons修飾みたいなものと考えることにする。
0351デフォルトの名無しさん
2010/03/27(土) 13:48:200352デフォルトの名無しさん
2010/03/27(土) 15:23:570353デフォルトの名無しさん
2010/03/27(土) 16:14:120354デフォルトの名無しさん
2010/03/27(土) 16:16:270355デフォルトの名無しさん
2010/03/27(土) 16:31:10boostのソース見るとすでに実装されてたり余裕で上を行かれてたりするから虚しくなってやめた
0356デフォルトの名無しさん
2010/03/27(土) 16:34:070357デフォルトの名無しさん
2010/03/27(土) 17:33:040358デフォルトの名無しさん
2010/03/27(土) 18:38:550359デフォルトの名無しさん
2010/03/27(土) 18:47:300360デフォルトの名無しさん
2010/03/27(土) 18:50:000361デフォルトの名無しさん
2010/03/27(土) 18:51:320362デフォルトの名無しさん
2010/03/27(土) 18:58:11Boostでそれが損なわれてるわけじゃないから良いんじゃないの
0363デフォルトの名無しさん
2010/03/27(土) 18:59:05ひとりでやってろ
0364デフォルトの名無しさん
2010/03/27(土) 19:04:45実行速度に加えて拡張性だろう。
文字列クラスなんか組み込み型なのかと思えるほどのように使える。
0365デフォルトの名無しさん
2010/03/27(土) 20:09:48低レベルな実行速度が必要な部分は実行速度を、という風に特殊化できるところだな。
0366デフォルトの名無しさん
2010/03/27(土) 20:30:28GCがある系だとデストラクタが呼ばれるタイミングが分りません。呼ばれないかもしれません。じゃあこまるし。
0367デフォルトの名無しさん
2010/03/27(土) 20:38:47GCは向いているかもしれん。
0368デフォルトの名無しさん
2010/03/27(土) 20:42:020369デフォルトの名無しさん
2010/03/27(土) 20:43:100370デフォルトの名無しさん
2010/03/27(土) 21:15:07なるほどな、コンパイル中のtemplateの展開中のメモリ管理を気にする人なんていないし。
0371デフォルトの名無しさん
2010/03/27(土) 22:15:340372デフォルトの名無しさん
2010/03/28(日) 07:02:46つまり C++ を関数チックに使えということですね?
→template メタプログラミングは関数チック
→関数チックだと GC 無いとやってられないかと
→でもコンパイル中の template の展開中のメモリ管理を気にする人なんていないし
0373デフォルトの名無しさん
2010/03/28(日) 07:18:470374デフォルトの名無しさん
2010/03/28(日) 12:20:350375デフォルトの名無しさん
2010/03/28(日) 12:23:320376デフォルトの名無しさん
2010/03/28(日) 15:57:01C++テンプレートは事実上の関数型(インタプリタ)言語
コンパイルはテンプレート言語の実行
0377デフォルトの名無しさん
2010/03/28(日) 20:21:560378デフォルトの名無しさん
2010/03/28(日) 20:46:05GC付けないと色々大変
0379デフォルトの名無しさん
2010/03/28(日) 23:49:590380デフォルトの名無しさん
2010/03/29(月) 16:02:59Tar32DLLのは遅いんです。復元は出来なくても良いです。
0381デフォルトの名無しさん
2010/03/29(月) 16:15:29読み取るソースがあってもいいもんだがなと思う。
0382デフォルトの名無しさん
2010/03/29(月) 16:20:30http://www.bzip.org/
0383デフォルトの名無しさん
2010/03/29(月) 16:22:24みんながそうキーボードで打ってるからって理由だろ。
なんでみんなそんなに人に合わせるの?
自分の意思は無いの?
理由を調べようとはしないの?
そんな生き方間違ってるとはおもわないの?
0384デフォルトの名無しさん
2010/03/29(月) 16:22:46Tar32DLLはそれを利用してるんです。それが遅いんです。
復元・圧縮機能いらないのでファイルリストだけ取得したいです。
0385デフォルトの名無しさん
2010/03/29(月) 16:28:08ファイルIOが遅いとかじゃなくて
0386デフォルトの名無しさん
2010/03/29(月) 16:29:28だからそいつを解析すればいいじゃん。そんなことも判らないの?
0387デフォルトの名無しさん
2010/03/29(月) 16:29:34ファイル「リスト」っていってるってことは.tar.bz2だな?
Tarはフォーマット的に、全部読まないと(=復元しないと)全てのファイルは分からないはず。
0388デフォルトの名無しさん
2010/03/29(月) 16:31:030389デフォルトの名無しさん
2010/03/29(月) 16:33:13ファイルIOじゃないと思います。
書庫サイズ40Mでファイル名を取得するだけで遅いです。
解凍と書き込みはしてないです。
0390デフォルトの名無しさん
2010/03/29(月) 16:36:470391デフォルトの名無しさん
2010/03/29(月) 17:08:43.tarは必ずしもそんなことはないが、.tar.bz2だと解析の前にbzip2の展開を行なわないといけない。
0392デフォルトの名無しさん
2010/03/29(月) 17:10:25tarにはヘッダがありませんでした
シーケンシャルでロードするか、ファイル情報が書き込まれてそうなあたりを試行錯誤して
探すしか無さげ
0393デフォルトの名無しさん
2010/03/29(月) 17:19:03どういう仕組みですか?
http://hp.vector.co.jp/authors/VA030681/App/XacRett.htm
0394デフォルトの名無しさん
2010/03/29(月) 17:20:470395デフォルトの名無しさん
2010/03/29(月) 17:23:090396デフォルトの名無しさん
2010/03/29(月) 17:31:360397デフォルトの名無しさん
2010/03/29(月) 17:33:54つねに失敗
0398デフォルトの名無しさん
2010/03/29(月) 17:34:36開発してる人は大変だね。
0399デフォルトの名無しさん
2010/03/29(月) 20:15:33『Exceptional C++』が難しいと嘆いた者です。
ttp://www.amazon.co.jp/dp/4894712709/
の
<A>p34の2.に、
> 例外を投げた際に代入しようとしていたTオブジェクトの値が
> 変更されていないことを保証しなければならない。
<B>p43の ・ の4つ目に、
> コピー先のオブジェクトの状態が変更されないことを保証するため
とありますが、
これは
T a, b;
a=b;
とすると両方ともbが変更されないことを保証すればいいってことでしょうか。
<A>はどっちにも読めますが文脈的にはbの不変性のことを、
<B>は反対の意味に読めますが文脈的にはbの不変性のことを
言っている様に思います。
つまり、<B>は原著のミスまたは訳者の誤訳でしょうか。
よろしくお願い申し上げます。
0400デフォルトの名無しさん
2010/03/29(月) 21:03:31たぶん君の解釈の間違い。
読んだ限りではA,Bとも
「a = b; が例外を投げたとき、aの状態が変更されない」
すなわち「強い保障」をすべきという意味。
0401デフォルトの名無しさん
2010/03/29(月) 21:11:39↓こういう実装になっていてはいけないということ。
T::operator=(T const& t) {
// 1) this.m = t.m など、何か状態を変更する処理
// 2) 何か例外を投げるかもしれない処理
// 3) 何か処理
}
この例だと、2)の処理でもし例外がthrowされると、
operator=を抜けた先でthisの状態は既に変更されている。
すなわち「強い保障」がされていないということになる。
0402399
2010/03/29(月) 21:26:01ありがとうございます。
教えていただけた内容を考えながらもう一度そのセクションを
読み返してきます。
もう一つお伺いしたいのですが
p52の真ん中やや下ぐらいのところに
Stack& operator = (const Stack& temp)
{
Swap(temp);
return temp:
}
とありますが、これは
Stack& operator = (Stack temp)
の間違いでしょうか。
0403デフォルトの名無しさん
2010/03/29(月) 21:37:37○ return *this;
それはともかく、
Stack::Swap()のシグネチャはSwap(Stack&)だから、そのコードだと
Stack& operator=(Stack temp)でないとコンパイルエラーになるね。
それは普通に本文のミスだろう。
0404デフォルトの名無しさん
2010/03/29(月) 22:00:55Hoge &operator = (const Hoge &other) { Hoge(other).swap(*this); return *this; }
0405399
2010/03/29(月) 23:30:35ありがとうございます。
なんか頭おかしくなりそうです。
みなさん全員、こういった難しいことを考えながら
クラスや関数を書いているのでしょうか。
0406デフォルトの名無しさん
2010/03/29(月) 23:40:470407デフォルトの名無しさん
2010/03/29(月) 23:40:58本当に「考えながら」コーディングするのは基幹ライブラリの
それもクリティカルな部分を書くときくらい。
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms
ここに載ってるくらいのイディオムが頭に入ってて、あと設計がまともなら
経験則だけで書いても勝手にまともなコードになると思う。
趣味の領域を越えるとそうも言ってられないが。
0408デフォルトの名無しさん
2010/03/30(火) 01:24:32C++ 以外でも同じ話じゃないの?
0409デフォルトの名無しさん
2010/03/30(火) 01:33:12bz2したのをtarするのは時間くいます。
一つ一つやるのが良いんです。
0410デフォルトの名無しさん
2010/03/30(火) 01:34:43tar は 512 バイトブロックで
ヘッダかデータだろ。
512バイト単位でシークしてヘッダならそのファイル名を
抽出して、そのあとサイズを 512バイト境界でスキップ
していけばリストは比較的簡単に作れると思うが。
0411デフォルトの名無しさん
2010/03/30(火) 01:35:35スレ違い。 .tar.bz2 作ったやつに頼め。
0412デフォルトの名無しさん
2010/03/30(火) 06:15:590413デフォルトの名無しさん
2010/03/30(火) 06:18:410414デフォルトの名無しさん
2010/03/30(火) 06:20:18zipのようにランダムアクセス出来る方が便利なのに。
0415デフォルトの名無しさん
2010/03/30(火) 06:51:48辞書を共用出来る形式の方が圧縮率が高い。
WindowsでもCABやRARなんかはその手の形式だが
やはりランダム操作は出来ない。
0416デフォルトの名無しさん
2010/03/30(火) 08:39:520417デフォルトの名無しさん
2010/03/30(火) 09:02:41こんな古典的書庫を使い続ける意味わからない。
テープなら素直に解凍・書庫できるメリットはあるけど。
いまテープにTar使うやつの方が少数だろ。別のフォーマットに移行しろよ。
0418デフォルトの名無しさん
2010/03/30(火) 09:18:010419デフォルトの名無しさん
2010/03/30(火) 09:25:53rarは遅くていかん
0420399
2010/03/30(火) 09:46:34ありがとうございます。
ttp://codepad.org/XOl4IAmh
このコードの様に理解しているのですが、
T型が例えばstd::stringのように動的メモリ確保などの事情で失敗する
可能性が考えられる場合、
CopyConstructorと代入演算子を例外安全に実装できません。
どうすれば例外安全かつ例外中立に実装できるでしょうか。
よろしくお願い申し上げます。
0421デフォルトの名無しさん
2010/03/30(火) 11:50:48コピーコンストラクタは引数3つのバージョンと同様の実装でいい。
あとはメンバそれぞれに swap() を呼び出す swap() を用意して、
swap() が例外を投げないという前提の下、 >>404 を使えばいい。
例外を投げない swap() を前提にできないのなら、メンバをまとめて
ポインタで持つようにする。 pimpl の形。
http://www.gotw.ca/gotw/059.htm
0422デフォルトの名無しさん
2010/03/30(火) 12:28:57重度・軽度って解説してる所を見つけたんですが、具体的にどうなのか分からず・・・。
0423デフォルトの名無しさん
2010/03/30(火) 12:36:44template<class T> class MyClassTemplate
{
T mem1, mem2, mem3;
public:
MyClassTemplate() : mem1(), mem2(), mem3() {
}
MyClassTemplate(const T& arg1, const T& arg2, const T& arg3) : mem1(arg1), mem2(arg2), mem3(arg3) {
}
~MyClassTemplate() {
}
MyClassTemplate(const T& other) : mem1(other.mem1), mem2(other.mem2), mem3(other.mem3) {
}
MyClassTemplate& operator = (const T& other) {
MyClassTemplate(other).swap(*this);
return *this;
}
void swap(MyClassTemplate &other) {
swap(mem1, other.mem1);
swap(mem2, other.mem2);
swap(mem3, other.mem3);
}
};
これでいいよ
0424デフォルトの名無しさん
2010/03/30(火) 12:39:59fread(), fwrite() などのストリームアクセス自体が失敗するようなのが bad
アクセス前後の数値 <-> 文字列の変換が失敗したとかいうときは fail
0425デフォルトの名無しさん
2010/03/30(火) 12:56:52ファイルオープンに失敗などはbadなんですね。
ありがとうございます。
0426デフォルトの名無しさん
2010/03/30(火) 14:05:34コンストラクタで変換するのかキャストで変換するのか
どっちがより良い方法でしょうか?
0427デフォルトの名無しさん
2010/03/30(火) 14:07:51安全に変換できるように作られてるなら、キャストしないでいい。
どうにかして変換できる、っていうレベルならキャストで注意を引き付けた
ところにコメントで説明を加えるのがいい。
0428デフォルトの名無しさん
2010/03/30(火) 21:11:330429420
2010/03/30(火) 21:30:11>>423
ありがとうございます。
例外を投げないswapというのは、普通 要求していいことなのですか?
つまり、
「俺のクラスのswapは例外なげるかもよ?」とか同僚が言ってきたら
「ふざけるな作り直せ」と言っていいレベルなのでしょうか。
0430デフォルトの名無しさん
2010/03/30(火) 21:32:06言っていいよ
0431420
2010/03/30(火) 21:35:13ありがとうございます。
今回はpimplを使って例外安全を得ようと思います。
今度そう言われたら「ふざけるな作り直せ」と言うことにします。
ありがとうございました。
0432デフォルトの名無しさん
2010/03/30(火) 21:38:39マルチスレッド対応したクラスなんかどうなるんだろう
0433デフォルトの名無しさん
2010/03/30(火) 21:48:160434デフォルトの名無しさん
2010/03/30(火) 22:12:44B::FromA(a)
みたいなのよりよいの?
0435デフォルトの名無しさん
2010/03/30(火) 22:24:040436デフォルトの名無しさん
2010/03/30(火) 22:28:46嫌がらせ
とは言わんが、例えば
std::stringのswapを単にstd::swapの通常の実装でやっちゃったら
例外を投げ得るよね。
>>433
マジ?
今ソース見てみたけどそうは見えないですよ?
0437433
2010/03/30(火) 23:52:50variant みたいのを素朴に実装すると例外が出ちゃうから、
boost::variant では例外を投げないようにする為に
それなりに負荷がある処理をしてますよ、という話だた orz
0438デフォルトの名無しさん
2010/03/31(水) 00:19:10variantは異なる型の間でswapを実現しないといけないからか?どうやってるのか想像がつかないな。
0439デフォルトの名無しさん
2010/03/31(水) 00:22:300440デフォルトの名無しさん
2010/03/31(水) 00:48:31ライブラリベースでムーブを実装し、それでswapを実装しているようだった。
ムーブの中身までは見ていない。
0441デフォルトの名無しさん
2010/03/31(水) 01:16:40例外を投げないようにするのが目的というより、中身が never-empty である
ことを保証するため、だった気がする。
0442デフォルトの名無しさん
2010/03/31(水) 01:52:37が例外を投げるなら、swap の中から例外が投げられる可能性はあるよね?
swap 自身が投げる訳じゃないけど。
0443デフォルトの名無しさん
2010/03/31(水) 11:08:04> テンプレート引数のコピーコンストラクタが
> 例外を投げるなら、swap の中から例外が投げられる可能性はあるよね?
何を当たり前の話をwww
全員pimpl以外認めないとでも言いたいのか?
0444デフォルトの名無しさん
2010/03/31(水) 11:35:030445デフォルトの名無しさん
2010/03/31(水) 15:21:22逆に一般的に例外投げない事になってる関数を教えて。
0446デフォルトの名無しさん
2010/03/31(水) 15:38:290447デフォルトの名無しさん
2010/03/31(水) 17:38:27中級にレベルアップしたいんですがどういう本とか学び方がいいんですかね
プログラミング学んだのは就職に有利になるかな?とか、プログラミングできるなんてすげぇくらいの
気持ちで始めたので特に目標とかこれができなきゃならないとかないです
0448デフォルトの名無しさん
2010/03/31(水) 18:00:330449デフォルトの名無しさん
2010/03/31(水) 18:14:01そこで、とある自作クラステンプレートをpimpl idiomで実装しようと思ったんですが、
pimpl idiomとクラステンプレートって相性悪いですか?
0450447
2010/03/31(水) 18:14:18effective C++も考えてみます
参考に聞きたいのですが上級者の皆さんはどういう手順でうまくなったんですか?
0451デフォルトの名無しさん
2010/03/31(水) 18:16:21ものによる
0452デフォルトの名無しさん
2010/03/31(水) 18:16:24> テンプレ参考にします
最新版じゃないことがあるから重々ご注意を!
例えば、かの名著『Effective C++ 』の最新は
Amazon.co.jp: Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES): スコット・メイヤーズ, 小林 健一郎: 本
ttp://www.amazon.co.jp/dp/4894714515/
これだから。
0453449
2010/03/31(水) 18:18:11なんかexportを使わない限り
実装とインターフェースの分離でコンパイル依存性の軽減が出来る!
というメリットが消えますよね。
ところがexportの廃止が決定されたとのことで。
うーん。
0454138
2010/03/31(水) 18:20:40のp41例2で、
> 自己代入の確認が必須である代入演算子は例外安全にすることができない。
とありますが、これは何故でしょうか。
すぐ後で説明すると書いてあるようで、70ページまで読みましたが
その該当部位がわかりませんでした。
よろしくお願い申し上げます。
0455デフォルトの名無しさん
2010/03/31(水) 18:26:52型消去的な使い方とかコンパイルコスト以外の利点もいくつかあるだろ
0456447
2010/03/31(水) 18:32:16effective C++も考えてみます
参考に聞きたいのですが上級者の皆さんはどういう手順でうまくなったんですか?
0458447
2010/03/31(水) 18:35:36わかりました 第三版見てみます
この前入門書買いに本屋に行ったんですがC系統の本は少ないですね
少なくともジュンク堂だと 立ち読みしたいけど無理かな?
0459デフォルトの名無しさん
2010/03/31(水) 18:37:35不具合の直し方とか本には書かれてない。
書こうという気にならないのは向いてないということなのかもしれない。
0460デフォルトの名無しさん
2010/03/31(水) 18:47:01何の話???
0461452
2010/03/31(水) 18:50:52ロベールの部屋
ttp://www7b.biglobe.ne.jp/~robe/
このサイトのC++の内容ぐらい分かる?
もし分かるならEffective C++は文句なく買いだと思う。
Exceptional C++が理解できればEffective C++は不要になりうるけど、
そのEffective C++が理解できればってところが難解だから
やっぱりEffective C++を今買っても良い。
目から鱗だよたぶん。
0462デフォルトの名無しさん
2010/03/31(水) 18:56:35>>454
もお願いします。
0463デフォルトの名無しさん
2010/03/31(水) 18:59:18>>450へのレスじゃないの?
0464460
2010/03/31(水) 19:02:11>>459
> 書こうという気にならないのは向いてないということなのかもしれない。
書こうという気にならない人なんてこのスレにいないだろ
0465デフォルトの名無しさん
2010/03/31(水) 19:07:180466458
2010/03/31(水) 19:19:35ちょっと目を通しましたが、自分の現在の能力として入門書一冊だけなので、
言うならば幅が狭いというか、知ってる関数・ライブラリとか、例が少ないと自覚しました
どうかな?多分、バン!とソース出されてやっとわかるかどうかくらいです
仮想関数とかテンプレートとか、本当に簡単なソースで習っただけなので自分で応用は効かせられないレベルですね
こういう場合effectiveに行っていいんでしょうか?
0467デフォルトの名無しさん
2010/03/31(水) 19:32:310468452
2010/03/31(水) 19:44:19> こういう場合effectiveに行っていいんでしょうか?
それはまだ早いなぁ。
C++は本当に気が狂ったような言語だから
『Effective C++』も意味を理解するにはそれなりに知識と多少の経験が必要になる。
どーすっかな、『Effective C++』未満の難易度で適切な本が思いつかない。
みんなだったら何 すすめる?
0469デフォルトの名無しさん
2010/03/31(水) 19:44:48本を何冊か読んだだけでプログラミングの勉強をした気分に
なってはだめ。
本1冊読んだなら、その知識を使って、なんか作れ。
最初は電卓みたいなのとか、メモ帳みたいなのとかでもいい。
0470デフォルトの名無しさん
2010/03/31(水) 19:49:56C++のソースコードの一部を受け取り文字列リテラル化するものとかどうよ?
int main(){
タブstd::cout << "hoge";
タブreturn 0;
}
と記載されたファイルを受け取り
"int main(){\n\tstd::cout << \"hoge\";\nreturn 0;\n}\n
に変換するとか。
簡単すぎてつまらんか。。
0471デフォルトの名無しさん
2010/03/31(水) 19:50:04を見ながらC++に翻訳しながら自前パーサー書きあげればオブジェクトの有難味とC++特殊性が判る
0472デフォルトの名無しさん
2010/03/31(水) 19:56:39使うだけなら難易度はそこまで高くないし、
実装を知りたいと思い始めたら立派な変態候補生。
0473458
2010/03/31(水) 19:58:09メモ帳の簡単なやつは・・いけるかな?自信ないです
僕が買った入門書はとりあえずコンパイルと実行してみよう!みたいな乗りであまり深くはやってないです
そのロベールの部屋なりで経験値あげて何か作ってみます
0474デフォルトの名無しさん
2010/03/31(水) 19:59:34ロベールの部屋は入門書のWeb版みたいなものだから
あまり新しい発見はないかも。
メモ帳の簡単なやつとか、GUIライブラリを使わなきゃならなくなるから
果たして意味あるのだろうか。
0475138
2010/03/31(水) 20:05:28のp69の下部で
^19^ ^22^ ^21^ ^23^ ^20^
とありますが、このうち
" "
^21^
でどうして例外が発生する可能性があるのか理解できません。
(例外に関連したコードパスの文脈なので、例外が発生するという意味だと解釈しました。)
19-20 22-23
は本文に解説があるのですが、21だけは解説がありません。
どなたか教えてくださいませんでしょうか。
よろしくお願い申し上げます。
0476デフォルトの名無しさん
2010/03/31(水) 21:19:030477デフォルトの名無しさん
2010/03/31(水) 22:26:47同頁の 6. に書いてあることじゃないの?
(operator== は operator+ に読み替える)
0478475
2010/03/31(水) 23:28:42ありがとうございます。
なるほど、暗黙の型変換が起こった場合に一時オブジェクトの生成に失敗して
例外が投げられると言うことですね。
0480デフォルトの名無しさん
2010/04/01(木) 00:08:241000回読んでから質問しろ
0481デフォルトの名無しさん
2010/04/01(木) 01:02:54話はそれからだ
0483デフォルトの名無しさん
2010/04/01(木) 12:35:43リンク先のサムネイルがエンジニアのための文章術再入門講座になっているのですが、どうしてですか?
0484デフォルトの名無しさん
2010/04/01(木) 15:18:310485デフォルトの名無しさん
2010/04/01(木) 15:51:120486デフォルトの名無しさん
2010/04/01(木) 18:14:29throwする関数ではローカル変数を渡しても問題ないのでしょうか?
VCではnew、deleteで渡してたようだったので気になってます。
class myex : public std::exception {};
void func()
{
myex ex;
throw ex; <<一時オブジェクトが作られる?
}
void main()
{
try
{
func();
}
catch(std::exception &ex) <<不正アクセス?
{
cout << ex.what();
}
}
0487デフォルトの名無しさん
2010/04/01(木) 18:17:420488デフォルトの名無しさん
2010/04/01(木) 19:44:57new deleteで例外を渡すのはよしたほうがいい
0489デフォルトの名無しさん
2010/04/01(木) 19:45:37問題は無いのですね。ありがとう。
ということは例外クラスは全部参照にしたほうがよさそうですね。
0490デフォルトの名無しさん
2010/04/01(木) 19:57:12可能な限りnew deleteを使わないようにしておきます。
ありがとう。
0491デフォルトの名無しさん
2010/04/01(木) 20:05:21キャッチ側で確実にdeleteする必要がある。キャッチ側に責任を負わせ、それを間違いなく確実に記述するのは難しい。
はっきり言って使うべきじゃない。
0492デフォルトの名無しさん
2010/04/01(木) 20:29:25そのためにtry_catchも専用のマクロが定義されていたはず
0493479
2010/04/01(木) 20:52:23環境依存だと思います。原因は不明です。
こちらの環境ではクリックするとamazonのExceptional C++のページに飛びます。
>>480
> すぐあとに書いてあんだろうが
すみません分かりません。
p52の話でしょうか?
すぐあととはどこでしょうか?
0494デフォルトの名無しさん
2010/04/01(木) 20:59:28MFCは反面教師
0495デフォルトの名無しさん
2010/04/02(金) 02:14:200496デフォルトの名無しさん
2010/04/02(金) 02:15:35int a(){}
int b(int){}
char c(){}
int main(){
void (*fnc[])() = { a ,b , c };
}
0497デフォルトの名無しさん
2010/04/02(金) 02:22:07struct interface_type{ virtual void apply() = 0; virtual ~interface_type(){} };
struct wrapped_a : interface_type{ virtual void apply(){ a(); } };
struct wrapped_b : interface_type{ virtual void apply(){ b(int()); } };
struct wrapped_c : interface_type{ virtual void apply(){ c(); } };
interface_type *ptr[] = { new wrapped_a, new wapped_b, new wrapped_c };
とでもしてください。
0498デフォルトの名無しさん
2010/04/02(金) 02:26:280499デフォルトの名無しさん
2010/04/02(金) 05:30:330500デフォルトの名無しさん
2010/04/02(金) 07:06:04全部展開したやつをそのままソースに乗せました。
0501デフォルトの名無しさん
2010/04/02(金) 12:11:540502デフォルトの名無しさん
2010/04/02(金) 12:16:34boos::fusion
0503デフォルトの名無しさん
2010/04/02(金) 12:19:190504501
2010/04/02(金) 12:42:44vector<bool>を調べてみましたがflipで反転は出来るものの
シフトにあたるようなオペレータは特に定義されてないように思えます
自分で実装しましょうとかそういう話ですか?
0505デフォルトの名無しさん
2010/04/02(金) 12:57:47処理系を指定せずに算術シフトの結果なんて意味があるの?
左シフト: value *= 2;
右シフト: value /= 2;
で、何が不都合ですか?
0506デフォルトの名無しさん
2010/04/02(金) 14:07:57データの内部表現に規定がないのはそのため。
0507デフォルトの名無しさん
2010/04/02(金) 15:39:552 の n 乗での乗除算のポータブルで高速なコードを聞きたかったんじゃないの?
0508デフォルトの名無しさん
2010/04/03(土) 19:44:300509デフォルトの名無しさん
2010/04/03(土) 20:27:100510デフォルトの名無しさん
2010/04/03(土) 23:09:330511デフォルトの名無しさん
2010/04/04(日) 01:09:570512510
2010/04/04(日) 12:25:01一度標準になればクソ仕様だろうが生き残り続け
新人・周りが合わせていく。
それが魔のC++クオリティ。
ただしまともに使用されていないexport, 例外指定は別らしく
削除されたがな。
0513デフォルトの名無しさん
2010/04/04(日) 12:33:27互換性なんて放り投げればいいのに
0514512
2010/04/04(日) 12:42:07> 互換性なんて放り投げればいいのに
それなんてD言語
まあ悪しき習慣と言えばそうだけど、その腰の重さが
C++が繁栄した理由だと思うんだけど。
C言語とそれなりに互換性があり、過去のC++ともそれなりに互換性があってこその
C++じゃないか。さもなきゃ滅んで当然の言語。
0516デフォルトの名無しさん
2010/04/04(日) 13:19:48存在すら忘れられてたな。autoは進化したというのに、、、
0517デフォルトの名無しさん
2010/04/04(日) 13:22:210519デフォルトの名無しさん
2010/04/04(日) 14:19:28> autoは進化したというのに、、、
もう別人になったと言う方が良いかもねw
0520デフォルトの名無しさん
2010/04/04(日) 22:45:05デストラクタでデリートするようなスマートポインタで、
それだけに機能を特化させた最軽スマートポインタクラステンプレートって
ありますでしょうか。
正確には
template<typename T>
class MySmartPtr{〜};
みたいな形で、MySmartPtr<Base>とMySmartPtr<Derived>には特に互換性など必要なく、
動的削除子などの工夫や所有権の移動などもちろん備わっていなくていいです。
ただしoperator -> と operator * と std::swap の特殊化ぐらいは必要で、
例外安全かつ例外中立なものです。
よろしくお願い申し上げます。
0521デフォルトの名無しさん
2010/04/04(日) 22:50:510522デフォルトの名無しさん
2010/04/04(日) 23:23:27auto_ptrは所有権の移動処理を行なう部分で
無駄なバイナリができるんじゃね?
自作するのが早いかな。
0523デフォルトの名無しさん
2010/04/04(日) 23:28:24無駄なバイナリはできない
0524520
2010/04/04(日) 23:39:19ありがとうございます。
std::auto_ptrは
C++0x - Wikipedia, the free encyclopedia
ttp://en.wikipedia.org/wiki/C%2B%2B0x
unique_ptr will be provided as a replacement for auto_ptr which will be deprecated.
とのことで何れは削除されるか少なくともコンパイル時にwarningが出そうで
なんか気にくわないんです。
が、ひとまず今年ぐらいはstd::auto_ptrで行こうと思います。
ありがとうございました。
0525デフォルトの名無しさん
2010/04/05(月) 00:18:380526デフォルトの名無しさん
2010/04/05(月) 00:48:320527デフォルトの名無しさん
2010/04/05(月) 00:55:00な関数があったとして
foo(foo(foo(foo(0, 1), 2), 3), 4);
と書くのはステートメントの両端に文字を付け足さなくてはいけなくて`気持ちが悪いので
infix infix_foo = foo;
0 infix_foo 1infix_foo 2 infix_foo 3 infix_foo 4 ...
的な事をしたいんですが、boostとか超大手ライブラリにそういった機能をするものはありませんか?
0528デフォルトの名無しさん
2010/04/05(月) 00:56:040529デフォルトの名無しさん
2010/04/05(月) 01:00:08この処理だけでいいならSTLのstd::accumulateを使うか
0530デフォルトの名無しさん
2010/04/05(月) 01:04:01やめろそんなこと
どうしてもやりたけりゃこうだな
ひどいコードだ
struct foo_helper{
int tmp;
foo_helper(int i) : tmp(i){}
operator int(){return tmp;}
foo_helper operator->*(int i){
return foo_helper(foo(tmp,i));
}
};
foo_helper(0) ->* 1 ->* 2 ->* 3 ->* 4 ...
0531デフォルトの名無しさん
2010/04/05(月) 03:06:030532デフォルトの名無しさん
2010/04/05(月) 03:42:410533デフォルトの名無しさん
2010/04/05(月) 04:27:030534デフォルトの名無しさん
2010/04/05(月) 07:37:41> というか再帰を使うべきじゃね?
決定打だな。
0535デフォルトの名無しさん
2010/04/05(月) 08:03:26列を何らかのコードで出力せずに手入力の必要があるからinfixが必要だって言ってるんだよ。
再帰とかループとか的外れな事を言い出す奴は何考えてるの?
可変引数は型検査できないから論外。
0536デフォルトの名無しさん
2010/04/05(月) 08:10:320537デフォルトの名無しさん
2010/04/05(月) 08:15:060538デフォルトの名無しさん
2010/04/05(月) 08:43:04労力割いてもいいこだわりなのか?的外れなこだわりなのか?
徹夜明けの現実逃避か?ん?
0539デフォルトの名無しさん
2010/04/05(月) 08:56:180540デフォルトの名無しさん
2010/04/05(月) 09:22:47手入力が必要だったらループや再帰が的外れになるの?
意味わかんない。
0541デフォルトの名無しさん
2010/04/05(月) 10:30:43accumulate ?
0542デフォルトの名無しさん
2010/04/05(月) 10:52:290543デフォルトの名無しさん
2010/04/05(月) 11:43:49君、この仕事向いてないよ
0544デフォルトの名無しさん
2010/04/05(月) 13:13:21どの仕事だよ?君には535の職業が分かるのか?
無職かもしれないだろ
0545デフォルトの名無しさん
2010/04/05(月) 20:18:59> 無職かもしれないだろ
クソフイタwwww
0546デフォルトの名無しさん
2010/04/05(月) 20:20:09お前のおつむの程度が論外。
0547デフォルトの名無しさん
2010/04/05(月) 20:35:32operator()をオーバーロードして
なんとかしちゃダメなのか
0548デフォルトの名無しさん
2010/04/05(月) 21:24:31>>529-530で答えは出てるのに何故それを無視してわざわざ噛みつくのか
荒らしたいだけなのか
0549デフォルトの名無しさん
2010/04/05(月) 21:45:020550デフォルトの名無しさん
2010/04/05(月) 21:46:53>>527ではないのですが
boost::assignとoperator()のオーバーロードだと
どんな感じの実装になるんでしょうか
0551デフォルトの名無しさん
2010/04/05(月) 22:11:56たいていの場合shared_ptrあたりのほうが優秀なんだよな
shared_ptrは遅い遅い言われるけど致命的に遅いわけじゃないし
shared_ptrがボトルネックになるなら生ポインタ操作するだろうし・・・
でも、再発明したがるんだよなぁ・・・
0552デフォルトの名無しさん
2010/04/05(月) 22:12:580553デフォルトの名無しさん
2010/04/05(月) 22:16:580554デフォルトの名無しさん
2010/04/05(月) 22:20:32そもそもboost::shared_ptrは
・多くの環境をサポート
・マルチスレッドも安全
・ちゃんとよくレビューされていて自作よりずっとずっと安心
という利点があるしねぇ。
0555デフォルトの名無しさん
2010/04/05(月) 22:24:370556デフォルトの名無しさん
2010/04/05(月) 22:26:59非共有ってことはauto_ptrみたいに破壊的コピーを行うもの?
それとも深いコピーを行うスマートポインタ?
0557デフォルトの名無しさん
2010/04/05(月) 22:31:00shared_ptrの機能とかマルチメソッドとかと共存できるし。
0558デフォルトの名無しさん
2010/04/05(月) 22:34:26ユーザーが選択できるように両方
0559デフォルトの名無しさん
2010/04/05(月) 22:38:11boost::anyって使い道が分からない。
実装は目から鱗が落ちるようだった。
0560デフォルトの名無しさん
2010/04/05(月) 22:39:040561デフォルトの名無しさん
2010/04/05(月) 23:07:56マルチメソッドがないと価値半減だからなぁ。
マルチメソッドがあるとanyに保存したデータの詳細を意識せずに操作することができるようになるんだけど……
前にboost/vaultに突っ込んだけど誰も興味無いみたいだから放置。
0562デフォルトの名無しさん
2010/04/05(月) 23:20:240563デフォルトの名無しさん
2010/04/05(月) 23:34:21用途を考えずに乱用する設計が良くないのはanyに限った話じゃないだろうね。
性能問題があるとしても(将来的な)拡張性という面でany&マルチメソッドは魅力的だけど。
0564デフォルトの名無しさん
2010/04/05(月) 23:42:110565デフォルトの名無しさん
2010/04/05(月) 23:42:48c++ならコンパイル時にできるだけ決定するのが基本だし
実行時に型判断を回すとしてもわざわざ一回anyに入れてコストふやす必要はない
0566デフォルトの名無しさん
2010/04/05(月) 23:43:230567デフォルトの名無しさん
2010/04/06(火) 00:01:550568デフォルトの名無しさん
2010/04/06(火) 00:03:590569デフォルトの名無しさん
2010/04/06(火) 00:05:550570デフォルトの名無しさん
2010/04/06(火) 00:20:55だから逆だって。anyの中身に応じて(自動的に)メソッドをディスパッチしてくれる機能が欲しい。
別にマルチメソッドするためにanyを活用したいわけじゃない。
もともとany使いたい時はソースコードと型情報を切り離して使用したいケースが多いんだけど、
現状のanyだと実際に使用するとき中身の型をソースコードに書かなきゃいけないから不便なんだよね。
リフレクションとかある言語だとそれを活用すればいいけど、C++にはそんなの無いからね。
0571デフォルトの名無しさん
2010/04/06(火) 00:24:150572デフォルトの名無しさん
2010/04/06(火) 00:30:33BOOST_INTERFACE?
0573デフォルトの名無しさん
2010/04/06(火) 00:34:480574デフォルトの名無しさん
2010/04/06(火) 00:44:54判ってないなあ。コストかけてでも動的な柔軟性が欲しいこともあるって言ってんだけど。
最初の設計段階ではかなり重宝するよ。
性能が欲けりゃ仕様が固まってパフォーマンスチューニングする段階になってから修正すればいいんじゃね?
0575デフォルトの名無しさん
2010/04/06(火) 00:46:58そんな感じ。
ただboost::variantだと代入できる型が決め打ちになるけど、boost::anyだと何でも突っ込めるという違いがある。
まあ、何でも突っ込みたくなるような事態になるのは少ないとは思うけどね。
0576デフォルトの名無しさん
2010/04/06(火) 00:50:26mapの値をanyにしてしまうとか
事前にanyに格納する型を数パターンに決めておいて
キーに対応する型を知っている場合は直接指定して
知らない場合は事前に決めた数パターンの型でチェックして値を取り出す
これでmapの値の型が多少柔軟になるんじゃないかな
クリティカルな処理には向かないだろうけど
バックグラウンドとかでやりようはあるんじゃない?
まあ使った事ないんだけどね
0577デフォルトの名無しさん
2010/04/06(火) 01:31:25コード自体はシンプルだがC++について知り尽くしてないとこんな発想出てこないわ
どういう頭の中身してるんだろ
0578デフォルトの名無しさん
2010/04/06(火) 08:44:270579デフォルトの名無しさん
2010/04/06(火) 10:10:450580デフォルトの名無しさん
2010/04/06(火) 18:42:09{
typedef int type;
};
template<typename T>
class B : public A
{
typename T::type a;
type b; // OK
};
template<typename T>
class C : public T
{
typename T::type a;
type b; // NG
};
class Cで、NGとなってしまう理由がわかりません。
どなたか解説願えませんでしょうか
0581デフォルトの名無しさん
2010/04/06(火) 19:53:16(規制されているため代理レスで書き込ませていただきます。)
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
上記のサイトよりC++の基本的なことを学んだのですが、いざGUIの開発をしようと思ってもどうすればいいのか分かりません。
GUIのツールキットにはGTK+を使いたいのですが、どうすればいいのでしょうか。
0582デフォルトの名無しさん
2010/04/06(火) 20:51:00そのtypeがコンパイルできないのは当たり前なんだが
逆に質問するがそのtypeはどの型だと思うんだ?
>>581
ここはスレ違い
Linux板にGTKスレがあったはず
on Windowsならム板にもあるが
そんな曖昧な質問しにいっても荒れるだけだから
せめてテンプレサイトとか使って環境構築とサンプルのコンパイルや
読み下しをしてわからない所を具体化すべき
0583デフォルトの名無しさん
2010/04/06(火) 20:54:17C<A>として使ってるの?
0584デフォルトの名無しさん
2010/04/06(火) 21:22:45name lookup のルールが違うから。
template 引数に依存しない名前(non dependent name)は
定義時に名前解決されこの場合 template な基本クラスまで見に行かない。
dependent name はインスタンス化された時点でも
lookup されるので template 基本クラスまで探索される。
two phase lookup でぐぐれば良いと思うよ。
0585デフォルトの名無しさん
2010/04/06(火) 21:52:08> static_cast<void>とか最近まで知らなくて、わざわざvoid用に特殊化してたよ。
すごい遅レスだけど、
これってどういう意味?
static_cast<void>なんて人生でいまだ使った事がないんだけど。。。
0586デフォルトの名無しさん
2010/04/06(火) 22:00:51typename T::result_type call_foo(T const& t) {
return static_cast<typename T::result_type>(t.foo());
}
0587デフォルトの名無しさん
2010/04/06(火) 22:03:30↑で T::result_type==void のとき、
return static_cast<void>(...); は
return; と同じ意味になる。
たぶんそういう使い方のことじゃないの。
0588デフォルトの名無しさん
2010/04/06(火) 22:06:56ちなみに VC++ 6.0 ではまだこの仕様に対応してなかったはず
0589デフォルトの名無しさん
2010/04/06(火) 22:07:44void 式自体は普通に使える。
0590デフォルトの名無しさん
2010/04/06(火) 22:16:430591デフォルトの名無しさん
2010/04/06(火) 22:21:420592デフォルトの名無しさん
2010/04/06(火) 22:26:13流石に退役したけど
0593585
2010/04/06(火) 22:47:05なるほどなるほど。
ありがとう。
いやはやまたもやバッドノウハウが増えた。
0594デフォルトの名無しさん
2010/04/06(火) 22:53:000595デフォルトの名無しさん
2010/04/06(火) 22:55:53IE6と同類だわw
0596デフォルトの名無しさん
2010/04/06(火) 23:02:25> IE6と同類だわw
IE6より達が悪いww
0597デフォルトの名無しさん
2010/04/06(火) 23:03:10「奥が深い」と申し上げるべきであった。
失礼した。
0598デフォルトの名無しさん
2010/04/06(火) 23:39:41void のときは特殊化すべしという
パッドノウハウが改善されたわけだ。
わかんない事を何でも否定すんなよ。
0599デフォルトの名無しさん
2010/04/06(火) 23:39:570600デフォルトの名無しさん
2010/04/07(水) 00:22:08関数呼び出しに付けて戻り値を無視する事を明示したり
0601デフォルトの名無しさん
2010/04/07(水) 01:00:430602デフォルトの名無しさん
2010/04/07(水) 01:34:36struct A
{
typedef void result_type;
int foo() const { return 0; }
};
0603デフォルトの名無しさん
2010/04/07(水) 01:56:180604デフォルトの名無しさん
2010/04/07(水) 02:32:200605デフォルトの名無しさん
2010/04/07(水) 03:01:27ttp://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
上記のサイトよりC++の基本的なことを学んだのですが、いざGUIの開発をしようと思ってもどうすればいいのか分かりません。
GUIのツールキットにはGTK+を使いたいのですが、どうすればいいのでしょうか。
0606デフォルトの名無しさん
2010/04/07(水) 03:05:11>>582
0607デフォルトの名無しさん
2010/04/07(水) 03:33:44具体的に探索は何を意味するんですか?
0608デフォルトの名無しさん
2010/04/07(水) 05:42:21探索に都合がいいように作られてるって事でしょ。
二分探索木なら大小関係に制約を置くとか。
0609デフォルトの名無しさん
2010/04/07(水) 07:08:40構文解析の結果、木構造になる
構文解析木とか。
0610デフォルトの名無しさん
2010/04/07(水) 07:25:20パッドノウハウてw
0611デフォルトの名無しさん
2010/04/07(水) 07:25:44そんなの渡すなよ
0612デフォルトの名無しさん
2010/04/07(水) 12:48:27ノードって読み替えたらいいとか=ただの木
0613デフォルトの名無しさん
2010/04/07(水) 13:25:28ありがとうございます。
順序付けされた木構造をいうのですね
0614デフォルトの名無しさん
2010/04/07(水) 17:47:56なんでエラーになるのこれ?
0615デフォルトの名無しさん
2010/04/07(水) 17:52:09hoge<3> の 時点では hoge<10> が特殊化されてないから
0616デフォルトの名無しさん
2010/04/07(水) 17:59:29特殊化ってオブジェクト作るときにされると思ってたんだけど違うのか…
0617デフォルトの名無しさん
2010/04/07(水) 20:48:350618デフォルトの名無しさん
2010/04/07(水) 21:35:26コンパイラは上から読んでいく1パス野郎だから、その下に書いてある内容なんて
完全シカトされる。
0619デフォルトの名無しさん
2010/04/07(水) 21:38:160620デフォルトの名無しさん
2010/04/08(木) 11:50:39template <int a> struct x<a, a> {}; // ok
template <int a> struct x<a, a + 1> {}; // ng
なんで最後のダメなの?
0621デフォルトの名無しさん
2010/04/08(木) 12:07:200622デフォルトの名無しさん
2010/04/08(木) 12:15:06>>620 エラーメッセージは何て言ってるの?
0623デフォルトの名無しさん
2010/04/08(木) 12:26:36gcc でコンパイルしたら↓のエラー。
> :5: error: template argument '(a + 1)' involves template parameter(s)
template まわりの規格文面を "involve" で検索したら、関連箇所が見つかった。
14.5.5 Class template partial specializations p8
> Within the argument list of a class template partial specialization,
> the following restrictions apply:
> - A partially specialized non-type argument expression shall not
> involve a template parameter of the partial specialization except
> when the argument expression is a simple identifier.
単純な識別子(この場合 a )として使うのはいいけど、それ以外の式はダメと定められている。
任意の式を許すとしてしまうと、特殊化のパターンマッチが終わらない可能性が出てくるとか、
そういう話かと。
0624デフォルトの名無しさん
2010/04/08(木) 13:05:04template関連はいくら勉強しても先が見えないですね…
0625デフォルトの名無しさん
2010/04/08(木) 15:57:080626デフォルトの名無しさん
2010/04/09(金) 00:08:351. ttp://codepad.org/qGxELgCu
2. ttp://codepad.org/25QITsNU
3. ttp://codepad.org/ZKHMj1Hk
3.はコンパイルエラーになるので論外ですが、1.と2.ではどちらが望ましいのでしょうか?
速度が変わったりコンパイラが最適化する余地の差が出たりしますでしょうか?
(私の考えでは右辺値参照とやらが実装された暁には差が出るのではないかと思っています。)
よろしくお願い申し上げます。
0627デフォルトの名無しさん
2010/04/09(金) 00:15:23std::strlen(str_ptr);
0628デフォルトの名無しさん
2010/04/09(金) 00:34:15俺の感覚では全部NGなんだが、何で動いてるんだろう??
0629デフォルトの名無しさん
2010/04/09(金) 01:02:18右辺値参照でこうしたいんだろうけど無意味じゃないか
0630デフォルトの名無しさん
2010/04/09(金) 01:05:440631デフォルトの名無しさん
2010/04/09(金) 01:07:36どちらも std::string の一時オブジェクトをひとつ作るだけ。動作は変わらない。
どちらかと言えば 1 のほうが意図を直接的に表している分、望ましい。
ただし、そのコードそのままのことがほんとうにやりたいことであれば >627
0632デフォルトの名無しさん
2010/04/09(金) 01:26:31どうしたらいいですか?
0633デフォルトの名無しさん
2010/04/09(金) 01:29:40仕事変えた方がいいよマジで
0634デフォルトの名無しさん
2010/04/09(金) 01:33:440635デフォルトの名無しさん
2010/04/09(金) 01:46:19boost::mpl::placeholders::_1とか書いてたら死なない?
0636デフォルトの名無しさん
2010/04/09(金) 02:49:36死なないけどめんどいんで、できるだけスコープを絞って using する。
且つ、できるだけ using namespace ... は避ける。
0637デフォルトの名無しさん
2010/04/09(金) 02:56:26しかも_0からじゃなくて_1だからな。吐き気がする。
0638デフォルトの名無しさん
2010/04/09(金) 03:07:02場所によらず2連続のアンダースコアだけじゃなかった?
0639デフォルトの名無しさん
2010/04/09(金) 05:28:31これについても _1 は該当しない。
0640デフォルトの名無しさん
2010/04/09(金) 07:11:04C++使えないレベルってだけだよ今。
0641デフォルトの名無しさん
2010/04/09(金) 07:33:46これで 637 の鳥肌と吐き気も治るなww
0642デフォルトの名無しさん
2010/04/09(金) 07:38:590643デフォルトの名無しさん
2010/04/09(金) 08:00:06整腸剤飲め。 俺もだけど。
0644デフォルトの名無しさん
2010/04/09(金) 09:18:09ここはC++相談室だぜ。 くだらないレスはやめろ とか言って
0645デフォルトの名無しさん
2010/04/09(金) 09:22:320646デフォルトの名無しさん
2010/04/09(金) 18:51:030647デフォルトの名無しさん
2010/04/09(金) 19:59:54え
俺、まだC++始めたてだった頃にアンダースコア先頭に入れた数値をメンバで持ってたら
今標準化委員会にいる人に「処理系で予約されてるよ」って言われたんだが...
0648デフォルトの名無しさん
2010/04/09(金) 20:04:250649デフォルトの名無しさん
2010/04/09(金) 20:07:06誰がうまい事を(ry
>>648
嫌ならboost使うな
C++0xも使うな
0650デフォルトの名無しさん
2010/04/09(金) 20:11:43嫌なことから逃げてるだけじゃ活路は開けねー
俺は使わせてもらうぜぇーーーーー!!
0651デフォルトの名無しさん
2010/04/09(金) 20:24:130652デフォルトの名無しさん
2010/04/09(金) 20:37:18美意識無い人って嫌だわー
0653デフォルトの名無しさん
2010/04/09(金) 20:40:020654デフォルトの名無しさん
2010/04/09(金) 20:58:34っていうか>>648の美意識が
常人の美意識からすると醜いんですよ。
0655デフォルトの名無しさん
2010/04/09(金) 21:24:350656デフォルトの名無しさん
2010/04/09(金) 22:09:10delete p;
これってサイズ分からないはずですけど、
どんな処理がされるんでしょうか?
0657デフォルトの名無しさん
2010/04/09(金) 22:15:11であり、実際にそのようにしてdeleteを行っている
0658デフォルトの名無しさん
2010/04/09(金) 22:16:140659デフォルトの名無しさん
2010/04/09(金) 22:16:52sizeof(std::string)の大きさのメモリを確保する。
std::stringのコンストラクタを呼び出す。
std::stringのデストラクタを呼び出す。
メモリを解放する。
サイズはsizeof(std::string)です。わかります。
0660デフォルトの名無しさん
2010/04/09(金) 22:21:48サイズがわからないのはpじゃない
0661デフォルトの名無しさん
2010/04/09(金) 22:28:00void del_func( void *p );
void func()
{
del_func( new std::string( "delete me!" ) );
}
void del_func( void *p )
{
delete p;
}
ふむふむ、delete自体はサイズが分かってるんですね。
デストラクタも呼ばれるとは意外でした。
だったらvirtualなしのデストラクタも呼び出してほしいなぁ
0662デフォルトの名無しさん
2010/04/09(金) 22:30:38あ、ごめん。void*に気づかなかった。
デストラクタは呼ばれないだろうね。
0663デフォルトの名無しさん
2010/04/09(金) 22:33:070664デフォルトの名無しさん
2010/04/09(金) 22:54:150665デフォルトの名無しさん
2010/04/10(土) 00:10:220666デフォルトの名無しさん
2010/04/10(土) 00:33:10>基底クラスの場合でも virtual デストラクタが無いとダメなんだからね。
これの理由ってvirtualでない場合、なんと言うか、継承と無関係なその層固有の物みたいに見られるから
スルーされちゃうのかな。
どうしてそうなのか理由よくわかってない俺。詳しい人教えて
0667デフォルトの名無しさん
2010/04/10(土) 00:35:31ポインタの型からデストラクタを呼ぶので、派生クラスを指しているとは
夢にも思ってないので呼ばないわけ
virtualを付けると動的に結合されるのでその都度呼ばせる事ができる
その代わり効率が少し低下する
0668デフォルトの名無しさん
2010/04/10(土) 00:41:41この条件で未定義動作になると規格で定められている。
667 が言ってるのはきっと何か特定の実装での実験結果なので、あまり真に受けないで
おいたほうがいい。
0670デフォルトの名無しさん
2010/04/10(土) 00:43:33struct Derived : Base
{};
Base * p = new Derived;
delete p;
としたとき、BaseがvirtualなDestructorを持っていない場合の
動作は、標準C++では未定義の動作である
/////////////////////////////////////////
ということを知らないヤツが居て困るんだけど。
彼らは「Derivedクラスのデストラクタが呼ばれないだけでしょ?
特にDerivedクラスのデストラクタに仕事はさせてないから
問題ないよ」とほざいていたりする。
0671デフォルトの名無しさん
2010/04/10(土) 00:45:40void *pgr = new int[2];
delete pgr;
これはデストラクタとか継承関係がなく、ただメモリ開放すればいいだけに思えるけどだめなの?
0672デフォルトの名無しさん
2010/04/10(土) 00:46:42virtualなデストラクタを持ってないから未定義の動作だ
0673デフォルトの名無しさん
2010/04/10(土) 00:47:390674デフォルトの名無しさん
2010/04/10(土) 00:49:55struct wrapped : std::vector<T>{
virtual ~wrapped(){ this->~std::vector(); }
};
そしてどっかでoperator =(T, std::vector<U>)を定義して中で例外をthrowさせる。
じゃだめなの?
0675デフォルトの名無しさん
2010/04/10(土) 00:51:43多態動作をさせないのならそれでもいいかもしれんな
しかし危険だな
0676デフォルトの名無しさん
2010/04/10(土) 00:52:180677デフォルトの名無しさん
2010/04/10(土) 00:55:43そう。未定義動作。
それとは別にそのコードだと配列なので delete [] pgr じゃないといけない。
このため char *pgr だったとしても未定義動作。
最新のドラフトだと "The operand shall have a pointer to object type, ..." となっているので、
void はオブジェクトでは無いことと合わせてコンパイルエラーになってくれるのかもしれない。
0678デフォルトの名無しさん
2010/04/10(土) 00:56:45そのクラスがstd::vector*から指していたらdeleteした場合鼻から悪魔だよ
つまりあまり役に立たない
0679デフォルトの名無しさん
2010/04/10(土) 00:57:05バグる
0680デフォルトの名無しさん
2010/04/10(土) 00:58:32前者ならobject_ptr<type>、後者ならarray_ptr<type>のそれぞれtype*にキャストできる型を返して欲しいとは思ったり思わなかったり
0681デフォルトの名無しさん
2010/04/10(土) 01:02:58wrappedからstd::vectorのdesutorakuta-動かせばいいのは分かるから
template<class T>
struct wrapped : std::vector<T>{ virtual ~wrapped(){} };
もだめなの?って横から思った。
0682デフォルトの名無しさん
2010/04/10(土) 01:06:10だからwrapped*から操作する分には問題ないと思う
問題はvector*からdeleteすると鼻から悪魔だよって事
0683デフォルトの名無しさん
2010/04/10(土) 01:07:260684デフォルトの名無しさん
2010/04/10(土) 01:09:05だが~wrappedの中で~vectorしてるとデストラクタが2回呼ばれるから必ずバグる
0685デフォルトの名無しさん
2010/04/10(土) 01:14:060686デフォルトの名無しさん
2010/04/10(土) 01:14:22それなら普通に包含使ったほうがいいな
0687デフォルトの名無しさん
2010/04/10(土) 01:15:56boost.assign に += とか -= とかメンバでないやり方でオーバーロードしてるのがあるけど = がどうかは知らない
0688デフォルトの名無しさん
2010/04/10(土) 01:36:25operator+=とかは+や&&や->*とかと同じただの二項演算子だから外でもOK
0689デフォルトの名無しさん
2010/04/10(土) 05:45:300690デフォルトの名無しさん
2010/04/10(土) 07:26:33それを別の関数からマップを介して取得する、といったことは可能なのでしょうか?
0691デフォルトの名無しさん
2010/04/10(土) 07:41:09単にmapを経由するだけの話
0692デフォルトの名無しさん
2010/04/10(土) 11:42:59Base* b = new Base
Derived* d = new Derived;
*(Base*)d = b;
こういう風にBaseクラスの部分だけコピーして上書きしてしまって良いのでしょうか?
とりあえず動いてるみたいですが……
0693デフォルトの名無しさん
2010/04/10(土) 12:04:27DerivedがAnotherBaseとBaseを多重継承してればアウトだと思うし、
そうでなくても保障されていないのでは?
0694デフォルトの名無しさん
2010/04/10(土) 12:16:29そのコードそもそもおかしくない?
Base* b = new Base // bはポインタ
Derived* d = new Derived; // dはポインタ
で
*(Base*)d = b; // 左辺はインスタンス、右辺はポインタ
だぞ?
とりあえずも何も全く動かないと思うが、本当はどういうコードを想定していたの?
0695デフォルトの名無しさん
2010/04/10(土) 12:20:23void func(Hoge *p)
{
Hoge tmp(*p);
・・・;
};
とか書いたら折角ポリモーフィックにしたのにサブクラスで使えなくなるってことか
そんなバカな…
0696670
2010/04/10(土) 12:21:21> そうなるとstd::vectorを継承した独自のコンテナクラスなんかとんでもない話だな
> virtualなデストラクタを持ってないから未定義の動作だ
こういうヤツが居て困ると俺は言ってるんだ!
なんでそういう風に断言するのかね君は。
//////////////////////////////////////////////////
struct MyContainer : std::vector<int>
{};
でも
std::vector<int> * p = new MyContainer;
で未定義の動作になるのは
delete p;
とした時だけで、例えば
delete (MyContainer*)p;
だったら未定義の動作にはならない。
あるいは
boost::shared_ptr< std::vector<int> > * p(new MyContainer);
としても未定義の動作にはならない。
そもそもMyContainerを基底クラスのポインタに入れるということをしなければ
全然問題ないし。
0697デフォルトの名無しさん
2010/04/10(土) 12:21:450698デフォルトの名無しさん
2010/04/10(土) 12:24:05落ち着いて自身のレスを読み返し、
何についてのレスなのかもちゃんと書け。
0699デフォルトの名無しさん
2010/04/10(土) 12:29:21struct B : A {};
A a;
B b;
A* p = &b;
*p = a;
これが許されるのかどうか自分も知りたい
0700デフォルトの名無しさん
2010/04/10(土) 12:33:47誰がそんな話題を振った? そんな何の問題も無い通常の代入を?
0701デフォルトの名無しさん
2010/04/10(土) 12:37:13protected継承しようぜってじっちゃが言ってた
0702デフォルトの名無しさん
2010/04/10(土) 12:39:36BaseクラスとDerivedクラスがあった時に、
Base* b = new Base;
Derived* d = new Derived;
*(Base*)d = *b;
こういう風にBaseクラスの部分だけコピーして上書きしてしまって良いのでしょうか?
0703デフォルトの名無しさん
2010/04/10(土) 12:43:37>>702
http://codepad.org/33CxBhOd
問題ないと思う
0704デフォルトの名無しさん
2010/04/10(土) 12:48:33一つの処理系の実行結果だけを見て「大丈夫」と言われても・・・・
規格から該当部分を探してこいよ
0705デフォルトの名無しさん
2010/04/10(土) 12:51:43日本語勉強してから出直してこい
0706デフォルトの名無しさん
2010/04/10(土) 12:54:42逆ギレみっともない
IOS/IEC 14882:2003から探してこいって言ってるんだ
0707デフォルトの名無しさん
2010/04/10(土) 12:55:44○ISOな
言わなくても分かると思うけど
突っ込む奴は馬鹿
0708デフォルトの名無しさん
2010/04/10(土) 12:58:340709デフォルトの名無しさん
2010/04/10(土) 13:03:300710デフォルトの名無しさん
2010/04/10(土) 13:07:110711デフォルトの名無しさん
2010/04/10(土) 13:09:410712デフォルトの名無しさん
2010/04/10(土) 13:09:520713670
2010/04/10(土) 13:48:01> こういう風にBaseクラスの部分だけコピーして上書きしてしまって良いのでしょうか?
そういう変な考え方をすると分からなくなるかもしれないけど、
普通に考えて
*( (Base*)d ) = *b;
は
*( (Base*)d )というBase&型の左辺値に対して
Base::operator = (*b);
を呼んでいるだけだろ?
ということは
規格の上では未定義の動作にはならない。
ただそれで問題ない動作をするかどうかは
Derived x;
x.Base::operator = (*b);
で大丈夫な実装になっているかどうかに依存する。
///////////////////////////////////////////////////////
>>703-712
お前ら誰か一人でも実りのあるレスができるヤツは居ないのか。
規格を嫁とかどんな質問もそれで片付いちゃうわけだが、
はっきり言ってバカでも言える事だし実りがあるとはちょっと言い難い。
0714デフォルトの名無しさん
2010/04/10(土) 13:59:06ありがとうございます。
Baseクラスの代入演算子が正しく動作すれば問題ないのですね。
仕様書読めとか入っている馬鹿は死んで欲しい。
0715デフォルトの名無しさん
2010/04/10(土) 14:10:280716デフォルトの名無しさん
2010/04/10(土) 15:43:20なに火病ってんだこいつ
0717デフォルトの名無しさん
2010/04/10(土) 15:45:160718デフォルトの名無しさん
2010/04/10(土) 16:14:04社会人とはとても思えない
0719デフォルトの名無しさん
2010/04/10(土) 16:19:430720デフォルトの名無しさん
2010/04/10(土) 16:41:08じゃあしょうがないなw
0721デフォルトの名無しさん
2010/04/10(土) 18:35:180722デフォルトの名無しさん
2010/04/10(土) 19:02:190723デフォルトの名無しさん
2010/04/10(土) 19:19:120724デフォルトの名無しさん
2010/04/10(土) 19:23:53よしこれでチャンコロは消えた。
0725デフォルトの名無しさん
2010/04/10(土) 20:04:450726デフォルトの名無しさん
2010/04/10(土) 20:08:070727デフォルトの名無しさん
2010/04/10(土) 22:42:38ttp://wota.jp/ac/?date=20100401#p01
これか。
すげぇ頭良いよなwww
0728デフォルトの名無しさん
2010/04/10(土) 23:30:02こんなの見つけた
何気に「小泉纯一郎」とかあって吹いた
0729デフォルトの名無しさん
2010/04/10(土) 23:41:410730デフォルトの名無しさん
2010/04/11(日) 00:35:04class CBase
{
public:
int m_base;
};
class CDerived : public CBase
{
public:
int m_derived;
virtual void v_func() {}
};
// グローバルデータ
CBase g_data00;
CDerived g_data01;
// グローバルデータへのポインタを取得する
void getDataPointer(CBase** pp_data, int type)
{
switch (type) {
case 0: *pp_data = &g_data00; break;
case 1: *pp_data = &g_data01; break;
}
}
(続く)
0731730
2010/04/11(日) 00:35:27{
g_data01.m_base = 10;
g_data01.m_derived = 20;
// グローバルデータを受け取る
CDerived* p_data = NULL;
getDataPointer((CBase **)&p_data, 1);
return 0;
}
引数によって色々なデータへのポインタを受け取る関数を作ったつもりが、
継承先に仮想関数があった場合に上手く行きませんでした。
期待した動作 → p_data->m_base == 10、p_data->m_derived == 20
実際の動作 → p_data->v_func == 10、p_data->m_base == 20, p_data->m_derived == 不定
p_data = getDataPointer(1); と改造した場合は上手く調整してくれたのに…。
アップキャストは安全だ!と思ってたのに、キツネにつままれたようでした。
CDerived* → CBase* は安全でも、CDerived** → CBase** は安全じゃないんでしょうか。
実際は複数のデータを受け取ることもあるので、戻り値で受け取る方法は使えません。
何かいい方法はないでしょうか。
0732デフォルトの名無しさん
2010/04/11(日) 00:56:17> CDerived* → CBase* は安全でも、CDerived** → CBase** は安全じゃないんでしょうか。
そうだよ。前者は暗黙変換が許されている。後者は reinterpret_cast が必要になり、
変換によって得られた値は安全に使用できない。
正直、Cスタイルキャストを持ち出しといて「安全じゃないんでしょうか」なんて聞いたら
「あたりまえだ間抜け」などと言われても仕方がないと思う。
前者の逆変換が static_cast (あるいは dynamic_cast )で可能なので、以下のように書けばいい。
CBase* p_base;
getDataPointer(&p_base, 1);
CDerived* p_data = static_cast<CDefived*>(p_base);
0733730
2010/04/11(日) 01:15:45C++ 風のキャストはタイプ量が多くて嫌っていたのですが、
使わないどころか使いこなせなくなっていたようです。反省です。
しかも static_cast でアップキャストが可能なのは初耳でした。
ありがとうございます!
ここから先は興味本位の質問なのですが、
元のソースから getDataPointer の引数を void** にすると、期待通り動きました。
同じく static_cast では変換できない型なのですが、たまたまでしょうか?
それとも仕様として認められているのでしょうか?
void** を受け取る関数は API などにも多くあり、
それらが動作不定とはあまり考えたくないので気になります。
0734730
2010/04/11(日) 01:16:34×しかも static_cast でアップキャストが可能なのは初耳でした。
○しかも static_cast でダウンキャストが可能なのは初耳でした。
0735デフォルトの名無しさん
2010/04/11(日) 01:58:40reinterpret_cast による変換結果は実装依存(コンパイラの自由だけど定められた動作)に
なるので、そのような変換が期待したとおりに動くような実装になっているかもしれない。
コンパイラなどのドキュメントに対応する記述を見つけられないのであれば、たまたまだと
思っといたほうがいい。この場合だと reinterpret_cast は必要ないわけだし。
0736デフォルトの名無しさん
2010/04/11(日) 02:04:11dynamic_castが必ず成功する事がわかっている時に限られるみたいね
そうでないとdynamic_castは0ポインタもしくは例外を投げてくれますから
0737デフォルトの名無しさん
2010/04/11(日) 02:23:07};
struct X {
float x;
};
template <unsigned int N>
struct hoge {
union {
float f[4];
struct : public loki::select<N >= 1, EMPTY, X> {
};
};
};
上のようなコードで
hoge.xとhoge.f[0]を等価にしようとしたのですが、出来ませんでした。
struct : public loki::select<N >= 1, EMPTY, X> {
} a;
とするとhoge.a.xとしてアクセス出来るのですが、無名共用体の中に無名構造体を使い
外側からアクセスできる裸のメンバを作る場合、継承を使ってメンバを増やすことは
出来ないということでしょうか?
何か方法ありましたらお教えください。
環境はVC2008Expressです。
0738737
2010/04/11(日) 02:26:01struct HOGE {
(略)
} hoge;
です。
0739737
2010/04/11(日) 02:30:58template <unsigned int N>
struct HOGE {
union {
float f[4];
struct : public loki::select<N >= 1, EMPTY, X>::result {
};
};
} hoge;
ですorz
Nが0なら空、1ならxが入るようにしたかったのですが、1でもxがありませんでした。
0740デフォルトの名無しさん
2010/04/11(日) 03:05:19それ、テンプレート関係あるのか?
無名構造体も VC++ の拡張じゃない?エラーメッセージは何て言ってるの?
0741737
2010/04/11(日) 03:21:18普通にXを継承しても同じでした。
エラーメッセージは出なくてコンパイルは通りますが
hoge.x = 1.0f;
とかやると
error C2039: 'x' : 'HOGE<N>' のメンバではありません
と出ます
0742デフォルトの名無しさん
2010/04/11(日) 03:58:07http://codepad.org/JcLEnpF7
何をしたいのかわからんが、こういうコード書く前に
アライメントやメモリアーキテクチャについての
移植性に関する問題を勉強することをお勧めする
個人的には>>730や>>739みたいな設計はすべきでないと思う
他人が見てわかりにくいし、直観的でないバグを誘発しやすい
0743デフォルトの名無しさん
2010/04/11(日) 04:11:030744741
2010/04/11(日) 04:17:16ありがとうございます。なんか変な結果になっちゃってますね・・・
用途を説明してなくてわかりづらかったですね、すみません。
SSEを使ったベクトルクラス(2〜4次元)を作りたかったんです。
128ビット境界でアラインして、__m128 v、float f[4]、float x,y,z,wで
同じ128ビット内の内容を指せるようにしたかったんです(リトルエンディアン限定)。
ともあれこの方法ではダメっぽいのでもうx,y,z,w全部入れてしまおうと思います。
ありがとうございました。
0745デフォルトの名無しさん
2010/04/11(日) 05:40:38あと、ダブルクォーテーションとかエスケープシーケンスとか、解析の時の頻出な部分をやってくれるライブラリもあったらいいなと思います。
0746デフォルトの名無しさん
2010/04/11(日) 06:01:360747デフォルトの名無しさん
2010/04/11(日) 06:42:070748デフォルトの名無しさん
2010/04/11(日) 07:12:26PHPには標準であるんですね。
>>747
どうもです。
0749デフォルトの名無しさん
2010/04/11(日) 09:12:00中身が10Gとかあると全展開するのに時間かかります。
部分的にロードできればHDDのスペースもいらないんですが。
0750デフォルトの名無しさん
2010/04/11(日) 18:47:23環境依存OKと書かれてるスレで聞きなよ
0751デフォルトの名無しさん
2010/04/11(日) 19:06:000752デフォルトの名無しさん
2010/04/11(日) 20:16:280753デフォルトの名無しさん
2010/04/11(日) 20:23:100754デフォルトの名無しさん
2010/04/11(日) 21:48:21template<typename T>result operator()(result(T::*t_f)() f){return f();} // 沢山の expected err …
0755デフォルトの名無しさん
2010/04/11(日) 21:55:07別に就職先要らないならそれでおkだよ。
0756デフォルトの名無しさん
2010/04/11(日) 22:00:50引数をres (T::*t_f)()にして
(p->*t_f)()で呼び出し
0757デフォルトの名無しさん
2010/04/11(日) 22:38:20ドカタ業界に職求めるなんて絶対止めるべき
不幸な人生確定
0758デフォルトの名無しさん
2010/04/11(日) 23:30:56就職先が無いのとどっちが不幸だろう
0759デフォルトの名無しさん
2010/04/12(月) 01:54:490760デフォルトの名無しさん
2010/04/12(月) 03:16:42下記クラスを作成/利用したコードを、デバッグモードで実行すると、
free のタイミングで 「ヒープが壊れています」 と言う旨の例外が発生し、実行が停止してしまいます。
wcscpy_s の辺りに何か不安を感じるのですが、一体何がいけないのでしょうか。 よろしくお願いいたします。
class Test {
private:
TCHAR *strBuf;
public:
Test() { }
~Test() {
if(strBuf) free(strBuf); // ← ここで「ヒープが壊れています」と出て中断してしまう
}
void setStr(const TCHAR *lpStr)
{
size_t len = (wcslen(lpStr)+1) * sizeof(TCHAR);
if(strBuf) strBuf = (TCHAR*)realloc(strBuf, len);
else strBuf = (TCHAR*)malloc(len);
memset(strBuf, 0, len);
wcscpy_s(strBuf, len, lpStr);
}
};
0761デフォルトの名無しさん
2010/04/12(月) 03:30:460762デフォルトの名無しさん
2010/04/12(月) 03:48:26というかそのソースだとメモリ確保の時点で例外発生すると思うんだけど
0763760
2010/04/12(月) 04:08:43Test() {
strBuf = NULL;
}
そして >>762 さんにご指摘頂いた点、実は最初にインテリセンスで確認した所、
第2引数の部分が rsize_t _SizeInWords となっていたので、これは文字数だろうと思い、そのようにしていたのですが、
wcslen(lpStr) を渡すと死んでしまうという結果になっていて、それでバイト数にしていました。
・・・・が、今もう一度試しに wcslen(lpStr)+1 を渡してみた所、すんなり上手く行きました。ありがとうございました!
本当は >>761 さんのおっしゃる wstring を使った方が楽チンなのはわかっていたのですが、
勉強の意味も込めまして、こんなコードを書いていました。 ありがとうございました!
0764760
2010/04/12(月) 04:12:410終端とかそこら辺の理由かなと思ったけど、文字数指定してコピーする関数だから
例えば途中までの文字でも構わないだろうし、転送先も事前に 0 で埋めてあるのに何故なんだ・・・
0765760
2010/04/12(月) 04:20:39そうだ、Unicodeだと1文字のサイズが不定になるから 上の処理だと確保に失敗する可能性がある・・・orz
0766デフォルトの名無しさん
2010/04/12(月) 04:22:35あとコピーコンストラクタとか=()もどうにかしないとポインタのコピーとfreeが発生して怖いかも
>>764
文字数を指定してコピーする関数ではないからだろう
ドキュメント読んでみ
0768デフォルトの名無しさん
2010/04/12(月) 12:37:16class Foo {
public:
int val[10];
Foo(const Foo &foo) {
〜コピー処理省略〜
}
Fool operator = (const Foo &foo)
{
〜valのコピー省略〜
return *this;
}
};
例えばこのようなクラスがあった時、代入演算子のオーバロード関数の中で *this を返していますが、
これ、return のタイミングでコピーコンストラクタが実行され、コピー処理が二回行われるような気がするのですが、
このような場合、どのようにすればコピー処理を1度で済ませる事が出来るのでしょうか。
0769デフォルトの名無しさん
2010/04/12(月) 12:51:23operator=は自分への参照を返さなければならないから、戻り値はFooではなくて"Foo&"。
参照はreturnでのコピー処理は発生しないから、コピー処理はoperator=の1回だけ。
0770デフォルトの名無しさん
2010/04/12(月) 13:11:26class Foo {
private: int val[10];
public:
Foo(const Foo& f) {
〜コピー処理省略〜
}
Foo& operator = (const Foo& f) { // ※1
〜コピー処理省略〜
return *this;
}
};
void testtesttest() {
Foo a, b;
b = a; // ※2
}
>>768 の内容で実行すると operator = → コピーコンストラクタ の順で実行されていた物が、
※1の戻りを参照に変えた所、コピーコンストラクタ → operator = の順で実行されるようになりました。 これは、
※2の b = としてコピーコンストラクタが走り、※2の = a として operator = が走った??のでしょうか。
(ひょっとして、単にDeep Copy したいだけなら、代入演算子のオーバロードはいらない??のでしょうか)
0771デフォルトの名無しさん
2010/04/12(月) 13:43:27デバッグしやすい。
間違えの総量が減る。
あとでパフォーマンス計り改良すればいい。
ホットスポット以外に手間掛けても意味なし。
0772デフォルトの名無しさん
2010/04/12(月) 13:44:52>ひょっとして、単にDeep Copy したいだけなら、代入演算子のオーバロードはいらない
それでOK。コピーコンストラクターとoperator=は何も定義しないとメンバー同士をディープコピーをするだけ。
メンバーにポインターがある場合も同様。
コピーコンストラクターが必要な場合は、メンバーにポインターやハンドルの類があり、ポインター(アドレス)そのもの
のコピーではなくて、ポインターが指している中身をコピーしたい場合とか、ハンドルの参照数を管理したい場合とか。
0773デフォルトの名無しさん
2010/04/12(月) 13:53:36Shallow CopyとDeep Copyの意味が逆になってない?
0774デフォルトの名無しさん
2010/04/12(月) 13:57:18デフォルトのコピー動作が Shallow か Deep かどうかはクラス内のオブジェクトの
コピー動作がどちらになっているかによって決まるわけで、なんとも言えないはず。
0775デフォルトの名無しさん
2010/04/12(月) 14:09:03本当にそれでコピーコンストラクタが動くか?
代入演算子の返値が参照じゃなかったときは返値の一時オブジェクトを生成するためにコピーコンストラクタが動くが。
0776デフォルトの名無しさん
2010/04/12(月) 14:09:170777デフォルトの名無しさん
2010/04/12(月) 14:11:41(゚Д゚ )ハァ?
0778デフォルトの名無しさん
2010/04/12(月) 14:14:31ベースクラスのポインターでduplicate()を呼び出すと、派生クラスのduplicate()を呼び出したい。
struct Base
{
virtual Base* duplicate () { return new Base; }
};
struct Derived : public Base
{
virtual Derived* duplicate () { return new Derived; }
};
0779デフォルトの名無しさん
2010/04/12(月) 14:20:11それ自体は構わんと思うが、Effective C++の第31項に触れないか?
0780デフォルトの名無しさん
2010/04/12(月) 14:20:28その操作を許してたらセキュアにならないからな
文字列終端は通常のstrcpy()の考え方
たしか_s系のDebugバージョンはコピー前にDestをFDで埋める
memset()乙
0781770
2010/04/12(月) 14:23:04参照を返すようにした場合、コピーコンストラクタは動いていないようでした。
自分でも「なんで参照返してるのに、生成するような動きに??」とは思ったのですが、
良く見てみた所、どうもVisualStudioで、トレースポイントの挿入で打ち込んだ所がどうやってもズレてしまい、
上下に並んでいた2つの関数のうち、2つのトレースポイントが両方ともオペレータオーバロードの方を差していただけ、だったようです。
=ログに常に2行出ていた。
試しにメンバを配列やポインタでなく int の即値に変え、コピー処理のところで x += f.x のようにして増加状態を見て確認してみた所、
コピー処理にあたる行は1度しか実行されず、つまりコピーコンストラクタは実行されていない事を確認しました。
お騒がせしました。 皆様ありがとうございました。
0782デフォルトの名無しさん
2010/04/12(月) 14:32:2131項「ファイル間のコンパイル依存性をなるべく小さくしよう」???
これ私の理解だとシグネチャーが違うので派生クラスのduplicate()が基底クラスのduplicate()を隠すはずなのですが、
何故か正しくオーバーライドできてしまっているので、最近のC++は仕様が変わったのかなと聞いてみました。
0783デフォルトの名無しさん
2010/04/12(月) 14:38:17前に話題になった部分も修正されてるし
http://www.pej-hed.jp/tools/file/download.cgi/1121/Exceptional%20C++%20Errata.htm
0784デフォルトの名無しさん
2010/04/12(月) 14:39:010785デフォルトの名無しさん
2010/04/12(月) 14:49:450786デフォルトの名無しさん
2010/04/12(月) 14:52:300787デフォルトの名無しさん
2010/04/12(月) 14:54:06うわこりゃひでえ
印刷して本にはさんでおくわ
0788778
2010/04/12(月) 15:03:06「共変」の「戻り値」でググると理解できました。
仮想関数のオーバーライドには共変の戻り値までは許されるのですね。すっきりしました。
何でお前はこんな重箱の隅の隅まで知ってるんだ……ありがとうございました。
0789デフォルトの名無しさん
2010/04/12(月) 21:42:02ttp://d.hatena.ne.jp/beeplex/20080228
1.C++の場合、メソッドの戻り値を共変にすることができます。
2.C++は反変引数をサポートしていない
へー。
0790デフォルトの名無しさん
2010/04/12(月) 21:44:04ttp://www.gotw.ca/publications/xc++-errata.htm
これもやべぇ
0791>>454
2010/04/12(月) 21:57:25ありがとうございます。
ご教示いただいた正誤表に
例外安全にすることができない。
->おそらく例外安全の強い保証が得られない。
があり、解決しました。
結局
>>480 >すぐあとに書いてあんだろうが
は知ったかぶりだったんですね。
まじめに考えなければ良かった。。。
0792デフォルトの名無しさん
2010/04/12(月) 22:20:490793デフォルトの名無しさん
2010/04/12(月) 22:32:06まあこのスレには知ったかぶりが昔からいっぱいなんだけどな。
0794デフォルトの名無しさん
2010/04/12(月) 22:42:130795>>454
2010/04/12(月) 22:45:05だとか今 読めば明らかにばかげた事を言っていたのに
正直にその後ろあたりをおよそ5回ほど熟読してしまったのですが、
結局 釣られていただけだと知りました。
0796デフォルトの名無しさん
2010/04/12(月) 22:58:530797デフォルトの名無しさん
2010/04/12(月) 23:44:35職業C++メインプログラマじゃなかったら、そんなもん
でも、職業C++メインプログラマなら恥ずかしい
0798デフォルトの名無しさん
2010/04/13(火) 00:34:21嘘を嘘と(ry
0799デフォルトの名無しさん
2010/04/13(火) 07:13:51よくあることです。
俺も2ch始めたころは…(ry
0800デフォルトの名無しさん
2010/04/13(火) 08:38:17共変の戻り値には俺も目から鱗だわ
C++は結構長いが知らんかった。
0801デフォルトの名無しさん
2010/04/13(火) 09:08:29実は俺も知らなかった…。C++め…どこまでも奥が深い。
0802デフォルトの名無しさん
2010/04/13(火) 10:29:23mix-inって方法は知ってたけど、名前があるなんて知らなかった
0803デフォルトの名無しさん
2010/04/13(火) 10:29:49しかもWikipediaには「共変」という言葉の定義が数学的に
しっかりされていて二回驚いた
Cは一人の人間が作ったので割と思想は浅いが、C++は数多くの
各界の著名人が開発に関わっているので、そういう裏事情も知らないと
完全に使いこなすのはまず無理ってか
C++ってプログラミング言語というガワを被された思想の塊だよな
0804デフォルトの名無しさん
2010/04/13(火) 11:02:150805デフォルトの名無しさん
2010/04/13(火) 11:12:020806デフォルトの名無しさん
2010/04/13(火) 11:18:51まさに上のduplicate(clone)みたいな仮想関数を実装するために拡張されたんだな。
確かにこれができないとキャストしまくりの汚いコードになる。
奥が深いぜC++
0807デフォルトの名無しさん
2010/04/13(火) 11:48:34ってどんな引数いれたらいいんだ?
::の意味がわかんねえ
0808デフォルトの名無しさん
2010/04/13(火) 13:46:34以前中高でHSPとAction Scriptはいじったことがあるけど、C言語系は初めてだ・・・。
というわけでブックオフで↓の2冊を買ってきたんだが、どうもネットで調べると明解C言語の方が評判良さげだね・・・。
林晴比古著『新訂 新C言語入門 スーパービギナー編』
同著『改訂 新C言語入門 ビギナー編』
あと、C言語について勉強するにあたって、色んな本が出版されすぎていて、
本の体系(ex. 大学受験の英語で言うところの「単語」「文法」「構文」「長文」「リスニング」のような分類)がイマイチ掴めない、ってのが困る。
どなたかC++やCの書籍の分類についてご教授頂けませんか?
0809デフォルトの名無しさん
2010/04/13(火) 14:20:51ここだと荒れそうだからよw
0810デフォルトの名無しさん
2010/04/13(火) 15:03:10じゃあそちらのスレで質問することにするので>>808は無視して頂けると有難いです。
失礼しました。
0811デフォルトの名無しさん
2010/04/13(火) 18:44:34> Borland C++ Compilerを使うことになった
バージョンにも依るだろうが、まさか5.5.1じゃねぇよな?
もしそうならそんな大学は即止めるべき。
0813デフォルトの名無しさん
2010/04/13(火) 18:50:22これがOKなのはbarとbar<foo>は別々の名前だからってことでいいの?
0814デフォルトの名無しさん
2010/04/13(火) 19:18:32(テンプレート関数の呼出であると明示した場合はテンプレート版が呼ばれる)
つまり非テンプレート版とテンプレート版が曖昧にならないから、
同名の関数を非テンプレート版とテンプレート版で定義しても問題ない。
もっと正確な仕様を知りたければ規格書読むべし。
0815デフォルトの名無しさん
2010/04/13(火) 19:25:135.5.1って具体的に何がまずいの?
0817デフォルトの名無しさん
2010/04/13(火) 21:25:11constの特殊化とか出来なかった気がする。
0818デフォルトの名無しさん
2010/04/13(火) 21:34:080819デフォルトの名無しさん
2010/04/13(火) 22:03:530820デフォルトの名無しさん
2010/04/13(火) 22:30:54しかし上手く行きません。 どのようにしたら良いのでしょうか
class Bar { 省略 };
unsigned int func(Bar*** out)
{
unsigned int cnt = 他所から動的に拾っているカウンタ;
*out = new *Bar[cnt];
for(unsigned int i = 0; i < cnt; ++i) (*out)[i] = new Bar();
return cnt;
}
0821820
2010/04/13(火) 22:32:07○ **out = new *Bar[cnt];
転記ミスしました。すみません
0822デフォルトの名無しさん
2010/04/13(火) 22:34:27具体的にそれだとどういった問題が起こるのでしょうか?
0824デフォルトの名無しさん
2010/04/13(火) 22:51:35class Bar {
unsigned int i;
public:
Bar(unsigned int i = 0) : i(i) {}
void print() const {
std::cout << i << std::endl;
}
};
unsigned int func(Bar**& out)
{
unsigned int cnt = 10;
out = new Bar*[cnt];
for (unsigned int i = 0; i < cnt; ++i)
out[i] = new Bar(i);
return cnt;
}
int main()
{
Bar** bp;
func(bp);
for (int i = 0; i < 10; i++)
bp[i]->print();
}
0825デフォルトの名無しさん
2010/04/13(火) 22:52:17×>>82
○>>820
つまりBarと*の位置が逆なだけ
0826デフォルトの名無しさん
2010/04/13(火) 22:58:280827デフォルトの名無しさん
2010/04/13(火) 23:04:09初心者に例外安全とか言うと絶対混乱するし
Exceptional C++を読んでないとまず理解不能
0828デフォルトの名無しさん
2010/04/13(火) 23:05:32int main()
{
Bar** bp;
unsigned int j = func(bp);
for (int i = 0; i < j; i++)
bp[i]->print();
}
0829デフォルトの名無しさん
2010/04/14(水) 01:22:23んなこたーないだろ。
エラーが起こっても漏れたり壊れたりしないようにするだけ。
これで混乱するようならプログラマとして問題があるんじゃないの?
0830デフォルトの名無しさん
2010/04/14(水) 01:32:37「初心者に」って言ったんだけど日本語読めませんか?
0831デフォルトの名無しさん
2010/04/14(水) 01:38:08エラーで漏れたり壊れたりするプログラム書いて誰がうれしいの?
初心者だからって何が変わるの?
っていうかむしろ vector や shared_ptr 使ったほうが簡単じゃね?初心者向きじゃね?
0832デフォルトの名無しさん
2010/04/14(水) 01:46:42じゃつべこべ文句言わずにお前がプログラム書いてやれ
0833デフォルトの名無しさん
2010/04/14(水) 01:55:53typedef std::vector<BarPtr> BarPtrVector;
unsigned int func(BarPtrVector& out)
{
unsigned int cnt = 10;
BarPtrVector v;
for(unsigned int i = 0; i < cnt; ++i) v.push_back(BarPtr(new Bar()));
out.swap(v);
return cnt;
}
0835デフォルトの名無しさん
2010/04/14(水) 02:05:570836820
2010/04/14(水) 02:09:180837デフォルトの名無しさん
2010/04/14(水) 02:21:590838820
2010/04/14(水) 02:26:300839デフォルトの名無しさん
2010/04/14(水) 02:27:35このコードのほうが難しいと思うぞ
0840デフォルトの名無しさん
2010/04/14(水) 02:50:02他のコンパイラに持っていくと動かないコードがうっかりできあがってしまったりする。
0841デフォルトの名無しさん
2010/04/14(水) 03:14:41ごめん職業プログラマだけど起きてる
このスレではROM専だった。
0842820
2010/04/14(水) 07:36:36いま携帯で見てて電池切れそうなので取り急ぎ
>>824
ありがとうございます!今晩帰宅後に確認させて頂きます!
あと、shared_ptr と vector について、上で上がっている本は読んでいないですが、
意味と目的は理解してるので大丈夫です。
0843デフォルトの名無しさん
2010/04/14(水) 09:07:110844デフォルトの名無しさん
2010/04/14(水) 10:06:200845デフォルトの名無しさん
2010/04/14(水) 10:09:370846デフォルトの名無しさん
2010/04/14(水) 10:12:37&や*、.、->が入り乱れたプログラムになって
自分でも統一しろよとか思えてくるんですが、そんなモンでしょうか・・?
&(*iterator)->func().member みたいなのがいっぱい。
もう包含やめて全部ポインタにしてやろうかと思えるくらいに嫌な感じなんですが。
0847デフォルトの名無しさん
2010/04/14(水) 10:16:42いっぱい出てきて嫌なららローカル変数なり関数なりにまとめればいいんじゃね?
そういうことをせずにぺたぺたコピペしてるから嫌な感じになってるんじゃないの?
0848デフォルトの名無しさん
2010/04/14(水) 12:17:19教えられる側の、特に初歩的な位置にいる人間の、理解力とか知識の蓄積をあまりに考えてなさ過ぎる。
0849デフォルトの名無しさん
2010/04/14(水) 12:55:26今のところ、Borland C++ CompilerとTurbo Debuggerをダウンロードして、
パス設定やらilink32.cfgやらbcc32.cfgやらの環境設定を終え、フリーの統合開発環境をVectorで手に入れたところです。
ここで質問なんですが、Borland(今は違う会社ですが)でダウンロード出来るこれらのソフトだけでは、
開発環境としては「快適なエディタ」を欠いた状態ですよね?統合開発環境はあった方が良いんですよね?
Vectorでフリーの統合開発環境を手に入れたので、それを使いながら勉強しようと思ってるのですが。
0850デフォルトの名無しさん
2010/04/14(水) 13:05:57快適なエディタを手に入れればいいだけじゃないのかな。
まぁいろんな開発環境を試すことも勉強になるからいろいろどうぞ
0851849
2010/04/14(水) 13:10:48とりあえず色々なソフトを起動してみて、使いやすそうなBCC Developerに決めました。
0852デフォルトの名無しさん
2010/04/14(水) 13:21:580853デフォルトの名無しさん
2010/04/14(水) 13:23:470854デフォルトの名無しさん
2010/04/14(水) 13:25:20でもBorlandで配布されてる最新版フリーソフトって5.5.1ですよね。
新しい奴っていうのはシェアウェア(例えばVisual C++)ですか?
0855デフォルトの名無しさん
2010/04/14(水) 13:28:01すみませんリロードしてませんでした。
30日間のトライアル版ですか・・・・。
確実に30日以上は勉強するつもりですし、トライアル版って基本的に嫌いなんですよ・・・。急かされている感があって。
とりあえずBCCで基本を学んでから、お金貯めてVC++やらVisual Studioやらを導入しようと思ってるんです。
0856デフォルトの名無しさん
2010/04/14(水) 13:29:12vc++は無料のやつある。vc++2010は最上位も今は無料。ベータ版とかだからな。
0857デフォルトの名無しさん
2010/04/14(水) 13:31:21色々な情報提供ありがとうございます。助かります。
ところで、やっぱり開発環境って最初から一貫してたほうが良いんですかね?
でもあーだーこーだ言う前にとりあえずBCCで勉強しようかな、というノリなんですけども。
0858850
2010/04/14(水) 13:31:44なんでVCExpressEditionじゃないんだろうとおもったらシェアという認識だったんだね。
ここどぞ。
http://www.microsoft.com/japan/msdn/vstudio/express/
0859デフォルトの名無しさん
2010/04/14(水) 13:31:48コンパイラ本体はライセンスで保護されていなくて自らやめなければ使える。
vc++2008expressか、vc++2010ベータは無料。
0860デフォルトの名無しさん
2010/04/14(水) 13:34:30文法的、windowsのマッチ度的にも、vc++無料版に及ばない。
実戦・実務でも使えるのはvc++だろ。
コンパイル速度はよほどパソコンが遅くなければ大差はないと思う。
0861デフォルトの名無しさん
2010/04/14(水) 13:37:25windowsSDKというのに入っている。これはコンパイラと必要ヘッダが入っているやつ。
0862初心者
2010/04/14(水) 13:44:06あと、分からない用語をググりながらなのでレスが遅くて申し訳ないです。
>>858-861
ありがとうございます。やっぱりVisual系の方が色々参考書籍・サイトも豊富ですしそちらにしようと思い始めました。
ちなみにパソコンは一昔前のXP標準搭載型で、CPUはintelのceleronです
詳しくは知らないですけど確かセレロンってショボいんですよね?w
0863デフォルトの名無しさん
2010/04/14(水) 13:44:34windows7と名付けられているがXPでも動く。windows7にも対応しているという意味らしい。
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1
http://msdn.microsoft.com/ja-jp/windows/dd146047(en-us).aspx
0864初
2010/04/14(水) 13:53:01何となく、SDKの方が扱う範囲が広そうな感じは受けますが、ちょっとよく分かりません・・・・。
0865デフォルトの名無しさん
2010/04/14(水) 13:55:02> これはコンパイラと必要ヘッダが入っているやつ。
と既に書いてくれてあるだろう?
Visual StudioはIDE。開発環境だよ。
0866デフォルトの名無しさん
2010/04/14(水) 13:57:03Platform SDKとBCCという組み合わせでもアプリ作っていける。
0867デフォルトの名無しさん
2010/04/14(水) 13:57:51基本的にはVisual C++を入れれば勝手に入る。
しかし最新版のコンパイラやヘッダはwindowsSDKにしか無い場合もある。
初心者はexpress SP1かvs2010評価版いれればそれだけで良いはず。
0868デフォルトの名無しさん
2010/04/14(水) 14:04:41visual stduioでないide使うなら
windows sdkだけ入れとけば出来る。
0869初
2010/04/14(水) 14:14:54なるほど。ありがとうございます。
とりあえず集合としては「SDK⊂VS」なんですね。分かりました。
SDKはコンパイラ・ヘッダファイルを含む一方、VSの方はコンパイラ・ヘッダ・エディタなどを統合的に含むので、こういう関係になるってことですかね。
とりあえずVS2008expressのVC++をインスコしようと思います。
>>868
やっぱり環境は統合されていた方が勉強・開発しやすそうなのでVSにしようと思います。ありがとうございます。
本当皆さん博識で勉強になります。ここは2chでも屈指の有意義な板ですね。
0870デフォルトの名無しさん
2010/04/14(水) 14:15:030871デフォルトの名無しさん
2010/04/14(水) 14:33:24コード補完のインテリセンスというのを止めれば固まることは少なくなる。
0872初
2010/04/14(水) 14:40:38standard版との違いなんて正直、初心者には大差ありませんよね?
0873初
2010/04/14(水) 14:48:34前者はWinAPIのバージョンの違いをイチイチ気にしないでプログラミング出来るようになるモノで、
後者はリスト構造のデータを手早く簡単に作れるようになるモノなんですね。
0874デフォルトの名無しさん
2010/04/14(水) 14:52:15解説している所少なめで、使いこなす人も少なめ。
ATL、MFCより難しいとされる直APIでも解説ページが多いことでこっちの方が楽という逆転もあり得る。
0875初
2010/04/14(水) 14:54:290876デフォルトの名無しさん
2010/04/14(水) 14:57:48WTLとは
WTL とは、Windows Template Libraries の略で、かつて MicrosoftR が無償配布していたフリーソフトです。
http://rapt21.com/wtl.php
0877デフォルトの名無しさん
2010/04/14(水) 15:00:050878デフォルトの名無しさん
2010/04/14(水) 15:00:45MFCに甘んじるのは腐ったクソを食うようなもの。
OOPを他の環境で覚えてから、
自分でAPIをラップすれば多少はスカッとする。
0879デフォルトの名無しさん
2010/04/14(水) 15:01:19C++/CLIでもC#と同様のことが出来るはずだが、情報少なめで急に難易度アップする。
c++とc#を臨機応変に使い分ける方が開発が短期間で済む。
0880デフォルトの名無しさん
2010/04/14(水) 15:16:24コードをトレースできるデバッガは大事。あとホットスポットの計測。
後者は体験版・有料だがインテルAmplifierというのがいい。
デバッガは、マイクロソフトの開発者が使っているというやつは
無料だが使いこなすのが難しい。
0881デフォルトの名無しさん
2010/04/14(水) 15:21:20これって変数の条件で停止されるのがわかなくて使わなくなった。
VSのデバッガより、動作が良くて良いんだけど
http://www.microsoft.com/japan/whdc/DevTools/Debugging/default.mspx
0882881
2010/04/14(水) 15:25:59//ここに来たら停止
}
こういうコードを挟み込めば出来るけど、その都度再コンパイルが痛いところ。
0883デフォルトの名無しさん
2010/04/14(水) 15:26:45デバッガは初心者のうちからでも使えるかもしれないけど、
パフォーマンスについては地力がついてからでいいんじゃないかな
とはいいつつ、ある程度printデバッグでがんばるほうがいいようにも思ったりするけど、これはあくまでも主観。
0884デフォルトの名無しさん
2010/04/14(水) 15:26:46その意味でもC++/CLIは無いな。
0885デフォルトの名無しさん
2010/04/14(水) 15:29:150886デフォルトの名無しさん
2010/04/14(水) 15:30:460887デフォルトの名無しさん
2010/04/14(水) 15:31:32printfだと死んだ現場を確認出来ない。printfの前後のここでエラーだろうと推測して
それが間違えていることもある。一行ずつのトレースなら確実。
0888デフォルトの名無しさん
2010/04/14(水) 15:33:41推測して間違えていることがあるというのを経験するのが、初心者にとって良いと思ってるんだ。
0889初
2010/04/14(水) 15:35:48とりあえずインスコが終わる気配ない上、そろそろバイトなのでまたいずれ疑問点があったら質問させて下さい。
ありがとうございました。
0890デフォルトの名無しさん
2010/04/14(水) 15:39:00#include <windows.h>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define malloc(size) _malloc_dbg(size, _NORMAL_BLOCK, __FILE__, __LINE__ )
#define calloc(s1,s2) _calloc_dbg(s1, s2, _NORMAL_BLOCK, __FILE__, __LINE__ )
#define realloc(p,s) _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define free(p) _free_dbg(p, _NORMAL_BLOCK)
#define _recalloc(p, c, s) _recalloc_dbg(p, c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define _expand(p, s) _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
inline void* operator new(size_t nSize, LPCSTR lpszFileName, int nLine){
return _malloc_dbg(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW
int main(){
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
int *p=new int [100];
}
0891デフォルトの名無しさん
2010/04/14(水) 19:53:04予約語を#defineするとか、
そんな悪い癖を付けさせるなよ。
0892デフォルトの名無しさん
2010/04/14(水) 20:34:24そんなキモいマクロ大量に使う前に RAII を徹底しろ。
0893デフォルトの名無しさん
2010/04/14(水) 20:42:52バッドノウハウじゃねぇか
0894デフォルトの名無しさん
2010/04/14(水) 20:51:030895デフォルトの名無しさん
2010/04/14(水) 21:45:560896デフォルトの名無しさん
2010/04/14(水) 22:45:07バッドノウハウですらないな
0897デフォルトの名無しさん
2010/04/15(木) 07:13:44と
void f(const MyClass x){}
は標準C++では定義の重複と再宣言でコンパイルエラーになるのが正しいのでしょうか?
また、
void f(MyClass x){}
と
void f(const MyClass& x){}
ではどうでしょうか。
よろしくお願いします。
0898デフォルトの名無しさん
2010/04/15(木) 07:44:590899デフォルトの名無しさん
2010/04/15(木) 12:54:160900デフォルトの名無しさん
2010/04/15(木) 12:58:570901デフォルトの名無しさん
2010/04/15(木) 13:06:15前者は仮引き数がconstになっただけ。呼び出し元には影響しない。
後者は参照がconstになっている。
0902デフォルトの名無しさん
2010/04/15(木) 13:20:41void f(MyClass const x); // 引き数はコピーされる。関数内では変更不可。呼び出し元には関係ないので再定義となる。
void f(MyClass & x); // 引き数は参照される。関数内で変更可だが呼び出し元に影響する。
void f(MyClass & const x); // 元々参照の付け替えはできないのでこうは書けない。
void f(MyClass const & x); // 引き数はされる。関数内では変更不可。
void f(MyClass const & const x); // 元々参照の付け替えはできないのでこうは書けない。
void f(MyClass * x); // 引き数はポインタが渡される。ポイント先を変更できるし、ポイントする場所も変更できる。
void f(MyClass * const x); // ポイント先の変更はできるが、ポイントする場所は変更できない。ポイントする場所の変更は呼び出し元には関係ないので再定義となる。
void f(MyClass const * x); // 引き数はポインタが渡される。ポイントする場所は変更できるが、ポイント先の変更はできない。
void f(MyClass const * const x); // 引き数はポインタが渡される。ポイント先もポイントする場所も変更できない。ポイントする場所の変更は呼び出し元には関係ないので再定義となる。
0903899
2010/04/15(木) 13:20:460904デフォルトの名無しさん
2010/04/15(木) 15:56:380905デフォルトの名無しさん
2010/04/15(木) 16:46:49void func(void (*d)(Widget *pw)) { (*d)(pw); }
func(delete);
こういうことしたいんだけどいちいち関数でラップしないといけないのかな
0906デフォルトの名無しさん
2010/04/15(木) 17:11:000907デフォルトの名無しさん
2010/04/15(木) 17:49:01boostのchecked_delete
0908897
2010/04/15(木) 19:22:04みなさんありがとうございます。
void f(MyClass x){}
void f(const MyClass& x){}
があったとして、
MyClass hoge;
f(hoge);
とするとどちらがよばれるのでしょうか。
規格ではオーバーロードの解決が曖昧になりますか?
0909デフォルトの名無しさん
2010/04/15(木) 19:26:060910デフォルトの名無しさん
2010/04/15(木) 19:28:27一回でも試してたらコンパイルできないとわかるだろうに…
0911デフォルトの名無しさん
2010/04/15(木) 19:41:40話に乗り遅れたがQtという選択肢もある
3つバージョンがあるけどライセンスの相違だけで
開発環境の機能としてはどれも同等
公式
tp://qt.nokia.com/title-jp
【RAD統合環境】 Qt 総合スレ 7 【Win/Mac/Linux】
tp://pc12.2ch.net/test/read.cgi/tech/1270309416/
0912デフォルトの名無しさん
2010/04/15(木) 19:51:15特定の環境でどうこうの問題じゃなくて、
規格の話を伺っています。
特定の環境でどうこうならとっくにそこでコンパイルしていますよそりゃ
0913デフォルトの名無しさん
2010/04/15(木) 19:55:21Overview of Overloading
Argument Type Differences
0914デフォルトの名無しさん
2010/04/15(木) 20:04:59すげー微妙な問題ならべつにしても
この程度の平凡な内容でもいちいち規格みないと先に進めないの?
つーかお前実は規格読んだ事ないんだろ?
読めりゃ質問しないで自分で見るもんな
規格も読めないのに規格にウルサイとか当た真ん中どうなってんのコイツ
0915デフォルトの名無しさん
2010/04/15(木) 20:14:155行も頑張って書いてくれたところ申し訳ないが、
すげー微妙な問題はお前に聞いても分からないだろ?
せいぜいこの程度がお似合いって事だ
0916デフォルトの名無しさん
2010/04/15(木) 21:40:28妄想で周りの人間を格下と決めつけて優越感を感じたり、心理的ストレスから逃れようとするのは
集団生活で子どもがとる典型的な逃避行動らしいぞ
相手に噛み付く前に自分の事を見つめ直したらどうだ?
規格原理主義者を気取るならせめて規格に目を通すぐらいのことはしようや、な?
0917デフォルトの名無しさん
2010/04/15(木) 21:59:42> 妄想で周りの人間を格下と決めつけて優越感を感じたり、心理的ストレスから逃れようとするのは
> 集団生活で子どもがとる典型的な逃避行動らしいぞ
> 相手に噛み付く前に自分の事を見つめ直したらどうだ?
まるで自分に言い聞かせているように読めるのは俺だけではあるまい
0918デフォルトの名無しさん
2010/04/15(木) 22:08:44根拠のない断定と一緒にしないでいただきたい
0919デフォルトの名無しさん
2010/04/15(木) 22:32:190920デフォルトの名無しさん
2010/04/15(木) 22:35:230921デフォルトの名無しさん
2010/04/15(木) 22:47:33いつまでくそ古いVerのVC++使ってんだよ
0922デフォルトの名無しさん
2010/04/15(木) 23:03:44だってお前のも根拠ないだろ?
どこに証拠があるの?え?
0923デフォルトの名無しさん
2010/04/15(木) 23:07:030924デフォルトの名無しさん
2010/04/15(木) 23:10:01って酷評されていますが、何が不便(デメリット)なのでしょうか。
また、使うことにどんなメリットがあるのでしょうか。
教えてください。
よろしくお願いします。
0925デフォルトの名無しさん
2010/04/15(木) 23:16:410926デフォルトの名無しさん
2010/04/15(木) 23:24:12メリットは情報の圧縮
0927924
2010/04/16(金) 00:06:35通常期待されるvectorの挙動と違うのですか。おっかないですね。
0928デフォルトの名無しさん
2010/04/16(金) 00:15:14普通のvectorとは全く別物になってる
0929924
2010/04/16(金) 00:16:020930デフォルトの名無しさん
2010/04/16(金) 00:16:520931デフォルトの名無しさん
2010/04/16(金) 00:18:18vector<bool>は鬼子じゃあ、使ってはなんね
って言ってたな
0932デフォルトの名無しさん
2010/04/16(金) 00:19:28うわあああ
0933デフォルトの名無しさん
2010/04/16(金) 00:27:49最近まで6.0が現役とかいってた奴がいたからなw
crtdbg.h覗けばわかるけど>>890のマクロのほとんどは無駄だな
当たりつけてスタックトレースすりゃ大概見つけられるけど
newでファイルライン検出するのは相変わらずこの手法が一般的なのかね
0934デフォルトの名無しさん
2010/04/16(金) 00:43:24なんのために使うのか明確にするのが最初じゃないか?
0935初
2010/04/16(金) 11:57:29結局、C++じゃなくてまずはC言語から学ぶことにしました。
テキストは「基礎からのC」っていうのを使ってます。開発環境そろえるときにアドバイス下さった方々には本当に感謝しています。ありがとうございました。
0936デフォルトの名無しさん
2010/04/16(金) 13:02:37しかし、C言語のソートプログラムや文字列操作などは
実用的には勉強する意味がないぞ。
ポインタの学習などにはなるだろうが。
おすすめは、軽くC言語を知ったらSTLをやることだ。
効率性がC言語より格段に上がる。
0937デフォルトの名無しさん
2010/04/16(金) 13:51:17二種類(「基本」と「応用」)に大別できる。
実用的C言語を身に付けたい場合、学習時間の大半は後者に費やされるが、
最終的にC++を使えればよいなら、後者を学習する意義はほとんど無い。
0938デフォルトの名無しさん
2010/04/16(金) 14:23:55学生なんだからいろいろ挑戦してみりゃいいじゃん
せっかくCならCPUやハードウェアアーキテクチャを意識しながら組むのが望ましいかね
0939初
2010/04/16(金) 15:10:21あと、学生ですけど実は情報系の学生じゃないです。(経済系ですし、しかも公務員志望です。)
まあどちらにしても、何事もトライ&エラーが大事だと思うので、色々挑戦してみます。ありがとうございます。
0940デフォルトの名無しさん
2010/04/16(金) 15:17:27{
X(void);
X(const X &);
X(const T &, const U &);
// 以下いくつかのコンストラクタ
};
template <class T, class U> class Y : public X<T, U>
{
inline Y(void) : X<T, U>()
{
}
inline Y(const Y &y) : X<T, U>(y)
{
}
inline Y(const T &t, const U &u) : X<T, U>(t, u)
{
}
// 以下いくつかのコンストラクタ
};
実装用にダミーのテンプレ引数Dを持ったクラステンプレートXがあったとします
XのインターフェースからDを隠蔽するために上記のようにXを継承してYをつくりたいのですが
コンストラクタを移譲するだけのコードを書く手作業の手間とオーバーヘッドを無くすことは可能でしょうか?
0941デフォルトの名無しさん
2010/04/16(金) 16:36:42とりあえずTとUのconstと&を取っ払って
中で実装に適合できるようにtraitsを定義してみては
0942デフォルトの名無しさん
2010/04/16(金) 16:45:080943デフォルトの名無しさん
2010/04/16(金) 17:19:50Boostでthreadやshared_ptr使いたいんですが、0xで標準になるっぽい事を考えるともうちょっと待った方が・・・と悩んでいます
0944デフォルトの名無しさん
2010/04/16(金) 17:59:34待ってりゃいいんじゃね?
0945デフォルトの名無しさん
2010/04/16(金) 18:02:170946デフォルトの名無しさん
2010/04/16(金) 18:04:12今年中に仕上げたいんですが、途中で0xが出たら無駄足になりそうで。
早めにやるに越したことはないものなんです
3ヶ月以内とかに出そうですかね?
0947デフォルトの名無しさん
2010/04/16(金) 18:04:370948デフォルトの名無しさん
2010/04/16(金) 18:05:230949デフォルトの名無しさん
2010/04/16(金) 18:07:36Boostでやろうと思います
0950デフォルトの名無しさん
2010/04/16(金) 18:09:45> 今年中に仕上げたいんですが、途中で0xが出たら無駄足になりそうで。
ありえない。
C++0xはなんだかんだで最速で規格が実装されるのが2011年内ってことは確定的だから、
そっから各コンパイラベンダがC++0x実装するまでと考えると
・・・な。分かるだろ?
0951デフォルトの名無しさん
2010/04/16(金) 18:12:43次のプロジェクトからstd::shared_ptrを使えばいい
0952デフォルトの名無しさん
2010/04/16(金) 18:55:46using namespace boost;
}
って規格違反しておけばいいんだよ
0953デフォルトの名無しさん
2010/04/16(金) 19:21:30わざわざそれをしなくても
typedef なり マクロなりすればいいんじゃね?
俺はstdよりboostのがしばらくは信用できそう
(stdは枯れるまで待ちたい)
だからboostにするけど。
0954デフォルトの名無しさん
2010/04/16(金) 20:23:23他でもあったら面倒だから適合性が問題になりそうな場合はboost一択だな
少なくとも今の所は
0955デフォルトの名無しさん
2010/04/16(金) 20:26:05このようなコードがあります。
ここでnamespace NS_Aの中のものは他人が作ったコードで変更不可、namespace NS_Bの中のものは私が作ったコードで少しくらいは変更可能とします。
このコードにおいてはまあ何の問題もないわけですが、
もしもNS_A::fooが
ttp://codepad.org/xjXwEurR
のようにコメントアウトされていた場合、
g++, Comeau C++ではコンパイルエラーになりますが、
VC2008でコンパイルエラーになりません。
(ただしwarningは出ます。)
Comeau C++の挙動を盲信するとすればVC2008の困った仕様ということになりますが、
これをVC2008でもコンパイルエラーにするにはどうしたらよいでしょうか?
安直に思い浮かぶ解決案としては次の2つがありますが、これは不可として、です。
�@class ClassB<T>のTは必ずしもNS_A::ClassAだとは限らないため
friend void foo(const ClassB<T>& arg){std::cout << BOOST_CURRENT_FUNCTION << std::endl;NS_A::foo(arg.mem);} // 今回の主役2
の様に明示的にNS_A::で修飾する訳にはいきません。
�AClassB(const T& arg)はexplicit指定されていないということは変更不可。
よろしくお願いします。
0956デフォルトの名無しさん
2010/04/16(金) 21:12:20template<typename T>
0957デフォルトの名無しさん
2010/04/16(金) 21:15:400958デフォルトの名無しさん
2010/04/16(金) 21:16:140959デフォルトの名無しさん
2010/04/16(金) 21:18:59friend void foo(const ClassB<U>& arg) { ... }
でだいじょうぶかな
0960955
2010/04/16(金) 21:52:22Effective C++によれば
Barton-Nackman trick を用いているfoo(const ClassB<T>& arg)
の引数にT型のオブジェクトを渡した場合、
暗黙の型変換が適用されるとあったと記憶しています。
なので私も無限再帰になるVCのほうが正しいような気がしていますが、
あのComeau C++の挙動が間違っているとも思えないんです。
0962デフォルトの名無しさん
2010/04/16(金) 23:54:36コンパイルエラーを起こさないのは間違いではないでしょ
Comeau C++の方がより親切でハッカーに厳しいというだけで
0963955
2010/04/17(土) 00:22:51もしその通りとしますと、「文法的には合法なコードを親切心といっただけのお節介な理由でComeauやg++がコンパイルエラーを下した」ということになります。
すると、次の合法なコードで困る事になります。
…………………………
foo()内が
static unsigned i;
if(!i){++i;処理1;foo(arg.mem);}
else{処理2;}
となっている場合。
…………………………
クソコードなのはともかく、このコードは合法であり、プログラマはその気で書いた可能性が否定できない。(実際問題 無限再帰もしないし本当に書きうる。)
そんな合法なコードを規格ギークなg++やComeauがわざわざコンパイルエラーにするとは考えがたいと思います。
0964デフォルトの名無しさん
2010/04/17(土) 01:39:02ごめん。意味がよくわからない
そのコードが合法で無限再帰しないなら普通にコンパイル通るんじゃないの?
スタックオーバーフローを起こさないって事なんでしょ?
0965デフォルトの名無しさん
2010/04/17(土) 01:48:45> ttp://codepad.org/xjXwEurR
名前空間スコープに宣言の無い friend 関数は ADL でしか見つからない、というのは
知ってるんだよね?
それなら NS_B::foo(const NS_B::ClassB<ClassA>& arg) の中での foo(arg.mem) で
発動する ADL の検索対象は NS_A なわけで、 foo が見つからないというのは上記の
ルールに従えば当然なんじゃないの??
0966デフォルトの名無しさん
2010/04/17(土) 09:05:33今回の話はBarton-Nackman trickは全く関係ない話だと思うんだが
0967デフォルトの名無しさん
2010/04/17(土) 09:27:56ClassAがClassB<ClassA>に暗黙変換されたら大変な事になるだろう
コンストラクタがexplicitでないテンプレートクラス全部が暗黙の変換の候補になるってことだぞ
0968955
2010/04/17(土) 12:01:59>>964
> そのコードが合法で無限再帰しないなら普通にコンパイル通るんじゃないの?
> スタックオーバーフローを起こさないって事なんでしょ?
無限再帰するしないは実行時エラーの話なのでそれには関係なく
そのコードが合法なら普通にコンパイルが通り、
合法でないコードならコンパイルが通らないと思います。
>>962> スタックオーバーフロー起こすのは実行時だから
> コンパイルエラーを起こさないのは間違いではないでしょ
っておっしゃっていたので、>>962氏はVCの仕様も間違いでないと言っていることになります。
すなわち本当はコンパイルエラーにはならないのが標準C++としては正しいとおっしゃっている
ことになります。
一方で
>>962> Comeau C++の方がより親切でハッカーに厳しいというだけで
ともおっしゃっているので、これはすなわち
「文法的には合法なコードを親切心といっただけのお節介な理由でComeauやg++がコンパイルエラーを下した」
という事を意図されているということだと私は解釈したため、
「文法的には合法なコードをComeauがコンパイルエラーにするとは考えがたい。」
と申し上げました。
0969955
2010/04/17(土) 12:09:59全くもっておっしゃる通りです。
私の
> なので私も無限再帰になるVCのほうが正しいような気がしていますが、
が間違いで、
>>965氏のご指摘の通り、
Comeau C++の挙動が正しいようです。
> NS_B::foo(const NS_B::ClassB<ClassA>& arg)
で可視なfooという名前の関数は
ADLで見つけたNS_A::foo
だけなのですね。
ADLで見つけたNS_A::fooに加えて自身の所属するスコープでfooを探すとNS_B::fooが見つかるかと
思ったのですが、ご指摘いただいた通りNS_B::fooは
> 名前空間スコープに宣言の無い friend 関数
なのでADLが発動していないため可視ではないのですね。
ありがとうございます。
0970955
2010/04/17(土) 12:31:49お返事ありがとうございます。
Barton-Nackman trickとは関係がありませんでした。
Effective C++を読み返してきました。
お二方のおっしゃるとおりです。
0971955
2010/04/17(土) 12:53:07Barton-Nackmanとも関係ありませんね。
結局、
ttp://codepad.org/T293nYKr
このコードのようにした場合はちゃんと(?)無限再帰しました。
この挙動の解釈としては
///////////////////////////////////////////////////
�@foo(a, b); // 今回の主役3
において、
「名前空間スコープに宣言の無い friend 関数は ADL でしか見つからない」
があるが、この場合は第1引数aはNS_A::ClassA型、第2引数bは
NS_B::ClassB型のため両方の名前空間を探して
1. NS_A::foo->コメントアウトされているため存在しない。
2. NS_B::foo->名前は見える。有効。
↓NS_B::fooのオーバーロード解決へ向かう(今回はNS_B::fooの名前を持つものは1つしかないが。)
3. NS_B::fooはNS_B::foo(const ClassB<ClassA>&, const ClassB<ClassA>&)であり、
第1引数をNS_A::ClassA型からNS_B::ClassB型へ「暗黙の型変換」可能であり
かつ第2引数を型変換する必要がない
よってNS_B::foo(const ClassB<ClassA>&, const ClassB<ClassA>&)が呼ばれる。
�A�@で呼ばれたNS_B::fooの中にもfoo(arg1.mem, arg2)があるが、
同様に実引数arg1.mem, arg2の両方の名前空間を探して
1. NS_A::foo->コメントアウトされているため存在しない。
2. NS_B::foo->名前は見える。有効。
↓NS_B::fooのオーバーロード解決へ向かう(今回はNS_B::fooの名前を持つものは1つしかないが。)
3. NS_B::fooはNS_B::foo(const ClassB<ClassA>&, const ClassB<ClassA>&)であり、
第1引数を型変換する必要がなく、
かつ第2引数をNS_A::ClassA型からNS_B::ClassB型へ「暗黙の型変換」可能であり
よってNS_B::foo(const ClassB<ClassA>&, const ClassB<ClassA>&)が呼ばれる。
///////////////////////////////////////////////////
ややこしいです。
0972971
2010/04/17(土) 12:54:02○ 同様に実引数arg1, arg2.memの両方の名前空間を探して
0973デフォルトの名無しさん
2010/04/17(土) 13:07:49いや、自分の所属する名前空間も可視だよ
http://codepad.org/uzi5sv8G (コメントを外すと曖昧になってコンパイルエラー)
0974デフォルトの名無しさん
2010/04/17(土) 13:15:48その例ではG()が可視だとか曖昧だとかの議論になっていないか?
>>955のケースに当てはめるとCall()が可視だとか曖昧だとか
論じないとならないんじゃね?
0975デフォルトの名無しさん
2010/04/17(土) 13:26:48http://codepad.org/yhSLgdd2
もちろんCallも可視だよ
>>995がコンパイルできない理由っていのは
http://codepad.org/h3pX4I1E
これがコンパイルできない理由と同じで可視性の問題ではない
0976デフォルトの名無しさん
2010/04/17(土) 13:29:120977デフォルトの名無しさん
2010/04/17(土) 15:02:42わかってないな。
Call(Y()) の ADL による検索対象は namespace B になるから、それで見つかる。
「自分の所属する名前空間」が namespace B だから、自分の所属する名前空間も可視
であるように見えているだけ。
>>955 の場合は「自分の所属する名前空間」と ADL による検索対象が異なる。
0979955
2010/04/17(土) 17:19:36つまり私の間違いは
無指定のfoo関数の名前解決をする時に
1.「自分の所属する名前空間でfooという名前を持つ関数をsignatureを問わず探す
(見つからなければ外側のスコープへ。)」
2.「引数の所属する名前空間でfooという名前を持つ関数をsignatureを問わず探す」
3.「1と2で見つかったfooという関数に対してオーバーロード解決を行なう。必要ならテンプレート具体化も。」
という原則があるが、その際に
「名前空間スコープに宣言の無い friend 関数は ADL でしか見つからない」
が"より優先するルール"であるということを理解していなかった
ということですね。
0980デフォルトの名無しさん
2010/04/17(土) 18:16:09ほんとだ…Call(A::X())にしたら通らんかった
知ったかしてどーもすいませんでした
レモンちゃん恥ずかしいです
0981デフォルトの名無しさん
2010/04/17(土) 18:59:18namespace ns
{
class hoge {};
class fuga
{
friend void foo(const hoge &h)
{
std::cout << __FUNCTION__ << std::endl;
}
};
}
int main(void)
{
ns::hoge h;
foo(h);
return 0;
}
引数がns::hogeだからns内のfooが検索されるような気がするんだけどだめだった
fooはどの名前空間に所属してるんだろうか?
0982デフォルトの名無しさん
2010/04/17(土) 20:04:112レス前を読もうぜ
>>979にあるだろ?
「名前空間スコープに宣言の無い friend 関数は ADL でしか見つからない」
と。
0983デフォルトの名無しさん
2010/04/17(土) 20:12:24ADL での特別ルールは以下のようになっている
ISO C++ 3.4.2 p3 より
> Any namespace-scope friend functions declared in associated classes are
> visible within their respective namespaces even if they are not visible
> during an ordinary lookup
つまり
△ 名前空間スコープに宣言の無い friend 関数は ADL でしか見つからない
○ 名前空間スコープに宣言の無い friend 関数はその宣言を含むクラスを
"associated class" とする ADL でしか見つからない
ここで "associated class" は、引数自身がクラス型であればそのクラスと、他には
引数がクラス内で宣言されたクラスや列挙型であればその外側のクラス、となっている。
これは 3.4.2 p2 に記述がある。
ややこしいが、つまり別途宣言の無い friend は基本的に呼べないもので、それでも
なんとか演算子オーバーロードの目的でクラス内に定義を押し込むことができるように
特別ルールが残されている、と考えておけばあんまり問題に巻き込まれることはないと
思う。
0984デフォルトの名無しさん
2010/04/17(土) 21:03:07書いてないじゃん
>>983
thxです
例外的な規則ということなのね
ということは>>977あたりの検索対象がBになるから見つかるというのは正確じゃないんかな
friendはめったに使わないから一連の流れは結構勉強になったぜ
0985デフォルトの名無しさん
2010/04/17(土) 21:19:46ADL の検索対象が B になったうえで、 B::Call() が引数 Y() の associated class である
class Y の中で宣言されているので、見つかる。
0987デフォルトの名無しさん
2010/04/17(土) 22:25:17「名前空間スコープに宣言の無い friend 関数はその宣言を含むクラスを "associated class" とする ADL でしか見つからない」
だとすると、
ttp://codepad.org/nmvcCMq4
このように名前空間スコープに宣言をしてみたんだが普通にコンパイルエラーになった。
これはどうしてですか?
Comeauでも
ttp://imagepot.net/image/127151063484.jpg
コンパイルエラーになった。
0988デフォルトの名無しさん
2010/04/17(土) 22:54:06その場合は普通にNS_Aだけが検索されるから見つからないだけじゃない?
0989デフォルトの名無しさん
2010/04/17(土) 23:03:440990デフォルトの名無しさん
2010/04/17(土) 23:22:41これがエラーになるのと同じ。
#include <string>
template<typename C> void foo(std::basic_string<C> const& s);
void bar() { foo("aaa"); }
関数呼び出しに伴うテンプレート引数の推測では暗黙変換は考慮されない。
0991987
2010/04/18(日) 00:54:42「名前空間スコープに宣言の無い friend 関数はその宣言を含むクラスを "associated class" とする ADL でしか見つからない」
の範囲外であり、NS_Bの中身も一応 検索はされ、
namespace NS_Bの中のtemplate<typename T>void foo(const ClassB<T>& arg);
という関数テンプレートが見つかります。
それは
ttp://codepad.org/pMnhCtf7
このようにNS_Bの中に
void foo(const NS_A::ClassA& a){std::cout << BOOST_CURRENT_FUNCTION << std::endl;} // さあどーだ!?
という関数を追加してやればコンパイル&リンク成功ということから分かります。
>>990
ありがとうございます。
なるほど、namespace NS_Bの中のtemplate<typename T>void foo(const ClassB<T>& arg);
という関数テンプレートは確かに見つかってはいますが、
暗黙の型変換の対象になっていないため
「signatureの合う呼び出し可能な関数がないよ!」
ということになるのですね。
0992デフォルトの名無しさん
2010/04/18(日) 19:05:41みんな大人になったな。
friendだけに なんつってww
0993デフォルトの名無しさん
2010/04/18(日) 19:13:450994デフォルトの名無しさん
2010/04/18(日) 19:17:020995デフォルトの名無しさん
2010/04/18(日) 19:39:060996デフォルトの名無しさん
2010/04/18(日) 20:35:09>>998に次スレのURLを記載するという
ことにしますか。
0997デフォルトの名無しさん
2010/04/18(日) 20:53:03C++相談室 part80
http://pc12.2ch.net/test/read.cgi/tech/1271591488/l50
0998デフォルトの名無しさん
2010/04/18(日) 21:03:060999デフォルトの名無しさん
2010/04/18(日) 21:10:001000デフォルトの名無しさん
2010/04/18(日) 21:11:3510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。