C++相談室 Part4
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNGBoost C++ Libraries
http://www.boost.org/
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
GotW.ca Home Page
http://www.gotw.ca/
STLport
http://www.stlport.org/
C++相談室
http://piza.2ch.net/tech/kako/980/980175292.html
C++相談室 Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/l50
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG(Essential|Efficient) C++ ってどーよ?
書評キボンヌ
0012デフォルトの名無しさん
NGNG推薦図書スレへ行け
0014デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNGどれが一般的&エレガント?
class Base1 { void foo() {...} };
class Base2 { void foo() {...} };
class Hoge : public Base1, public Base2{
public:
void bar(){Base1::foo();} //bar()の名はfoo()でいい
using Base1::foo;
};
int main(){
Hoge hoge;
hoge.bar(); //1
hoge.Base1::foo(); //2
hoge.foo(); //3
return 0;
}
0017デフォルトの名無しさん
NGNG図書スレへ行け宣言はビギナーの参照なのでほうっておけ。
あとv(^・^)vに食いつくのも。わらい
>(Essential|Efficient) C++ ってどーよ?
私もちょっぴり気になっています。パラパラ見た感じは
Essentialは普通そうだけどもEfficientは面白そうだ。
結局このシリーズは全部よんどけってことになるんだろうか。
このシリーズは購入に悩むにはそれほど高くないし
なんか騙されている気もする。
0018デフォルトの名無しさん
NGNGそんなもの答えがあるわけがない。
void bar(){Base1::foo();} ならきっとfooになにか
別名を付ける特別の操作を意識しているのだろう。
using Base1::foo;ならこちらの関数こそHogeに相応しい
ということなのだろう。
hoge.Base1::foo();なら何も決定できなかったということだ。
だがそれでも答えはきっとこうだ。
君のクライアントは君と同様スコープ解決演算子が大好きだ。
001911
NGNG>このシリーズは購入に悩むにはそれほど高くないし
マヂで!?3600円 はヲレにとっては悩む程高いんだよね.
いや,このテの本にしてはまぁ普通なのは分かるんだけど,金額の絶対値が
ヲレにとって高い(苦笑).
んで,
> なんか騙されている気もする。
の意味が良く分からないのでマジレスキボンヌ.
一応購入を検討中なんで・・・
0020デフォルトの名無しさん
NGNG{
Base1::foo();
Base2::foo();
}
0021デフォルトの名無しさん
NGNGスレッドAで、あるクラスオブジェクトを作成したとして
スレッドBからそのオブジェクトのメンバ関数を呼び出したとき
そのメンバ関数はどっちのスレッドで実行されるのでしょうか?
なんかもー・・・・脳味噌バーン
0022デフォルトの名無しさん
NGNG「どっち」って、何と何??
0023デフォルトの名無しさん
NGNGどうやって呼ぶ場合のことをいっている?
0024デフォルトの名無しさん
NGNGオブジェクト指向関係ねぇだろ。マルチスレッドの理解が足りない。
まさかJavaの話じゃないだろね?
002521
NGNGこの質問は無しでよろ〜(;´Д`)
0026デフォルトの名無しさん
NGNGそれぞれ独立したスレッドで走っていて、いろいろメッセージのやりとり
しながら動いている、すげープログラム、ってな妄想があったよ。
もう20年近くも昔のことだが。
(あのころはスレッドなんて言葉、無かったかな?)
0027デフォルトの名無しさん
NGNGそういうOSってあっても良さそうだよね
詳しくないけどMacOS XとかのMachなOSってそういう事なの?
0028デフォルトの名無しさん
NGNGそれはきっとCSPだ。
0029デフォルトの名無しさん
NGNGバイナリのバイト列をできるだけ標準に近い形で、
しかも簡単に扱う一般な方法って何でしょうか?
使い方を限定すれば、
typedef std::basic_string<unsigned char> bytes;
でもいいんだけど、
バイナリなので、
struct char_traits<E>::length( const E *x );
が呼ばれたとき困るしね。
なんかいい方法ってないんでしょうか?
0030デフォルトの名無しさん
NGNGvector<unsigned char>
0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNG0033デフォルトの名無しさん
NGNG適度にreserve呼び出すかアロケータ書くかすればstringに比べて
遅いなんてこともないだろ。
バイト列なんか標準も何も用途に応じて適当なクラス作ればいいと
個人的には思うんだがね。プラットフォームに依存した物にもなり
やすいし。
0034質問
NGNG0035デフォルトの名無しさん
NGNGbasic_string<wchar_t>
003634
NGNGwstringじゃなくて、1バイトコードと2バイトコードの混在する文字列を扱えるかどうかが知りたいのですが・・・。
というか、多分扱えないとは思うので、stringでマルチバイト文字列を扱うとき
みなさんはどうやっているのか聞きたいのです。
stringの内容を書き換えない場合は、operator const char*()があるから
そのままCライブラリに投げればいいとして、
stringの内容を書き換える場合、たとえば部分文字列の置き換えなんかはどうしたら良いのでしょうか?
0037デフォルトの名無しさん
NGNGstd::stringもマルチバイト文字は扱える。
ただし、文字単位でなくバイト単位の操作になる。
(size()とかはバイト数を返す)
0038デフォルトの名無しさん
NGNGそこが文字の区切りかどうか判別するアルゴリズムかけば? その場合
常に文字列先頭から走査することになって面倒だけど。
自分はどうしているかというと、UTF-16しか使わないので問題ない。
0039デフォルトの名無しさん
NGNGstd::stringをメンバに持つmulti-byte stringクラスを作ってそれを使うようにしてる。
std::stringのメンバをpublicにしとけば、それに対するアクセスもできるしな。
で、そのクラスもchar_traitsみたいな、multi-byte string用の操作情報を与えれるようにすれば
複数の文字コードにも対応できるしな。
折れはそうしてる。
0040デフォルトの名無しさん
NGNGうらやましい。。
UTF-16だと、JISとかに変換する場合に一意な変換ができんから使えんことが多い。
0041デフォルトの名無しさん
NGNGそうか?
結局サロゲートの処理が必要になるから、
マルチバイトの処理と変わらんだろ。
0042デフォルトの名無しさん
NGNGソース中の関数を列挙しようと思う。
...(){}..のパターンを捕まえてひとつに数えるんだが、
判定として()と{}の間が空白であるという条件を使いたい。
そうしないと変なEnum{}とかa={{},{}};とか関数で
ないのが引っかかってしまう。
ってことで、空白の種類なんだけど、スペースとタブと改行、
それ以外にコンパイラが空白と認識する文字ってあるのかな。
それと、スペースは0x20,改行はテキスト形式で\r\n,タブがわからない・・・
です。
0044デフォルトの名無しさん
NGNGコメントも空白のはず。
タブは '\t'。
テキストしかツールに渡さないのなら、0x20 以下は一律に空白と見なしても問題無いと思う。
0045デフォルトの名無しさん
NGNG関数を列挙するツールを使った方がはやいぞ。
freewareでその辺にある。
0046デフォルトの名無しさん
NGNGそういうのって正規表現ライブラリとか使った方が楽ちんじゃない?
関数名列挙なら /^\w+.*\)$/ だけでも十分抽出できるし。
0047デフォルトの名無しさん
NGNGisspace でいいんじゃないの
0048デフォルトの名無しさん
NGNG元々web連載をまとめたものなんだから
まとめて一万くらいで十分と思うんだが5,6冊に分けていて姑息だと。
004919
NGNG> 元々web連載をまとめたもの
えっ!?そーなんだ.知らなかった・・・
でもまぁそーゆー事なら僕にとっては日本語訳してあるだけでも価値があるからいいや.
お答えサンクスコ
0050初心者
NGNG例えばフルパスからファイル名とか取るとき、
『\』を検索して切り取ると最後のファイル名に
『ソ』とかあるとき変なところで切れてしまします。
VC++のヘルプを見てもいまいちよくわかりません…。
0051デフォルトの名無しさん
NGNG一般論だと、SJISの場合文字列先頭からみていくしかない。
isleadbyte()参照。
オススメは一旦Unicodeに変換。サロゲートペアなんざ無視。
0052デフォルトの名無しさん
NGNGあと「一週間位まえから必死で頑張ってるんです!!」
とかあれば100点だと思います :-)
0053初心者
NGNG0054デフォルトの名無しさん
NGNG0056デフォルトの名無しさん
NGNGプログラマは参考になると思うよ。ライブラリ開発者とか。
アホアホプログラマに読ませると害が大きいと思うな。
大局に影響のない不必要チュウニング馬鹿はどこにでも出没するので。
0057デフォルトの名無しさん
NGNGUNICODE というか wchar_t にしてしまえば良いと思うが。
wchar_t はあくまでワイド文字 1 文字であって、サロゲートペアなぞ気にしなくていいはず。そもそも wchar_t
の符号化方式が UTF-8, UTF-16 あるいは ISO 2022 ベースの何かとかも規定されていないし、Win32 だと
wchar_t はサロゲートペアなしのサブセット版 UTF-16 (16 ビット固定長) じゃない?
0058デフォルトの名無しさん
NGNGVC++でWindows前提ならMultiByteToWideChar/WideCharToMultiByte
使ことになるだろうから、まぁUnicodeだろうと。ってこのAPI、変換が怪しいし、
サロゲートペアに対応してたかどうか知らないけど。
いずれにせよstring<->wstring変換関数は適当に自前で用意だろうな。
内部的にどういうコード使っててもそれを外部にださなきゃいいんだし。
0059デフォルトの名無しさん
NGNG006034
NGNGマルチバイト文字列操作に対応するように、std::stringを拡張しようと考え、
委譲ではなく実装継承にしたかったので
class mbstring : public std::string {}; // 試しに継承してみる
としてみました。
が、"operator=()"が定義されてないとかコンパイラに怒られてしまいました。
サンタさん助けてください。
0061デフォルトの名無しさん
NGNG彼らは今、納期に間に合わせるべく死に物狂いで奔走しているところです。
無茶言わないように。
0062デフォルトの名無しさん
NGNG文字オタのために頻度1/1,000,000の文字をサロゲートにしてまで
実装する価値があるのだろうか。
それと中国。文字が多すぎるんだすこしは我慢しやがれっつーの。
というわけで、私が自前で作ったユニコードライブラリは
サロゲートをボツにしました。
0063デフォルトの名無しさん
NGNG0065デフォルトの名無しさん
NGNG#include <stdio.h>
#include <wchar.h>
int main()
{
wprintf(L"foo");
}
をコンパイルすると、wprintf が undefined になっちゃうんですが。
gcc だと、コンパイルはできるけど、リンクでエラーになります。
何かライブラリを陽に指定しないといけないんだろうか。
0066デフォルトの名無しさん
NGNGwchar とか,wprintf とかって皆さん何で勉強したんですか?
僕の持ってる本にはどれにも載っていなくって,このスレで初めて存在自体を
知りました.一応 web を検索して
http://www.linux.or.jp/JF/JFdocs/Unicode-HOWTO-6.html
こんなのとか見つけたんですが,正直サパーリ分かりませぬ.
どなたか良書 or 良いサイトがあったらご紹介して頂けませんでしょうか.
006765
NGNGあう。この HOWTO に、見事に
> GNU glibc-2.0.x, glibc-2.1.x
> ・wcs/mbs 関数がありますが、fgetwc/fputwc/wprintf はありません
と書いてありますな。というわけで私の疑問は解決。
で、書籍 or サイトについては私も知りたいです。国際化にかんして
私が持っている本だと、
・「C++ 標準ライブラリ チュートリアル&リファレンス」(ASCII) の
「第14章 国際化」
・「Unicode 標準入門」(翔泳社)
くらいです。C のライブラリということだと、
・「標準C言語辞典」(ピアソン)
という本があるようです。
0068デフォルトの名無しさん
NGNGtypedef basic_string<ucs4char> ucs4string;
って、どう。サロゲート気にしなくて良いよ。
自分のUnicode関係のライブラリは、
文字コード変換用のやつ以外、全部これ。
0069デフォルトの名無しさん
NGNG4バイト食っちゃうのがなぁ。うーん。
あとUTF8<->UCS4を行き来しなきゃなんないよねー。
初めの理想を徹してUCS2で我慢できないもんなのかなぁ…。
すべてはやたら多い文字の国が悪いのだ…。
0070デフォルトの名無しさん
NGNGすると体系として割とすっきりする。拡張もできるし。
unix系のどこかのグループが作業していたような。
必要なタグは贅沢を言えばキリがないんだけど。
0071無名λ式
NGNGwcs/mbsだったら、JIS規格表が出てるから買いなよ。
JISは追加された所だけ別の規格表にしたから安いぞ。
日本規格協会から買える。http://www.jsa.or.jp/
http://www.jsa.or.jp/catalog/catalog09.asp
確かこれ。http://www.jsa.or.jp/catalog/catalog_bumon_a.asp?fn=D007927.HTML
正直、この辺はいい加減な本が多いから、規格読んだ方が早い。
0072デフォルトの名無しさん
NGNG日本がそんなに悪いのか!
0073デフォルトの名無しさん
NGNG0074デフォルトの名無しさん
NGNG>>73
日本は悪くないよ。
0075デフォルトの名無しさん
NGNG日本規格協会も C の規格書を出していたんだ。さすがに最新ISOに
則ったやつはまだないみたいだけど、現行のやつでも持っててそんはないね。
おすすめにしたがって、買っておきます。
0076重大なエラー名無しさん
NGNGある共用データを書き込む処理をする、スレッドAと、
共用データを読むだけの処理をするスレッドBがあるとします。
スレッドAでは共用データを書き込む際、MUTEXロックをかけておきます。
スレッドBでは共用データを読むだけなので、MUTEXロックは必要ないのでしょうか?
スレッドBでロックが必要な場合、待ち状態になると思うのですが、待たないよう
にする方法はありますか?
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG読むだけといっても、書いている最中のわけのわからないデータに
アクセスしてしまうとおかしくなるということがあると思うけど。
特に、アクセス先が複雑なデータ構造なら。
0079重大なエラー名無しさん
NGNGそうなんですよね!
つまり、書き込んでいる最中に、ロックもかけないで読むのはいけないということですね。
(読むだけといっても、マシンコードのレベルでは複数行だったりするらしいので。)
で、そこで問題なんですが、普通にロックをかけて読むのであれば、共用データ書き込み中
の場合は、待ち状態(タイムロス)になってしまいます。
では、タイムロス無しに共用データを読むにはどうすればいいんでしょうか?
0080デフォルトの名無しさん
NGNG例えば、入力した文字の画数を調べるプログラムで時間が経つと
かってに、結果に移るようにしたいのです。
コントロール+Dしなくていいように
0081デフォルトの名無しさん
NGNG0082デフォルトの名無しさん
NGNG77 も書いてるが reader/write lock を使う。簡単化して説明すると
読める条件
writer がいないこと
(reader は何人いても OK)
書き込める条件
write がいないこと
reader がいないこと
でロックをかける。google で検索すれば、山のように説明が出てくると思われ。
0083デフォルトの名無しさん
NGNG>79は、書き込み中にロックしてしまうのを避けたいみたいだが。
確かに、ある種の書き込み方式(たとえば、リストに足していくだけとか)なら、
十分な検討を行い、読み込みをロックフリーにできる場合もあるかもしれない。
たとえば、書き込み前に現在のリスト最終位置を保存しておくとか。
write : Lock(); @last = @list.size(); @list.push( func() ); unLock()
read : last = @last; @list.each( to last ){|i|; process i }
個人的には、ハマり道なので、あまりお勧めできない。
0084デフォルトの名無しさん
NGNG読み込みの待ち時間を最小にしたいなら
1. 書き込みの単位を小さくする。たとえばキューなら一気にデータ挿入を行わず、1 つキューに入れる
操作をしたら、すぐにロックを離して、読み込み要求があるか調べる。
2. データをコピーして二つ用意しておき、書き込みはコピー側に対して行う。書込み操作が完了したら、
以後のリーダーは新データを参照するように挿げ替え(古いデータは参照しているリーダーがいなく
なるまで残しておいて、後でガベージコレクションかける)
あたりじゃないのか。
0085デフォルトの名無しさん
NGNG2.でもコピーと挿げ替えのときにロックが必要だから、
やっぱりまったく無しというのは無理だな。
0086デフォルトの名無しさん
NGNG0087無名λ式
NGNG挙げたのはwcs/mbsだけしか載ってないから注意してね。
書籍は、共立から出ていた「国際化プログラミングハンドブック」(たしかこんなタイトル)、
どこだかわすれたけど「マルチリンガル〜」がいいと思う。(UNIX only)
>>76 マルチスレッドプログラミングスレの方が適当じゃないかな?
0088デフォルトの名無しさん
NGNGおまえのプログラム原因不明のバグとか多いだろ。
0089デフォルトの名無しさん
NGNG未解決のバグは全部原因不明
0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNGデータ構造によるけど、たぶんロック無しはきついだろうなぁ。x86 ならポインタ一つだけとか
整数一つだけの操作なら割り込みが入らないけど、それで済むような簡単なデータ構造なら
そもそも問題になってないだろうし(SMP だとロックプリフィックスをつけてバスをロックするの
は必要か)。
>>88
たしかに FreeBSD 5.0-CURRENT には、まだ怪しい挙動する部分あるな。
0092デフォルトの名無しさん
NGNG一般的にいえば、sig_atomic_t以下のサイズの読み込み以外は必ずロックが必要。
0093デフォルトの名無しさん
NGNGクラスの1番最初のメンバに関数ポインタ(void func(CGOBJ *obj)系のポインタ)
がある様々なクラスを作り(つまり、ヘッダみたいなのを統一して作るの)、
クラス(どのクラスかは不明。)の、ポインタだけわかる状態で
その、関数ポインタに飛ぶにはどういう風にすればいいですか?
関数型キャストしようとすると、ANSI Cじゃ出来ないわよ。
って言われます。
C++このようなこと出来そうな機能ってありますか?
それとも、アセンブラやるしかないのでしょうか?
0094デフォルトの名無しさん
NGNGclass Foo {
private:
void (*func)(CGOBJ *obj);
public:
void operator()(CGOBJ *obj) {
(*func)( obj );
}
};
int main()
{
Foo *foo = new Foo;
// foo->func を初期化する処理をして
CGOBJ *obj = new CGOBJ;
(*foo)( obj );
}
0095デフォルトの名無しさん
NGNG0096デフォルトの名無しさん
NGNG#include <iostream>
typedef void (*func)(int obj);
void test(int obj) {cout << obj << endl;}
class Foo {public: func test;};
int main() {
Foo *foo = new Foo;
foo->test = test;
//(reinterpret_cast<func>(foo))(0);
(*(reinterpret_cast<func *>(foo)))(0);
return 0;
}
g++では通ったぞ
コメントアウトしてる方の行はだめだったけど
0097デフォルトの名無しさん
NGNG> 関数型キャストしようとすると、ANSI Cじゃ出来ないわよ。
> って言われます。
Cなのか
> C++このようなこと出来そうな機能ってありますか?
C++なのか
はっきりしる。
あと処理系とエラーメッセージも書け。
0098デフォルトの名無しさん
NGNG0100ロックしないで〜
NGNG0101デフォルトの名無しさん
NGNG0102デフォルトの名無しさん
NGNG関数へのポインタをメンバに持つ構造体を1つ定義して、
それへのポインタにキャストすればええんでないか?
0103100>101
NGNG0104デフォルトの名無しさん
NGNG構造体を定義せずとも、関数へのポインタへのポインタにキャストすりゃえー
んでは、っつーのが>>92では。
0105デフォルトの名無しさん
NGNGそれがANSI Cじゃできないからっていうんでは?
0106デフォルトの名無しさん
NGNG0107デフォルトの名無しさん
NGNGできるはずだが、>>93がちゃんと情報を出さんので、
ほんとにそういう問題なのかわからん。
010893
NGNG>>102さんの言うとおり、ヘッダを構造体にしたらいけました。
やろうとしたことは、CGOBJを中心にCOMみたいなことして
いろんな機能を使用、追加できるクラスを作ろうと思ったのです(DirectShowに近い)。
3Dとかになると、同じ座標使っても、
さまざまなポリゴン表示(トーンとかキューブとか)や
ビルボード等、いろいろな表示方法があったり、
他にも、いろんなあたり判定、ライティング座標、etc…
それを初期化の時に、設定しやすく(素材の共有もできる)、そして
使用方法はCGOBJのメンバを呼ぶだけ。
という。そんなものを作ろうとしているのです。
ソースは94さんみたいなものです。で、
(void *)キャストしたmat(94のソースで言うとFoo)を
(void *(CGOBJ))mat(this);//
D:\[Development]\testCOBJ\main.cpp(35) : error C2066: 関数型へのキャストは不正です。
MSDNで見ると
コンパイラ エラー C2066
関数型へのキャストは不正です。
オブジェクトが関数型にキャストされましたが、このキャストは許されていません。
ANSI C では、関数へのポインタとデータへのポインタの間でキャストを行うことは許されていません。
あばば。
今見ると、キャスト方法間違ってたかも。
でも、ヘッダを構造体にすることにより、わかりやすくなったので、
それがいいです。
長文かつ、読みにくい文章ですいません。
いろいろありがとうございました。
0109デフォルトの名無しさん
NGNGif (c >= '0' && c <= '9')
cnt[c - '0']++;
}
for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';
で
cout << i << "の出現回数:" << cnt[i] << '\n';
のcnt[i] の部分はfor文とwhile文のどちらの結果が入ってるんでしょうか?
0110デフォルトの名無しさん
NGNG> (void *)キャストしたmat(94のソースで言うとFoo)を
>>96か?
> (void *(CGOBJ))mat(this);//
(*(void (**)(CGOBJ))&mat)(this);
直接キャストするならこうだろ。たぶん。
0111デフォルトの名無しさん
NGNG終わりじゃないの? なんでわざわざキャストする必要がある?
それともみんなネタ?
0112デフォルトの名無しさん
NGNGcout の << 演算子は、引数を書き換えたりしないよ。
0113デフォルトの名無しさん
NGNGinlineだとクラスが分かってないと使えないじゃん。
>>93はgenericな関数を作りたいんだろ。
0114デフォルトの名無しさん
NGNG111はネタだから
0115デフォルトの名無しさん
NGNG>>93 は、
> クラスの1番最初のメンバに関数ポインタ(void func(CGOBJ *obj)系のポインタ)
> がある様々なクラスを作り(つまり、ヘッダみたいなのを統一して作るの)、
と言っているので、「ヘッダみたいなの」を基底クラスとして、そこから派生した
クラスを扱うのかと思った。
また、generic な扱いをするのに template を使えば、あらかじめクラスが
分かっている必要はない。関数オブジェクトでやるのが一番スマートかな。
0116デフォルトの名無しさん
NGNG仮想関数じゃ、どのへんがダメなん?
0117デフォルトの名無しさん
NGNG> と言っているので、「ヘッダみたいなの」を基底クラスとして、そこから派生した
> クラスを扱うのかと思った。
C++で普通に考えたらそうなんだが。
> また、generic な扱いをするのに template を使えば、あらかじめクラスが
> 分かっている必要はない。関数オブジェクトでやるのが一番スマートかな。
関数自体は一つにしたいということなんでは。
あるいは実行時まで実際のクラスは分からないとか。
0118デフォルトの名無しさん
NGNGあえて当り前の手を封じてこそのネタ。
0119名無しさん@Vim%Chalice
NGNGI18N ハンドブック ISBN4320029046
(例えば、http://www.amazon.co.jp/exec/obidos/ASIN/4320029046/qid%3D1009639543/250-5595564-8511408)
0120116
NGNG0121デフォルトの名無しさん
NGNGswitch (c) {
case '0'; cnt[0]++; break;
case '0'; cnt[0]++; break;
}
}
for (i=o; i<10; i++)
cout << i << "の出現回数:" << cnt[i] <<'\n';←この行のcnt[i]は
switch文のカウントから、きているものなのでしょうか?
0122121訂正
NGNGcase '0'; cnt[0]++; break;
↓
case '0'; cnt[0]++; break;
case '1'; cnt[0]++; break;
0123デフォルトの名無しさん
NGNGだからもーちっとマシな日本語使えって.
何が言いたいのか分からんぞ.
だいたい
i=o
の時点でヲィヲィ・・・
0124デフォルトの名無しさん
NGNG>この行のcnt[i]は switch文のカウントから、きているものなのでしょうか?
cntはどんなクラスの、オブジェクトなのでしょうか?
0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNG0127121訂正
NGNG/*
入力に出現する数字をカウントする
*/
#include <iostream.h>
int main(void)
{
char c;
int cnt[10] = {0}; // 配列cntの全要素を0で初期化
while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++;
}
for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';
return (0);
}
for文のcnt[i]がどこから来てるのか知りたいんです。
0128デフォルトの名無しさん
NGNGaとかbとか入れた場合は?
0129デフォルトの名無しさん
NGNG0130デフォルトの名無しさん
NGNG人をからかってるのか?
0131123
NGNGだーかーらー
> for文のcnt[i]がどこから来てるのか知りたいんです。
この一文が意味不明なの.
せめてオマエの考えてる
「こーなの?それともこーなの?どっち?」
とかって質問の仕方をしてみろ.
0132121訂正
NGNGcnt[i]に出る数値は、
while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++;
の
cnt[c - '0']++;から来ているものなのか、
それとも、
for (int i = 0; i < 10; i++)
から、来ているものなのか?です。
0133デフォルトの名無しさん
NGNG0134デフォルトの名無しさん
NGNGそうしないと多分、誰も答えられません。
0135デフォルトの名無しさん
NGNG0136ここで一句
NGNG苦労がいたく
身にしみる
2001年
暮れのひととき
0137デフォルトの名無しさん
NGNGここのみなさんも簡単にわかる質問だとは思うが
俺も質問の意味がわからん
0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNGエクセルの計算式
http://piza.2ch.net/tech/kako/970/970031167.html
しかし、これは意図を読み取れる人がいた。
0140デフォルトの名無しさん
NGNG0141123
NGNG質問の意図がまだ良く分かんねーんだけど,配列の中の値と,配列の添字の区
別が分かってねーんじゃねーか?
それともインクリメントが分かってねーのか?
なんか前者の可能性が高い気がするんだが・・・.
ちょっと簡単な例を出してみよう
> for (int j = 0;j<10;++j)
> cnt[j] = j;
>
> for (int i = 0; i < 10; i++)
> cout << i << "の出現回数:" << cnt[i] << '\n';
これだったら何やってるか分かるか? >> 121
0142123
NGNG激しくワロタ
腹痛ぇー
0143121訂正
NGNG> for (int j = 0;j<10;++j)
> cnt[j] = j;
は
jに0を格納、jに1ずつ足していきjが9になるまで繰り返す。
cnt[0] =j;
cnt[1] =j;
:
cnt[9] =j;
---------
> for (int i = 0; i < 10; i++)
> cout << i << "の出現回数:" << cnt[i] << '\n';
ここのcout << iのiには0から9までの数が入り。
cnt[i]はjの値が挿入されてるでしょうか?
僕としては、cnt[i]の[i]になぜjの値が入るのか?解らないんです。
0144121訂正
NGNG>if (c >= '0' && c <= '9')
>cnt[c - '0']++;
ここは0から9の添え字の出力を行い、なおかつ、入力された
数値もカウントされてるんですよね?
0145デフォルトの名無しさん
NGNG>jに0を格納、jに1ずつ足していきjが9になるまで繰り返す。
> cnt[0] =j;
> cnt[1] =j;
> :
> cnt[9] =j;
は、
> cnt[0] =0;
> cnt[1] =1;
> :
> cnt[9] =9;
が正解。
ちなみに、
for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';
というのは、媒介変数iを使って以下を簡潔に書いたものです。
cout << 0 << "の出現回数:" << cnt[0] << '\n';
cout << 1 << "の出現回数:" << cnt[1] << '\n';
cout << 2 << "の出現回数:" << cnt[2] << '\n';
cout << 3 << "の出現回数:" << cnt[3] << '\n';
cout << 4 << "の出現回数:" << cnt[4] << '\n';
cout << 5 << "の出現回数:" << cnt[5] << '\n';
cout << 6 << "の出現回数:" << cnt[6] << '\n';
cout << 7 << "の出現回数:" << cnt[7] << '\n';
cout << 8 << "の出現回数:" << cnt[8] << '\n';
cout << 9 << "の出現回数:" << cnt[9] << '\n';
iの代わりにjを使っても、本質的な違いはありません。
0146デフォルトの名無しさん
NGNGアプリ定義の構造体をファイルに出力したいんですけど
struct _data{char *szdata;
int i;}data;
と
struct _data{char szdata[256];
int i;}data;
激しく違うよね?
0147121訂正
NGNG//入力に出現する数字をカウントする
例えば122と入力されたとします。
while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++; //ここがjだとしたら
}
for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';
jがcnt[i]に挿入される?のですか?
------------------
入力された122は
cnt[c - '0']++;でカウントされているんですか?それとも
for (int i = 0; i < 10; i++)でカウントされれいるんでしょうか?
0148デフォルトの名無しさん
NGNG勝手に自分用語を作るな
0149デフォルトの名無しさん
NGNG激しく違う。
0150123=141
NGNG> cnt[c - '0']++;でカウントされている
が正解.
for (int i = 0; i < 10; i++)
では cnt の値は何一つとして変えてないだろ.
cnt[c-'0']++;
ってのは
cnt[c-'0'] = cnt[c-'0'] +1;
と同じ意味なのは分かってるか?
これは "=" を使ってるから「cntの値を変更してる」のはいいよな?
その点 for (int i = 0; i < 10; i++) の中では
"<<" という演算子しか使ってなくって,これは cnt の値は変更しねぇぞ.n
だから「カウントしてる」=「cntの値を変更してる」のは前者なわけ.
でもなぁ,きっとお主は配列の概念良く分かってないんじゃないかなぁと思うわけよ.
ちゃんと配列勉強した?
0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNGなんて読むんだ++。
0153デフォルトの名無しさん
NGNGチョメチョメ に一票
シーチョメチョメマンセー
0154名無しさん@お腹いっぱい。
NGNGifstreamを用いて,同じファイルから2回データを読み込みたいとき,
例えば1回読み込んだあと,
seekgを用いてカレントポジションを先頭に戻し,再び読み込む,即ち
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
char tmp;
ifstream ifs ("hoge.txt");
// 1回目読み込み
while (!ifs.eof ()) {
ifs.get(tmp);
cout << tmp; // 例えば,表示.
}
ifs.seekg (0, ios::beg); // 開始点にシーク
ifs.clear (); // フラグを初期化
// 2回目読み込み
while (!ifs.eof ()) {
ifs.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
のように書けますよね.
同様に,標準入力(catとパイプでつなぎたい)から2回データを読みたいと思いまして,
#include <iostream>
using namespace std;
int main ()
{
char tmp;
// 1回目読み込み
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
cin.seekg (0, ios::beg); // 開始点にシーク
cin.clear (); // フラグを初期化
// 2回目読み込み
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
としたところ,うまくいきません.
で,cin.tellg ()を使いましてseekg (0, ios::beg)でカレントがどこに移ったか調べましたところ,
どうやらifstreamの場合と挙動が違うことが分かりました.
つまり,ifstreamではseekg (0, ios::beg)によりカレントポジションが最初の位置に戻りますが,
istream (この場合cin)では戻らないようです.
これは,こういう仕様なのでしょうか? それとも,使用しているライブラリの不備なのでしょうか?
(派生関係にあるのだから,同じように動いて欲しいものです.) 私が使用している環境は,
$ g++ -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
です.
0155デフォルトの名無しさん
NGNGマジレスしちゃいかんのかな?
「++」はインクリメントじゃ。
0156デフォルトの名無しさん
NGNG0157デフォルトの名無しさん
NGNGpipeの仕様。
0158デフォルトの名無しさん
NGNGマジレスしちゃいかんのかな?
(++)は困ったときの顔文字じゃ。
(+π+)とする人もいる。
0159デフォルトの名無しさん
NGNG0160名無しさん@お腹いっぱい。
NGNG>pipeの仕様。
どうやら,最終点まで読み込む前だったら,
seekg (0, ios::beg)は効くみたいです.
例えば,1バイトだけ読み込み,seekg (0, ios::beg)で
先頭に戻したあと,再び読み直す以下のようなプログラム
#include <iostream>
using namespace std;
int main ()
{
char tmp;
// 1バイト読み込んで表示
cin.get(tmp); cout << tmp;
cin.seekg (0, ios::beg); // 開始点にシーク
cin.clear (); // フラグを初期化
// 最初から読み直し
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
で,1バイトより大きなデータを標準入力に与えると,
ちゃんと先頭の1バイトも表示し直してくれました.
最終点まで読み込むと標準入力ってバッファを消去してしまうってことなのかな?
0161デフォルトの名無しさん
NGNGiostreamが管理しているバッファにおさまる限りはseekできるってことでは?
1MBくらい読んでからseekgしてみれば失敗するはず。
seekgが下請けに使ってるlseek(2)はpipeには使えないのよ。
0162名無しさん@お腹いっぱい。
NGNG>1MBくらい読んでからseekgしてみれば失敗するはず。
>seekgが下請けに使ってるlseek(2)はpipeには使えないのよ。
試してみたら,おっしゃる通りでした.
4096バイトまでは遡れるけど,4097バイトでは失敗しました.
どうもっ!
0163名無しさん@お腹いっぱい。
NGNGついでに,
たとえ4096バイト以内でも,
最終地点に到達したら,seekgは失敗してしまうようです.
まぁ,いずれにしても標準入力に対してはseekgは使えないみたいですね.
0164ロリオタ殺す
NGNGTuesday, January 01, 2002 20:11:46
User Name: TenTen_DWP2f3e793d1a2b
Access Level: user
Time Online: 5:55:17
In Channels:
Status: 11 in queue (-2 of 0 available)
Shared Files: 120
Active Downloads: 2
Active Uploads: 2
Connection Type: DSL
Client Version: WinMX v2.6j
ロリと盗撮と援交・・・・・・・・
web pageはこちら。
ttp://www.tokyo-nazo.net/~tenten/
キーワード
援助交際白書
ディズニーランドトイレ
ロリータ写真集
0165デフォルトの名無しさん
NGNG0166_
NGNG今VC使ってるけどBC++Builderとかg++とかどうですか?
0167デフォルトの名無しさん
NGNGVC6 << Borland C++ Compiler < g++
ただ GCC は細かいところでバグがある感じ。ネームスペースとテンプレートを絡めて使うと、
たまに挙動が変。
0168_
NGNGありがとうございます。
Vine Linuxいれたからg++でもやろうかな。
VCでSTLを深くやろうとしたり、テンプレート関係の本のサンプルを打ち込んでも
変な場合があってやる気がなえてたところだから。
Borland C++ Compiler はC++Builderの純粋なコンパイラ部分なんだよね。
GUIのプログラム作るのが楽そうだからこっちもよさそうだな。
0169167
NGNGtemplate らぶらぶ で GUI のプログラムを組むのなら VC6 + ATL/WTL を推しときますが。
VC6 の template は「完璧」からは程遠いですが、実用的なフレームワークを作れる程度に
は機能します。
0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNGゲイツ社のC++ってVC++のことか?
ソフトが違うじゃん。
0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNG0174デフォルトの名無しさん
NGNGVS.NETで改善されてるみたい。
0175173
NGNGどこかに比較記事とかあったら紹介希望。
# RCなしでbeta2からいきりなりリリースとは勇気あるなぁ>VS.NET
0176デフォルトの名無しさん
NGNGfor文の初期
0177デフォルトの名無しさん
NGNG英語版はRC出てたはずでは?
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNGstring型の変数をchar型の配列に変換するにはどうしたら良いんでしょうか?
0181デフォルトの名無しさん
NGNGc_str()
0182デフォルトの名無しさん
NGNGウインドウの作成と初期化、さらにダイレクトXの初期化をするクラスを
作ろうとしているのですが、WindowProc()関数をそのクラスのメンバ関数に
するにはどうすればいいのでしょうか?
WM_DESTROYメッセージの後にダイレクトX関連のオブジェクトをリリースする
必要があるのでどうしてもWindowProc()関数内部からそのリリースする
メンバ関数にアクセスしたいのです。
よろしくお願いします。
0183デフォルトの名無しさん
NGNG・hWnd -> thisの連想配列で処理する(MFC式)
・hWndをthisにすげ替えるWindProcを自動生成する(ATL式)
お好きなのをどうぞ。
0184182
NGNGありませんか?もしくはウインドウ作成と初期化を一つにまとめた
クラスのソース公開しているところとか。
0185デフォルトの名無しさん
NGNG>クラスのソース公開しているところとか。
なぜATLのソースを読まないのでしょう?
0186182
NGNG0187デフォルトの名無しさん
NGNGttp://www.sun-inet.or.jp/~yaneurao/
0188デフォルトの名無しさん
NGNGCreateWindow 直後に SetWindowLong() で this ポインタを HWND に関連付け、ウィンドウプロシージャでは
GetWindowLong() で this ポインタを引き出してきてメンバ関数を呼び出す、ってのもアリかな。
>>186
MSDN Library に「ATL 3.0 ウィンドウクラス入門」という文書があったはず。あれ読んで CWindowImpl 使うの
が楽だと思うぞ。
0189182
NGNG目的のソース見つけました。あとそのページでかなりプログラム技術が
アップしそうな気がします。どうもありがとうございました。
ATLは適当に調べたかんじではまだよく分からなかったので
後回しにします。
0191デフォルトの名無しさん
NGNG技術そのものは、あちこちからパクってきたものだから問題ないんじゃない?
(変にオリジナリティを出そうとしてがんばって改悪してるかもしれないけど)
0192デフォルトの名無しさん
NGNGこの板には>>190-191みたいなアンチやねうら粘着厨房がいるみたい、
気にしない方がいいYO!
0193デフォルトの名無しさん
NGNGレス早いですね
粘着厨房さんですか?p
0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNGハジかいたってのは見たことある。
それ以外はよく知らないけど。
0196デフォルトの名無しさん
NGNGやね氏の能力は否定しないが、
文章を読んで賛美者になったりしてはいけない。
自分で技術的真偽の判別がつかない初心者は気をつけるように。
0197デフォルトの名無しさん
NGNGタスクコンテクストスイッチに関して、かなりボケたことを言ってて叩かれてたのはリアルタイムで
見てた。最近はどうか知らないけど、当時は「計算機論理設計の基礎が分かっちゃいねぇ、ヘネ
シー&パターソン読んで出直せ」というレベルではあった。
C++ と関係ないから、これ以上、やねうらおを語りたければプログラマー板行きましょう。
0199デフォルトの名無しさん
NGNGまず<やりたいこと>
・配列をvectorに置き換えたい。
・でも、配列先頭へのポインタによるアクセスは同じようにしたい
よーするに、T Array[5];をvector<T> Array;にしたいんだけど、 (void*)Arrayって
アクセスもしたい、っつーことなんです。
これ、const_pointer使えばOKなん? それとも、クラス書かないとダメ?
0200デフォルトの名無しさん
NGNGポインタの方で、要素を追加したりしないなら、こういう手もあり。
まぁ、それを想定するのが卑怯だというなら、クラスを実装
するしかないね。
0201199
NGNGということで早速のお返事、ありがとうございます。
>大抵の実装では、vector<T>::iteratorがT *になるはず‥‥
つーコトは、そのまんま(void*)ArrayでOK?(^^;
ちなみに、
>ポインタの方で、要素を追加したりしないなら、こういう手もあり。
なんてことは露ほども考えておりません(^^;
ぶっちゃけて話しちゃうと、DirectX8のDrawPrimitiveで使う頂点配列を、何とかして整理したかったのココロ(^^;
0202デフォルトの名無しさん
NGNGstd::vector<T> v;
T* p = &v[0];
vector は C の配列と同様のメモリ配置になることが規格上保証されてるから、これで OK。C で書かれた
関数と C++ 混ぜて使う場合 vector は重宝します。
>>197
そういや、以前の yaneSDK には std::vector に auto_ptr っぽいセマンティクスを持つ型を格納するという
おおぼけなコードがあった。最近のは見てないから知らんけど。
0203デフォルトの名無しさん
NGNG> vector は C の配列と同様のメモリ配置になることが規格上保証されてる
これって、規格になったんだっけ。まあ、そういう方向で標準化作業は
すすんでいたと思うので、そうでない実装というのは存在しないだろうけど。
0204デフォルトの名無しさん
NGNGg++ 付属の stl だと、vector<T>::iterator から T * への暗黙の変換は
定義されていなかったと思う。
0205デフォルトの名無しさん
NGNGvector<T>::iterator から T* への変換とかいう問題以前にさ、
typedef T* iterator
ってなってるはずなんだが。
今、g++ の vector のヘッダ見てみたけどさ、ちゃんと
typedef _Tp value_type;
typedef value_type* iterator;
ってなってるぞ。
0206199
NGNGどうしたらいいのでしょう?
#include <vector>
using namespace std;
template <class T> class apexVector
{
public:
//頂点データのベクタ
vector<T> apex;
void apexVector::method1();
};
vectorは(void*)apexが出来るっつーのでpublicにして横着しようと思ったなり(^^;
が、それは置いておいて、method1でコンパイルエラーになります。apexVector::を
取っ払えばとりあえずコンパイルは通りますが、ここは本来はどーゆー風に書くのでしょう?
0207デフォルトの名無しさん
NGNGtemplate <class T> class apexVector {
void method1() { // 実装
}
void apexVector<T>::method2(){//実装
}
};
ということをやればよい。ああ、テンプレートのメソッドが、テンプレート外に
記述できない、というのは知っているだろうな。(.cppと.hに分離できねーとか
泣きついてくるなよ)
0208デフォルトの名無しさん
NGNGVC7は違うらしいYO
0209デフォルトの名無しさん
NGNGtemplate <class T> class apexVector {
void method1() { // 実装
}
void method2();
}
void apexVector<T>::method2(){//実装
}
こうじゃないの?
0210デフォルトの名無しさん
NGNG0211199
NGNG>ふむ。君はvectorのソースも見ないんだな‥‥ まぁそれはいい。
厨房で申し訳ないっす(^^;
>template <class T> class apexVector {
〜中略〜
>ということをやればよい。ああ、テンプレートのメソッドが、テンプレート外に
>記述できない、というのは知っているだろうな。(.cppと.hに分離できねーとか
>泣きついてくるなよ)
……知りませんでした、申し訳ない(^^; 「.hと.cppに分離」はC++の作法だと思っておりましたので(^^;
早速やってみます。アドバイス多謝(拝)
0212デフォルトの名無しさん
NGNGgccのvectorのiteratorはT*との互換性はない、と書いた文書を
俺もどこかで見たぞ。公式の文書で。
古いの見てるんじゃないのか? libc++-v3じゃないやつとか。
それと、O(1)のオーダーでアクセスできることと
C の配列と同様のメモリ配置になることとは違うぞ。
0213デフォルトの名無しさん
NGNGtypedef value_type* iterator;
となってる。
0215デフォルトの名無しさん
NGNGtemplate<class T>
て書く?
template<typename T>
て書かない?
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNG>std::vector<T> v;
> T* p = &v[0];
> vector は C の配列と同様のメモリ配置になることが規格上保証されてるから、これで
> OK。C で書かれた関数と C++ 混ぜて使う場合 vector は重宝します。
std::vector<T> v;
T& r = v[0];
でなんか問題あるのか? ここでポインタわざわざ使う必要性が見えないんだが。
0218デフォルトの名無しさん
NGNG「C で書かれた関数と C++ 混ぜて使う場合」があるからなんでは?
0219デフォルトの名無しさん
NGNGgcc-3.0.2/include/g++-v3/bits/stl_vector.h だと、
typedef __normal_iterator<pointer, vector_type> iterator;
になってるね。__normal_iterator は別のファイルでクラステンプレート
で定義されてる。
0220217
NGNGその「Cで書かれた関数」というのが、「ポインタを引数に取る関数」の
ことならまあ納得するけど、「CとC++を混ぜる」場合、C++上でしかありえ
ないのにC的にする意味は無いと思うが。CにもC++にも適用したいアルゴリズム
はポインタよりイテレータの文脈で処理すべきだ。
0221デフォルトの名無しさん
NGNG>……知りませんでした、申し訳ない(^^; 「.hと.cppに分離」はC++の作法だと
つーか、それは MS の作法なんじゃねーの? 不必要に情報をタレ流さない
ためには、やたらと .h を作らないほうがいいと思うんだが。
あと、テンプレートクラスを .h で定義しておいて、そのメソッドを
.cpp で実装する、ということは可能だよ。export が使えれば一発だが、
これが使えなくても、必要に応じて明示的なインスタンス生成というのを
やればよい。
0222デフォルトの名無しさん
NGNGDirectX みたいな「与えられた API」を使ってプログラムを組む場合には、C++ を使っていてもポインタに
縮退させること必須でしょうが。文脈読めよ。
0223デフォルトの名無しさん
NGNGどして? その元の話がvectorを使おうとしてる以上DirectX云々は
副次的な文脈だろ。ちなみに俺の回答は「そんなとこでvector
使うんじゃねえヴォケ!」
0224デフォルトの名無しさん
NGNG> 「そんなとこでvector 使うんじゃねえヴォケ!」
なんで?
0225デフォルトの名無しさん
NGNGSTL は C との相互運用にも十分に配慮されたライブラリだから、使わない手はないと思うが。もし英語が
苦手でなければ Scott Mayers の Effective STL を買ってきて Item 16 "Know how to pass vector and
string data to legacy APIs." を読むことを薦めとく。
0226デフォルトの名無しさん
NGNGModern C++ Design で、
クラス(ユーザー定義型)しか使わないなら class
組み込み型も使う可能性があるなら typename
っていうふうに使い分けてた。
>>219
いわゆる type traits ってやつかな。
__normal_iterator<pointer, vector_type> を展開すると結局ただの valuetype* になりそうな気がするんだけど。
0227デフォルトの名無しさん
NGNGextern "C" の既存関数やAPIに対して、
std::string の持つデータを .c_ptr() や .data() で渡すのと同じでしょ。
それとも、vector<T> のかわりに basic_string<T> を使えという
主張ですか?それなら納得するけど。
0229デフォルトの名無しさん
NGNGgcc の STL は読んでないので知りませんが、他の有名どころだと STLport の vector<T>::iterator がデバッグ
モード限定で T* ではないですね。
話がそれるけど STLport のデバッグモードは無効な iterator 参照などを簡単に発見できて便利です。T* な
iterator だと、元の vector に push_back しても iterator が正しい領域を指しつづけることが多いから、バグを
埋め込んだときに再現率が低くて泣ける。
0230デフォルトの名無しさん
NGNG>>>223
>STL は C との相互運用にも十分に配慮されたライブラリだから、使わない手はないと思う
>が。もし英語が苦手でなければ Scott Mayers の Effective STL を買ってきて Item 16
>"Know how to pass vector and string data to legacy APIs." を読むことを薦めとく。
やむをえない時にやるべきことと、率先してやるべきことを混同していないか?
スタック上とか任意の場所にメモリを置いていたいときにvectorだと簡単に管理
できないし、相手先のC関数の挙動とvectorの実装が完全に見えている(=カプセル化
されていない)状況でしか使えないというのはバグの温床以外の何物でもない。
せめて間にラッパ入れてやらないと。
0231デフォルトの名無しさん
NGNGスタック(というか自動変数)として vector とるのはまったく問題ないけど。その場合でもデータそのものは
allocator 経由で(一般には)ヒープ上に取られた領域に置かれるけど、その違いが問題になるケースって
あるなぁ。
考えられるのは API 内部で渡されたデータに対して free() したり realloc() するケースだけど、それは
生成 破棄 利用
いずれも専用の API 群で行う設計で、そもそも vector 使う余地がないし。
> 相手先のC関数の挙動とvectorの実装が完全に見えている(=カプセル化されていない)状況でしか使え
> ないというのはバグの温床以外の何物でもない。
問題になるような関数の例を希望。
あと vector の実装に関して仮定していることは「データが連続領域にとられること」だけで、特に問題ない
と思う。
> やむをえない時にやるべきことと、率先してやるべきことを混同していないか?
C++ だと malloc() で確保した生のメモリ領域を自前で管理せず vector を使うのは「率先して」やるべきこと
でしょう。例外中立/安全な可変長のストレージを作ろうとすると、結局 vector と同じような実装にいきつく
ことになるし。
0232デフォルトの名無しさん
NGNGこれ、
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
に載っていますか? ちいさいデータなら並んでるかもしれませんが大きな
データは簡単に確保できず断片化されるとかあるんじゃ、と思ったんで。
0233デフォルトの名無しさん
NGNGバッファではないよ。バッファとして使いたいなら本来は
それ用のクラスを作って使うべき。もしくはget_temporary_bufferを使うか。
理念でなく実利で言うなら、要素のコンストラクトがおこるとかもある。
>問題になるような関数の例を希望。
について言えば、明らかにカプセル化の理念を無視してるわけだから、
例なんかなくても一見してだめ。
もっとも、俺自身は「わかってやってるならよし」という立場だけど。
0234227
NGNG>>233 バッファとして使うなら basic_string<T> ではだめかね
0235デフォルトの名無しさん
NGNG怖いんだけどそんなことってない?
0236デフォルトの名無しさん
NGNG内部で new してる可能性があるね。でもなぜそれが怖いの?
0237デフォルトの名無しさん
NGNGそれだと vector と deque を分ける意味がないと思うけど。
規格にざっと目を通してみたけど、vector のデータが連続領域にとられることを明記してる文章は
見当たらんね。Effective STL には p.74 に
The elements in a vector are constrained by the C++ Standard to be stored in
contiguous memory, just like an array, ...
と書いてあるけど。
>>234
名前が basic_string だから文字列にしか使えん、と思ってる人多数に一票。わりと使いでのある
クラスなんだけどね。
0238デフォルトの名無しさん
NGNG> 明らかにカプセル化の理念を無視してる
どこが? vector の内部データ形式を仮定してるところかな。
basic_string は値の「共有」を可能にするために参照カウンタが入ってることが多いよね。書き換えが少ない
(でも書き換えないわけじゃない)小規模なデータを値として渡していく場合には便利だけど、DirectGraphics
の頂点リストを管理するには不適切と思うな。
っつかバッファでもサイズが大きくなったら basic_string 捨てて rope だと思われ。標準じゃないけど。
0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNGCスタイル関数に渡すのにc_str()して、それが何万回も呼び出されると考えると、
newされるのは勘弁して欲しい
0241デフォルトの名無しさん
NGNG性能に関しては、プロファイラにかけてボトルネックになってることを特定してから考えれば良いと思う
けど。
ちなみに VC6 添付の STL や STLport, あたりだと、内部で C 形式の文字列データを使ってるので、
c_str() は
return this->internal_buf_ptr;
みたいなコードになってる。コストは this 経由の間接参照が一つ入るだけ。gcc 2.95.3 の STL だと
const charT* c_str () const
{ if (length () == 0) return ""; terminate (); return data (); }
charT* data () { return reinterpret_cast<charT *>(this + 1); }
と末尾を eos で埋める terminate() 呼び出しが入るけど、それを除くとコストはやっぱり間接参照ひとつ分。
0242236
NGNG言語規格上は毎回 new しても構わないが、まともな実装ならそんなことはしない。
0243デフォルトの名無しさん
NGNGみたいなことをよくするので(他にはfreadとか)、いちいちnewされたら困る。あと、こういう実相依存なプログラムしてるといつか困るとは思う。
0244236
NGNGstringの保持データ操作には
string::assign(const charT*, size_type) や
string::replace(size_type, size_type, const charT*) を使っておくれ
fread に渡すのは auto 変数のバッファにし、後で assign/append しておくれ
0245199
NGNGとりあえず、
std::vector<T> array;
void* p = &(array.at(0));
で、
T array[5];
void* p = array;
と同じ動作になりました。アドバイスしていただいた皆さんに感謝(拝)
ちなみにクラス定義はメソッド実装も含めて全部.hに集約したナリ。
軟弱でソマソ(^^;
ちなみに、VC++ Ver.6のSTLには、メモリ不足時にかなり致命的なバグが
あるとゆー話を聞いたのですが本当?
なんでも、メモリ確保に失敗したら例外出さずにreturn 0;するとか……(^^;
0246デフォルトの名無しさん
NGNGSTL に限らず、VC++6.0 の new はメモリ確保に失敗しても例外投げないよ。
set_new_handler の仕様も標準のものと全然違う。
0247デフォルトの名無しさん
NGNGバグというか、仕様ですね。operator ::new(size_t) 失敗時に呼び出すハンドラを _set_new_handler() で指定
できるので、そこで対処してください。
0248何で検索すればいいんでしょうか(´д`;
NGNGint i = 3;char c;
c = i;
としたとき、
cの値が'\003'ってなるのですが、原因がわからず妙な所で苦戦しています。
だれか助けてください・・・
0249デフォルトの名無しさん
NGNG>>243
>memcpy( const_cast<char*>(stringVar.data()), ***, ***)
それっぽいのは俺もよくやる。WindowsだとconstになってるべきAPIが
constじゃない場合があるからその場合は仕方なく...とか思ったら
コピー元じゃなくコピー先かよ。氏ね
0250248
NGNG0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG正解!!オメデトウ!
まぁお主のやりたい事は sprintf を使うのがてっとり早いかな.
# フレーム合戦はヤめような(藁 > all
0253デフォルトの名無しさん
NGNG激しく同意
0254デフォルトの名無しさん
NGNGdata()で返される領域は、複数の string で共有してる可能性があるので、書き換えると大変なことに(だから const なんだよ、無闇に const 外すな)。
0255デフォルトの名無しさん
NGNG> # フレーム合戦はヤめような(藁 > all
当事者その一だけど、それなりに実のある話になってるから良いじゃない。コピペ荒らしとか単調なレスの
繰り返しとかは不快なだけだが、この程度のフレームはネットの華ってことで見逃してくれ。
(もう、だいたい話は出尽くしたと思うけど)
0256252
NGNG悪ぃ悪ぃ.そーゆー意味じゃなかったんだ.
sprintf 厨房逝って良し!
とか言い出されるとメンド臭ぇなぁって思っただけ.
0257243
NGNGファイルサイズ取得して、resizeして、freadにconst_castして放り込む・・・とかやってる奴は密かに多いと思うのだが。真似しちゃ駄目よ。移植性0よ。でも面倒だよなー。
他の逝ってよしテクとしては、setでのconst_castがあるなぁ。
setVal.find()の返り値はconstのiteratorなのだけど、これはコンテナの値を書き換えるとコンテナの順番が
入れ替わってしまうので、それを阻止するためのconst。
しかし、述語関数オブジェクトでは評価されていないコンテナのフィールドを書き換えたいときがある (こ
の場合コンテナの順番は変更されない)ので、こういうときにconst_castでiteratorの constを除
去してみる。
ちなみにVCのSTLはconst_iteratorではなく普通のiteratorを返してくるのでこの逝ってよし技は
不要。というかVCユーザは無意識のうちにこの技を使っていることが多いと思われ。
0258デフォルトの名無しさん
NGNGだったら適当に改行入れることを覚えろ。
>ファイルサイズ取得して、resizeして、freadにconst_castして放り込む・・・とかやってる奴は密かに多いと思うのだが。真似しちゃ駄目よ。移植性0よ。でも面倒だよなー。
勝手に思いこんでるだけだろ。
2chに来て1.5年以上になるが、basic_stringに対して
こんなふざけた扱い方をしている人間は初めて見たよ。
やるなら、vector<char>でreserve()してbegin()か&v[0]を放りこむ。
それなら(保証されていなくても)密かにやってる人間はたくさんいる。
参照カウンタの考え方を理解していれば、
basic_string::c_str()の書き換えなんか絶対やらない。
作業バッファとして用いるなら、basic_stringは効率が悪い。
0259デフォルトの名無しさん
NGNG0260デフォルトの名無しさん
NGNGSGI STL
0261259
NGNG俺の持ってるのが古いのかと思って、http://www.sgi.com/tech/stl/download.htmlから
Ver3.3を落としてみたけど、stl_set.hでは
iterator find(const key_type& __x) const { return _M_t.find(__x); }
となっている。
0262259
NGNG0263デフォルトの名無しさん
NGNGconstじゃないiteratorを返すなぁ…。
0264デフォルトの名無しさん
NGNG0265デフォルトの名無しさん
NGNGそれ、上のほうで
typedef typename _Rep_type::const_iterator iterator;
とか定義されてない? 俺が見てるのは gcc 2.95.3 についてくる SGI STL なんだけど、これは
find でとってきたイテレータ経由で値を書き込もうとすると、
set.cpp:9: assignment of read-only location
と怒られる。
0266259
NGNGsetだと、
typedef typename _Rep_type::const_iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
mapだと、
typedef typename _Rep_type::iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
0267259
NGNGtypedef rep_type::const_iterator iterator;
になってるね。
gccだと、プリミティブ型でなければコンパイルは出来るみたい(警告あり)。
もちろん、Compareに直結する要素を書きかえると順序が狂う。
02681
NGNGがポータビリティのある書き方である。
詳しくはEffective STL Item22を見よバカチンども(゚Д゚)!
const_castを使わない方法も載ってるよ。
0269デフォルトの名無しさん
NGNGはいはい、逝っちゃってる人はMeyersのケツの毛でも煎じて飲んでいて下さい
0270素
NGNGで出力する値の、整数部、小数部の桁数を指定するのはどうするのでしょう。
Cの
printf("%4.9lf",1234.123456789); みたいなの。
0271デフォルトの名無しさん
NGNGマニピュレータ使え
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNG微妙に同意。私も strstream は使わずに snprintf してしまう方だ。
stream 使えば
1. 型安全で
2. 入出力先に依存しない汎用的な記述ができる
のは分かってるんだが、書式指定が読みにくすぎて辛いんだよなぁ。
double d;
int n;
printf("%5.1f / %d\n", d, n);
cout << setw(5) << setprecision(1) << setiosflags(ios::fixed) << d << " / " << n << '\n';
0274デフォルトの名無しさん
NGNGcout << formatFix(5, 1) << d;
マニピュレータを作ろうとしたこともあったが、
sprintf 系の手軽さの前に挫折した。堕落のついでに
ostream に sprintf メソッドが欲しい今日この頃。
0275素
NGNGI/Oストリームを使ったファイル出力法しか今は理解していないので、
ストリームを使った桁処理が知りたかったのですが、
持ってる参考書のマニピュレータの項には、setw(int x)は載ってたけど、
setprecision(int x) が未掲載で、小数部の桁を操作する関数名が分からず困ってたのです。
0276デフォルトの名無しさん
NGNGでも何年かかることやら...
0277デフォルトの名無しさん
NGNGcout << format(d, 5, 1);
みたいのじゃないのか。
0278デフォルトの名無しさん
NGNGprivate:
foo f;
};
class foo{
...
};
こうすると型名が必要、宣言に;がないとコンパイルエラーが出てしまうの
ですが、クラスfooをクラスhogeの前に書く方法以外でできる方法はあるの
でしょうか。教えて下さいませ
0279デフォルトの名無しさん
NGNGない。
foo fをfoo* fにしてもよいなら
hogeの前にclass foo;と書けばよい。
0280デフォルトの名無しさん
NGNG「前」に書かなくても
class hoge
{
class foo* pFoo;
...
};
で OK。あと
class hoge
{
class foo;
foo* pFoo;
};
だと nested class である hoge::foo を宣言したことになるので注意。
0282デフォルトの名無しさん
NGNGわざわざ実務的に有用な方を教えてるのに、
よけいなフォロー入れないで頂戴。
0283デフォルトの名無しさん
NGNGスタイルの問題だとおもうけど?
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNGふつー
a = b++ + c
だと思うけど、人に聞く前にとりあえずコンパイラ通せ
0286284
NGNGう。そうでした。
a=b+++c; は a = b++ + c; でした。
ついでに試してみると a=b++++c; とか a=b+++++c; はエラーでした。
C++Builder 5 にて。
0287デフォルトの名無しさん
NGNG演算子の優先順位というのがあって、例にあるものだと、
「後置++」>「前置++」=「単項+」>「加算+」>「代入=」という順になる。
よって、「a=b+++c;」は「a=((b++)+c);」と評価される。
「a=b++++c;」とか「a=b+++++」だと、
「a=((b++)++)」の段階でアウトになる。
# 「b++」の結果、つまり整数はインクリメントできない
0288デフォルトの名無しさん
NGNGというか利かなかったんですけど、それってどこが悪いんですか?
ここに書いてあるようにマイクロソフトですか? それとも僕の脳ですか?
ttp://www.nantekotta.com/stl.html
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGb の後のオペレータは + と ++ とどっちにもマッチングするけど、 ++ のほうが長いから、そう解釈される。
優先順位できまるなら b+++++c は 加算+より優先順位の高い前置++が優先されて、 b++ + ++c と解釈されるはず。
実際はそうでない。
優先順というのは a + b * c のような時 * のほうが + より優先順位が高いから a + (b * c) になるときの規則。
字句解析が終わった後の構文解析の規則。
0291278
NGNGprivate:
int h_size;
class foo *h_foo;
public:
hoge(){ h_size=0; }
void setFoo(class foo *f){ h_foo=f; }
int get_h_size(){ return h_size; }
void h_print(){ cout<<h_foo->get_f_size()<<endl; }
};
class foo{
private:
int f_size;
class hoge *f_hoge;
public:
foo(){ f_size=1; }
void setHoge(class hoge *h){ f_hoge=h; }
int get_f_size(){ return f_size; }
void f_print(){ cout<<f_hoge->get_h_size()<<endl; }
};
二つのクラスの関連を双方向にしたいのですが、上記だと
型が宣言されていないため 'get_f_size' は 'foo' のメンバーではない(関数 hoge::h_print() )
という、コンパイルエラーが出てしまいます。これは関連の実装が間違って
いるのでしょうか?それともアクセスの仕方が間違っているのでしょうか?
教えて下さいませ
0292デフォルトの名無しさん
NGNGvoid hoge::h_print() と void foo::f_print() の実装を
書く場所がまずい。クラスの外に書け。
0293デフォルトの名無しさん
NGNGされると登録を入力し、次に入力された年齢を、ハッシュ法で検索
し、あればその人の名前を出力するプログラムを作成せよ。ただし
ハッシュ表の大きさは9とする。
学校でこの問題を出されましたが、さっぱり分かりません。おまえら
教えてくださらないでしょうか。
0294278
NGNGクラスの外に書くとは
class hoge{
...
void h_print();
};
void hoge::h_print(){ ... }
という事でしょうか?これでも同じエラーが出るのですが
0295デフォルトの名無しさん
NGNG宿題みてあげるっ
http://pc.2ch.net/test/read.cgi/tech/1007902384/
で怜のご機嫌を伺うか
[[ハッシュ法統合スレッド]] vol.1
http://pc.2ch.net/test/read.cgi/tech/1005461137/
0296291
NGNG#include <iostream>
using namespace std;
class hoge{
private:
int h_size;
class foo *h_foo;
public:
hoge(){ h_size=0; }
void setFoo(class foo *f){ h_foo=f; }
int get_h_size(){ return h_size; }
void h_print(); //{ cout<<h_foo->get_f_size()<<endl; }
};
class foo{
private:
int f_size;
class hoge *f_hoge;
public:
foo(){ f_size=1; }
void setHoge(class hoge *h){ f_hoge=h; }
int get_f_size(){ return f_size; }
void f_print(); //{ cout<<f_hoge->get_h_size()<<endl; }
};
inline void hoge::h_print(){ cout<<h_foo->get_f_size()<<endl; }
inline void foo::f_print(){ cout<<f_hoge->get_h_size()<<endl; }
0300デフォルトの名無しさん
NGNGええーっ、面倒い〜・・・
いや言いたいことは解るけど
かちゅーしゃにそういう機能付かないかなと密かに祈りを
0301デフォルトの名無しさん
NGNGここの板にスレのある 「2chブラウザ」 は、
スペースやタブを &nbsp;に 変換する機能あるよ。
0302デフォルトの名無しさん
NGNG1度にincludeする方法ってありませんか
0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNG0305デフォルトの名無しさん
NGNGMakefile に、次のようなターゲットを仕込んでおけば?
all.h:
ls -1 *.h | perl -lne 'print qq(#include "$_")' > all.h
distclean:
rm -f all.h
0307デフォルトの名無しさん
NGNG:%s/\t/ /g
0308304
NGNGキャストしないで printf してた。
0309素
NGNGFile[0]("abc01.txt");
File[1]("abc02.txt");
↑これでエラーでたのですけど、不正な書式なのでしょうか。
0310デフォルトの名無しさん
NGNGofstream File[2];
File[0].open("abc01.txt");
File[1].open("abc02.txt");
0311デフォルトの名無しさん
NGNG0313デフォルトの名無しさん
NGNG例えばclass Addressというものがあるとして、
Address a;
struct in_addr addr = a;
というのをどうしても成立させたいのですが、
class A : public in_addr {
...
}
というような、in_addrを直接継承する以外の方法では
可能でしょうか。
http://forums.belution.com/ja/vc/000/006/08s.shtml
のURLに同じような質問があったのを発見し、そこでは
解決策がいくつか出ているみたいですが、具体的に
どうオペレータオーバーロードすれば良いのか分からないです。
0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNG毎回やるのが面倒だったら、operator in_addr& () でも作っとけば?
0316デフォルトの名無しさん
NGNG上のは、aがin_addrを直接継承してないと無理な気が‥‥
0317デフォルトの名無しさん
NGNGC形式のキャストが嫌なら、アドレスをreinterpret_castでどーぞ
0318デフォルトの名無しさん
NGNG>>314 が正解だろうね。でも generic programming で必要、とかいう理由がないのなら、
単純に class Address に copyAddr( in_addr& addr ) というようなメソッドを定義して
それを使ったほうがプログラムは分かりやすくなると思うな。
0319315
NGNG0320315
NGNGstruct sockaddr_inで値を設定して
struct sockaddrにキャストして渡したり、ってことをするわけさ。
だから、Addressもその一種だと思ってしまったのさ。
こんな感じ。(WinSock2.0プログラミングのgethttp.cppより)
saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
つまり、サイズ等は一緒でそのままキャストで渡せるものが入っていると
勝手に想像してしまったわけ。
ごめんね。
0321313です
NGNGclass Address {
public:
operator in_addr() const;
}
Address::operator in_addr() const {
struct in_addr addr;
...
return addr;
}
のようなものを用意したらできちゃいました。なぜか。
コンパイラ(gcc-2.96)も文句を言わないし、出来た実行ファイルの
動作も期待通りになりました。
でまた質問なんですけど、なんでこれ返り値が必要無いんでしょうか。
0322デフォルトの名無しさん
NGNGコードについて質問です。
// HOGE.h
class HOGE{
public:
HOGE(){}
virtual ~HOGE(){}
int Boo(int);
private:
int foo(int);
}
// HOGE.cpp
inline int HOGE::foo(int n){
return n + 5;
}
int HOGE::Boo(int n){
return foo(n);
}
こう書いたとき、HOGE.hをインクルードしたソースファイルが
HOGEオブジェクトを創るときは、どうなるんでしょう?
HOGEオブジェクトは、fooを呼び出すための関数ポインタを
持っちゃうんですかね? fooがpublicだったら結果は
違ってきますかね?
fooが有るときと無いときで、sizeof(HOGE)は違う値を
返しますか?
どなたか、ご教授ください。m(__)m
「コンパイラに通して調べろよ」ってのはナシで。
マシンの不都合で、1ヶ月ぐらいはコンパイルできないんす。(T_T)
あ、もしコンパイラ依存の問題なら、VC++の場合でお願いします。
0323デフォルトの名無しさん
NGNGどこに関数ポインタを宣言してる?
0324デフォルトの名無しさん
NGNGキミのコードは正しいよ。自信がないみたいだから、「なぜ」正しいかを
勉強しておいたほうがよいと思うけど。
ただ、型変換オペレータは、思わぬところで暗黙のうちに働いてしまう
ことがあるので注意したほうがよい。
あと、型変換オペレータに戻値の指定がないのは、まあコンストラクタと
似たようなものだから、かな。
0325デフォルトの名無しさん
NGNG仮想関数へのポインタと思われ。
> fooが有るときと無いときで、sizeof(HOGE)は違う値を返しますか?
仮想関数が有るか無いかで、オブジェクトのサイズは変わってくる。C++ の実装に関して詳しく知りたい
なら Inside the C++ Object Model という書籍を買ってきて読みましょう。
0326デフォルトの名無しさん
NGNGん? クラスのメンバーじゃない operator= って定義できたっけ?
0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNG>>296のソースだと、新しいクラス(aaa)をもうひとつ追加してそれらが
相互に通信しあうとすると、各クラスにそれぞれ、
1.メンバ変数の追加
class aaa* m_aaa;
2.ポインタ登録用のメソッドを追加
void setAaa(class aaa* aaa) { m_aaa = aaa;}
3.Aaaを使用するメソッドを追加。
void aaa_print();
の3工程必要になりますよね。
もうひとつの方法として、すべてのクラス(のポインタ)をグローバルに
宣言して、共通ヘッダに押し込めてしまうという手法が考えられます。
上記の例だと
extern class foo* g_foo;
extern class hoge* g_hoge;
extern class aaa* g_aaa;
そうすると、上記工程の1、2は省略できて3の工程のみにできます。
実際はclass aaaの定義ファイルのインクルードが必要ですが。
というように、この方法は大変便利なんですが、インスタンスの変数名g_aaaが、
決めうちになってしまう辺りが、どうにも気持ち悪いと自分では思ってます。
で、双方向関連を表現するのに、上記の2つの方法以外に
何かいい方法ご存じないでしょうか?
0329デフォルトの名無しさん
NGNG322のどこに仮想関数が?
0330デフォルトの名無しさん
NGNGあえて言えばデストラクタ?
っつか、たぶん求めてる答えは
仮想関数があると仮想関数へのポインタを格納した vtbl が作られ、各インスタンスには vtbl を指す
vptr が格納される。よって仮想関数なしの場合に比べると、インスタンスのサイズは増える。
仮想関数が無い場合には、メソッドはリンク時に静的に解決され、関数ポインタを介さずに直接呼び
出される。
という話のような気がする。>>322 のコードに限って言えば、デストラクタが仮想なので、すでに HOGE
のインスタンスには vptr が含まれることは確定。したがって foo() があってもなくても、仮想でも非仮想
でも HOGE のサイズには影響しない。
0331観筒
NGNG>Inside the C++ Object Model
amazonで探したら、洋書しか出てこなかったんですが…。和訳されてないんですかね?
へたれアマグラマなんで、「英語で読め」は勘弁してください。(T_T)
>>330
あー、俺が勘違いしていた部分まで踏まえて、完璧な回答ありがとうございます。
なるほどー、virtualでないメンバ関数は、インスタンスのサイズに影響はないんですね。
てっきりインスタンスがメンバ関数まで丸ごと抱えているのかと思ってました。
あ、もしかして、メンバ関数を呼び出すときって、インスタンスのアドレスをスタックに
積んでから呼び出してるんですか? それで、メンバ関数内では、渡されたインスタンスの
アドレスをthisとして扱う…と。そういう仕組みですか?
と。そこで、生まれてきた疑問を。
class HOGE{
public:
int Boo(int){cout << foo();}
private:
virtual const char* foo(void){return "ほげ";}
}
class HOGE_EX : public HOGE{
private:
virtual const char* foo(void){return "ほげEX";}
}
int main(void){
HOGE_EX HE;
HE.Boo();
return 0;
}
この場合、表示されるのは「ほげEX」ですか? こういう風に基底クラスの
内部で仮想関数が呼ばれる場合のオーバーライドの例って、見たことがないんです
けど、上の俺の考えが合ってるなら、「ほげEX」と表示されるはずだと思うんですが…。
0332デフォルトの名無しさん
NGNG>アドレスをthisとして扱う…と。そういう仕組みですか?
そういう仕組みです。
>この場合、表示されるのは「ほげEX」ですか? こういう風に基底クラスの
そーです。ちゃんと派生クラスのが呼ばれます。
0334デフォルトの名無しさん
NGNGのインスタンス生成関数を引数NULLで呼ぶとその変数の中身は
どうなるの?
0335デフォルトの名無しさん
NGNGメンバに持つ(各インスタンスが持つ)のではクラスとして機能が異なる。
コーディングの手間を省くために機能変更しちゃダメだよ。
0336デフォルトの名無しさん
NGNG日本語がよくわからん。コードを書いたほうが早いかも。
C++ のコンストラクタには返り値ないよ、念のため。
0337デフォルトの名無しさん
NGNGすまん。書いてからそう思った。
中身忘れたんで明日またソース見てくる。
0338超初心者
NGNGstringを使って作ったソースでオブジェクトを作って、そのオブジェクトを
dlopen で開こうとするとエラーになってしまうのですが・・・
なにが悪いのか分かりません・・・
ご指摘お願いいたします。
意味を持たないソースだけど例えばこれのオブジェクトをdlopenで開けないということです。
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
string k("test");
return 0;
}
0339デフォルトの名無しさん
NGNG一応指摘しておくけどこういう場合はオブジェクトって
言わないでライブラリって呼ぶんじゃないかな
まずmain()はダイナミックロード出来ないと思う
あとはコンパイルオプションを確認しよう
0340デフォルトの名無しさん
NGNGC++ と dlopen を一緒につかうなんてオトコのコです.
extern "C" について調べましょう.
0341超初心者
NGNGもうちょっと具体的にエラーの原因を書きますので
よろしかったら再びアドバイスいただけると助かります。
1 いくつかのオブジェクトファイルを使って一つの動的共有ライブラリ(仮にtest.soとしておきます)を作成します。
2 C版APIを使ったソースでtest.oを使用する。
3 2の過程でdlopen()が使われている。
4 dlopen()が失敗する原因はtest.soのなかで使用している
「std::basic_string<char,std::char_traits<char>,std::allocator<char> >::__nullref」
というシンボルが参照できないため再配置エラーとなって失敗している。
というような状態です。
で、>338で作ったものでもまったく同じエラーが出ました。
ちなみに他のOSの他のコンパイラではエラーはおきていません。
というわけでこのコンパイラ特有の何かだと思うのですが・・・
まず、(3)、(4)の条件からどのあたりに目をつけていけば良いか
アドバイスいただけたらよろしくお願いいたします。
0342デフォルトの名無しさん
NGNG> 一応指摘しておくけどこういう場合はオブジェクトって
> 言わないでライブラリって呼ぶんじゃないかな
個人的には、ライブラリと言うと複数のオブジェクトをまとめたファイルって感じがするなぁ。単一モジュールだけ
ファイルに切り出してダイナミックローディングするというのは割と良くある。(デバイスドライバとか)
>>341
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::__nullref が、処理系付属の C++ ライブラリ
かどこかで定義されてるんだと思う。
ELF オブジェクトだと依存関係を書き込むセクションがあったと思うので test.o に
このファイルは C++ 標準ライブラリ (libc++.so とか?) に依存する
旨を書けば良いんじゃない。とりあえずリンカのコマンドラインオプションをチェック。
0343デフォルトの名無しさん
NGNG定義の方だけつければいいんだよね?
リンクでエラーが・・・
0344デフォルトの名無しさん
NGNG> 定義の方だけつければいいんだよね?
定義をヘッダではなく実装 (*.cpp) に書いてないか?
0345343
NGNGあれ、それじゃダメ?
inline void class::method(){
return;
}
って感じじゃダメだっけ?
0346デフォルトの名無しさん
NGNGClass hoge{
public:
&nsbp;&nsbp;inline hoge & foo (const hoge & foo) {}
}
0347デフォルトの名無しさん
NGNG0348デフォルトの名無しさん
NGNG0349デフォルトの名無しさん
NGNG0350デフォルトの名無しさん
NGNG「使える?」って、どういう意味だ。
0351デフォルトの名無しさん
NGNGそりゃ、使えるだろ。
0352デフォルトの名無しさん
NGNGそもそも *.cpp に書いたら、どうやって
「インライン化」
するんだよ。インライン関数利用側をコンパイルする時点で定義が見えないとインライン展開しようがないから、
インライン関数はヘッダに書く。
ヘッダで関数を定義すると、複数のオブジェクトファイルにコンパイルされた関数が含まれる可能性がある。そ
こでリンカのシンボル重複定義エラーを避けるために、inline 関数は自動的に static リンケージになる。同一
翻訳単位外からは、inline 関数は見えない。
>>346
class 定義の中にメソッドを書く場合、暗黙のうちに inline 扱いされなかったっけ? あとクラス間で相互参照
が入る場合には、どうしても宣言と定義を分ける必要があるから、class 定義の中にインラインメソッドを書け
ないケースもある。
それ以前に、本当にインライン展開する必要があるのか、プロファイラにかけて調べてみろと言いたいけど。
0353観筒
NGNGその書き方がOKなのは、inline関数の展開先が同じソースファイル内の
場合だけです。しかも、展開先は、定義の後にないといけません(だったはず)。
つまり、定義時の(.cppファイルでの)inline指定は、クラス内でしか
呼び出さない関数(private関数です)だけで有効、と覚えておけば
いいのではないかと思います。
クラス外部から呼び出される関数(public,protected関数です)を
inline展開したい場合は、ヘッダファイル内で関数本体を記述しないといけません。
コンパイラがinline展開をしようがないからです。
>>322で定義時のinline指定を書いてるから参考にしてください。
0354デフォルトの名無しさん
NGNGどうもです。
わかりました。
0355デフォルトの名無しさん
NGNG>つまり、定義時の(.cppファイルでの)inline指定は、クラス内でしか
>呼び出さない関数(private関数です)だけで有効、と覚えておけば
>いいのではないかと思います。
弊害が大きすぎるような。
0356デフォルトの名無しさん
NGNGこれを利用して、.cppに書いたコードのインライン展開ができるんだそうな。
0358デフォルトの名無しさん
NGNGその説明だと private メソッドをインライン定義された public メソッドから呼び出す場合や、friend について
考慮してない。
それより、
「inline 関数は、それを利用する各々の翻訳単位に対して定義を与える必要がある」
と規格書っぽく言っておくのが正確かつ簡潔だと思う。ま、ヘッダに書いておけば確実ではある。
0359デフォルトの名無しさん
NGNGttp://www.geocities.co.jp/SiliconValley-Cupertino/7774/c/sub/chap12.html
↓
calculator.h
0360デフォルトの名無しさん
NGNGダメダメじゃん……。
top() で return NULL は間違いだし、スタックの overflow, underflow のチェックをカプセル化してないし、
pop() インターフェースは例外安全にしようがないし。
0361観筒
NGNGああ。「語弊が大きい」と言いたかったのですね。「弊害が大きい」なんて
いわれるから、なんかとんでもない副作用が出るのかと心配しました。(^^;
「語弊が大きい」ことに関しては、確かにおっしゃるとおりです。
0362358 != 355
NGNG全然本題と関係ないが
語弊=言葉の使い方が正しくないために生じる弊害
だぞ。弊害が大きいで何ら問題ないと思われ。
0363デフォルトの名無しさん
NGNG> >Inside the C++ Object Model0
> amazonで探したら、洋書しか出てこなかったんですが…。和訳されてないんですかね?
邦訳はトッパンから出ている「C++オブジェクトモデル」だと思うんだが、トッパン出版部門活動停止に伴い
入手できなくなってる。cbook24.com で調べたら「絶版」だそうだ。
私は原書で読んだけど英語自体は平易だったよ。C, C++, アセンブラに関してある程度の技術的背景があ
る人間なら、楽に読めると思われ。
0364デフォルトの名無しさん
NGNG> top() で return NULL は間違いだし
正解は、例外を投げるって事ですか?
0365デフォルトの名無しさん
NGNGそれ以前に
DATA_t top();
で return NULL はまずいんじゃ。
そもそも DATA_t の型によっては NULL からの暗黙の型変換ができないし、DATA_t が int としても「スタックトップ
に 0 が入っていたのか、それともスタックアンダーフローなのか」見分けがつかんよ。
0366デフォルトの名無しさん
NGNGpush(),pop()のチェックになんでfull(),empty()を使わないの?とか、
pop()はスタックトップをもらえないの?
とか、なんでstackpos() がpublicなの?
とか、top()がNULL返すなよ、とか、いろいろツッコミ所あるけど、
CALCULATOR::Calculate(char *)みたら、そんなのふっとんじゃうよ、っていうのが俺の感覚。
0367デフォルトの名無しさん
NGNGpop() でスタックトップを持ってこないのは正しい設計だけど (STL の stack もそうなってる)、Calculate() が
そんなに珍しい? スタックを使って LL(1) の構文解析を行うのはコンパイラ理論の書籍を紐解けば必ず載っ
ている常套手段だし。
0368デフォルトの名無しさん
NGNGhttp://sawayaka.mariansela.com
http://sawayaka.mariansela.com
http://sawayaka.mariansela.com
0369デフォルトの名無しさん
NGNGそのCalculate()がヘッダに展開されてるの見て、なにも思わんか??
中身以前の問題だ。
0370デフォルトの名無しさん
NGNG「ヘッダに展開」って、何? 結構長い関数だから、コンパイラがインライン化しない
可能性大だと思うんだが。こんな単にクラス宣言内に関数定義を書いただけの
何の変哲もない例をもってきて何がいいたいのかサパーリわからんが。
0371デフォルトの名無しさん
NGNGいや、「何の変哲も無い」って思うなら、べつにいい。
あんたを説得するのが目的じゃないから。
0372デフォルトの名無しさん
NGNG0373デフォルトの名無しさん
NGNGおれも何を問題としてるのかさぱーりわからん。
ちゃんと説明すべし。
0375デフォルトの名無しさん
NGNGわからんやつはヘッダに定義を全部押しこんどけ。
0376デフォルトの名無しさん
NGNGstackクラス、サイズの違うのを作るとクラスが増えるのも、すごいかも。
まさか、最近のコンパイラは、こういうの最適化してくれるってこと、無いよね?
0377デフォルトの名無しさん
NGNGなんだそんなことか(プ
そんなに大騒ぎする程の事でもないよお。
0379376
NGNGヘッダに何でも押しこんじゃったら、実行ファイルでかくなるわ、
実装を書きなおしたら呼んでるファイル全部コンパイルだわ、
インライン展開してくれるのかどうか、処理系依存になるわ、
お互いに呼び合ってるクラス同士は定義できなくなるわで、
いいところ全然無いって思うけど、そういうのは最近、問題にはならんのか?
つか、そういう書き方推奨していいもんなのか?
少なくとも、「なんの変哲も無い」は、センス無さ杉だろうな。
まあ、やっちゃだめだろうな、こういうでかい関数を宣言にいれるの。
宿題見てあげるスレにも出てきたサイトだけど、大学の授業でこういうの教えてるのが、やっぱ、一番の問題かし。
0380デフォルトの名無しさん
NGNGたとえば、donutのソースみて卒倒するタイプ。
0382デフォルトの名無しさん
NGNG>いいところ全然無いって思うけど、そういうのは最近、問題にはならんのか?
>つか、そういう書き方推奨していいもんなのか?
への答えのつもりだが。
0383デフォルトの名無しさん
NGNGそれは「ヘッダになんでも押しこんじゃったら」で始まる文なんだが…
0384デフォルトの名無しさん
NGNGそれ以外の文脈で評価できる、とでもいうのか?
0385デフォルトの名無しさん
NGNG「ヘッダになんでも押しこんじゃったら」で始まる文である以上、
無計画にそうする奴の話なんじゃないの?
0386デフォルトの名無しさん
NGNGライブラリなんかだと template だと「使わない関数はそもそもコンパイルされない」から、逆にコンパクトに
なるかも。そうでなくとも、逐一 bridge パターンを使って実装を隠蔽したコードよりはコンパクトになるし、実
行時ではなくコンパイル時に実装を固定して良いのなら、インターフェースとして使う抽象クラスの数を減ら
すこともできる。
前に10000 行ぐらいのコードをお遊びで可能な限り template 化して、不要になった抽象クラスを削ってみ
たことがあるんだけど、VC6 のコンパイラオプション /O1 (ファイルサイズ優先) でコンパイルしてみたが
1) 6% ぐらい実行ファイルのサイズが小さくなった
2) 20% ぐらいソースコードの行数が減った
3) 実行速度は有意な差は得られず
4) エディット&コンティニューのプログラムデータベースが使えなくなり
5) 実質ひとつの .cpp から、実装込みのすべてのヘッダを include したので、一行書き直すとフルビルド
が必要になった
ってな感じ。最近のマシンだと 10000 行ぐらいならフルビルドしても問題にならんから、中小規模のプロ
グラムなら、まぁ良いのかも。
> お互いに呼び合ってるクラス同士は定義できなくなるわで
これだけど「template 関数は実際に呼ばれるまで実体化されない」規則がある都合か、確か書き方に
よっては出来た気がする。こんな感じだったかな。
template <typename TController>
class CTaskKeyboard
{
public:
CTaskKeyboard(const TController& con)
{}
};
class CController
{
typedef CTaskKeyboard<CContoller> TTaskKeyboard;
boost::scoped_ptr<TTaskKeyboard> m_spTaskKeyboard;
...
};
0387デフォルトの名無しさん
NGNGクラスCGraphicを作ってます。で、その中で、画像をロードする関数は
下のような実装になってます。
bool CGraphic::Load(const string& FileName)
{
if(LoadBMP(FileName) != ERROR) return OK;
if(LoadPNG(FileName) != ERROR) return OK;
if(LoadJPG(FileName) != ERROR) return OK;
(中略)
return ERROR;
}
こんな感じで処理してたんですが、だんだんと各種ロード関数が
増えてきて手におえなくなってきました。加えて、動的にロード関数を
増減させたくもなりました。そこで、この各種ロード関数を
なんとか外部クラスにしたいのですが、下のようなダサい実装しか
思い付きません。
bool CGraphic::Load(const string& FileName)
{
if(CBMP::Load(this,FileName) != ERROR) return OK;
if(CJPG::Load(this,FileName) != ERROR) return OK;
if(CPNG::Load(this,FileName) != ERROR) return OK;
(中略)
return ERROR;
}
ロード関数にCGraphicのthisを渡さなくちゃならないところが、
すごくダサい気がします。しかも、ロード関数が増えるたびに
CGraphic::Loadも書き直してるから動的な増減は達成できてないし。
「CGraphicクラス自体は変更しない」「CGraphicのthisはどこにも
渡さない」と言う条件で、ロード関数を自由に増やすための手段は
ないものでしょうか?(Strategyパターンでなんかいけそうな
気がしたんですけど、結局thisを渡す以外は思い付かなかった…)
0389デフォルトの名無しさん
NGNGstruct GraphicLoader
{
virtual bool LoagGraphic(const string& FileName, GraphicBuf& buf) = 0;
};
みたいなインターフェースを用意してやって、
1. GraphicLoader を継承した JpegLoader, BitmapLoader, etc.. を用意する
2. CGraphic を構築
3. 1 で作ったクラスをインスタンス化して CGraphic に登録
4. CGraphic::Load は、登録された GraphicLoader を順次実行するだけ
とでもしておけば。これなら Loader 部分だけ DLL に切り出すとかも可能になるし。
0390387
NGNGStrategyパターンとIteratorパターンを合わせたやり方ですよね。
俺もそこまでは考え付いたんですよ。けど、それだと「thisを渡す」という
記述をしているのと、変わらないんですよね。
何が言いたいのかって言うと、ロード関数がf(A,B)になるのを避けたいのです。
f(A,B)じゃなくて、A.f(B)にしたいな〜、と。
0391387
NGNGhttp://www1.odn.ne.jp/synsyr/prog_cpp0.html
に、いい方法が載ってました。
CGpraphicから派生したクラスにロード関数を作らせて、
CGpraphicのstaticな登録リストに、そのロード関数ポインタを
登録する。CGpraphicのLoadは、
for(list<LOADFUNC>::iterator p=s_Func.begin();
p != s_Func.end();++p){
if((this->*p)(FileName) != ERROR) return OK;
}
って感じで、登録されたロード関数を順次使っていく。
こうすれば、「CGraphicを変更しない」「CGraphicのthisをどこにも渡さない」
「ロード関数を動的に増減可能」を達成できます。
0392デフォルトの名無しさん
NGNGヒントだけでもいいです。
お願いします。
0393デフォルトの名無しさん
NGNGA,B,Cの行列が与えられていて、2A-3B+Cを計算するプログラムをつくれっていう問題なんですが。
サッパリわかりません。
どなたか教えてください。
0394デフォルトの名無しさん
NGNG>CGraphicのthisをどこにも渡さない
そっか、よかったね。
0395デフォルトの名無しさん
NGNG> pop()はスタックトップをもらえないの?
例外安全って勉強しろよ。Exceptional C++でな。
>>360は、int pop();をスタックトップのデータ返すと勘違いしたな。
(まあ、今時アンダーフロー例外投げるだろうから無理もないが)
0396デフォルトの名無しさん
NGNG>>366がどこまで考えてるかわからんが、俺はそもそもpop()って名前使うなって気がする。
>スタックトップのデータ返すと勘違いしたな。
な勘違いもわからないでもない。
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNG> 俺はそもそもpop()って名前使うなって気がする。
つーか、例外安全を勉強しろって。
STLがなんでvoid pop(void);なのかさ。
0399デフォルトの名無しさん
NGNGスタックポインタずらすのとスタックトップを返すのを両方やると例外セーフを保証できないのは知ってるよ。
pop()がスタックトップをくれないならtop()とremoveTop()とかにすればええやんって話だ。
0400デフォルトの名無しさん
NGNG0401デフォルトの名無しさん
NGNGそのとおり。
> つーか「勉強しろ」だけ言ってないで、さわりだけでも説明すればいいのに…
じゃあ、俺が責任を持って。
T pop();
と pop() で値を返すと、T の型によっては「コピーコンストラクタの実行に失敗」して、例外が飛んでくる
可能性がある。その場合に、
スタック内部のインデックス値は更新したのに
pop したインスタンスをどこでも受け取れない
ということで、例外安全じゃなくなるわけだ。Exceptional C++ とか GotW で検索すると詳しい記事が見つかる
と思われ。
0402デフォルトの名無しさん
NGNG次のような簡単プログラムなんですが、
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin, s);
cout << s << endl;
}
getlineで何か文字列を入力してエンターを1度押すと、それが出力されると
思うのですが、VC++ではエンターを2回押さなければ出力になりません。
BorlandC++では、1回で出力になります。
これだけはっきりしているとバグレポートでもあるかとも思うのですが、どうも
わかりません。VCとBCどちらが正しいのでしょうか?
それとも私が何か勘違いしてるでしょうか?
よろしくお願いいたします。
0403デフォルトの名無しさん
NGNGそんな議論は10年近く前に終って、void pop(void);になった。
0404デフォルトの名無しさん
NGNGほんとだ。どうなってんだ?
0405デフォルトの名無しさん
NGNG10年? まぁいい。
STLがvoid pop(void);を採用したことと、ワタシがスタックトップを返さないpop()がきらいなのは、どう関係が?
0406デフォルトの名無しさん
NGNGどうでもいい。もうその話題は終わってくれ。
0407デフォルトの名無しさん
NGNG0408デフォルトの名無しさん
NGNG(wpは変数)
どういう意味ですかね?
0409デフォルトの名無しさん
NGNGBoarland C++が正しいです。cygwin/g++でももちろん一回。
0410デフォルトの名無しさん
NGNG連結リストで検索
0411デフォルトの名無しさん
NGNG何が聞きたいの?
0412デフォルトの名無しさん
NGNGVC+STLPortでは1回。
VCのライブラリが腐ってるに100まんこ。
0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNGgoogle いけ
0415デフォルトの名無しさん
NGNG1回、調べたんですけど良くわかりません。教えてください。
0416デフォルトの名無しさん
NGNG連結リストで検索すると、詳しいサイトがいくつか出てくるだろ? それを見ても分からないなら、
ここで聞いても分かるとは思えないので、諦めてください。
0417デフォルトの名無しさん
NGNGどうりで、リンカエラーを連結エラーでいってる奴がいるわけだ
0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNG何でもかんでも例外安全がどうのと書かれてるとまた誤解を生むな。
再利用しないアプリケーションコードまでジェネリックにするこたあない。
ジェネリックにこだわるなら例外投げないオブジェクトの場合だけテンプレート
を特殊化したり特性ヒントを与えたりしてパフォーマンスを改善するとか
その辺まで言及しないと今時な感じがしない。
0421デフォルトの名無しさん
NGNGある関数の中で求めた値を
別のファイルの別の関数に渡すにはどうすればいいんでしょうか?
returnだと値は一つしか渡せないみたいだし、で息詰まっております。
0422デフォルトの名無しさん
NGNGスレ違い
C 言語スレで聞きましょう
(C++ だとデザインパターンが、とか言い出すぞ。俺が)
0423デフォルトの名無しさん
NGNG0424デフォルトの名無しさん
NGNG任せた
Modern C++ Design ネタっぽい気がするが。
0425弱気な名無しさん
NGNG関数にデータをやりとりするんじゃなくて
データをいじる関数を追加するんです。
…違うかも
0426デフォルトの名無しさん
NGNGTypeListがどうこう、って話だが。
0427デフォルトの名無しさん
NGNGおぃおぃ,たしかに TypeList には pair 使ってるけど
ここでは TypeList は関係無いのでは・・・
# pair は確かに「複数 return」には使えるけど
0428デフォルトの名無しさん
NGNGLoki::tuple< TYPELIST_4(int,long,double,float> > somefunc( );
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNG> 再利用しないアプリケーションコードまでジェネリックにするこたあない。
「ジェネリック」→「例外安全」という意味か? それなら、この後の文章は冗長では。
人には大げさだと言っておいて、自分はもっと過激な事を同じレスの中で言う。
知識ひけらかし君か?
0431デフォルトの名無しさん
NGNGんなわきゃない。
じぇねりっく、ってのは、型に対して汎用性がある、っちゅう意味さね。
誤解を恐れず云えば、templateつかう、ちゅうことさね。
0432デフォルトの名無しさん
NGNG今、俎上にあがってるのはスタックだから じぇねりっく にするのは妥当と思われ。
そういえば結局 >>371 は何だったんだろう。単なる勘違い?
(それならそうと書いて欲しかったけど。どうせ名無しさんなんだから、恥かくわけでもなし)
0433デフォルトの名無しさん
NGNG> 何が言いたいのかって言うと、ロード関数がf(A,B)になるのを避けたいのです。
> f(A,B)じゃなくて、A.f(B)にしたいな〜、と。
これって、何が嬉しいの?
個人的には CGraphic と個別の画像フォーマット対応ローダクラスの間に、継承という「むちゃくちゃ強力な」
関係を持ってしまうからイマイチなデザインという気がするんが、見落としてる利点があるなら教えて欲しい。
0434デフォルトの名無しさん
NGNGじゃあ、なんで「例外安全」から「ジェネリック」に話変わってるのだろう。
>>420の1行目から、2行目で。
0435371
NGNGヘッダに入れる理由が思いつかない。
でも、これが「なんの変哲も無い」っていわれたら、あとは、言うことないよ。
pop()については、STLがvoid pop()なの知らなかった。俺の感覚が古かったんだね。
こんなんで、いいですか?
っていうか、話があっち行っちゃったのに、なんでいまさら呼ばれるの?
0436デフォルトの名無しさん
NGNGスタックの話というか、わけのわかんないインライン関数のサンプルの
例で皆が混乱したのが発端?
>>434
そこで、>>401の説明が
>T pop();
> と pop() で値を返すと、T の型によっては「コピーコンストラクタの実行に失敗」して、例外
> が飛んでくる
> 可能性がある。その場合に、
という説明だったから、>>420のような話になったのでわ。
0437デフォルトの名無しさん
NGNGいや、その>>401の説明は、inlineには全く関係ないが、
>>366に対する、pop()が要素を返さない理由としては全く正しい。
0438421
NGNG構造体を使うことにしました。
早速試してるんですけど、なぜかエラーが・・・。
構造体の変数をreturnで返す関数の型はstructでいいんですよね?
struct関数のtypeに対してエラーが出てしまいます。
どうすればよいのでしょう?
0439デフォルトの名無しさん
NGNG0440デフォルトの名無しさん
NGNGhttp://www.geocities.co.jp/SiliconValley-Cupertino/7774/c/cpphtml/calculator_h.html
のは、確かにテンプレートではあるが、スタックの中身にせいぜい組み込み型か
そのバリエーションしか入れないっぽいので、わざわざ例外安全を持ち出して
くるまでもない気はする。脇が甘いと突っ込まれればそれまでなんだけどね(藁
0441デフォルトの名無しさん
NGNG大学の課題だとはいえ、計算の内容は高校2年レベルの算数だぜ。
たぶん高校の授業で代数学を選択しなかったから行列を難しいと
思うんだろうけど、いくらなんでも簡単すぎ。
「2a-3b+c」と「2d-3e+f」と…を計算するプログラム、なんて、
どこをどう悩めばいいんだろうか。
0442387
NGNG>> 何が言いたいのかって言うと、ロード関数がf(A,B)になるのを避けたいのです。
>> f(A,B)じゃなくて、A.f(B)にしたいな〜、と。
>これって、何が嬉しいの?
C++のオブジェクト志向らしい記述が出来るのが嬉しいのです。
>個人的には CGraphic と個別の画像フォーマット対応ローダクラスの間に、
>継承という「むちゃくちゃ強力な」関係を持ってしまうからイマイチなデザイン
>という気がするんが、見落としてる利点があるなら教えて欲しい。
見落としてる利点は特にないと思います。ただ、A.f(B)なのをf(A,B)にして
「継承ではない」としたところで、CGraphicと一緒に提供せざるを得ない以上、
CGraphicの構成要素であるのは同じですから。「強力な関係」であることに
変わりはありません(この根拠はExceptional C++の項目32)。つまり、
どちらにしても特に利点や欠点はありません。
ですから、後は記述スタイルの好みで、A.f(B)ができる方法を探してたのです。
0443デフォルトの名無しさん
NGNG意外にも誰もレスしてやらんので俺が・・・
ゲ製作技術板に逝け。
以上
0444デフォルトの名無しさん
NGNG俺なら
1. 画像データ格納用のバッファクラスを用意して、CGraphic に集約。それを Loader 側に提供する
2. 画像データ操作用の手続きをまとめた抽象クラスを用意し、CGraphic はそれを継承。Loader には
抽象クラスのインターフェースを提供する。
とするかなぁ。
> CGraphicの構成要素である
こうやって、CGraphic 自身とインターフェースを分離する。一例だけど。
0445Ruby厨な人(802)
NGNG0446デフォルトの名無しさん
NGNGでコンパイルして実行すると
VC: ABC4E6G\n
bcc: ABCDEFG4
g++: ABCDEFG\n
となりました。main()4行目のseekpの指定のやり方がいけないのでしょうか。
#include <iostream>
#include <strstream>
#include <Iomanip>
using namespace std;
int main(void)
{
char ch[130];
strstream cStrStrm (ch, 128, ios::out);
cStrStrm << "ABCDEFG" << endl << ends;
cStrStrm.seekp(-(128 - 7 + 2), ios::end);
cStrStrm << '6';
cStrStrm.seekp(-3, ios::cur);
cStrStrm << '4';
cout << ch;
return 0;
}
0447デフォルトの名無しさん
NGNGCGraphic に仕様変更が入った場合に、個別の画像対応の Loader をコンパイルしなおす必要があるかを
考えれば、どっちが良いかは言うまでもない。
そもそも >>391 の方法だと
派生クラスは Is-A 関係を満たしてるのか?
という疑問がある。this を渡さないで済むというのは、継承によって暗黙の this が一致しているからだし、
それが OO 的なコードってわけでもない。Exceptional C++ 持ってるみたいだから、項目 24 を読み返すと
得るものがあると思うよ。
0448デフォルトの名無しさん
NGNG実験したところ
mingw g++2.95.3-5の場合std::ios::endはstd::ios::curと同じ
bcc5.5.1の場合std::ios::endは終端文字のある場所からの移動
clの場合std::ios::endはstd::strstreamのコンストラクタの第2引数
みたいでした。
もうしかして同じコンパイラでもライブラリのバージョンが違うと
std::ios::endは違う結果になるのでしょうかね。
0449デフォルトの名無しさん
NGNG例えば
main(){
function1(a,b);
function2(b,c);
}
と
main(){
function1(a,b);
}
main(){
function2(b,c);
}
で変数Cの値の結果が違ってくるのはどういう理由なんでしょう?
a,b,cは整数型の二次元配列です。
デバッグすると後の方はきちんとbの値が渡されてるんですけど、
最初のはbがfunction2でおかしな値になってしまって渡されてるみたいなんです。
255が66になってたり。わけわかりません。
わかる方お願いします。
0450デフォルトの名無しさん
NGNGa,b,c の型を書いたほうがよいとオモワレ。
0451デフォルトの名無しさん
NGNG省略しすぎ、せめて各関数のプロトタイプと
呼び出し側の変数宣言&初期化くらい書けよ。
0452デフォルトの名無しさん
NGNG3ケタの数字をランダムに0.3秒間隔で10回表示させる
プログラムはどう記述したらよいでしょうか?
わかりやすく言うと次々と現れる3ケタの数字を記憶するゲームを
作りたいと思っています。
最後に答えを表示できれば完璧なのですが。
わかる方いらっしゃいましたら、ご教授よろしくお願いします。
0453デフォルトの名無しさん
NGNGプラットホーム依存。
Win32 なら SetTimer() とか見てみるといいと思われ。
0454387
NGNG>1. 画像データ格納用のバッファクラスを用意して、CGraphic に集約。それを Loader 側に提供する
>2. 画像データ操作用の手続きをまとめた抽象クラスを用意し、CGraphic はそれを継承。Loader には
> 抽象クラスのインターフェースを提供する。
じっくり、じっくり、じっくり考えました。
考えに考えて、結局、どこにも異議申立てできる部分がない、と言う結論に達しました。
1.で提案されたデザインにしようと思います。
>>447
言われたとおり、Exceptional C++ の項目24をじっくり読み返してみます。
あー、前回「オブジェクト志向」って書いちゃってる…。恥ずかスィ。
0455デフォルトの名無しさん
NGNG447は2.がいいって言ってるんじゃないの。その辺はどうなん?
0456デフォルトの名無しさん
NGNGVisual C++
C++
Bacic
などいろいろあり、どれがどう違うのかさっぱりわかりません。
プログラミングを勉強し始めるとしたら、どれから覚えていったほうが
よいのでしょうか?
0457デフォルトの名無しさん
NGNG0458デフォルトの名無しさん
NGNGVisual C++はC++の開発環境、というか商品名。
勉強ならとりあえずCが無難だろうが、スレ的にはC++勧めんと駄目かな。
というか激しくスレ違いだ。
0459デフォルトの名無しさん
NGNGVisualC++は、Microsoftが出してるC++っていうだけ。
どの言語から始めたほうがいいかは目的によって違う。
0461デフォルトの名無しさん
NGNGまず英語から覚えましょう。
0462デフォルトの名無しさん
NGNGGameProgrammingGemsの自動シングルトンユーティリティ
というところを読んだのですが…。
int offset=(int)(T*)1-(int)(Singleton<T>*)(T*)1;
ってところがよくわかりませんでした…。
Singletonクラスのthisから、
派生したTクラスのthisを求めてるみたいなんですが。
なぜキャストするだけでoffsetが出てくるのか…?
うーん。。いまいち良く分かってないんですけど、
良かったら教えてほしいです。。。
0463デフォルトの名無しさん
NGNG0464デフォルトの名無しさん
NGNGhttp://www.cs.utah.edu/~justino/cs3500/doxygen/Singleton_8h-source.html
で、class Sample , class test2, Singleton<Sample>とか適用するわけやな。
|test2 |
|singleton |
|sample |
メモリイメージはこんな感じか。sample, test2ではthisは
このメモリの先頭を指してるわけ(sampleはtest2、singleton
両方しっているから、問題にならない)。
test2*からsingleton*にキャストする場合、singletonはtest2
なんかしらへんから、この位置補正が当然あるわけや。
せやから、キャストでポインタがずれる。おわかりか?
0465デフォルトの名無しさん
NGNG細かいことだけど、 SampleとSingleton<Sample>のあいだに
test2が挟まってるから、そのぶんずれるってことだよね?
0466デフォルトの名無しさん
NGNGclass Sample : class test2, Singleton<Sample> {...};
の書き間違いで、その通り。
0467デフォルトの名無しさん
NGNGこれシングルトンになるの?
0468467
NGNG実行時にエラーになるのね。
0469469
NGNGtemplate <typename T = double>
class hogehoge
{
---
}
とクラステンプレートにデフォルトの型を定義していますが
このクラスのオブジェクトを作るときに
hogehoge<> hogeobj;
と "<>" をつけなくてはいけないのが非常に面倒です
デフォルトの型でいい場合には "<>" を省略できるように
する方法はないでしょうか?
0470469
NGNGhogehoge<> と同等の機能をもたせて
hoge2 hogeobj;
とすることはできませんでしょうか
0471デフォルトの名無しさん
NGNGってのは、ど?
0472デフォルトの名無しさん
NGNGじゃいかんのか。
0473デフォルトの名無しさん
NGNGでもええやん。
0474473
NGNG0475469
NGNGところでどれが一番よさそうですか^^;
0476デフォルトの名無しさん
NGNG0477デフォルトの名無しさん
NGNG漢はやっぱり C++ だろ!と思い立ち、今更ながらに C++ を勉強している者です。
で、ちょっと質問なのですが、いままで
「 共通のスーパークラスを継承しているクラスを多重継承すると、
オーバーライドしないメンバーは、どれが呼び出されるかわからない」
んだと思っていたのですが、これって継承の度合い
(っていうのかな? public 継承とか protected 継承とか)
を使えば実は済む話なのでしょうか?
Java厨でありC#厨でもある私は、
幼少の頃から、多重継承=悪 と教えられて育ったのですが
本当に必要な場合は多重継承もアリなのかなぁ…とか
微妙に思い始めています。どうなんでしょうか?
0478387
NGNG実は2.の設計はよくわからないのです。(^^;「Loader には抽象クラスのインターフェースを
提供する」って、どういうことなんでしょう? ローダークラスは、抽象クラスを
private継承するってことでしょうか?
>>444さん、よければ解説お願いします。
0479デフォルトの名無しさん
NGNG仮想継承つかえ
0480456
NGNGレスありがとうございます。
目的は画像処理などのソフトウェアを作りたいと考えています。
いろいろ種類があるみたいで、どれから手をつけてよいのか
わかりませんでした。兄が「Visual Studio 6」を持っているので
C++から始めてみようとも思っています。やはり参考書は必要でしょうか?
0481デフォルトの名無しさん
NGNGそのまえに、VisualStudio6のライセンスが必要でしょう。
つか、うそでも自分で買ったって家。
0482ぱふーん ◆BEVSNet2
NGNGメソッド名がかぶるような多重継承は悪というか
頭をかかえるだろうけど、どういう理由で悪とされているか
知っておくべきよ。単なる教条主義に陥るから。
多重継承を上手に活用しているクラスライブラリも
あるけど、それは少数派で、ほとんどは多重継承で
ふりまわされるから、悪としとけ、ってなってると思う
0483456
NGNG「ライセンス必要」というのはどういう意味でしょうか?
>つか、うそでも自分で買ったって家。
スミマセン。そういうものでしたか。
兄の物では駄目ということですね。
0484デフォルトの名無しさん
NGNG良いクラス名が思いつかなくて鬱なんだけど、たとえばこんな感じ。
struct IGraphicBuffer
{
virtual void WriteRawData(char *data, size_t size) = 0;
};
struct IGraphicLoader
{
virtual bool Load(IGraphicBuffer& obj, const string& file) = 0;
};
class CGraphic : public IGraphicBuffer
{
vector<IGraphicLoader*> m_pLoaders;
typedef vector<IGraphicLoader*> TLoaderIterator;
// こいつは public でも private でも、好きなように
void WriteRawData(char *data, size_t size);
public:
bool LoadGraphic(const string& file)
{
for (TLoaderIterator i = m_pLoaders.begin(); i != m_pLoaders.end(); ++i)
if (i->Load(*this, file))
return true;
return false;
}
};
class CBitmapLoader : public IGraphicLoader
{
bool Load(IGraphicBuffer& obj, const string& file);
};
Concrete Loader に対して CGraphicLoader 自身ではなく、CGraphicLoader の内で公開したいメソッド
だけまとめた IGraphicBuffer を渡しておくのがミソ。
IGraphicBuffer, IGraphicLoader はがっちり結びつくけど、実装である CGraphic, CBitmapLoader
の間は公開インターフェースを通してのみの緩い結びつきになる。こうしておけばインターフェース
を変えない限りは CGraphic, CBitmapLoader は独立に拡張できるのが利点。
事例
XXX という画像フォーマットでは、最終的に必要なデータのサイズがファイルを最後まで読んでみ
ないと分からない。でも、とりあえず読めた分から CGraphic のバッファに書き込んでしまいたい。
(たとえばブラウザの画像表示に使うとかの理由で)
そこで、CXXXLoader にはバッファサイズを最初に確定する IGraphicLoader ではなく、バッファに
追加書き込みが出来る IGraphicLoader2 という別のインターフェースを提供する必要がある
みたいな要求が出てきたときに、その IGraphicLoader2 を CGraphic に実装して CXXXLoader に公開
すれば、これまでの Loader には一切影響を与えずに済むでしょ。
0485デフォルトの名無しさん
NGNGfor(int t=s+1; t<5; t++){
if(test[t] > test[s]){
int tmp = test[t];
test[t] = test[s];
test[s] = tmp;
で、
for(int t=s+1; t<5; t++){
のt=s+1; の所をt=1;にするとなぜだめなのでしょうか?
0487デフォルトの名無しさん
NGNG0-sまでの要素は、すでにソート済みだから。
あと、t==sのときは、並べ替えの必要無いよね。
0488デフォルトの名無しさん
NGNG> 「 共通のスーパークラスを継承しているクラスを多重継承すると、
> オーバーライドしないメンバーは、どれが呼び出されるかわからない」
具体的にコード書いてくれると理解の助けになるんだけど。
class A{
public:
f():
};
class B:public A{};
class C:public A{};
class D:public B,public C{};
D d;
d.f();
こんな場合だとエラーです。
d.B::f(); とか書けば良かったかと思いまふ。
それか仮想継承するとか。
仮想継承しても
class A{
public:
virtual f():
};
class B:virtual public A{
public:
virtual f();
};
class C:virtual public A{
0public:
virtual f();
};
class D:public B,public C{};
これはエラーかと。Dの中で改めて f(); を定義すれば良し。
> 幼少の頃から、多重継承=悪 と教えられて育ったのですが
> 本当に必要な場合は多重継承もアリなのかなぁ…とか
本当に必要な場合はね。
0489462
NGNGええと、、継承関係のある型同士でのキャストでは、
そのずれを調節してくれる…ということであってますか?
あと、メモリ配置はインスタンス毎ですべて同じなのでしょうか?
コードでは、0x1にある仮想のオブジェクトからoffsetを求めていますよね。
offsetは一定じゃないとうまくいかないかと…。
0490デフォルトの名無しさん
NGNGうまく機能しないのでは、とかおもいませんかね?
0491デフォルトの名無しさん
NGNG多重継承じゃないと、ずれないけどね。
それから、0やNULLをキャストしてもだめだじょ。
0492デフォルトの名無しさん
NGNGfor(;;)とwhile(1)とwhile(true)のどれを使っていますか?
0493デフォルトの名無しさん
NGNGfor (;;)
他の形式だと
条件文が定数です
とか警告出るのが鬱陶しいから。
0494デフォルトの名無しさん
NGNGどんなコンパイラ使ってんのよ?
うちでは最大レベルの警告でも出ないよ
0495デフォルトの名無しさん
NGNGwhileだといちいちチェックする可能性があるから。
0496デフォルトの名無しさん
NGNGつか、定数との比較がパイプライン乱すようなコード吐くコンパイラつかうな。
おれは自分一人で書いてるならwhile(1)、同じプロジェクトにfor(;;)使う人がいればfor(;;)を使う。
0497デフォルトの名無しさん
NGNG0498デフォルトの名無しさん
NGNGあるのか分かりません。
必要なものですかね?
どなたか、どんな時に必要なのか教えてくださいませんか?
0499デフォルトの名無しさん
NGNGコピーコンストラクタを private で宣言してみ。どこで使われてるか分かるから。
0500デフォルトの名無しさん
NGNG一例、コンストラクタでリソースを確保しデストラクタで解放するようなクラス。
コピーコンストラクタが無いと単純なビットコピーとなり、デストラクタで二重解放が起きる。
つーか、本読め。
0501デフォルトの名無しさん
NGNGGiko b = a; <-コピーコンストラクタ
b = a; <-代入演算子
0502デフォルトの名無しさん
NGNGGiko b(a); <-コピーコンストラクタ
Giko b[3]={
Giko(1),
Giko(2),
Giko(3),
} <-デフォルトコンストラクタ
0503デフォルトの名無しさん
NGNGどうせなら return とか throw の例も書いたほうが。
0504デフォルトの名無しさん
NGNGあるクラス Base を継承した Sub クラスを作りました。
また別に、同じく Base を継承した SubKitajima クラスを作りました。
プログラム中で
Base へのポインタを宣言して、
状況によって Sub か SubKitajima のインスタンスを生成するように
しました。
で、このインスタンスを削除しようとしたのですが…。
delete した時に呼び出されるのは Base のデストラクタだけでした。
この場合、Base へのポインタを通して、正しく Sub か SubKitajima の
デストラクタを呼び出すにはどうしたらいいのでしょうか?
よろしくお願いします。
0505デフォルトの名無しさん
NGNGデストラクタを仮想関数にする。
>>495
可能性はあるだろうが・・・しないだろうな、普通は。
>>493
同意。
>>489
ええと、488の例でCのメソッドを呼ぶときは、必要に応じてアドレスをずらしたthisを渡すはずです。
仮想継承の場合は良く知らんのでパス。
0507506
NGNGひとつちょっと疑問が…。
デストラクタは純粋仮想関数にできないのでしょうか?コンパイルは通ったのですが、リンカが「外部シンボルが見つからない」と
言ってくるのですが。
0508デフォルトの名無しさん
NGNG基底クラスのデストラクタはきちんと実行される必要があるので純粋仮想関数にはできないよ。
0509387
NGNGうーん。そういう実装なんでしたら、やっぱり1.の方がいいようです。
俺が考えた1.の設計の具体案はこうです。
// IGraphicBuffer.h
class IGraphicBuffer
{
// グラフィックバッファ(実装は省略)
}
// CBitmapLoader.h
class IGraphicBuffer;// 前方宣言
class CBitmapLoader
{
public:
static bool Load(IGraphicBuffer&,const string&);
}
// CGraphic.h
class IGraphicBuffer;// 前方宣言
typedef bool (*LOADFUNC)(IGraphicBuffer&,const string&);
class CGraphic
{
public:
CGraphic();
static vector<LOADFUNC> m_pLoaders;
bool Load(cosnt string&);
private:
auto_ptr<IGraphicBuffer> m_pBuffer;// バッファ本体
}
// CGraphic.cpp
#include "IGraphicBuffer.h"
CGraphic::CGraphic :
m_pBuffer(new IGraphicBuffer)
{
}
bool CGraphic::Load(cosnt string&)
{
for (vector<LOADFUNC>::iterator i = m_pLoaders.begin(); i != m_pLoaders.end(); ++i)
if ((*i)(*m_pBuffer,file))
return true;
return false;
}
関数ポインタの取り扱いだけはちょっと不安がありますが。その問題点を除けば、
仮想関数も継承も不要で、クラス依存性は極めて小さくなります。
特に、メインルーチンで動的にローダー登録を行うところでは、
CGraphic.hとCBitmapLoader.hをincludeして、
CGraphic::m_pLoaders.push_back(CBitmapLoader::Load);
と書くことになりますが、この書き方だと、IGraphicBufferを変更しても、
このメインルーチンをコンパイルし直さなくてもすみます(よね?)。
と、ここまで依存性を減らせるとわかったから、さすがに「thisを渡さないで」
などとワガママいってる場合じゃないなと思って、1.の設計でいこう、と
決めました。これ以上の設計って、なにかあります?
ところで、>>478ではtypedefをクラス内で行ってますけど、
そう記述すると、そのtypedefはクラス内だけで有効なんですかね?
0510デフォルトの名無しさん
NGNGできませんよ。ていうか、そうする必然性ってあるの?
0511デフォルトの名無しさん
NGNGSTLを使うと、MSVCP60.DLL が必要なんですか?
自分の開発マシンでは当然Systemフォルダに入ってるんですが、
入ってない人もいた。
XpとかMeあたりだと初期状態であるんですかね?
0512デフォルトの名無しさん
NGNGテンプレートクラスのメンバ関数ポインタを保持することは可能でしょうか?
「オブジェクトに付随した形式のメンバー関数のポインタを取り出そうとしている」と
エラーが出たのですが、回避する方法は無いものかと。
0513日下部圭子 ◆ib749tYo
NGNG> >デストラクタは純粋仮想関数にできないのでしょうか?
> できませんよ。
VC++6では、デストラクタも純粋仮想関数にできるようです。
これはVC++6の仕様がおかしいのでしょうか?
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
0514デフォルトの名無しさん
NGNGランタイムライブラリをスタティックリンクにすれば
MSVC*.DLLは不要です。
ただしヒープが共有できないので、DLL/EXE間でSTL
オブジェクトの受け渡しは事実上不可能になります。
単体のEXEなら問題ない。
0515511
NGNGということはコード生成で、使用するランタイムライブラリが
マルチスレッド(DLL)だと駄目ってこと?
0516ぱふーん ◆BEVSNet2
NGNG「C++ FAQ」のFAQ21.13を参照すべし
class Base {
public:
virtual ~Base() throw() = 0;
}
inline Base::~Base() throw() { }
とinlineの併用でできるらしい。
なんや、ようわからんけど
0517デフォルトの名無しさん
NGNGマルチスレッドか否かは関係ないです。
/MD ならMSVC*.DLLが必要
/MT や /ML なら不要
ということ。
0518462
NGNGもう少し考えてみます。。
0519デフォルトの名無しさん
NGNG抽象クラスを作りたいんだが、どうしても純粋仮想関数にするメソッドが見当たらない場合に
使うことはある。
0520デフォルトの名無しさん
NGNGその設計だと CBitmapLoader::Load は static メソッドになるの?
0521387
NGNGそうです。CBitmapLoader::Load は、ファイルネームを受け取って、
IGraphicBufferのオブジェクトに適切なデータを格納するだけですから。
端的に言うと、strcpy(Dest,Src)みたいな機能ですので、staticです。
0522デフォルトの名無しさん
NGNGそこで設計のトレードオフが発生してるわけだ。
ローダに柔軟性を求めないなら、それで良いんじゃない。
0523C++消防
NGNGtemplate <typename T1>
class hoge
{
---
hoge<T1> &operator *= (???);
}
emplate <typename T1, typename T2>
hoge<T1> &hoge<T1>::operator *= (T2 &hogehoge) // 行列×=複素数
{
---
}
用はオーバーロード*=の引数に別のテンプレートを使いたいのですが
この場合???のところ(というかテンプレートクラス全体)を
どのように書けば実装できますか?
あるいは不可能なのでしょうか...
0524C++消防
NGNG鬱山車嚢
0525C++消防
NGNG用→要
UTUDASINOU
0526デフォルトの名無しさん
NGNGtemplate <typename T1>
class hoge
{
---
template<typename T2>
hoge<T1> &operator *= (T2 &rhs)
{
....
}
};
ではあきまへんか?
0527387
NGNG関しては>>484も>>521も同じではないんですか? トレードオフには
なってないと思いますけど…。
0529デフォルトの名無しさん
NGNGインスタンスがとれないなら、Cの関数と変わらない、つーか。
0530デフォルトの名無しさん
NGNGまぁ設計は
こちらをたてれば
あちらがただず
で、何を重視するかで選択が違ってくる。後々を考えると >>484 と >>521 には差が出てくる場合がある
けど、それが重要ではない(少なくとも現時点で利用法を考えたときに差が見えない)なら、キミの用途
にとっては、どちらも OK ってことだと思うよ。
いずれにせよ、事前の設計で 100% 完全なものを見通すのは難しいから、そろそろ実装に移って良いと
思うよ。設計ミスが判明したら、その時点で何が悪かったのか良く考えて設計しなおし、ってことを何度
かやる内に身体にバランス感覚が染み付く。
0531387
NGNGそうはいっても、>>484のロード関数だって、機能的には
static同然ですよ。やってる内容はstrcpy(Dest,Src)です。
ただ、仮想関数のオーバーライドだからstatic宣言できないだけで。
むしろ、実体のないインスタンスを生成する無駄があるのでは…?
あれ、いや、俺、なんか勘違いしてますかね?
0532デフォルトの名無しさん
NGNG>static同然ですよ。やってる内容はstrcpy(Dest,Src)です。
だからといってクラスメソッドにすると、ロードオブジェクトとして、
何か変数/状態を持ちたい、とかに対応でなくなるだろう。
そこがトレードオフなわけよ。
530が言ってるとおり、その「ロード関数」がstrcpy(Dest,Src)同然
の事しかしないから、387はそれが有利なトレードと判断したんだろう?
0533387
NGNGな・る・ほ・ど〜。ものすごく納得できました。ありがとうございます。
とりあえず、>>530さんの忠告どおり、そろそろ実装に入ります。
>>387から、長長とお付き合いありがとうございました。
お礼と言っては何ですが、マ版のオナペットスレに、俺のお気に入りの
高画質フリーアダルトムービーのアドレスを書いておきますね。
0534デフォルトの名無しさん
NGNG> お礼と言っては何ですが
個人的にはその手の画像より、ソースコードの方が萌えます(ぉ
0535デフォルトの名無しさん
NGNG> >>516
> 抽象クラスを作りたいんだが、どうしても純粋仮想関数にするメソッドが見当たらない場合に
> 使うことはある。
純粋仮想関数にする面罵関数は無いけど抽象クラスである必要があるケースってどんなでしょう?
単純に興味本位の質問です。
基底クラスの実体を作らせたくなかったら構築子を protected にすればすむし…
基底クラスのポインタで一元管理し、必要に応じて dynamic_cast したい?
0536デフォルトの名無しさん
NGNG> > >デストラクタは純粋仮想関数にできないのでしょうか?
> > できませんよ。
>
> VC++6では、デストラクタも純粋仮想関数にできるようです。
> これはVC++6の仕様がおかしいのでしょうか?
おかしいのは“あんたの”VC++6か、あんたの文章読解能力だろ(w
デストラクタが純粋仮想関数のクラスも定義はできる。
それを継承したクラスの実体を生成しようとすると、
リンクエラーとなる、って話を507はしてんだろ?
…513のHNを見ると、刺々しいレスを付けたくなるよう(笑
0537デフォルトの名無しさん
NGNG仮想関数はあるが、純粋仮想関数にするものが無い場合と思われ。
0538デフォルトの名無しさん
NGNG0539デフォルトの名無しさん
NGNGそれは“抽象クラスを作りたい”理由にはならないのでは?
0540デフォルトの名無しさん
NGNG> するメソッドが見当たらない場合に使うことはある。
邪悪な設計ですね。
05421
NGNGようやくMore Exceptional C++を読み始めたわけなのですが
例の、Effective STLでは保証されていると断言されているのに
標準には見あたらないvectorのメモリレイアウトのことですが
This was fixed in 2001 as part of Technical Corrigendum #1
to the C++ standard.だそうです。よかったね。
Schemeに夢中なのでレビューは一ヶ月後かも。
0543507
NGNGみなさんありがとうございます。
実は Java のコードを C++ に移植していた所で、
Java の interface にあたるクラスを作ろうとしていた所でした。
というわけで、ベースクラスのデストラクタで、特に処理する事は
なかったのです。
こういう場合は、デストラクタが必要なサブクラスの為に
空っぽの仮想デストラクタを定義するといいみたいですね。
みなさんありがとうございました。
0544デフォルトの名無しさん
NGNG純粋仮想として宣言できますが、しかし実装も書かないとダメです。
0545デフォルトの名無しさん
NGNG実装があったら純粋仮想関数ではなく仮想関数
0546デフォルトの名無しさん
NGNG0547デフォルトの名無しさん
NGNG試して理解しました
知らんかったのよ
純粋仮想関数として定義しつつ実装もするって手法
許して
0548デフォルト
NGNGダイアログボックスベースのプログラムで
自分で作ったほかのクラスから
一番上のウインドウハンドル
m_hWndを得るにはどうしたら良いでしょう?
CxxDlg::GetSafeHandle
したり
CxxDlg::m_hWnd
したり
よくわからないままいろいろしてるのですが、どれもうまくいきません。
初心者カキコです。すまんです。
0549デフォルトの名無しさん
NGNGすれ違い。こっちで聞いて。
■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/test/read.cgi/tech/1008031675/
0550デフォルト
NGNGすみません。そっちにいきます
0551C++消防
NGNGva_arg を使うためには予め型を知っている必要がありますよね.
"%d %f" のような型情報を一緒に送れば確かにできますが
これ無しで組むことは可能でしょうか?
typeidを使ってごちゃごちゃやってみたんですが
なかなかうまくいきません...鬱鬱
0552デフォルトの名無しさん
NGNGまず,本当にそういう関数が必要なのか自分自身に問い詰めろ
小一時間問い詰めろ
話はそれからだ
0553C++消防
NGNGその要素をファイル出力する場合に
要素1[1] 要素2[1] 要素3[1] ...
要素1[2] 要素2[2] 要素3[2] ...
要素1[3] 要素2[3] 要素3[3] ...
と表示したいのですが,出力したい要素の並び,内容が
頻繁に変わるので,一々型を指定しなくてもよくなれば
楽になるかと思ったのですが...
0554デフォルトの名無しさん
NGNG0555デフォルトの名無しさん
NGNGとかすればいいのではないのか?
0556C++消防
NGNGなるほど,そんな手がありますか
>>555
fileout("ファイル名", vector<T1> a, vector<T2> b ...);
(T1, T2, T3は型が違う)
と書けば
a[1] b[1]...
a[2] b[2]...
.
.
.
の内容のファイルが自動的に生成されるような関数を作りたいのです.
0557デフォルトの名無しさん
NGNGその前に設計を考え直した方がいいと思う。
0558デフォルトの名無しさん
NGNGclass fileout{
fileout(const string &filename)
operator ()( T hoge )
}
for_each( a.begin(), a.end(), fileout( "filename" ) )
for_each( b.begin(), b.end(), fileout( "filename" ) )
みたいにしないわけ?
0559デフォルトの名無しさん
NGNG0561デフォルトの名無しさん
NGNG0562デフォルトの名無しさん
NGNGだったら「列」で並ぶような配置の vector を持てば良いでは無いか.
0563C++消防
NGNG確かに.
>>562
いえ,vector自体には列も行もなくって次元の情報しかありません.
問題はファイル出力のときに
a[1] b[1]...
a[2] b[2]...
...
となるか
a[1] a[2]...
b[1] b[2]...
...
となるかです.
0564デフォルトの名無しさん
NGNGんあ?
> vector自体には列も行もなくって
で,
> 同じ型の要素が「行」で並ぶ
んなら,列で並べるのに何の苦があるんだ?
行と列の区別無いんだろ?
インデックス値をちょっとイヂるだけじゃねーのか?
ちょっとデータ構造をきちんと書いた方がいいと思われ
0565デフォルトの名無しさん
NGNG{
print_dat( fp,a[i] );
print_dat( fp,b[i] );
print_dat( fp,c[i] );
...
}
と並べていくのは嫌だ、という話か?
0566C++消防
NGNG>>565
だと
a[1] a[2]...
b[1] b[2]...
...
となってしまいますよね?
a[1] b[1]...
a[2] b[2]...
...
のように表示したいのですが.
0567デフォルトの名無しさん
NGNGprint_datは一回に一つしか表示しない。
print_dat(fp,z[i]);のあとに、
print_dat(fp,"\n");でも入れれば判るか?
0568デフォルトの名無しさん
NGNG0569568
NGNG0570デフォルトの名無しさん
NGNG>>565 だと、
a[1] b[1]...
a[2] b[2]...
...
になると思われ。
でもさ、要するに、
a は A 型、 b は B 型、 c は C 型のベクターだとするわな。
そうすると、
a[1] b[1]...
a[2] b[2]...
...
っていう風に並べたいときって普通は、
struct Tuple
{
A a; B b; C c;
};
ostream& operator<< (ostream& os, Tuple tupple)
{
os << tupple.a << " " << tupple.b << " " << tupple.c;
return os;
}
って構造体作って、Tuple 型のベクター使わんか?
0571C++消防
NGNG御手数おかけします.
おそらく言わんとしていることがわかりました.
要は,行が変わる度にファイルポインタを行の最後に
持って来ればいいんですね?
要素が変わった場合はまたポインタを一番前に戻すと.
確かに行の最後の位置をインデックス配列に保存すれば
ポインタをいじる方がよっぽど簡単ですね.
0572C++消防
NGNGファイルアウトしたい要素が頻繁に変わるので
(又,後々何度も使いそうなので)
struct Tuple を書き直すよりも引数で指定できれば楽かなと思いました.
(また見当違いなことを言っているかもしれないです)
0573デフォルトの名無しさん
NGNG0574デフォルトの名無しさん
NGNGfor( int i=0; i<N; i++ )
{
std::cout
<< a[i] << ", "
<< b[i] << ", "
<< c[i] << "\n";
}
ああ、今回はデリミタはなしだが
0575C++消防
NGNGFileout関数を一つのソースの中で複数の場所から呼んでいます.
しかも型情報も引数の数もNの値も違います.となるとファイル出力の度に
for(...) {
...
}
を書く必要がありますよね.そこを簡単に
Fileout("ファイル名", vector<T1> v1,vector<T2> v2..);
とすればNの値を N = v1.GetDimension() で取得して
書き出すようにしたかったんです.
0576デフォルトの名無しさん
NGNGFileout( const char *s, T& t, U &u, V &v, W &w, X &x, Y &y, Z&z )
{
}
でもツカットケ。
0577デフォルトの名無しさん
NGNGclass EmptyClass {};
template< class T, class U=EmptyClass , class V=EmptyClass, class W=EmptyClass,class X=EmptyClass,class Y=EmptyClass,class Z=EmptyClass >
class Fileout{
public:
Fileout(const char *s){}
operator ()( T* t, U *u = NULL, V *v = NULL, W *w = NULL, X *x = NULL, Y *y= NULL, Z *z = NULL)
{ int N = t->dimension(); for(...) }
};
int main()
{
int a, b ,c;
Fileout<int,int,int> fo( "tmp" );
fo( &a, &b, &c );
}
こんなところでどうよ?
0578C++消防
NGNG引数はせいぜい4〜5個なので十分間に合います.
0579デフォルトの名無しさん
NGNG0580デフォルトの名無しさん
NGNG下のプログラムで(*2)のようにインスタンスを生成しようとすると
VC++6ではコンパイル時にエラーが出ます。(*1)がなければ大丈夫です。
この例自体にはあんまり意味はないんですが少し気になったので・・・。
どなたか理由判りませんか?
class Foo {
public:
template<typename T> class HogeBase; // (*1)これがあると駄目らしい
template<typename T> class HogeBase {}
typedef HogeBase<int> Hoge;
};
int main()
{
Foo::Hoge hoge; // (*2)
return 0;
}
--
http://pc.2ch.net/test/read.cgi/tech/1010673275/412-
0581デフォルトの名無しさん
NGNGそりゃ、VC++の template の実装があまいから。
メンバテンプレートの使えないし。
0582511
NGNGMSVCP60.DLLを自分のアプリと一緒に配布してもOK?
インストーラは使わないで、ZIPで配布です。
0583デフォルトの名無しさん
NGNGredist.txt
0584デフォルトの名無しさん
NGNG部分特別化の違いがよくわかんないです。
どこがどのように違うのでしょうか?
0585デフォルトの名無しさん
NGNGぐらい巨大なものをソートするには、どんなアルゴリズムを使えばいいのでしょうか。
データにランダムアクセスできないのでほとんどのソートアルゴリズムは使えませんよね。
0586デフォルトの名無しさん
NGNGなんだかアルゴリズムの教科書に出てきそうな問いだな。
マージソートでいいんじゃないの?
0587デフォルトの名無しさん
NGNGマージソート
たしか 4.4BSD 系の sort って、必要に応じてテンポラリファイルを作ってマージソート
してたような気がする。
0589デフォルトの名無しさん
NGNG勉強がてらに API だけでお手製クラスライブラリを作ろうと思っています。
で、しょっぱなでいきなりつまづいています。
「Windowsクラス」というのを作って、メッセージの処理をこちらで
やろうと思ったのですが、ウィンドウプロシージャで、どの「Windowクラス」に
メッセージがきた事を伝えればいいのかわかりません。
メッセージループの処理をしているクラスに hWnd の管理テーブルを作って
それで判断するしかないでしょうか?
0590デフォルトの名無しさん
NGNGそれを自分で考えるのが勉強ではないの。ATLのソースでも読めば?
0591589
NGNGとりあえず自己解決です。ありがとうございました。
0592590
NGNG0594デフォルトの名無しさん
NGNGいや、そこは ATL で良い。興味があるなら CWindowImpl あたりから読み進めましょう。
0595デフォルトの名無しさん
NGNGなんらかの形でテンプレート引数が残っているのが
partial specialization ってだけじゃないの?
テンプレート引数が空になったのが完全な (明示的な?)
specialization
0596デフォルトの名無しさん
NGNG{
vector<elemtype>::iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}
このようにvectorクラスをパラメータに渡す関数を作りたいのですが、
vectorの中身がどのような型か分かっていないとパラメータとしては
渡せないのでしょうか?
今の状態だとエラーが沢山でて何のことか分かりません。
0597デフォルトの名無しさん
NGNGvoid printfunc(T &vec, string str)
{
T::iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}
0598デフォルトの名無しさん
NGNG#include <iostream>
#include <vector>
#include <string>
using namespace std;
template<typename T>
void printfunc(const vector<T> &vec, const string &str)
{
vector<T>::const_iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}
main()
{
vector<int> A;
A.push_back(17);
A.push_back(18);
printfunc(A, "test:\n");
}
0599デフォルトの名無しさん
NGNGめちゃんこありがとうございます。
関数、またはクラスをテンプレートにするんですね。
なんか使い方が少し分かってきました。
見習ってよく勉強したいとおもいます。
ありがとうございました。
0600デフォルトの名無しさん
NGNGT::iterator it = vec.begin(), end_it = vec.end();
を
typename T::iterator it = vec.begin(), end_it = vec.end();
って書かないとだめなんだけど、誰か解説プリーズ
0601巨額詐欺
NGNG巨額詐欺の疑いのある、グローバリーについて
掲示板を拝見されてるの皆様、新年あけましておめでとうございます。
掲示板の趣旨とは直接関係ない話で申し訳ないのですが、この世の中では許せない事があります。
http://www.max.hi-ho.ne.jp/sakimono/index.htm
この会社はありもしない儲け話をでっち上げ、巧みに客の財産を聞き出し、全財産を巻き上げます。
2002年になりましたが、一向に改善する気配すらなく、悪質化は進む一方です。
この会社の営業は世間の皆様の迷惑になっています。
それだけではなく、人を騙して破産に追い込み、騙された人が仕方なくグローバリー社員を
殺人する事件も実際に発生し、新聞ザタになっています。
http://www.mainichi.co.jp/news/selection/archive/200001/24/0124e038-400.html
みなさんもこちらの掲示板に投稿し、悪徳会社に騙される不幸な人が増えないようご協力お願いしま
す。
http://messages.yahoo.co.jp/bbs?action=q&board=8745
また、この書き込みを見て賛同頂ける方はこの内容をコピーしていろんな掲示板に書き込みをお願いします。
0602デフォルトの名無しさん
NGNGそりゃ、例えば、↓みたいに iterator が型でない可能性があるから。
型であるということを明示しないと駄目。
class Type
{
public
int iterator; // iterator が型じゃない
}
template< class T >
void printfunc(T &vec, string str)
{
T::iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}
int main()
{
Type t;
printfunc(t, "");
return 0;
}
0603596
NGNGtypename T::iterator it,end_it;
it = vec.begin();
end_it = vec.end();
このように2行に分けて書かないとエラーが出るのは仕様なんでしょうか?
0604596
NGNG関数テンプレートというのは皆さんあまり使わないのでしょうか?
クラスをテンプレート化するほうがスマートだと言う感じですか?
上のものは標準入出力を使った関数を少しだけ(デバッグ用に)
テンプレート化しただけですが、これにしてもスーパークラスに
おいて持ってしまえば、関数においてテンプレートにしておく
必要もないですよね?
C++が手続き指向のプログラミングも出来るというメリットの
ためにあるんですよね?
0605596
NGNG感動してる最中なもんで(^^;(早くJavaにもテンプレートを!)
0606デフォルトの名無しさん
NGNG<algorithm>
0607デフォルトの名無しさん
NGNGきみのやりたいことは、関数化しなくても、
std::cout << str;
std::copy( vec.begin(), vec.end(), std::ostream_iterator( std::cout, " \n") );
でやれたはず。
0608596
NGNGどうもです。
今C++Primerのサンプルコードのみで勉強していますw。
本を持っていないので推測だけで勉強してるのですが、
なかなか思うようには理解が進みません(あたりまえか!?)
今度C++Primerの訳書を買ってちゃんと勉強し直します。
>>606
container type
algorithm type
iterator type
この三つの組み合わせがどうもイメージ出来ないんですよね。難しいです。
>>607
これがSTLですか。
これはC++におけるCの標準関数みたいなものになるのでしょうか?
はやいとこC++覚えてServlet作りまくりの毎日から脱出したいです・・・
0609606
NGNG>これがSTLですか。
それは標準アルゴリズムでSTLじゃないよ
ていうか596のJava風引数渡しが、597の回答でさりげなく参照渡し
へ変更されているのにウケタ
0610596
NGNG今日はこんな夜中にいろいろとありがとうございました。
これ以上はチョット恥かしいのでもう書きませんw。
スレ汚して済みませんでした。
0611デフォルトの名無しさん
NGNG<algorithm> は、STL の一部だと思うが
0612596
NGNGtypename T::iterator it=vec.begin(),it_end=vec.end();
としたところ、g++の2.95.4、3.03ともにOK。
何か別のエラーと勘違いしていたようです。
ごめんなさい>g++
0613609
NGNGスマソその通り。
>これはC++におけるCの標準関数みたいなものになるのでしょうか?
に対してC++におけるCの標準関数はCスタイルアルゴリズムなんだ! とボケた方がよかった(w
>>612にならって、>>609書き込み前半は嘘でした。
ごめんなさい>596
0614596
NGNG0615デフォルトの名無しさん
NGNGDWORD *num = new DWORD[100];
として使ってるんですけどデータが1桁だったら勿体ないし
100を越える可能性もあるから問題がありますし、、
こういった場合スマートな方法は何ですか?
0616デフォルトの名無しさん
NGNGstd::vector
0617デフォルトの名無しさん
NGNGありがとうございます。
これは便利だからといって使いすぎると速度が
低下してしまうかな?
0618デフォルトの名無しさん
NGNGサイズ変更しまくらない限り心配無用だと思われ
# egcs とか古いコンパイラだと遅かったりもするけど
0619デフォルトの名無しさん
NGNG大量のデータを突っ込むことが事前にわかってるなら reserve() しとくと良いよ。
0620デフォルトの名無しさん
NGNGしかし >>615 の話なら 単に
入力処理では可能性のある最大桁を取っておいて、
入力処理の帰り値では そのサイズだけの領域を確保 それにコピー
という手法が適切だろう。
まあ、最近ならそういうのはデータベースアクセスに置き換えてしまうとか
0621デフォルトの名無しさん
NGNGnew 演算子でクラスの配列を割り当てるときは
コンストラクタに引数を渡す事はできないんですか?
0622デフォルトの名無しさん
NGNGとかじゃダメ?
0623デフォルトの名無しさん
NGNGそれだとコンパイルとおらんよ
0624デフォルトの名無しさん
NGNGg++だとこれでもOKみたいなんです。
勉強始めたバッカなので、
個別にコンストラクタへの
パラメータの設定する方法、
自分も知りたいです。
0625デフォルトの名無しさん
NGNGVC6だと
とおらんかった
0626デフォルトの名無しさん
NGNGいっこずつnewは
0627621
NGNG今は VC++6.0 でやってます。MSDNや入門書など
見てるのですがどうにもわからないです。
イメージとしてはまさしく >>622さんの書かれたような事を
したいんです。
0628デフォルトの名無しさん
NGNGどうしても delete Cls[] したいのであれば、初期化用の関数作るとか?
でもかえって手間になるので氏労徒にはお勧めできない。
0629621
NGNGはい、今までは 初期化用の関数作って間に合わせていました。
しかし、もしもインスタンス作成後に初期化関数を呼びだすのを忘れると
値の割り当てられていない変数への不正なアクセスを許してしまうのは
OOPL的にいかがなものか、と氏労徒なりに思ってしまって。
自分で使う分にはいいんですが。ドキュメントしっかり書いておけばいいと
いうことででしょうか。
でも >>626 さんのやり方が基本なんですね。やってみます。
ありがとうでした。
0630デフォルトの名無しさん
NGNG【C++ Network Programming Volume 1】
http://www.amazon.co.jp/exec/obidos/ASIN/0201604647/
0631デフォルトの名無しさん
NGNG読んでないけど目次見る限りACEの解説書だね。ACE使ってクロス
プラットフォーム開発って魅力的な気もするけど実際どの程度
使われてるんだろう。ちなみに俺は乗り気じゃありません。
0632デフォルトの名無しさん
NGNGそれかなりでかいライブラリだから気合入れて
調べないとわからなそう。おれも前から
試してみたいとは思ってたけど。。
http://www.cs.wustl.edu/~schmidt/ACE-overview.html
これだけの機能が必要になるケースじゃ
Javaでもつかった方がよさそうな感じかもね。
0633HWND
NGNG取得することは可能ですか?
0634デフォルトの名無しさん
NGNG16進数と10進数の違いは?
0635デフォルトの名無しさん
NGNGforとかで、if(Handoru==総当り)とかするしかないんじゃない?
0636デフォルトの名無しさん
NGNG文字列って、どういう表現を期待してるんだ? ハンドルの値を取得したいなら
DWORD あたりにキャストして sprintf() で拾えるだろうし、その HWND に関連
付けられたウィンドウのタイトルなら GetWindowText() だろう。
っつか HWND の話なら、ここではなく VC++ スレに行きましょう。
0637デフォルトの名無しさん
NGNGDWORD あたりにキャストして sprintf() では拾えない。
ハンドルを文字列で得るには総当りでしか無理だったはずです。
0638HWND
NGNG総当たりじゃ使いものになりません。要するに無理なんですね。
ありがとうございました。
0639デフォルトの名無しさん
NGNG0640デフォルトの名無しさん
NGNG0641デフォルトの名無しさん
NGNGていうかそれ以外ってなに?
0642デフォルトの名無しさん
NGNGおれは>>637の考えを聞きたい。
0643デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNG0645デフォルトの名無しさん
NGNG同意。総当たりって何を総当たり? 謎だ。
0646教えて君
NGNG項目1:TN-620
項目2:192
項目3:168
項目4:1
項目5:100
言ってる事から何をすんのかもサパーリです。教えてください
ってな質問はここでいいのだろうか
0647デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNGで、私たちは何をすればいいんでしょうか。
サパーリです。#宿題なら宿題スレに行ってね。
0649デフォルトの名無しさん
NGNGC++!
C++!
ミギャアアアアアアアアアア!!
0650デフォルトの名無しさん
NGNG二つのクラスがお互いを使っているとき、コンパイルできないのです。
-------- ファイル ClassA.h --------
#ifndef CLASSA_WAS_INCLUDED
#define CLASSA_WAS_INCLUDED
#include "ClassB.h"
class ClassA{
public:
ClassB* getClassB();
};
#endif
-------- ファイル ClassB.h --------
#ifndef CLASSB_WAS_INCLUDED
#define CLASSB_WAS_INCLUDED
#include "ClassA.h"
class ClassB{
public:
ClassA* getClassA();
};
#endif
こんな場合です。お互い相手の名前が出てきた所でコンパイルエラーです。
こういう時はどうしたらいいのでしょうか?
ちなみに使っているコンパイラは Borland C++ 5.5 です。
(が、できれば汎用的なお返事をいただけるとうれしいです。)
よろしくお願いいたします。
0651業
NGNGClassCでも作れよ(w
0652デフォルトの名無しさん
NGNG前方宣言
0653650
NGNGクラスにも前方参照って必要なんですね。
C を弄っていた頃はちゃんと(関数の宣言を)書いていたんですが、
最近すっかり Java に慣れてしまったもので忘れていました。
ありがとうございました。
参照
http://black.sakura.ne.jp/~third/cpp23.html
0654デフォルトの名無しさん
NGNGつまり、
std::string s("0123456789");
s.erase(1);
をstringstreamでやりたいのです。
0655デフォルトの名無しさん
NGNGはどうですか?効率は?
0656デフォルトの名無しさん
NGNGC++が楽しくなった瞬間だった(w
0657デフォルトの名無しさん
NGNG{
private:
static T s;
};
template<class T> T c<T>::s;
の最後の行ってなにをしてるのですか?
vc6の標準ライブラリの iosfwd の class fpos のところにあったのですが。
0658デフォルトの名無しさん
NGNG0659デフォルトの名無しさん
NGNGようやく一番下まで掘り進んだとおもったら
さらにその下に巨大な地下帝国があった。
0660デフォルトの名無しさん
NGNGstatic T s;
だけではダメナンデスカ?
0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNG{
//private:
public:
static T s;
};
//template<class T> T c<T>::s;
main() {
int i = c<int>::s;
char ch = c<char>::s
}
でコンパイルもリンクもできたのですが、なにかまずい状況が
あるのですか?
0663661
NGNGテンプレートで実体を持っていないので宣言がいるということでしょうかでは逝きます
0664662=663
NGNG0665デフォルトの名無しさん
NGNGsの値を表示できたか?
0666デフォルトの名無しさん
NGNGすまぬ
0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNG0670デフォルトの名無しさん
NGNG金ねーっつーの
0671デフォルトの名無しさん
NGNGメンバー関数として、「関数ポインタ」を返す関数ってどうやって定義したら
いいのでしょうか?
0672デフォルトの名無しさん
NGNG別の型にキャストしてから渡しちゃう
とか、
構造体に入れて渡しちゃう
とか。
0673デフォルトの名無しさん
NGNG(void(*)()) f();
};
こんな感じ?ちなみに「メンバー関数ポインタ」を返す関数のことなら
(void(A::*)()) f();
って感じ。
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGclass Class{
int a;
int b;
void A( int _a, int _b ){ a = _a; b = _b; B(); C()}
void B(){ if (a==b) ...; }
void C(){ ...; }
};
↑のa,bみたいな場合。
この例のようにメンバ変数にすると、その変数が有効じゃないときにアクセスしてしまう可能性がありますよね。
BやCの引数に渡してやればOKですけど、数が多くなると問題ですよね。
a,bを格納するインナークラスを作ってそれを引数にして渡してやれば数が多くても大丈夫ですが、
ある一定期間だけのためにクラスを新設するのはなんだかもったいない(謎)気がします。
インナークラスを作るのが一番スマートな気がしますが・・・皆さんはどうでしょう?
0676デフォルトの名無しさん
NGNG0677デフォルトの名無しさん
NGNG>その変数が有効じゃないときにアクセス
どういう意味? コンストラクタで初期化してないとか? それにしては
インナークラス云々がわかんないんだけど。
0678デフォルトの名無しさん
NGNGあるのか(w
まああんまり使わないなら比較的長い名前にしておけば?
0680675
NGNG> どういう意味? コンストラクタで初期化してないとか?
コンストラクトされた時点では値が不明なときです。
MFCのCDCなどのm_hDCのような物です(ただしもっと一時的です。Perlで言うlocalな変数です)。
m_hDCはどこから参照するかわかりませんからメンバ変数にしてありますが、それを使用するところでは必ずその値をチェックしなければいけません。
で、実際にはそういう変数がまとめて5個くらいあって、
それを使用する関数、というか使用してもよい関数が10個くらいです。
それらの関数すべてにその引数を渡すのは効率的じゃないです。
一つのクラス(構造体といったほうが伝わりやすい?)にまとめて、そのオブジェクトのアドレスを渡すようにするべきかな?
結局トレードオフの問題で、私が決めるべきことですが、皆さんはこういうときどうしているのでしょうか?
あるいはもっとスマートな方法があるのでしょうか。
> >変数が有効じゃないときにアクセスしてしまう可能性がありますよね。
> あるのか(w
一人で使う分にはないです。
0681デフォルトの名無しさん
NGNG>それを使用するところでは必ずその値をチェックしなければいけません。
ならその変数をメンバ変数に持つかその変数から継承したクラスを作って
そのクラスのオブジェクトにアクセスするときはそのクラスが公開してる
インターフェイスでアクセスするようにすれば。で、そのインターフェイ
スは内部で値のチェックをやってると。要するにラッパ。
つーか例をもっと詳しくしてくれ。
>MFCのCDCなどのm_hDCのような物です(ただしもっと一時的です。Perlで言うlocalな変数です)。
も意味不明だ。
0682675
NGNG特定の関数内からしかアクセスできない変数を考えています。
(↑=特定の関数どうしで変数を共有したい、とも言い換えられます。)
コンパイル時に、できればそれ以外の関数内でその変数を参照していたらはじきたいので、メンバ変数というのはちょっと使いたくありません。
> >MFCのCDCなどのm_hDCのような物です(ただしもっと一時的です。Perlで言うlocalな変数です)。
> も意味不明だ。
Perlのlocal変数はわれながらいいたとえだと思ったのに。(;´Д`)
ま、いいや、やっぱりインナークラス作ることにします。
もし私の説明が解読できてしかももっといい方法を知ってる人がいたらよろしくお願いします。
0683デフォルトの名無しさん
NGNG> Perlのlocal変数はわれながらいいたとえだと思ったのに。(;´Д`)
もしかして動的変数スコープを使いたいって話? それは C++ では無理だ。
知らない人のために補足しておくと、Perl5 はデフォルトで変数は全てグローバル、my
で宣言するとブロック内有効な静的スコープを持ち、local 宣言すると動的スコープを
持つようになります。(local 宣言したときに値を保存しておいて、スコープを抜けるときに
値を復元する)
0684デフォルトの名無しさん
NGNG> (↑=特定の関数どうしで変数を共有したい、とも言い換えられます。)
と
>ま、いいや、やっぱりインナークラス作ることにします。
の関係がよくわからんが、その変数を何かのクラスでくるんで、
関数を friend にしてやれば?
0685デフォルトの名無しさん
NGNG次のコードで、my と local の違いが分かるね。
$x = 1;
foo();
print $x,"\n";
sub foo() {
# my($x)
local($x);
$x = 2;
print $x,",";
bar();
}
sub bar() {
print $x,",";
}
結果は、local のときが 2,2,1 で、my のときが 2,1,1, になります。
0686681
NGNG>特定の関数内からしかアクセスできない変数を考えています。
>(↑=特定の関数どうしで変数を共有したい、とも言い換えられます。)
それを文字通りに「特定の関数内からしかアクセスできないメモリ =
クラスオブジェクトのprivate宣言されたメンバデータ」
って回答しかない。コンパイル時に弾くにはこれしかないね。
で、それをクラス間にまたがって行うには>>684の言うように
friendしかないと。
>Perlのlocal変数はわれながらいいたとえだと思ったのに。(;´Д`)
Perlのlocalがグローバルシンボルテーブルを一時的に上書きするのと
C++で「特定の関数で値を共有する」というのとでは意味も前提もまる
っきり違う。グローバルな特殊変数に基づいた振る舞いをするサブルー
チンの振る舞いを変更したいときにlocal宣言で特殊変数を一時上書きして
やったりするが、そういうシンボルベースの動的な振る舞いとMFCがラップ
したm_hDCのようなvolatile(システムによって非同期に変更される)な変数
の扱いとは全く別で、だから意味不明と書いた。
C++で同じシンボルで振る舞いを変更するには、参照の参照先を付け替える
かメソッドをオーバーライドするかしかない。
0687デフォルトの名無しさん
NGNG絶対買いだとは言えないかも。
例外についてはMoreなしの方で言い終わっていた的な。
文字列クラスの実装の話の方が多いし。
0688デフォルトの名無しさん
NGNGclass XXX{
public:
XXX():yyy(),zzz(){
return;
}
このような表記があるのですが、
これって何をしているのでしょうか?
自分の理解では親クラスのコンストラクタに
パラメータを渡していると思っていたのですが、
どうも違うみたいです。よく分かりません。
教えてください。
0689デフォルトの名無しさん
NGNGメンバ変数の初期化デス。
0690デフォルトの名無しさん
NGNGこういった書き方も出来るんですね。
初めて知りました。どうもです。
0691デフォルトの名無しさん
NGNG一つ思ったんですが、
どうしてこんな書き方が必要なんですか?
クラスのコンストラクタにおいて、
渡されたメンバ変数を使って初期化すれば
いいだけの話に思えるのですが。
もし問題となるケースがあるとするならば
コンストラクタの実行順序ですが、
これだけが上のような表記が必要な理由ですか?
0692デフォルトの名無しさん
NGNG○:渡されたパラメータを使ってメンバ変数を初期化
0693デフォルトの名無しさん
NGNGする場合の初期化
0694デフォルトの名無しさん
NGNG今見ているソースではconstでもリファレンスでも
ないのに先のような表記になってます。
これは勘違いということになるんでしょうかね?
private:
ZZZ zzz;
YYY yyy;
こんなかんじです。意味無しですか?
0695デフォルトの名無しさん
NGNG> コンストラクタの実行順序
これは初期化リストの書き方によらず、常にメンバ変数の定義順になる。
0696デフォルトの名無しさん
NGNG>>695
メンバの初期化の順序は処理系依存ではなく言語仕様なんですね。
よーく頭に叩き込んでおきます。
0697デフォルトの名無しさん
NGNGコンストラクタをポインタなどを介さずに直接呼び出すにはその記法が唯一な気がするのだが
たとえば
class hoge {
std::vector<int> vi;
public:
hoge(int n): vi(n) {}
//...
};
とか.
そうしないと
hoge(int n) { vi.resize(n); }
とかにするしかないような.
0698デフォルトの名無しさん
NGNGもう>>697さん大好き!惚れました!!(´ε`)チュッ
確かにそうですね。上のような感じだと、
パラメータを渡してメンバ変数を初期化するには
そのような書き方しかないですね。
resizeに相当するようなメソッドがないクラスは
その方法しかありません。勘違いしてました。
0699デフォルトの名無しさん
NGNGそもそも、デフォルトコンストラクタを持たないクラスの場合には、書かないと
コンパイル通らないしね。
0700デフォルトの名無しさん
NGNGもっとも,この場合には
hoge(int n) { vi = std::vector<int>(n); }
とできるけどね.
結局,初期化と代入とを区別するための記法だね.
0701デフォルトの名無しさん
NGNG0702デフォルトの名無しさん
NGNGこのように書くしかないと思う
0703675
NGNG使用する関数が継承等で増える可能性もあるのでfriend指定は出来ません。
関数をオーバーライドするときにクラスも新しく派生させればいいですけれど。
>>686
m_hDCとlocalが同じとは書いていません。
m_hDCの値はオブジェクトが作成されて破壊または分離されるまでの間でのみ有効ですよね。
(オブジェクトが生成される前に、生成に成功したかどうかをm_hDCの値から判断する処理をしても無意味です。)
有効範囲という意味で、m_hDCのような値が常に有効とは限らない変数。
しかしm_hDCほど寿命は長くなく、もっと一時的に、ある関数が呼ばれている間のみ、意味を持つ変数はみなさんどうするかなぁと。
Perlのlocal変数と同じようなことはメンバ変数を使った最初のやり方で出来ています。
しかしPerlのlocal変数同様特定の関数からのみ呼ばれることを期待して書いたとき、ほかの場所から呼ばれた場合に問題がでます。
で、それへの対応策が必要な変数をすべて引数へ渡すこと、さらにそれをクラスにまとめることです。
こうすればどこから呼ばれても、引数さえちゃんと渡されていれば問題なく動きます。
メンバ変数の無駄遣いもなくなりますが、クラスが1つ増えます。
0705にゃお
NGNGなどのハードウェア名情報はどのように取得すればよいのでしょうか?
レジストリエディタで検索してみると当然みつかりますが、環境によって場所が違うようです。
0707にゃお
NGNGごっ、ごめんなさい。どーもスレチガイだったようで・・・
Windowsプログラムの話題をやってるところに投稿するべきですね。
0708デフォルトの名無しさん
NGNGライブラリはg++3.03でリンクすることは
できないのでしょうか?
0709デフォルトの名無しさん
NGNGリストを選択した状態でエンターを押した時に
エディットボックスに、選択状態のリストの文字列を送ってやりたいのですが、
リストの項目番号を取得することもエンターを検出することも出来ません。
どうやったらいいのでしょうか?
0710デフォルトの名無しさん
NGNG処理系のスレへどうぞ
0711デフォルトの名無しさん
NGNG……ようやくあなたの言っている意味が分かった。しかし、
「書き方が悪すぎ」に、もう一票だな。
で、あらためて >>675 に戻るが、コンパイル時にチェックしたいなら、
引数で渡すしかない。実行時の assert によるチェックでよいなら、
変数をポインタにするという手はある。ふだんは NULL のままだけど、
関数 A() の中で有効なポインタを設定する。
それよりも設計を見直して、変数a, b と関数 B(), C() だけをまとめた
クラスを考えたほうがよいと思う。
0712デフォルトの名無しさん
NGNGstack overflowとか出るんですけど、どうしたらいいですか?
0713デフォルトの名無しさん
NGNG0714デフォルトの名無しさん
NGNGMFCでいうところのCObjectクラスってのがないよね。
あれって何でなの?
そういうものだって言われて終わりかな…。
0715デフォルトの名無しさん
NGNG0716デフォルトの名無しさん
NGNG0717デフォルトの名無しさん
NGNG> どうしたら節約できるんですか?
でかいauto変数を使わないようにする。
少しは自分で調べろよ。
0718デフォルトの名無しさん
NGNG「おいオメー さっきから うるせえぞ
『知りません』『知りません』ってよォーーーー
『知りません』・・・そんな言葉は使う必要がねーんだ
なぜなら オレやオレたちの仲間は その言葉を頭に浮かべた時には!
既にGoogleや書籍で調べがついちまって もうすでに『知っている』からだッ!
だから 使った事がねェーーーッ
『知っている』なら 使ってもいいッ!」
0719ithink
NGNG基底クラスがあるとすると例えば多重継承をどう処理する?などなど
0720デフォルトの名無しさん
NGNGそんなもん要らんから。
0721デフォルトの名無しさん
NGNGMFCがこまるから。
0722デフォルトの名無しさん
NGNG再帰で無限ループとかになってないか?
0723デフォルトの名無しさん
NGNGプログラミング言語C++に
void print(int);
void print(char);
があった場合、print('a');とするとprint(char)が
呼ばれるって書いてあるんですけど。
0724デフォルトの名無しさん
NGNGC だと int, C++ だと char
0725デフォルトの名無しさん
NGNGこういうときはリファレンスでわたす
とか決めてる?
0726デフォルトの名無しさん
NGNG場合によって相手を変える場合にはポインタ
初期設定したら二度と相手を変えない場合には参照
NULL がくる可能性があるならポインタ
NULL がきたらまずい場合は参照
もちろん
foo(int& n);
int *p = NULL;
foo(*p);
とか書けばコンパイラのエラーチェックに引っかからないが、そりゃ NULL ポインタ
をデリファレンスしたヤツが悪い。
0727デフォルトの名無しさん
NGNG参照で渡す場合はそれをしないという自分ルール。
参照にNULL渡す奴なんぞ知らんってことついては >>726 に同意。
0728デフォルトの名無しさん
NGNGclass A{
private:
int a;
public:
void f();
};
class A{
public:
void f();
private:
int a;
};
今までずっとprivateを先に書いてたけど、STLのソースなんかは逆なのね・・・どっちが普通??
0730デフォルトの名無しさん
NGNGpublic:クラス名・タイプ宣言
public:コンストラクタ
public:メソッド
public:フィールド
public:クラス
protected:クラス名・タイプ宣言
:
:
private:クラス名・タイプ宣言
:
:
0731デフォルトの名無しさん
NGNGおれは private 書かずに、いきなりメンバ変数書くので private が先。
たいてい、メンバ変数は pImpl だけだったり。
0732デフォルトの名無しさん
NGNGconst_cast dynamic_cast reinterpret_cast static_cast
がありますよね?
これがいまいちわからんのです。
普通のキャストと何が違うんでしょうか?
C++を勉強した本には載ってなかったし、BCBのヘルプを見ても使用例がなくてどうも。。
有用な使用例サンプルを出していただけると泣けるほど嬉しいです。
0734デフォルトの名無しさん
NGNG>C++を勉強した本
どんな本で勉強してるんだよ...
0735デフォルトの名無しさん
NGNGすばらしい。そこみたら即効で理解できてしまいました。
いいとこ教えてもらった〜。ありがとー。
>>734
「CプログラマのためのC++入門」です。
ネームスペースやテンプレートもなかったです。
まだ定まってないようでした。
0736デフォルトの名無しさん
NGNG―――――――――――――‐┬┘
|
____.____ |
| | | |
| | ∧_∧ | |
| |( ´∀`)つ ミ | 古くさい本は投げ捨てろ
| |/ ⊃ ノ | | □
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
0737デフォルトの名無しさん
NGNG0738デフォルトの名無しさん
NGNGA[0]=1,A[1]=2,A[2]=3
B[0]=4,B[1]=5,B[2]=6,B[3]=7
上記のデータを
vector<vector<int> > IntAry;
で用意して以下の様に格納したいのですが
IntAry[0][0]=1
IntAry[0][1]=2
IntAry[0][2]=3
IntAry[1][0]=4
IntAry[1][1]=5
IntAry[1][2]=6
IntAry[1][3]=7
一発で*Aから*IntAry[0]にコピーする方法がどうも出来ません。
なにか良い方法ありましたらご教授お願いします。
0739デフォルトの名無しさん
NGNG>「CプログラマのためのC++入門」
Cプログラマ向けの本らしいのにCと違うキャストの種類すら載って
ないとは恐ろしい度胸だね。
classとstructの違いくらいしか載ってないのかね。
入門向けC++本といえば、ろくにSTLと標準ライブラリについて書いてない
のが沢山ありそうだ。Cの本でprintfについて書いてないというのもあまり
ないだろうに。そういうものがSTLの周知を妨げているのかもしれん。
0740739
NGNGstd::copy(B, B + 3, IntAry[1].begin());
一発ってコレの繰り返しじゃ駄目なの?
0741740
NGNG0742デフォルトの名無しさん
NGNGまぁ、参考文献が『The Programming Language C++ second edition』だったりするからな。
つか、謝辞の日付1992年4月だぞ。古すぎてやめといたほうがいい部類の本かもな。
0743デフォルトの名無しさん
NGNGありがとうございます。今検証中なのですが
std::copy(IntAry[0], IntAry[0].begin() + 2, C[0]);
逆に書き戻す場合上記ではないのでしょうか。
といいつつエラーが出るのでまずはgoogleしてきます。
0745744
NGNGstd::copy(IntAry[0].begin(), IntAry[0].end(), C[0]);
で良いっつー話かな?
0746744
NGNGstd::copy(IntAry[0].begin(), IntAry[0].end(), &C[0]);
だな.
これなら C が配列でも vector でもOK
0747ワェス・パラヤ
NGNG#include <iostream.h>
int main()
{
for(int i=0;i < 1000;i++)
int *p=new int;
return 0;
}
0748デフォルトの名無しさん
NGNG出来ました。ありがとうございます。
今度は自分がBYTE配列、相手(C)がLPVOIDの場合に上手く行く様に
頑張ってます。これは同じ様にやれば特に問題なしかな??
0749(l)←マムコ
NGNGwhile(1){
}
↑じゃないの?
0750デフォルトの名無しさん
NGNGE-mail欄のコメント書き忘れんなよ
0751デフォルトの名無しさん
NGNGプログラム終了と同時にメモリは解放されます。
0752デフォルトの名無しさん
NGNGboost::threadはPOSIX環境ではPthreadのラッパーとして
機能するみたいですけどLinuxとかSolarisの上ならこれで
SMPで動いてしまうんでしょうか?
これが使えそうならPthreadインターフェイスは捨てたいのですが・・・
# Boostって日本語の解説は少ないですね
0753デフォルトの名無しさん
NGNGlibs/src/thread.cpp 見ると pthread_create() してるから、使ってる POSIX Thread
ライブラリが SMP 対応なら、問題なく SMP で動くと思われ。
0754デフォルトの名無しさん
NGNGdeleteって配列消すとき、[ ]付けても付けなくてもどっちでもいいんだっけ?
それは何次でもかわらん?
0755デフォルトの名無しさん
NGNG0756またりろ
NGNGMessageBox(hWnd, str, "", MB_OK);//////42
wsprintf(str, "%d", strlen(str));
MessageBox(hWnd, str, "", MB_OK);//////48
if(strcmp(ccc,str))MessageBox(hWnd, "同じ", "", MB_OK);
同じっていうメッセージボックスは表示されるから
cccとstrは等しい。でも、strlenの結果が違う。
どうしてなんだろう?
0757754
NGNG素早いレス、どうも。
ついでに
(*a)[5][5] 消す場合、
delete[] a;
で良い?
0758またりろ
NGNG0759またりろ
NGNGwsprintf(buf, "%d", strlen(ccc));
MessageBox(hWnd, buf, "", MB_OK);////// buf=42
wsprintf(buf, "%d", strlen(ptr));
MessageBox(hWnd, buf, "", MB_OK);////// buf=48
if(strcmp(ccc,ptr))MessageBox(hWnd, "同じ", "", MB_OK);
同じっていうメッセージボックスは表示されるから
cccとptrは等しい。でも、strlenの結果が違う。
どうしてなんだろう?
0760デフォルトの名無しさん
NGNGstrcmp()は比較した文字列が等しいとき0を返す。
だから表示されたということはif()で0以外が評価されてる。
0761デフォルトの名無しさん
NGNGdelete[] a;
aは配列へのポインタだろ? 配列じゃなくて…
0762またりろ
NGNG0763ドンキホーテかな、おれって?
NGNGJAVAじゃないと無理ですか?
小一時間の説教覚悟してますんで、出来るか出来ないかをまず回答ください。
0764デフォルトの名無しさん
NGNGC++Builderのexeをスタートアップに登録して
起動時にある処理を行いたいのですがその時フォームを非表示
にして処理を行いたいのです。
で,下記の様に記述するとフォームを非表示にできる事は
解ったのですが最初の処理をどこに記述したら良いかよく
解らないのです。
VBの場合だとSub Main()ルーチンに記述するのですが・・・
Formのshowイベントとかはまずいし・・・・・・
参考になる物があったら教えて下さい(T__T)
Application->ShowMainForm = false;
0765デフォルトの名無しさん
NGNGだからそれぞれのプラットフォームのスレ逝けっつーの
0766デフォルトの名無しさん
NGNGこれだな。
新C++Builder相談室
http://pc.2ch.net/test/read.cgi/tech/997074601/
0767デフォルトの名無しさん
NGNGstring型にすべておきかえられる。また、そのほうが効率がいい」
って、どっかの本にかいてあったんだけど、
すべておきかえられるもの?
char*型がいらないってことではないよね?
0768デフォルトの名無しさん
NGNGcorbaのstringってcharにマッピングされてなかったっけ?
というかもし今でもそうなら仕様を変えた方がいいような、、、
0769デフォルトの名無しさん
NGNG効率に関してはノーコメント。
0770デフォルトの名無しさん
NGNGそして可変長バッファは vector で置き換え。
効率は、それまで const char * で渡してきた部分を const string& にすれば、
いずれにせよポインタひとつ分で受け渡せるから問題ない。strdup() の代わり
にコピーコンストラクタってのも悪いトレードオフじゃないし。
気をつけないといけないのは + 演算子なんかを多用して、ソースコードには
直接見えない一時オブジェクトをたくさん作ってしまうことかな。C++ だと、何
気ない 1 ステートメントが、大量のオブジェクト生成/破棄を行うことがある
ので。
0771デフォルトの名無しさん
NGNGclass Command{
};
class CommandA:public Command{};
class CommandB:public Command{};
struct TestData{
TCHAR *com;
Command *c;
};
TestData test[]={
{"func1",new CommandA}
};
関数ポインタを使う代わりにコマンドオブジェクトをテーブルにもたせろ
って言われたんだけど、こういうことじゃないのかなぁ?
こんぱいるとおらない。
0772デフォルトの名無しさん
NGNG俺はそのソースそのままコピペで通るんだけど。
0774デフォルトの名無しさん
NGNGvoid abc::hoge(void) {}
を定義して、クラスの外で
void hoge(void) {}
を定義した場合、
クラスの中でhoge()を読んだ場合、メンバ関数が優先して呼ばれるのでしょうか?
そうならば、クラス内でグローバルな関数を呼びたい場合はどうするのでしょうか?
0775デフォルトの名無しさん
NGNG0776デフォルトの名無しさん
NGNGできました。ありがとうございます。
0777デフォルトの名無しさん
NGNGファイルアクセスに関するエラー処理ってほんとにいるんですかねぇ?
openに失敗した場合の処理はともかくとして、
一旦openに成功した後ではファイルに書き込んでるときのエラー処理とかって
現実におき得ないような気がするんですが・・・
一行書き込む毎に、いちいちエラー処理って入れなきゃならないものなんでしょうか?
0778デフォルトの名無しさん
NGNG0779デフォルトの名無しさん
NGNG0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNGディスクフルとか、
ネットワークファイルシステムでサーバだのルータが落ちたとか、
実はpipeで相手のプロセスが終了してEPIPEとか。
0782デフォルトの名無しさん
NGNG0783777
NGNGありそうですねぇ。
でもそしたら、たとえば、
ofsFile << "hogehoge" << endl;
if(!ofsFile.fail())
{
return false;
}
ofsFile << "FunyaFunya" << endl;
if(!ofsFile.fail())
{
return false;
}
てな感じで毎行毎行入れてかなきゃならないでしょうか?
とても現実的な話ではないような気がするんですが。
0784デフォルトの名無しさん
NGNG思いっきりシステム依存。他行け
0785デフォルトの名無しさん
NGNG0786777
NGNGこんなかんじ?
CMyFile::Write(std::ofstream& ofsFile, string strLine)
{
ofsFile << "hogehoge" << endl;
if(!ofsFile.fail())
{
throw "File Write Error";
}
}
でもひょっとしてこれの同じものを、ofstreamそのものの例外でもってたりします?
0787デフォルトの名無しさん
NGNGC++ なんだから、例外で拾うようにすれば、と答えとく。
0788デフォルトの名無しさん
NGNGios_base あたりに、書き込み失敗したら例外投げるようにフラグを立てるメソッドが
あったと思うが
0789デフォルトの名無しさん
NGNG> とても現実的な話ではないような気がするんですが。
あたりまえなんじゃないの?
フロッピーに書き込みにいって途中で抜いてみるとか、
手元のアプリでためしてみれば?
0790777
NGNGできましたですぅ。ありがとうございますです。
以下サンプル(Zはネットワークドライブ):
openとoutの間でネットワークケーブルを引っこ抜くと、
bbb.txtは何事もなかったかのように終了し、
aaa.txtは例外を発生します。(failbitも立てるとopen時に例外となります。)
try {
std::ofstream ofsbFile("z:\\bbb.txt");
Sleep(10000);
ofsbFile << "bbb" << std::endl;
std::ofstream ofsFile("z:\\aaa.txt");
// ofsFile.exceptions(ios_base::badbit | ios_base::failbit);
ofsFile.exceptions(ios_base::badbit);
Sleep(10000);
ofsFile << "aaa" << std::endl;
}
catch(ios_base::failure& exc)
{
cerr << exc.what() << endl;
}
0791デフォルトの名無しさん
NGNGクラスに複数のfloatがあるとします
class Vector4
{
public:
....
public:
float x, y, z, w;
};
この時にoperator[]を次のように記述する事はメモリレイアウト上
問題はないのでしょうか?処理系依存でしょうか?
float& Vector::operator [](int i)
{
float *f = &x;
return f[i];
}
0792デフォルトの名無しさん
NGNG0793デフォルトの名無しさん
NGNGswitch(i){
case 0:return x;
case 1:return y;
case 2:return z;
case 3:return w;
}
throw RangeException;
と素直にかかないのでしょうか?
0794デフォルトの名無しさん
NGNGやっぱりそうなんですか?
最終的にこれをメンバにした4x4の行列クラスを作りたいのですが
逆行列を求める時などにi, jでアクセスできるとforが使えるから
書きやすいと思うのです
これをやるには一時的に配列に入れるしかないかな?
0795デフォルトの名無しさん
NGNGつか、793で書いたのは、まさしくfloat& operator [](int i)の
コードなんだが‥‥
0796デフォルトの名無しさん
NGNGあそうか
すいませんアホデシタ・・・
自分で割り振ってやれば良いんですね
これで逝ってみます有難うございました
0797デフォルトの名無しさん
NGNGunion {
struct { float x, y, z, w; };;
float f[4];
};
とでもしとくとか。
0798デフォルトの名無しさん
NGNGそれってstructのパディングの関係で上手く逝かない事無い?
0799798
NGNG実はその辺の知識漏れ怪しいわ.スマソ
0800デフォルトの名無しさん
NGNGアラインメントの問題は無いでしょ。
パディングは通常、アラインメントをまたがないと、発生しないのよ。
0801デフォルトの名無しさん
NGNGclass Vector4
{
private:
float f[4];
public:
float& x() {return f[0];}
float x() const {return f[0];}
float& y() {return f[1];}
float y() const {return f[1];}
...
};
としそうなもんだな。()が邪魔っけだが。
0802デフォルトの名無しさん
NGNGで逝けるかもよ。
0803791
NGNG>>801も考えたんですが仰るように()がちと邪魔なのと
i, jアクセスはあまり頻繁には使わないのとで
>>793の方法で逝っていますがどれが一番一般的でしょうか?
別にどれがというのは無いかな?
0804デフォルトの名無しさん
NGNG0805デフォルトの名無しさん
NGNGだが、そもそも union のメモリ配置自体も実装依存じゃない? まぁ、大抵の環境で
は問題は発生しないだろうから、そこまで規格にこだわらなくても良いけど。
いちおう assert(&x == &f[0] && &w == &f[3]); ぐらい入れておくのが吉か。
0807デフォルトの名無しさん
NGNGこんなのはどう
class Vector4
{
float f[4];
public:
float &x,&y,&z,&w;
Vector4() : x(f[0]), y(f[1]), z(f[2]), w(f[3]) {}
float& operator[](int i){return f[i];}
const operator[](int i)const{return f[i];}
};
0808807
NGNGconst float& operator[](int i)const{return f[i];}
0809デフォルトの名無しさん
NGNGそれだと Vector4 のサイズが大きくなるから、ちょっと嫌かと。
0810デフォルトの名無しさん
NGNGシーケンスコンテナとか map/multimap, hash とかは
使い道はだいたい思い浮かぶんですけど,set/multiset
の使い道ってイマイチ思い浮かばないんですが…
0811デフォルトの名無しさん
NGNG使いたいと思ったやつが使うんだろ。
0812デフォルトの名無しさん
NGNG逐次入力されていく値をソートしたいとき。
0813810
NGNGなるほど,そーゆー時は確かにsetを使う価値はありますね.ふむふむ
>811
まぁそー言わんといて下さいよ.
見聞を少しでも広めようというだけなので…
0814デフォルトの名無しさん
NGNGofstreamを継承したクラスを作ってます。
<<operator引数の全パターンを網羅させるのは面倒なので、
以下のように安直な解決策を計ってみました。
よくわからないのがソース中の�@、�A、�Bです。
class CMyFile : public ofstream
{
public:
// �@ 全引数のパターンを一気に受けたい。
ostream& operator<<(void* input);
};
ostream& CMyFile::operator <<(void *input)
{
// 独自の処理
cout << input << std::endl;
// 親の処理
// �A 親の<<を呼び出したい。
parent? << input; // ???
// �B 何を返すの?
return ???; // ???
}
0815デフォルトの名無しさん
NGNGreturn ofstream::operator<<(input);
ぢゃマズいかのぅ?
0816815
NGNGうーん,そりは・・・任せたぞ!他の人!!
0817デフォルトの名無しさん
NGNGint ** foo= new int[10][10];
みたいなことってできないんですか?
0818デフォルトの名無しさん
NGNG出来ね。
foo[1][1]はどこをさすんだ?
new int[10][10]とnew int[9][9]で別のアドレスをさす必要があるのにint**からじゃわからんだろ。
0819デフォルトの名無しさん
NGNGtemplate 関数の出番じゃない? 詳細はともかく、こんな感じで。
template <typename T> ostream& (ostream& os, T& input)
0820デフォルトの名無しさん
NGNG0821デフォルトの名無しさん
NGNGなにいってんのかわかんねーぞ
0822突然すみません・・・
NGNGってエラーどうやったらいいですか???
ちなみに初心者なんで、やさしくお願いします。
0823初学者
NGNGC++クラスメンバ関数ないで宣言したstaticな変数ってCのそれを同じと考えて良いですか?
つまり
MYSTRUCT *foo::boo()
{
static MYSTRUCT mystruct;
処理
return &mystruct;
}
として呼び出し側からmystructを使うのは可能ですか?
でもこんなやり方するのかな?
こういう場合は皆さんどうします?構造体をそのまま返すと構造体が大きい場合負荷がかかりますよねぇ。
かといってポインタを返すと実体の生存時間が気になりますよね。
staticメンバにしてみてもべつのに上書きされる可能性があるし。
0824デフォルトの名無しさん
NGNG>>823 よくわからんけど、俺ならメンバ変数にしてそれのポインタを返すな。
属性も指定できるし。
0825デフォルトの名無しさん
NGNGsigletonの安直な実装としては便利。
0826デフォルトの名無しさん
NGNG可能。ただ、その手で作ったオブジェクトのデストラクトの順番に
気ぃつけるよーに。ただデータ入れただけの構造体なら大丈夫だと思うけど。
> かといってポインタを返すと実体の生存時間が気になりますよね。
std::auto_ptr で返してしまうとか。
0828デフォルトの名無しさん
NGNGよくやりますか?
0829814
NGNGお二人の意見を参考につくってみたんですが、リンクエラーが・・・
<テンプレートを使ったメソッド>
template <typename T> ofstream& CMyFile::operator<<(T input)
{
return ofstream::operator <<(T input);
}
<使用例>
CMyFile cMyFile("XXXX.txt");
cMyFile.readOpen();
int a=1;
cMyFile << a ;
<リンクエラー>
TestProj.obj : error LNK2001:
外部シンボル ""public: class std::basic_ofstream<char,struct std::char_traits<char> > &
__thiscall CMyFile::operator<<(int)"
(??6CMyFile@@QAEAAV?$basic_ofstream@DU?$char_traits@D@std@@@std@@H@Z)" は未解決です
オペレータでのテンプレートの使い方がよくわからんです。
0830815
NGNGうーむ g++ 3.0.3 では
template <typename T>
ofstream& CMyFile::operator<<(T input)
{
ofstream::operator<<(input);
return *this;
}
とすれば逝ける模様.
なんでそのまま return 出来ないんぢゃろう・・・
誰か教えてプリーズ
0831デフォルトの名無しさん
NGNGtemplate<class T>class A
{
void func(void);
};
void A::func(void){}
見たいに外で関数を定義したいのですがどうしたら良いのでしょうか。
0832デフォルトの名無しさん
NGNG0833デフォルトの名無しさん
NGNGtemplate<class T>void A<T>::func(void){}
じゃなかったっけ?
違ったらスマソ。
0834デフォルトの名無しさん
NGNG0835831
NGNGおお!ありがとうございます。
今まで、その方法が分からなかったもので。
助かりました。
0836デフォルトの名無しさん
NGNGint * num = new int[1000];
delete num;
}
VC6のコンパイラは配列をdeleteするとき、
delete [] numとしなくてもいいのか?
実行してみても、
Detected memory leaks!
が表示されないだけれども…
0837デフォルトの名無しさん
NGNG#つか、detected leakなんて報告するのは、ライブラリでわ‥‥
0838デフォルトの名無しさん
NGNGintやcharなどの組み込み型なら問題ない模様。
クラスや構造体はデストラクタが呼ばれないのでだめ。
0839デフォルトの名無しさん
NGNG>>838
レスありがとうございます。
www.codeguru.com/richedit/SyntaxColorizer.html
実は、codeguruのCSyntaxColorizerクラスを実行したら、
~CSyntaxColorizer()で落ちるから、
何だろうと思ったら、配列のdeleteに一つも[]がついてないのよ。
それはunsigned shortの配列だったけど、
deleteに[]つけたら解決しました。
"Comments:"で誰も言及してないから、
マジ焦ったよ。
0840デフォルトの名無しさん
NGNGVC6 だと delete, delete[] は同じ動作をする。(だからといって、これに依存した
コード書いちゃダメだよ)
0841814
NGNGメンバー関数をtemplateで作るときは、宣言部に直接本体を埋め込まないと
うまくいかないみたいですね。
CMyFile : ofstream public
{
template <typename T> bool write(T input)
{
cout << input;
return true;
}
};
それから、よく考えたらoperator<<をオーバーライドしてしまってるので、
望みの動作させるためには、friend関数の力を借りねばならないみたいです・・・・・・・・
0842デフォルトの名無しさん
NGNGtemplate<class T1,class T2>
T1(*FUNC)(T2)=&(void func(void));
これなんでエラーになるんでしょう?
どこか間違えていますか??
0843デフォルトの名無しさん
NGNG0844デフォルトの名無しさん
NGNG&(void func(void)) じゃなくて &func だろ。
0845デフォルトの名無しさん
NGNGいいえ。これはエラーにはなっていません。
0846デフォルトの名無しさん
NGNG確かに。しかし VC6 だと、こんなコードもコンパイル通るな(実行すると落ちるけど)。
もしかしたら、昔は OK だったのかも。
void func(int) {}
template<class T1,class T2> T1 (*f)(T2) = &func;
int
main(void)
{
(*f)(1);
return 0;
}
0847デフォルトの名無しさん
NGNG> VC6 だと delete, delete[] は同じ動作をする
マジですか? VC5 だと delete では配列の解放をしてくれなかったと思ったけど。
0848デフォルトの名無しさん
NGNG{
public:
~Ca(){cout << "deleted." << endl;}
};
int main(int argc, char* argv[])
{
Ca* pca = new Ca[16];
delete pca;
return 0;
}
deleteとdelete[]でちゃんと動作違うけど。@VC6SP5
0849デフォルトの名無しさん
NGNGごめん、勘違いだわ。
0850デフォルトの名無しさん
NGNGusing namespase std
class<a,b>
int main(void)
double abu;
omaemona-
0851超初心者
NGNG勉強して1時間目です。
今、hello.ccというファイルに、
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
}
と書き、
$ gcc hello.cc
としたら、
$ gcc hello.cc
/tmp/ccGQTMfz.o: In function `main':
/tmp/ccGQTMfz.o(.text+0xf): undefined reference to `cout'
/tmp/ccGQTMfz.o(.text+0x14): undefined reference to `ostream::operator<<(char const *)'
となりました。
なぜうまくいかないのか説明してください。
0852デフォルトの名無しさん
NGNGって,きっとネタなんだろうな.まぁマジレスしとくと,
使うコマンドは gcc じゃなくって g++ にしろ
ほんでよ,
http://www.freeml.com/message/[email protected]/0001221
でなんか面白い事やってる
0853852
NGNGまぁ見りゃ分かると思うけど.
0854超初心者
NGNGgccとg++
ってどうちがうの?
0855超初心者
NGNGを教えて.
[ESC]X+compile
ってやってからどーすんの?
0856デフォルトの名無しさん
NGNGなんでもかんでも
おしえて君だと、あとでこまるぞ。
0857超初心者
NGNG有る程度自分の足で立てるまで教えてよ。
0858デフォルトの名無しさん
NGNGなんでキミのために無料奉仕しなきゃならんのだ?
0859デフォルトの名無しさん
NGNGEmacs使ってるなら、
M-x info
で>854も>855も解決する。infoの使い方がわからなかったらinfo読め。以上。
0860デフォルトの名無しさん
NGNGでしょうか?他の環境ではNGですか?
0861デフォルトの名無しさん
NGNG0862860
NGNGわかりにくくてスマソ
0863デフォルトの名無しさん
NGNGVC6でもたまたまOKなだけだと思った方がいい。
現実にはほとんどの処理系でもOKだけど、悪癖は早いうちに矯正することを
お勧めする。
0864860
NGNGありがとう!
ちょうどそのネタで上司とちょっと揉めてました(汗)。
上司が [] つけない人なんです。
0865デフォルトの名無しさん
NGNGスタイルの問題をいうなら、そもそも delete[] を陽に呼び出すようなプログラムを
書くな、という気がするが。std::vector や boost::scoped_array を使うことを考えた
方が良い。
0866852
NGNGしょーがねーな.まぁ最初は確かにどこから手付けていいか分からんからな.
gcc は C コンパイラ, g++ は C++ コンパイラだと思っとけ.
Emacs の M-X compile は実質上 make を起動するだけだから,make について
お勉強するべし.make についてのサイトは探せば色々見付かるから自分で探
すべし.
0867デフォルトの名無しさん
NGNGclass A
{
virtual class B
{
};
};
このvirtual付けたBってどういう扱いになるんでしょうか?
付けたときと付けない時の違いが分からないもので。
0868デフォルトの名無しさん
NGNGvirtual class B なんて定義は C++ の規格にはないぞ。
virtual を使えるのは
1. メンバ関数
2. 継承
いずれかのみだ。
0869デフォルトの名無しさん
NGNGそれが何故か出来るんですよ。
(一応、バージョンは古いけどBCB、VC、GCCでは確認済み)
C++ の規格に無いなら気にしなくていいなっと。
どうもありがと。
0870デフォルトの名無しさん
NGNGエディットボックスにそのドラッグ&ドロップしたファイルのパスを表示してやりたいのですが
どうやったらいいでしょうか?
0871デフォルトの名無しさん
NGNG最近の gcc だと怒られる。
% g++ test.cpp
test.cpp:4: `virtual' can only be specified for functions
test.cpp:4: virtual outside class declaration
0872デフォルトの名無しさん
NGNGファイル名とかとれるでしょ?
0873デフォルトの名無しさん
NGNGプラットフォーム依存の質問はそれぞれのスレへ逝け.
ここはスレ違いだ.
0874791
NGNGアフォですか?
gccはフロントエンドだから.ccなファイルならC++コードのコンパイルが通る
>>851
のエラーメッセージを良く見ろリンカのエラーだろが
正解は
$gcc hello.cc -lstdc++
だ
0876デフォルトの名無しさん
NGNG名前を消し忘れたな。
791とのギャップにワラタ
0878デフォルトの名無しさん
NGNGどうやってつかいわけてる?
0879デフォルトの名無しさん
NGNG0880デフォルトの名無しさん
NGNGtemplate<typename T>T* t=func;
((void(*)(void))t)();
これは何で落ちるんでしょう?テンプレートはこのような使い方を
してはいけないのでしょうか?
0881デフォルトの名無しさん
NGNG# …って、「落ちる」??
0882デフォルトの名無しさん
NGNGprivate 継承なんて使ったことないなあ。つか、なるべく継承より
コンポジションを使うようにしてるよ。継承のレベルが深くなると
後の保守が大変なんで。
0883デフォルトの名無しさん
NGNGそんな使い方出来ることすら知らなんだ。
operatorを定義しているのか?
多分それできるのってVCだけでしょ?
0884デフォルトの名無しさん
NGNGネタだとは思うが、もしそれが可能だとするなら t をキャストしているのは
無意味。むしろ t<void(*)(void)>() にすべきかと。
0885デフォルトの名無しさん
NGNGint main()
{t=func; }
ってやると、
'void(*)(int)'から' *'に変換できないとかすごいことを云われるYO!
これこそホントのvoidポインタなのかな(ワラ
0886デフォルトの名無しさん
NGNGそういったことを解説してる本やサイトを知ってる人がいたら教えて下さい。
0887デフォルトの名無しさん
NGNG}
クラスはヘッダファイルに書くものですか?
0888デフォルトの名無しさん
NGNG別に *.cpp の方に書いても良い。
俺は外部に公開したくないクラスについては *.cpp に書いてる。
// 外部に公開するのでヘッダに書く
class Foo {
struct Impl;
const std::auto_ptr<Impl> pImpl;
public:
...
};
// 実装は外部に公開しないので *.cpp に書く
struct Foo::Impl {
// いろいろ
};
0889デフォルトの名無しさん
NGNG勉強になりました。
thanx!!
0890デフォルトの名無しさん
NGNGtemplate<typename U>class TCB{
public:
friend template<typename A>class TCA<A>;
};
何故エラーに・・・?普通のfrindなら通るのですが・・・。
0891デフォルトの名無しさん
NGNG0892デフォルトの名無しさん
NGNGAのタイプは誰が決めるの?
0893デフォルトの名無しさん
NGNGconst int MIN = 0;
const int MAX = 9;
#include <iostream>
struct A {
int hoge(int i) {//A君が値の範囲チェック
if (i > MIN && i < MAX) return i * 3; return i;
}
};
struct B {
int hoge(int i) {//B君も値の範囲チェック
struct A a; if (i > MIN && i < MAX) return a.hoge(i); return i;
}
};
void main()
{
B b;
int i, num = 8;
if (num > MIN && num < MAX)//メイン君も値の範囲チェック
i = b.hoge(num);
else
i = num;
std::cout << i << std::endl;
}
//のような事が頻出するのですが、そもそも誰が値の範囲チェック
//をするべきとか、決まりはあるのでしょうか?
0894デフォルトの名無しさん
NGNG0895デフォルトの名無しさん
NGNGそりゃ、仕様で決めるだろ。
assert() はあらゆる場所にばら撒いておくが、正常パスの値チェックは仕様で決めた
関数でしかやらない。
0896デフォルトの名無しさん
NGNG・・・成る程。そりゃそうですよね。型が決定しなけりゃエラーになりますよね。
0897デフォルトの名無しさん
NGNGうちならA・Bの側では一切値のチェックなんてしないよ!
食わせる前にチェックしろと言う仕様。
こう決まってるほうが都合がよくない?
0898デフォルトの名無しさん
NGNG>>893の場合ではmain内でチェックする方がいいの?
0899初心者
NGNGこの<>のにはclassとtypenameどちらを使うのが主流なんですか?
本にはclassとあって、さっき見たサイトだとtypenameと書いてありました。
0900デフォルトの名無しさん
NGNG使うように推奨していますが、古い処理系には typename という予約語
がなく、すべて class で代用していたのです。
ですから古い処理系で書かれたプログラムをコンパイルする互換性と、
これから新しくC++を学んでいく人は、必要に応じて書き分ければ
いいでしょう。
0901初心者
NGNG0902デフォルトの名無しさん
NGNGとあるとき、
p = new int[5][10];
は分かる。これは組み込み型にかぎれば、
p = (int (*)[10])malloc(5*sizeof(int [10]));
と同じことだよね。
しかし、
p = new int[][10];
の意味が分からない。コンパイルは通るんだが、これは何をやってるの?
サイズを指定しなくていいの?
0903デフォルトの名無しさん
NGNGうちの gcc(2.95.3) じゃ parse error になったよ。
通るの?
0904デフォルトの名無しさん
NGNGVCなら通った。
どうもVCでは、new int[0][10]と解釈されるみたい。
なーんだ。
0905デフォルトの名無しさん
NGNGclass A
{
void FuncX(void){}
void FuncY(void){}
void FuncZ(void){}
public:
void Call(int sel)
{
void (*func[])(void)={FuncX,FuncY,FuncZ};
func[sel]();
}
};
メンバー関数からポインタ取って呼び出すことは出来ないのでしょうか。
0906デフォルトの名無しさん
NGNGclass Hoge {
double (*Hoge::myfunc)(double);
public:
double func1(double a);
void setfunc(void) { myfunc = func1; }
double callfunc(double a ) { return( (this->*(myfunc))(a) ); }
...
};
0907名無しさん
NGNGe:\program files\microsoft visual studio\vc98\include\stlport-4.5.3\stlport\exception(60) : fatal error C1083: インクルード ファイルがオープンできません。'../include/exception': No such file or directory
のように出てビルドできません。
なんかvc98\includeにファイルを読みに逝ってるみたいなんですが・・・
解決方法を知っている方、いませんでしょうか?
0908デフォルトの名無しさん
NGNGコンパイル出来ないものを書くな。
class Hoge {
double (Hoge::*myfunc)(double);
public:
double func1(double a);
void setfunc(void) { myfunc = &Hoge::func1; }
double callfunc(double a) { return( (this->*myfunc)(a) ); }
};
あと、最近のC++だと&Hoge::func1のように
明確に指定しないといけないみたい。
0910デフォルトの名無しさん
NGNGstl/_site_config.h を INCLUDE で検索
0912デフォルトの名無しさん
NGNG0913デフォルトの名無しさん
NGNG0914デフォルトの名無しさん
NGNGヘッダで定義したものを *.cpp でも定義したら、そりゃ二重定義で怒られるだろ。
0915名無しさん
NGNG>>910
stl_msvc.hを編集したらパスが変更できたみたいなんですが、
e:\program files\microsoft visual studio\vc98\include\stlport-4.5.3\stlport\stdarg.h(23) : warning C4182: #include のネスト レベルは 546 です; 無限再帰の可能性があります。
e:\program files\microsoft visual studio\vc98\include\stlport-4.5.3\stlport\stdarg.h(23) : fatal error C1076: コンパイラの制限 : ヒープの領域を使い果たしました; 上限を設定するために /Zm オプションを使用してください。
上のようなエラーが出てしまいます・・・
0916デフォルトの名無しさん
NGNG単にパスの設定をミスって再帰的に同じファイルを #include してるだけだと思うが。
悩みたくなければ ..\vc98\stlport の下に STLport をインストールしとけ。include の
下に入れると、いろいろめんどうだ。
0917名無しさん
NGNG最初からネストするようになってるみたいですが・・・
0918デフォルトの名無しさん
NGNG違うだろ。
STLport の stdarg.h を #include すると、標準ヘッダの stdarg.h が #include
されるのが正解。そこで設定をミスって STLport の stdarg.h を再度 #include
してるから無限ループにはまってる。
0919名無しさん
NGNGこっちはincludeには入っていないみたいなんですが・・・
0920デフォルトの名無しさん
NGNG「定義」という用語の使い方が間違っているとして、
privateなメソッドならあっても変ではない。
0921デフォルトの名無しさん
NGNGdeleteを使う基準がわかりません。
クラスの中の変数としてそのクラスのヘッダファイルでポインタを宣言した
らデコンストラクタでFreeしてやればいいのでしょうか?
クラスの各関数の中でnewした場合はその関数を出るときにdeleteする必要があるのでしょうか?
それともないのでしょうか?
0922デフォルトの名無しさん
NGNGとりあえず一から勉強し直した方がいいように思う。…が、まぁいいや。
new で作ったオブジェクトは、どこかで delete しないと消えてくれない。
だから、new したまんま放っておくとメモリリークしたりリソースリークしたりて
よろしくない。ので、使い終わったらどこかで責任持って必ずdeleteせよ。
逆に、「deleteしないと消えない」ことを利用した使い方もある。
関数の中で string xxx; とかやって作ったオブジェクトは、関数から抜けるときに
必ず消えてしまう。これを外までもたせようとしたら、
string* pXxx = new string;
とかやって new で作って返すことになる。この場合関数の中でdeleteしちゃったら
何の意味もないので、別のどこかの関数で delete することになるだろう。
#1 あと、newで作ったのではないオブジェクトは delete するな。
#2 ていうか、new/delete の意味が理解できたら、 auto_ptr を積極的に使え。
以上、健闘を祈る。
0923デフォルトの名無しさん
NGNG#3 でauto_ptrをコンテナに入れようとしてはまる
に一票
0924デフォルトの名無しさん
NGNG0925デフォルトの名無しさん
NGNG>>924
彼らはEffective STLを読んだばかりで嬉しいのです
そうそして漏れも(w
0926超初心者
NGNGです。
>Emacs の M-X compile は実質上 make を起動するだけだから,make について
>お勉強するべし.make についてのサイトは探せば色々見付かるから自分で探
>すべし.
ちょっとしらべたけど、わからんかった。
Makefileっていうのは、c++ファイルと同じディレクトリ
に作成したらいいんかいな?
で、そのMakefileはc++ファイル作るたびに、
別途用意しなあかんの?
結構めんどくさい気がするんだけど。
汎用性のあるMakefileってないの??
0927デフォルトの名無しさん
NGNG0928デフォルトの名無しさん
NGNGM-x compile ってやったらミニバッファに make -k とか出るよな?
それを全部消して gcc hello.cc とでも入力してからENTER。
一行ですまないようだったら、スクリプトファイルにでも書いておいて
そのファイル名を入れればいい。
makeのありがたみがわからないうちはそれで十分。
0929デフォルトの名無しさん
NGNGとりあえず調べたサイトを列挙せよ
0930デフォルトの名無しさん
NGNG0931デフォルトの名無しさん
NGNG#
% make hoge
cc tmp.c -o tmp
%
充分有り難い。
0932デフォルトの名無しさん
NGNG% make hoge
cc hoge.c -o hoge
%
0933デフォルトの名無しさん
NGNG全角文字、半角文字(できれば英数と仮名を区別)が何文字あるかを
調べるにはどうしたらいいですか???
とりあえず過去ログで「半角」で全検索、もちろんサーチで検索も
してみました。よくわからない・・・です(^-^;
文字コードはSJISかな? 何か便利な関数がありそうな予感してるんですが。
0934デフォルトの名無しさん
NGNG>汎用性のあるMakefileってないの??
ソースと実行ファイルが一対一なら書かなくてもいいの。
デフォルトでルール持ってるから。
これは商用UNIX/Linux/BSD/Windows共通。
どれでも「make 実行ファイル名」だけ。
Visual-Cなら「nmake filename.exe」。
ファイル名拡張子を見て、CかC++かフォートランかパスカルを
起動してくれる。gcc->.cc, Visual-C->.cpp
0935デフォルトの名無しさん
NGNGMakefileはそもそも、どういう目的で作られたのかを考えな!
ちなみにC++のファイルと同じじゃなくちゃいけないって事は無い!
0936デフォルトの名無しさん
NGNG(書いてあれば)
汎用性でいえば最強の部類に入ると思われ。
0937デフォルトの名無しさん
NGNG今押されているかどうかを知りたい)を取得したいのですが、APIからのメッセージ
は一度に一つしか送られてこないので使い勝手が悪いです。なにか良い関数は
あるでしょうか?
0938937
NGNGどれか一つでもキーが押されているかどうか知らせてくれる、ってことです。
マウスとキーを同時に扱えない(メッセージが1つ&瞬間なので)ので困ってます。
0939デフォルトの名無しさん
NGNG0940デフォルトの名無しさん
NGNGnAlpha = nDigit = nSbc = nDbc = 0;
for( p=start; p<end; p=next(p) )
{
if( isalpha(*p) ) nAlpha++;
else if( isdigit(*p) )nDigit++;
else if( isSingleByteChar(*p) ) nSbc++;
else nDbc++;
}
こんな感じで数えりゃいいんでないの?
↑には流れしか書いてないから実装は自分で好きなようにどーぞ。
0942デフォルトの名無しさん
NGNGさんくす! そんな関数あったんやね。
isSingleByteCharはC++にあるん? 半角カナも取得したいっすな。
さすがにもうちょい自分で調べまっす。
0943940
NGNGそんな関数は無いから自分で作れゆーとるんじゃゴルァ (゚д゚ )
iskanji とか ismbcslead とか何かそんなのはあるかもしれんが。
ガンバッテーネ。
0945デフォルトの名無しさん
NGNG次のコードがエラーになるのですが、
なぜなのですか?コンパイラはgccです。
両方抽象クラスだから、実装はなくてもいいと思って
いるんですよね。
class A {
public:
virtual bool funcA() = 0;
};
class B
{
public:
virtual A funcB() = 0;
};
0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNG使えるわけがなかろう。落ち着いて考えろ。
0949デフォルトの名無しさん
NGNGclass inA{
};
};
これがOKなら、このメンバクラス(メンバ?)
のオーバロードをしたいのですが、出来るでしょうか?
class CA{
template<class C1>class inA{cout<<"A"<<endl;};
template<class C2,class C3>class inA{cout<<"B"<<endl;};
public:
CA{inA<int,int> ina;};
};
は、通るのですが、
CA(){inA<int> ina;};
とすると、エラーになってしまいます。これは出来ないということなのでしょうか?
0950デフォルトの名無しさん
NGNGそういわれればそうだな。
ありがとうございます。あー、どうしましょう。
0951デフォルトの名無しさん
NGNGというのがあって、これがNULLならcin(標準入力)から、
NULLでないならこの名前のファイルを開いてifstreamから
入力したいんですが、どう書くのがC++的に一番いいでしょう?
istream* ifs;
if(name)
ifs=new ifstream(name);
else
ifs=&cin;
int i;
(*ifs)>>i;
とかだとどうもポインタが出てきて嫌なんですが…。
かといって参照だとスコープとかの関係で無理っぽいし…。
というわけでかっこいい書き方をおしえてください。
0952デフォルトの名無しさん
NGNGえ?なんで?
0953デフォルトの名無しさん
NGNGポインタじゃないからって事じゃない?
0954デフォルトの名無しさん
NGNGC++が使える人がそんなに多くないのと、
C++にあこがれる人がまだ沢山いるのとの
二つがよく分かって少し安心しました。
0955デフォルトの名無しさん
NGNGそれでいいんじゃん,別に.見て何やってんのかスグ分かるし.
まぁあとは3項演算子使いたければ使えってぐらいで.
ただ ifs っつーと ifstream を連想するのは漏れだけ?
istream だったら・・・ is ・・・ かなぁ?
0956名無しさん
NGNG>683
IDカコイイ
0957デフォルトの名無しさん
NGNGポインタ返しにすればいいわけね。
ほんと、俺はバカだな。ありがとう。
0958デフォルトの名無しさん
NGNGifstream(name)の生存期間が不明だからあまり具体的にはアドバイス
出来ないけど、ひとつの関数で作業をやりすぎてないか?
実際のコードではint iじゃなくて、もっといろいろ入力するんだろ?
1.入力すべきストリームを決定
2.ストリームからデータを入力
という二つの作業があるんだから、別の関数に分けた方が
いいと思うぞ。そうやって構造をスッキリさせれば、ポインタを
なくす方法も見えてくるはずだ。
0959デフォルトの名無しさん
NGNGクラスにflag変数をもっておいて
そのflagの値によってstatic関数の中で処理を変化させたいのです。
クラス内でstatic BOOL flagを宣言するとコンパイラは通るのですが、
実行ができません。
0960デフォルトの名無しさん
NGNG誰もが平均0.6回は通る道だな。
クラスの外側(ソースファイルのどれか)で static BOOL xxx::flag; と定義すれ。
0961デフォルトの名無しさん
NGNGでもそれだったらリンカエラー出るからそーゆー話じゃないんじゃない?
>959 は
> static (でprivate or protected) な関数の処理をメンバ変数の値によって
> 挙動を変えたい
という意味不明の事を言ってるように見えるのはヲレの日本語能力が足りない
からかな?
それだったら
> そんな関数staticにすんな
が答えなんだけど...
0962959
NGNGレスありがとうございます。
すみません。言葉足らずだったようなのでもう一度。
ええとボタンがクリックされたら
GetListCtrl().SortItems(CompareFunc,pNMListView->iSubItem);
この行から
static int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSor
int CALLBACK MemListView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
このように宣言された関数を呼んで
sortを行いたいのですが、
これがCompareFuncの中でflagがTRUEならば昇順に
flagがfalseならば降順にと切り分けたいのです。
このようなときflagは
どこに(クラス内かクラス外か)
どのように(staticかそうでないのか)持たすのが一番良いでしょうか?
0963デフォルトの名無しさん
NGNGthisをもらえない関数であるウインドウプロシジャー/
コールバック関数からメンバー関数を使いたいということある。
マックならウインドウのプロパティにクラスへのポインタを
セットする。ウインドウのプロパティからそのウインドウを
作成したインスタンスを参照する。
WindowsならばGetWindowLongのユーザーデータを使用したい
ところだなと、マニュアルを見ながら思った。
0964デフォルトの名無しさん
NGNGSortItemsの第2引数で工夫してflagの値も引き渡すようにするのが筋ではないかと。
たとえば、サブアイテムの個数がWORDの範囲を超えないのなら
MAKELONG(pNMListView->iSubItem, flag) としてみるとか。
0965デフォルトの名無しさん
NGNGそのstatic関数に、該当するインスタンスのポインタを渡してやればいいんじゃないの?
全体がどーゆーデザインになってるのか見当がつかんが。
0966デフォルトの名無しさん
NGNG送られるメッセージは何でしょうか?
Spy++を使ってみましたが量が多すぎてよくわかりませんでした。
0967デフォルトの名無しさん
NGNGDebugビルドでは平気なのにReleaseビルド
すると計算結果がおかしくりました。私が
悪いのでしょうか?
printf("\n")って入れたらちゃんと動いた
りもします????
0968デフォルトの名無しさん
NGNGたぶんヒープを壊してる。次のコードを WinMain の直後に追加して、デバッグビルド
でヒープのチェックを有効にしてみ。
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
あと STLport を使ってるなら #define _STLP_DEBUG とかも定義しておくと便利だ。
0969デフォルトの名無しさん
NGNGよろしく
0970デフォルトの名無しさん
NGNGVCスレ逝け
0971デフォルトの名無しさん
NGNGVC++ == C++
と思ってる奴って多くない?
0972デフォルトの名無しさん
NGNGoperator == の定義によると思われ。
0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNGを使うのに比べて何かメリットはあるのでしょうか?
struct.first_item
ってやるのと
get<0>(tuple)
っていう書式違い以上の違いが厨房な僕には分からないんで,
どなたか教えて下さい.
# まぁ構造体定義せずに済むという利点があるというのは分かりますが.
「利点が分からねーなら使うなゴルァ」と言われそうですが,利点がある
なら知りたいのです.どうぞよろしく.
0975デフォルトの名無しさん
NGNG何故にエラーになる・・・???
0976デフォルトの名無しさん
NGNG0977デフォルトの名無しさん
NGNG↑
ここにスペースがないと >>演算子とカンチガイしてしまう
0978デフォルトの名無しさん
NGNGをを、そうだったのですか。
動きました♪有難うございます♪
0979デフォルトの名無しさん
NGNGそれとも普通のC言語とはまったくの別物ですか?
いまから趣味でプログラムやるならCとC++のどっちのほうがいいですか?
0980デフォルトの名無しさん
NGNGCと一緒に勉強するのがいいよ。
このスレではこう答えるけど、
他じゃCやっとけっていいたいところだったり。
0981デフォルトの名無しさん
NGNGpublic:
template<typename T>void func(T a);
};
template<typename T>inline void CB::func(T a){};
これがエラーになるのは何故なのでしょうか?
0982デフォルトの名無しさん
NGNGCB<T>::func
にしる!!
0983デフォルトの名無しさん
NGNG誰か新スレ立てない?
0984982
NGNG0985デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1014217496/l50
0986デフォルトの名無しさん
NGNGg++ 3.0.2 だと通るけど。たんに使ってるコンパイラが
メンバテンプレートに対応していないだけなんじゃない?
0987デフォルトの名無しさん
NGNG残念。
レス数が950を超えています。1000を超えると書き込みができなくなります。