CからC++に移行中の人が質問するためのスレ
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2005/04/16(土) 10:54:30これらに当てはまる人のための質問スレです。
1.Cはだいたい理解している。
2.最近C++を始めたばかり
3.入門書を読んでも、Googleで検索しても、いまいち理解できない人
【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する香具師 】
・ どんな事で躓いているのか明確にしる。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書け。
0002デフォルトの名無しさん
2005/04/16(土) 10:55:43普通にC++のスレで聞けばいいだろ?
甘えた態度はよろしくないな。
0003デフォルトの名無しさん
2005/04/16(土) 12:59:03>>1番かわいいのはさゆなの!
ノノハヽヽ〃ノハヾ /) >>2じ本はハゲすぎなの!
後>>10は落ち目すぎなの! ∩*・ 。.・)从*・ 。.・)/ミ
〃ノハヾノノハヽヽノノハヽヽつ い>>4川は黒すぎなの!
矢>>9ちもフケすぎなの!⊂(。.・从(・ 。.・*∩ノノノハ 。.・)ノハヽ
(( (\ゝノノノハノハ〃ハ v)っ彡*・ 。.・)
あ>>8やはフケすぎなの! ⊂`ヽ从*・ 。.・)・ 。.・))ノノノハヽつ ))>>5んのは顔ふくれすぎなの!
大の大人が>>7っちとか(プ⊂\ ⊂ ) _つ从*・ 。.・)
(/( /∪∪ヽ)ヽ)/ U つ モー>>6すは売れなさすぎなの!
∪ ̄(/ ̄\) ゝし'⌒∪
>>11-1000さゆのかわいさの前にひれ伏すの!
0004デフォルトの名無しさん
2005/04/16(土) 13:11:280005デフォルトの名無しさん
2005/04/16(土) 23:20:18宣言と同時に初期化できるのならそうするとなお良い。forで使うカウンタもfor内で宣言できる。for (int i = 0; i < N; i++)
2. フラグにはboolとtrue/falseを使え。
3. #defineは使わなくても済むなら消せ。
const使えば定数になる。つまり配列の添え字にも使える。
関数にinlineを付ければ(inline int f()など)コンパイル時にインライン展開される。
4. void *からその他のポインタ型への変換にはキャストが必要になった。(逆はC++でも平気) mallocなどには注意。
5. キャストもC++形式にしろ。今までのキャストは次のどれかに分類できる。(いくつか複合している場合もあるが)
const_cast(const外し)、reinterpret_cast(ポインタ←→整数など)、static_cast(その他一般)
static_castはdouble←→intとかvoid *→その他のポインタ型とかそういうときに使う。
6. malloc/freeの代わりにnew/delete new[]/delete[]を使え。
0006デフォルトの名無しさん
2005/04/16(土) 23:26:210007デフォルトの名無しさん
2005/04/16(土) 23:46:307. 構造体変数を引数にする場合(関数内でそれを書き替えない場合)はconst参照にしろ。値渡ししたかのように . でメンバへアクセスできる。
関数内で書き替える場合はconstじゃない参照にすれば良いのだが、
(呼び出し側で&を書くことで)書き換えることを明示できるとポインタにする人もいる。
コーディングスタイルの問題なので言い出すとキリが無くなる。(俺は参照に出来るときは常に参照派)
参照ではNULLを表現できないからNULLを指定しても良いときは当然ポインタを使うしかない(わけではないが)。
これはクラスにも当てはまる。
8. std::stringを使うときにはメンバのc_str()を使うとconst char *型の文字列へのポインタを手に入れられる。const_castするなよ。
9. malloc/freeの代替としてはstd::vectorもある。realloc相当のことをしたければnew/deleteは使えないしな。
10. usingディレクティブ(using namespace 〜;)は使用禁止。namespaseを使う意味がなくなるじゃないか。
using宣言(using std::cout;)ならOK。
0008デフォルトの名無しさん
2005/04/16(土) 23:53:17んなこたない。
名前が衝突するときだけ修飾名を使えばいい。
0009デフォルトの名無しさん
2005/04/17(日) 09:00:06とりあえず代わりにこっちを追加。
10.1. ヘッダファイル内ではグローバル名前空間でのusing禁止(ディレクティブ・宣言共に)。
8.1. 逆にconst char *→std::stringにはstatic_castが使える。
でもそういうときは一時オブジェクト作成のstd::string(p)の形式を使う人のほうが多い(と思う)。
11. C++では関数プロトタイプ宣言がないと関数を使えなくなった。
12. int f()とint f(void)は等価になった。int f()はCだと引数不定を意味するのは知っているよな。
0010デフォルトの名無しさん
2005/04/17(日) 09:40:570011デフォルトの名無しさん
2005/04/17(日) 21:45:57C++ は signed char と unsigned char と char を別の型として扱うとの
ことですが、なぜこのようなことをしたのですか?
int と signed int は同じとして扱うのに char だけなんでなのでしょう??
0012デフォルトの名無しさん
2005/04/17(日) 22:01:33え、Cでも同じじゃないの?
0013デフォルトの名無しさん
2005/04/17(日) 22:16:09扱うかは処理系により、よって、char は signed char か unsigned char
と同等なる、みたいな記述が今もっている本にあります.
なぜだろか
0014デフォルトの名無しさん
2005/04/17(日) 22:57:19種別によっては文字の扱いが遅くなる、しかしCやC++の文化では
それは許容できない。だからcharと書くとそのCPUでの「自然な」
(実行が速い)解釈を処理系が選べるように言語仕様を決めている。
ところで >>11 はCからC++に移行とは何の関係もない質問なのね。
0015デフォルトの名無しさん
2005/04/17(日) 23:13:41//関係ない質問だったならば、申し訳ないです。自分がC++に移行中だったもので
0016デフォルトの名無しさん
2005/04/23(土) 12:45:170017デフォルトの名無しさん
2005/04/23(土) 12:45:490018デフォルトの名無しさん
2005/04/23(土) 12:46:28001916
2005/04/23(土) 12:47:170020デフォルトの名無しさん
2005/04/23(土) 12:49:12Cではconst付けても定数にならないから。
いちいちCとC++で切り替えるように作るのも面倒くさいだろうし。
0021デフォルトの名無しさん
2005/04/24(日) 13:36:35別のCファイルから読めるようになります。
数式の中に入れると最適化を阻みます。
プリプロセスが汚いト思うならenum定数。
Cでもenum定数で宣言しても良かったはずですが
柔軟性を残すために#defineにしてあるのではないでしょうか。
0022デフォルトの名無しさん
2005/04/24(日) 14:18:55>const変数は外部参照させるためにあります。
>別のCファイルから読めるようになります。
>数式の中に入れると最適化を阻みます。
………
0023デフォルトの名無しさん
2005/04/24(日) 16:12:440024デフォルトの名無しさん
2005/04/24(日) 16:30:44> const変数は外部参照させるためにあります。
ちがいます。定数を定義するためにあります。
> 別のCファイルから読めるようになります。
それは const による効果ではありません。
> 数式の中に入れると最適化を阻みます。
コンパイラは値が定数であることを知ることができるので、
最適化を助けることはあっても阻むことはありません。
0025デフォルトの名無しさん
2005/04/24(日) 16:34:270026デフォルトの名無しさん
2005/04/24(日) 17:12:51柔軟性が理由ではないね。enum定数という習慣がないだけだ。
0027デフォルトの名無しさん
2005/04/24(日) 17:13:550028デフォルトの名無しさん
2005/04/24(日) 17:49:25deleteで削除した場合、ポインタはNULLになるのでしょうか?
0029上田
2005/04/24(日) 17:51:080030デフォルトの名無しさん
2005/04/24(日) 18:12:07> newでメモリを確保できなかった場合、ポインタにはNULLが入りますが、
そうとは限りません
> deleteで削除した場合、ポインタはNULLになるのでしょうか?
いいえ
0031デフォルトの名無しさん
2005/04/24(日) 18:50:29> newでメモリを確保できなかった場合、ポインタにはNULLが入りますが
ちがうよ。 std::bad_alloc が飛んでくるんだよ。
ヌルが返るのは std::nothrow 使ったときだけ。
0032デフォルトの名無しさん
2005/04/24(日) 19:08:580033デフォルトの名無しさん
2005/04/24(日) 19:27:27extern constなんてのもCLSID/IIDでは使われているがな。
0034デフォルトの名無しさん
2005/04/24(日) 19:36:170035デフォルトの名無しさん
2005/04/24(日) 22:13:37それは try{} した場合だろ。
適当な回答者ばっかだなここ。
0036デフォルトの名無しさん
2005/04/24(日) 22:21:54tryで囲っていなくてもstd::bad_allocが投げられる。
terminate()などが呼ばれるのも例外を投げられた(けどtryで囲っていないからcatchされない)結果。
0037デフォルトの名無しさん
2005/04/24(日) 22:24:170038デフォルトの名無しさん
2005/04/24(日) 22:32:420039デフォルトの名無しさん
2005/04/24(日) 23:23:350040デフォルトの名無しさん
2005/04/24(日) 23:39:460041デフォルトの名無しさん
2005/04/25(月) 01:59:40例えば、グローバルスコープで
void* new( size_t size ) { return malloc( size ); }
で new をオーバーロードしてもちゃんとコンストラクタが呼び出される。
なんで?
0042デフォルトの名無しさん
2005/04/25(月) 02:03:56そりゃクラス内でオーバーロードしてないからだろ。
0043デフォルトの名無しさん
2005/04/25(月) 02:27:22いや、トレースするとちゃんと malloc()を使っている方が呼び出されているし。
new と delete ってとても特殊なキーワードなんだろうか?
オーバーロードされててもされてなくとも、new, delete があれば、アロケーたー
呼出し後に必ずコンストラクタ呼び出しするコードをコンパイラが埋めこんでいる
としか思えん。
004441
2005/04/25(月) 02:31:24template < class T >
T* new( size_t size ) { T* p = malloc( size ); p->T(); }
だったら判るんだけどね。そうじゃないからどうしてかなと。
0045デフォルトの名無しさん
2005/04/25(月) 02:40:56関数(operator)形式のnewと演算子のnewの違いを調べろ
0046デフォルトの名無しさん
2005/04/25(月) 02:51:26void* operator new( size_t size ) { return malloc( size ); }
話を整理すると、これをグローバルスコープで宣言してやると、
コンストラクタを呼んでないので new したclassのコンストラクタは
呼ばれない気がするんだけど、呼ばれるのはどうしてかなと。
例えば、bool T::operator == ( T& right ) { return T::compare( *this, right ); }
の compare を実行した後に、コンパイラが勝手に組み込みの == 比較演算をするのは
意味不明なわけじゃないですか。
0047デフォルトの名無しさん
2005/04/25(月) 02:57:33new = operator new + constructor
0048デフォルトの名無しさん
2005/04/25(月) 03:06:58operator new, deleteのオーバーロードは特殊で、そういうもんだということですね?
0049デフォルトの名無しさん
2005/04/25(月) 03:08:43operator new, deleteは全然特殊じゃない。
特殊なのは演算子のnew,delete。
0050デフォルトの名無しさん
2005/04/25(月) 03:10:24なら、なぜコンストラクタ呼び出しをするのでしょうか?
0051デフォルトの名無しさん
2005/04/25(月) 03:13:16コンストラクタを呼ぶのは演算子のnewなの。
operator newだけを呼びたいなら
例えば void* m = operator new(sizeof(int));。
0052デフォルトの名無しさん
2005/04/25(月) 03:38:34push dword ptr [size]
call operator_new
mov ecx, [new されたポインタ]
call T::T
のようなクラスのコンストラクターを呼び出すコードを
挿入するだけだと思います。
でないなら、オペレーターオーバーロードの機構からいって、
オーバーロードされた演算子の newがクラスのコンストラクタを
呼び出すのは不可能ですし。
005351
2005/04/25(月) 03:48:54大体そんなところ。
一応付け加えておくと、>>51で言ってる演算子のnewってのは
opeartor new のことじゃなく、new-expressionのことね。
0054デフォルトの名無しさん
2005/04/25(月) 03:53:46だでがだぢげで
0055デフォルトの名無しさん
2005/04/25(月) 04:01:460056デフォルトの名無しさん
2005/04/25(月) 08:43:46きもいと言う認識があるだけまし。
実際にどんなクラスを作ったのか晒してみ。
0057デフォルトの名無しさん
2005/04/25(月) 12:31:58見込みのある青年だな
0058デフォルトの名無しさん
2005/04/25(月) 14:08:06str=a;はエラーになってしまいました。
0059デフォルトの名無しさん
2005/04/25(月) 15:06:46エラーの詳細を述べよ。
0060デフォルトの名無しさん
2005/04/25(月) 16:43:180061デフォルトの名無しさん
2005/04/25(月) 16:46:42普通にconstつけろ。
で、初期化子で初期化しろ。
0062デフォルトの名無しさん
2005/04/26(火) 00:21:38class A
{
const int n;
public:
A( const int k ) : n( k ) {}
};
0063デフォルトの名無しさん
2005/04/26(火) 00:23:00class A
{
const int n;
public:
A() : n( 100 /* 定数 */ ) {}
};
0064デフォルトの名無しさん
2005/04/26(火) 00:55:03わかって書いてるのかもしれないが、引数の const は不要だぞ。
>>63
そこに定数を書くなら、さらに static も付けて
宣言と定義を同時に書いてしまうのがいいだろう。
0065デフォルトの名無しさん
2005/04/27(水) 17:33:080066デフォルトの名無しさん
2005/04/27(水) 19:31:30FOO a, b;
a = b;
0067デフォルトの名無しさん
2005/04/27(水) 19:41:44それって使い方じゃないだろ。訳わからんこと書くな
0068デフォルトの名無しさん
2005/04/27(水) 19:45:56使い方だと思うが。
>66のようなコードを書くと、FOOクラスのコピーコンストラクタが呼ばれるのだから。
0069デフォルトの名無しさん
2005/04/27(水) 20:00:2466のコードだとコピーコンストラクタは呼ばれず、operator =()が呼ばれる。
用途は同じようなものだけど。
007067
2005/04/27(水) 20:55:29FOO a;
FOO b = a;
0071デフォルトの名無しさん
2005/04/27(水) 22:57:30FOO b(a);
0072デフォルトの名無しさん
2005/04/30(土) 03:06:45バカですか?初期化と代入を混同するな。
0073デフォルトの名無しさん
2005/04/30(土) 07:38:310074デフォルトの名無しさん
2005/04/30(土) 22:05:34longjmp巻き戻り時にスタック上にあるオブジェクトのデストラクタの起動は
保障されますか?
それともlongjmpよりthrowの方が良いですか?
0075デフォルトの名無しさん
2005/04/30(土) 22:09:50throwって言いたいけど、なんだか例外と言えなさそうな状況である気配がするな……。
0076デフォルトの名無しさん
2005/04/30(土) 22:15:040077デフォルトの名無しさん
2005/04/30(土) 22:17:40おれも昔、C/C++でSchemeの継続みたいなことしたいと思ったけど、
結局再帰は使わず処理の方を自前のスタックに押し込んで管理した。
理由は仕事だったから。
0078デフォルトの名無しさん
2005/04/30(土) 22:23:37VCはなんかSEHの構造的に保障されてるみたいだけど、
実際は環境・処理系依存っぽい。
どうしても使うならthrowが手段としては安全じゃないかな。
>>77みたいに関数のネスト自体をなくしてしまうという設計の仕方もある。
管理は多少大変だけど確実ではある。
0079デフォルトの名無しさん
2005/04/30(土) 22:32:02とりあえずthrowで作ってみて、時間があったら設計を見直してみます。
一応処理の内容は、ワーカースレッド内でフォルダを再帰的に辿る
処理があって、その途中でGUIからユーザーがキャンセルしたときの
中断をどうするかというものでした。
0080デフォルトの名無しさん
2005/05/02(月) 17:17:10Delphiで言うClass Functionみたいな。
0081デフォルトの名無しさん
2005/05/02(月) 17:19:27> クラスをnewしなくてもよべるメソッドって作れましたっけ?
確実に間違った認識をしてるようだけど、たぶんstaticメソッドがそれに該当する。
0082デフォルトの名無しさん
2005/05/02(月) 17:22:12メソッドと言うな。静的メンバ関数と言え。
0083デフォルトの名無しさん
2005/05/03(火) 01:33:43C言語のプログラム技術は維持しながら、C++というもう一つの技術を学習して、
選択肢を増やすのが正しい道だと思うんだが。
C++の本は、Cのやり方を否定的に書いてるのが多いのが気になるんだが。
そして、まだ完全にCを学んだわけではないのに、C++を学んだからと言って、
あたかもCを卒業したかのように考えるのもおかしいと思うんだが。
0084デフォルトの名無しさん
2005/05/03(火) 02:16:15( ´_ゝ`)スマポ
0085デフォルトの名無しさん
2005/05/03(火) 02:31:39「Cのやり方」にはより良い代替手段が用意された部分が多い。
・ブロック先頭での未初期化変数定義 → 使用箇所での初期化付き定義
・忘れないように気をつけて初期化、破棄 → コンストラクタ、デストラクタ
・関数ポインタ+void*+キャスト → 仮想関数
・なんでもできる危険なキャスト → 限定的、明示的なキャスト
・型チェックの働かないマクロ → テンプレート
・名前のプリフィックス → 名前空間
・戻り値によるエラーチェック → 例外のスロー、キャッチ
この状況でそれぞれの前者が否定的に見られるのは自然。
C++コンパイラが問題なく動作する環境なら、
これらのより良い手段を使うためにC++に移行するのも自然。
Cによるライブラリを使うためとか、C++が使えない環境でも生きていけるように、
また、C++の仕様に対する理解を深めるためにも、
C言語のプログラム技術を学ぶことには大きな意義がある。
Cを卒業したかのように考えるのはただの勘違い。明らかにおかしい。
0086デフォルトの名無しさん
2005/05/03(火) 04:00:19c++には自信あるけどcには自信なかったり。
0087デフォルトの名無しさん
2005/05/03(火) 04:19:410088デフォルトの名無しさん
2005/05/03(火) 04:52:43つい最近まで//がCだと思ってた
0089デフォルトの名無しさん
2005/05/03(火) 08:07:45C99で//も導入されたがな。
0090デフォルトの名無しさん
2005/05/03(火) 20:55:26とは言え、俺はCを否定したい。
たかが定数やインライン関数ごときに#define使ったり、
classもnamespaceもないから関数名に汚いプリフィックスつけたり、
あんな糞環境は一刻も早く消し去るべきだ。
0091デフォルトの名無しさん
2005/05/03(火) 22:32:250092デフォルトの名無しさん
2005/05/03(火) 23:27:59#defineの関数形式マクロのことだろう。
0093デフォルトの名無しさん
2005/05/05(木) 16:32:37Cにもconstはあったはずだが。
0094デフォルトの名無しさん
2005/05/05(木) 20:10:57しかし定数ではないから、たとえば配列変数を宣言するときの要素数に使えない。
0095デフォルトの名無しさん
2005/05/05(木) 20:17:110096デフォルトの名無しさん
2005/05/05(木) 21:05:47可変長配列が使えるのは、ブロックの中か関数引数/プロトタイプの中だけで、
グローバル変数として宣言したり、struct や union の中のメンバとして宣言したり
することはできません。加えて、static や extern 付きの配列は、可変長配列に
できません。
0097デフォルトの名無しさん
2005/05/05(木) 21:12:41それがどうした
0098デフォルトの名無しさん
2005/05/05(木) 21:56:43>>94
0099デフォルトの名無しさん
2005/05/08(日) 10:00:25やはりC〜とすることが多いのでしょうか?
0100デフォルトの名無しさん
2005/05/08(日) 12:37:07関数名みたいに単語の頭を大文字にしているだけ。
0101デフォルトの名無しさん
2005/05/08(日) 17:27:420102デフォルトの名無しさん
2005/05/09(月) 00:38:14クラスも〜_t
0103デフォルトの名無しさん
2005/05/09(月) 03:10:28{
int x;
public:
void InitX( void ) { x = 0; }
}
というクラスAを,
void func( const A& r ) { r.InitX(); }
と引数で constの参照で取るとA::InitX()が const の関数でないので
エラーになるじゃないですか。この引数を、"const A& r" → "A& r"と変更することなしに
対処する方法はないですか? あくまでも func()が直接 class Aを書き換えるわけではないので
納得いかないんですが。
0104デフォルトの名無しさん
2005/05/09(月) 03:14:450105デフォルトの名無しさん
2005/05/09(月) 03:24:56Aと言うクラスの、引き数rとして渡された参照先をInitX()で書き換えるんだからエラーが出て当然。
納得いかないのは学習不足を棚に上げた所為。
0106デフォルトの名無しさん
2005/05/09(月) 04:08:56「あくまでも func()が直接 class Aを書き換えるわけではないので 」
って書いてんだろ。意味わかんねーのか?
なんでそんな偉そうなわけ?
0107デフォルトの名無しさん
2005/05/09(月) 04:12:04じゃあついでに質問してやるが、
allocator::construct(pointer p, const T& val)
の実装をせよ。
0108107
2005/05/09(月) 04:32:21どうもすみませんでした。
0109105
2005/05/09(月) 04:43:11自分の学習不足を棚に上げた所為でした。107様には、心よりお詫び申し上げます。
>>108 で成りすましをしてごまかそうとしましたが、自分はなんて卑劣な人間なんだろうかと
今、恥ずかしくて死にたい心境です。これより精進し、allocator::construct
位普通に実装できるような普通のPGにならなければならないと反省しております。
0110デフォルトの名無しさん
2005/05/09(月) 04:43:40class A {
int x;
public:
void InitX( void ) { x = 0; } // 定義(1):OK
static void InitXS( const A& r) { x = 0; } // 定義(2):NG(constは変更できない)
};
static void func( const A& r ) {
r.InitX(); // (1)の呼び出し:NG (たぶんthisはconstであるべきではない)
r.InitXS(r); // (2)の呼び出し:OK
}
int main() {
A a;
const A& ar = a;
func(ar);
}
0111デフォルトの名無しさん
2005/05/09(月) 04:55:25とは、class Aのメソッド InitX のシグネーチャが、
○ void A:InitX(A& this);
× void A:InitX(const A& this);
ということ
0112デフォルトの名無しさん
2005/05/09(月) 04:56:370113デフォルトの名無しさん
2005/05/09(月) 05:13:47wwwwwwwwwwwwおkwwwwwwwwwおkwww
うはっwwwうぇwwwっwwwwww
www
うぇwwwうぇwwwっwっうぇうはっwwwうぇwww
0114デフォルトの名無しさん
2005/05/10(火) 04:17:190115デフォルトの名無しさん
2005/05/10(火) 04:21:320116デフォルトの名無しさん
2005/05/10(火) 04:26:140117デフォルトの名無しさん
2005/05/10(火) 04:59:41void func(const char* str)
{
cout <<"const"<<endl;
}
void func(char* str)
{
cout << "not const" << endl;
}
/*できなかったもの
void func(const char* const str);
void func(char* const str);
*/
int func2(int i)
{
}
//int func2(const int i);はできなかった。
func("moji")ではconstは表示されない。
tukareta・・・おやすみなさい
0118デフォルトの名無しさん
2005/05/10(火) 05:18:19wwwwwwwwwwwwwwwwwwwwwwwwっ
wっ
wwwっっうぇwwwっうぇうぇwww
っうぇwww
っwwwwwwwwwwwwwwwwおkwww
0119デフォルトの名無しさん
2005/05/11(水) 15:48:59void func(const T foo);
と
void func(T foo);
は呼び出し側にとっては区別がつかないのでオーバーロードできない。
従って同様に、
void func(char * str)とvoid func(char * const str)、
void func(const char * str)とvoid func(const char * const str)
はそれぞれオーバーロードできない。
0120デフォルトの名無しさん
2005/06/04(土) 14:34:37ムズイ・・。
0121デフォルトの名無しさん
2005/06/04(土) 14:39:32いきなり詰め込んでも身にならない。
使ってみて、「あ、これ使うと、こーゆーことができるんだー」ってのに気がつけば習得したといえる。
C++に限らん話。
0122デフォルトの名無しさん
2005/06/04(土) 15:33:11単純に、構造体をクラスに置き換えればC++だと思って、
軽い気持ちで始めようとしたら、練習本が500ページもありやがる orz
一週間で余裕だぜ!とか思ってた自分が恥ずかしい。。
0123デフォルトの名無しさん
2005/06/04(土) 16:50:28> 単純に、構造体をクラスに置き換えればC++だと思って
いるうちは恐らくC++は使いこなせない。
Cを構造化言語として使っていたのなら数回の劇的なパラダイムシフトを繰り返して
ようやっとC++の言語としての機能を全部使いこなせるようになるですよ。
一年くらいかけてゆっくりそして確実に行くのが良いかと存ずる。
0124デフォルトの名無しさん
2005/06/04(土) 17:54:22っと。
>>123
>使いこなせない・・
そうですか。あぁ orz
取り合えず、500ページ終わらせてみます。
てゆか、500ページ終わる頃には
最初の200ページ分ぐらい完全に忘れてて、
途方にくれる予感もビシビシしてるんですけどねえ。。
現在137ページ。
参照仮引数引渡しとか、、もう全部ポインタ渡しでいいやん (´・ω・`)
0125デフォルトの名無しさん
2005/06/04(土) 18:14:090126デフォルトの名無しさん
2005/06/04(土) 18:32:45あー、参照となんの関係があるのかわかんねー orz
うへへ、500までがんばりまっす (`・ω・´)
0127デフォルトの名無しさん
2005/06/04(土) 19:08:12C++やそれより後の言語には演算子オーバーロードというものが存在する。
例えばstd::cout << 〜;というのも<<演算子のオーバーロード。
std::coutはstd::basic_ostreamクラスのオブジェクトであるが、std::basic_ostreamのメンバには
basic_ostream& operator <<(int n);
basic_ostream& operator <<(const char *);
と言った具合に並んでいる。
そしてstd::cout << 5 << "個";という式は(cout << 5) << "個";と解釈されまず5を引数にしてoperator <<が呼ばれる。
この戻り値は元のオブジェクト自身への参照を返すので次にcout << "個"ということになる。
0128デフォルトの名無しさん
2005/06/04(土) 19:13:33だから、<<出力演算子や>>入力演算子が適用される度に(inlineで
なければ)毎回関数CALLが起きるわけで、ここら辺がCのprintf()、scanf()
に比べて弱点だと言われてるけど、逆に言えば出力(入力)書式はコンパイル時
に既に決定しているので、解析する必要がない。
Cでもprintf/scanfは動作が重い関数の内に入る。C++になって、俺は入出力
が遅くなるという理由で<< >>を使わなかった事はない。
0129デフォルトの名無しさん
2005/06/05(日) 13:00:49>>126です。丁寧な説明感謝です。
とりあえず、
int g_a;
int & func()
{ return g_a; }
ってやって、
main()
{ func() = 10; }
で、func()の返したアドレスの場所に
値が代入できることまではわかったのですが、
これをどううまく使えるのかがわからず・・
私のレベルでは無理なようなので、引き続きお勉強しまっす。
ありがとうございました m(__)m
0130デフォルトの名無しさん
2005/06/05(日) 13:30:21あと関数の仮引数ではポインタ渡しに比べて呼ぶ側がいちいち変数に&をつける必要がなくなる。
特に今までクラス・構造体のconstポインタ渡しだったものをconst参照にすると、
呼ぶ側も呼ばれる側もポインタ渡しを意識する必要がなく、あたかも組み込み型の値渡しのように扱える。
0131デフォルトの名無しさん
2005/06/05(日) 13:34:00ポインタにはNULLポインタが存在するが、参照にはそのようなものは存在せず、
常に何かを指していると思って扱えるのでいちいちポインタ引数のNULLチェックをする手間も無くせる。
0132デフォルトの名無しさん
2005/06/05(日) 14:29:02なるほど。使う側の混乱をちょっと抑えられるかもですね。
てことは、Cでポインタ渡ししてた場面でも、
C++では参照渡しを積極的に使ったほうがいいんでしょうか?
0133デフォルトの名無しさん
2005/06/05(日) 15:48:10ポインタは 参照 と イテレータ っていう2つの役割がごっちゃになってる物だから、ポインタの負担は軽くしてあげたほうがコードが読みやすくもなるはずだ。
実際にはそのうちオブジェクトの所有権とか考え出すとスマートポインタとかを使う場面が多くなると思うので
そんなに気にしなくてもいいと思うけど。
簡単にまとめると「参照で困らないときは参照を使え」だな。
0134デフォルトの名無しさん
2005/06/05(日) 20:06:21どうもありがとー。
私が今お勉強してる本には、
参照とは、基本的には暗黙的なポインタ定数の事で、実質的には
ほかの変数または引数の別名として使うことができます。
参照仮引数を使う利点として、引数のコピーが作成されない
ということが挙げられます。
と、ありました。
コピーが作成されないってことは、
速度的にも問題なさそうですね。
速度はポインタと同じかな?
うし、これからバリバリ使うことにしまっす (`・ω・´)
スマートポインタとか、イテレータってのは
なんのことかわからずww
0135デフォルトの名無しさん
2005/06/05(日) 20:56:01ポインタ「定数」ってのはおかしいな。参照は変数だ。
参照は結局内部ではポインタで実装されている.
これは間違っていない。そうでない処理系なんて聞いたことない。
0136デフォルトの名無しさん
2005/06/05(日) 20:59:18ポインタ定数と書いたのではなかろうか
0137デフォルトの名無しさん
2005/06/06(月) 11:50:40Function(g, 〜) で
void Function(float g ,〜〜〜) の方にワーニングなしで送れるってのはVCの仕様ですか?
0138デフォルトの名無しさん
2005/06/06(月) 16:52:45警告Lvを上げたら警告されると思うのだが。
0139デフォルトの名無しさん
2005/06/07(火) 18:21:05もうコンストラクタとデストラクタは無くていいよ
これがあるせいで、ややこしいこと多すぎー
0140デフォルトの名無しさん
2005/06/07(火) 18:44:06少なくともコンストラクタ・デストラクタは大したことないと思うけど。
ローカル変数を宣言した or newしたときにコンストラクタが呼ばれて、
ローカル変数のスコープを抜けたとき or newしたポインタに対してdeleteを呼んだときにデストラクタが呼ばれる。
ようするにそんだけでしょ。たった2行。
例えばうまく使った例では
std::auto_ptrクラスはコンストラクタでnewしたポインタを受け取り、デストラクタでdeleteを呼んでくれる。
だからdeleteし忘れによるメモリリークを防ぐ手当てになる。
0141デフォルトの名無しさん
2005/06/07(火) 19:19:12わかりやすい説明どうもです。
コピーコンストラクタの説明でちょっとキレちゃって ^^
オブジェクトを引数にしたり、
戻り値にして代入しようとしたりすると
呼ばれるとか呼ばれないとか言われて、、あああー!
0142デフォルトの名無しさん
2005/06/07(火) 19:21:41C++ではそのようにしてテンポラリのオブジェクトが作られることも良くある
0143デフォルトの名無しさん
2005/06/07(火) 22:17:16つまりこういうこと?
class hoge {};
int main()
{
hoge a, b; //aとbに対してそれぞれコンストラクタが呼ばれる。
hoge c = a; //cに対してコピーコンストラクタが(aを引数にして)呼ばれる。
b = a; //bは今ここで変数宣言したわけではないのでコピーコンストラクタは呼ばれない。
} //もちろんここでa, b, cのデストラクタが呼ばれる。
0144デフォルトの名無しさん
2005/06/08(水) 16:55:28そですね。
あと、
myclass func ();
って関数つくって、
myclass ob1;
ob1 = func();
というふうに戻り値を代入したときとか、
void func (myclass ob);
って宣言して、
myclass ob1;
func(ob1);
てな感じで引数にしたときなんかも
呼ばれるみたいです
まだほかにもありそうだし・・勘弁して欲しいよ。
0145デフォルトの名無しさん
2005/06/08(水) 17:09:32関数の戻り値は結局143の話と同じ。変数が関数の戻り値に置き換わっただけ。
関数定義の時、仮引数はブロックの頭で宣言された変数という扱いで、そこへ実引数を元にコピーコンストラクタが起こる。
あんまり神経質にならなくてもコピーコンストラクタかoperator =()のどっちかが呼ばれると思っておけばいい。
0146デフォルトの名無しさん
2005/06/08(水) 17:47:29どもです。
実際使い始めたら、後からクラスに付け足した変数とか
コピーコンストラクタに入れ忘れたりしそうで怖いよお。
operatorってのは、まだお勉強中なのでわかりません。
そこまで行ったら、また違う景色が見えるのだろうか。
0147デフォルトの名無しさん
2005/06/08(水) 17:59:46operator =()ってのは>>143-144の例でコピーコンストラクタが呼ばれないときに呼ばれる関数。
そのうち出てくると思うけど。
0148デフォルトの名無しさん
2005/06/09(木) 01:10:360149デフォルトの名無しさん
2005/06/09(木) 05:53:44勿論operatorですとも。
0150デフォルトの名無しさん
2005/06/09(木) 21:09:170151デフォルトの名無しさん
2005/06/10(金) 17:50:43>>127さんの書き込みが、やっと少しだけ理解できるようになったよー。
てゆか、こんなん自分で定義しまくったら、組んだ人以外
ワケワカメになりそうだけどなあ。
0152デフォルトの名無しさん
2005/06/10(金) 22:59:59うまく使えば便利。
例えば文字列クラスに+=や+とか不等号演算子での比較
複素数や多倍長整数に四則演算など、配列クラスに[]
リストの全要素へのアクセスにポインタっぽく演算子をオーバーロードしたクラスを使ったり
0153デフォルトの名無しさん
2005/06/11(土) 00:57:57抽出とか分割をやり始めると自分でも混乱する羽目に陥る罠。
0154デフォルトの名無しさん
2005/06/11(土) 01:03:431) operator=はデフォルトで作られてしまうから、その動作でまずい場合は
正しい実装をするか、単にprivateにする
2) STLなどのテンプレートライブラリでクラスを使う場合、特定のoperatorの
存在が必要になる場合がある
ってとこかな。
0155デフォルトの名無しさん
2005/06/11(土) 20:03:24何でもやっちゃうクラスやら
何でもできちゃうインターフェイス(プロトコルクラス)を作ったら
実際、わけわかんなくなる。
クラスの役割と責任をしっかり考えて分離すれば問題ない。
0156デフォルトの名無しさん
2005/06/11(土) 20:53:46int func(string& str)やfunc(string str)に対して、
func(string("str"))は通るのですが、
func(int i, string& str)やfunc(int i,string str)に
対して同様のことを行うと
func(int,string)に相当する関数が見つからない
という感じのエラーが出てしまいます。
理由がわかりません。
それから、これ( class名+() )の名称か何かを見かけ
た気がするのですが、メモとり忘れてて、調べように
も調べることができません。
よろしくお願いします。
0157デフォルトの名無しさん
2005/06/11(土) 23:35:47エラーになったコードを見せてくれないと答えようがない。
型名()ってのは一時オブジェクト作成とか関数スタイルキャストとかコンストラクタ呼び出しなどと言われる。
クラスに限らず、intなどの組み込み型や構造体などにも使える。
0158デフォルトの名無しさん
2005/06/12(日) 00:25:21int func(string& str);
に、func(string("str")); は通らん。右辺値じゃないか。
0159デフォルトの名無しさん
2005/06/12(日) 00:39:38VC++の独自拡張だけど
0160デフォルトの名無しさん
2005/06/12(日) 00:43:19想定外の挙動になるよな
まあ本来const リファレンスにすべきものであったなら、問題は
なかろうが。
0161デフォルトの名無しさん
2005/06/12(日) 01:39:590162デフォルトの名無しさん
2005/06/12(日) 11:59:24long& に値を返す関数に int 変数を渡したときとか、死ねる予感。
0163デフォルトの名無しさん
2005/06/12(日) 16:39:180164デフォルトの名無しさん
2005/06/12(日) 20:47:40えーと、、、何故かエラーが再現不能になりました。
本当にすいません。
BCB5を使用しているのですが、
string func(string& a, string& b){a+=b;b+=a;return b;}
に対して
cout << func(string("ma"),string("to")) << endl;
cout << func("111","222") << endl;
としても、「一時変数を作成する」という警告(多分string)が二つだけで
通るようです。
これはやはり問題有りなのでしょうか。
0165デフォルトの名無しさん
2005/06/12(日) 20:57:41string c = "ho", d = "ge";
func(c, d);
こういう風にでもすれば実引数が書き換えられているのを確かめられるが、
164コードではにするとそれができないという警告。規格でも駄目ということになっているし。
0166デフォルトの名無しさん
2005/06/12(日) 21:00:35標準に準拠したコンパイラでエラーになるという問題が有る。
0167デフォルトの名無しさん
2005/06/12(日) 21:37:18結局のところ164のように書くべきではないみたいですね。
有り難うございました。
0168デフォルトの名無しさん
2005/06/14(火) 14:19:22文字列の連結やコピーをする↓のクラスをつくってみました。
http://www.vipper.org/vip30009.txt
operator += はたぶんできたのですが、
operator + のとこで悩んでいます。
cStrType & cStrType::operator + (const cStrType &ob)
{
cStrType temp;
strcat(str, ob,str) // 文字くっつける
strcpy(temp.str, str); // くっつけた文字をtempに入れる
・
・
return temp;
}
↑みたいにやりたかったのですが、
cStrTypeクラスには、文字列がもう一個あって、
それはオブジェクト自体の名前が入ってるんです。
↑のようにtempを返してしまうと、代入先のオブジェクトの名前が
変更されてしまうのですが、
こういう場合はどうすればいいんでしょうか?
わかりにくいプログラムですみませんが、どなたかお願いします m(__)m
0169デフォルトの名無しさん
2005/06/14(火) 18:16:28ソースはよく見てないが、 += が出来たのなら
cStrType & cStrType::operator + (const cStrType &ob) {
return cStrType(*this) += ob;
}
でいいような気がする。
ソースを見たらコピーコンストラクタ無かったっぽいから、それを定義するか、
cStrType tmp;
tmp = *this;
tmp += ob;
return tmp;
だな。
+ と += みたいなのは1つ定義したらそれを使って他を定義するのが基本だと思う。
0170デフォルトの名無しさん
2005/06/14(火) 18:21:21operator + が返すのは参照じゃなくて実体だから、
戻り値の型は cStrType& じゃなく cStrType な。
0171デフォルトの名無しさん
2005/06/14(火) 18:29:14operator !=をoperator ==の戻り値を ! で反転させて作るのもよくやる。
0172168
2005/06/14(火) 19:25:55おー、それは楽ちんな感じですね。
似たやつは即利用できるのか。
ちょっと質問とはかけはなれてるっぽいんですが、
凄い便利そうなので、明日あたり>>168のを簡略化して、
>>169-171を組み込んでみまっす!
クラスって、自分で始めて本とか極力見ないで組んでみたんですが、
普通の構造体とかと違って、作る前に考えなくちゃ
いい動きするヤツはできないっぽいですね。。
>>168のを作ってる途中、何回か破綻して、
つくり直しましたよ ^^
あー、早く使いこなせるようになりたい。
れすさんくすです。
0173168
2005/06/15(水) 18:07:05モロ>>169と一緒になっちゃったんですが
http://www.vipper.org/vip31149.txt
どもです m(__)m
それで、あの、ちょっと質問なんですが、
return cStrType(*this) += ob;
↑でもいけるようなのですが、
これはなにをやってるんでしょうか?
return *this += ob;
↑だと *this の値にも影響を与えちゃうんでダメなのですが、
return cStrType(*this) += ob;
↑だとOKってことは、、、、、なんだろ??
0174デフォルトの名無しさん
2005/06/15(水) 18:15:23cStrType(*this)でオブジェクトを生成している。
0175デフォルトの名無しさん
2005/06/15(水) 18:20:01return cStrType temp = *this += ob;
みたいな感じなんでしょか?
うーん、新しい。
0176デフォルトの名無しさん
2005/06/15(水) 18:26:01微妙に違う。それでは*thisが変更されてしまう。
むしろ、
cStrType temp = *this;
temp += ob;
return temp;
0177デフォルトの名無しさん
2005/06/15(水) 18:30:20あー、そっか ^^
でも、変数名すら決めてないオブジェクトが
返るなんて、不思議っちゅーか、便利っちゅーか
使いこなせる自信はないですな・・。
0178デフォルトの名無しさん
2005/06/15(水) 18:53:02podと同じように考えたら?
ex.
double func(int v) {return double(v);}
0179デフォルトの名無しさん
2005/06/15(水) 19:15:12型キャストとも違いますよね return (double)v
普通のC言語からあったんでしょうか。
pod と ex. ってのも、意味不明なんですけど (T_T)
0180デフォルトの名無しさん
2005/06/15(水) 19:34:03・POD
as Plain-Old-Data
ttp://www.informit.com/guides/content.asp?g=cplusplus&seqNum=32
・ex.
=for example.
0181デフォルトの名無しさん
2005/06/15(水) 19:45:14ご親切に、どもです。
ex.の方は把握。
plain old data の方は、
なんとか日本の解説ページを探してみます。
お手数をかけてしまって、マジすみません orz
0182デフォルトの名無しさん
2005/06/15(水) 20:23:42void main(void)
{
while(1)
printf("ぬるぽ\n");
}
0183デフォルトの名無しさん
2005/06/15(水) 21:06:29これの1番はどうして?
0184デフォルトの名無しさん
2005/06/15(水) 21:07:58全部先頭で宣言してたら発狂しそうになって困るだろ
0185デフォルトの名無しさん
2005/06/15(水) 21:12:15途中で宣言すると「iって宣言したっけなぁ」とか分かんなくなるので、
先頭で宣言すること多いんだけど、明確な理由があればスタイルを
変えようと思っております。(そもそもそんな長い関数書くなは置いと
いて)
0186デフォルトの名無しさん
2005/06/15(水) 21:32:23{
if(!flag)
return;
socket x("127.0.0.1, 80); // 先頭においても初期化に時間がかかるが全くつかわれない
vector<string> y(10000); // これも重い
}
すべて先頭で宣言すると、重いクラスやら、時間食うクラスなんかの不必要な
初期化コストがかかってしまい、宣言しても使わないのなら無意味に重くなるのだそうな。
0187デフォルトの名無しさん
2005/06/15(水) 21:39:27PODはようするにCでもそのまま使える構造体・クラス・共用体のこと。
参照型メンバ変数・operator =()・デストラクタ・非PODメンバ変数の存在しない構造体・クラス・共用体が該当する。
0188デフォルトの名無しさん
2005/06/15(水) 23:43:38先頭で宣言するスタイルを C++ で貫こうとすると、
・初期化をしないことが珍しくなくなるので、初期化忘れの危険が増える。
・コンストラクタで重要な処理を行うクラスが扱いにくくなる。
・クラス作成時に意味無くデフォルトコンストラクタが要求される。
・初期値が決まったタイミングで「代入」が必要になるので、
・「代入」できない型では通用しない。
・ローカル変数に const を付けることが不可能になる。
デメリットしかないな。
0189デフォルトの名無しさん
2005/06/16(木) 12:21:20#include "CMyChar.h"
class CMyWeapon
{
public:
CMyWeapon();//コンストラクタ
virtual ~CMyWeapon();//デストラクタ
void Init();/●初期化●
void Process(CMyChar* pMyChar);//★メイン処理★
};
このProcessで [error C2061: 構文エラー : 識別子 'CMyChar' がシンタックスエラーを起こしました。]
となってしまいます。
includeしてますし・・構造体のようには使えないんでしょうか?
ちなみに参照を使っても同じエラーが出ます
レスをよろしくお願いします
0190デフォルトの名無しさん
2005/06/16(木) 12:36:05CMyChar.hを晒せ。
0191デフォルトの名無しさん
2005/06/16(木) 12:36:40>void Init();/●初期化●
これは何かの冗談か?
0192189
2005/06/16(木) 12:42:40#include <d3d9.h>
#include <d3dx9.h>
#include "Global.h"
#include "CMyWeapon.h"
class CMyChar
{
private:
int w;//キャラ幅
int h;//キャラ高さ
public:
float x;//自キャラ 左上座標 X
float y;//自キャラ 左上座標 Y
float vy;//VX
float vx;//VY
〜変数宣言が続きます〜
CMyChar(float xpos,float ypos,float vecx,float vecy,int width,int height,int tex,int tey);
virtual ~CMyChar();
void Init();//●初期化●
void Process();//★メイン処理★
void Move();//移動と移動の制限
void Scroll();//スクロール管理
〜以下関数が続きます〜
};
です privateをpublicにしてみましたが同じエラーが出ました
>>191 すいません /を1個削りすぎましたw
0193デフォルトの名無しさん
2005/06/16(木) 12:52:26> #include "CMyWeapon.h"
これだろ。要らないなら消せ。
0194189
2005/06/16(木) 12:55:46前にincludeしたのをそのままにしてました・・・スレ汚しすいませんでした
0195デフォルトの名無しさん
2005/06/16(木) 19:41:59(今回のとはちょっとずれるが)
VC使いなら#pragma once使え。
使う理由も考えてな。
0196189
2005/06/16(木) 20:00:08クラスはいつも右クリしてクラスを作成してますのでデフォルトでついてます。
0197デフォルトの名無しさん
2005/06/16(木) 22:01:520198データボックス
2005/06/17(金) 01:11:22のような気もする。そして、初期化忘れの危険もあるかも知れないが、そこらへん
は、しっかりしていて不注意を犯さない人間であるという前提でコーディングでき
るようでないとだめじゃないかとも思うし。
VBは手続きや関数の先頭以外でも宣言できるのは知ってるが、先頭でしか宣言した
ことがない。
また、その一方で、Cでは関数の先頭で変数の宣言をしているものばかりで、関数より
も内側のブロック内の先頭で宣言するのは、あまり一般的ではないようで、俺自身は
まだそういうソースコードを目にしたことはない。メモリやパフォーマンスで問題
になるときなど、場合によっては、それを使わない手はないと思うが、世の中には、
ちゃんとそういうソースコードもあるのかな。
0199デフォルトの名無しさん
2005/06/17(金) 01:23:07>>188をちゃんと読んだのか?「だらしない」とかそういう問題じゃないんだよ
C++では。
コンストラクタというものが存在しないCのような言語では関係のない話だがな。
0200データボックス
2005/06/17(金) 01:38:420201デフォルトの名無しさん
2005/06/17(金) 01:55:34そういうコードは例外安全じゃないんで現在のC++プログラミングでは
推奨されない。
0202デフォルトの名無しさん
2005/06/17(金) 01:57:140203デフォルトの名無しさん
2005/06/17(金) 01:58:31「newとdeleteしてる」だけで「例外安全じゃない」と言えるの?
0204デフォルトの名無しさん
2005/06/17(金) 02:09:05まあ言えないかもしれないわなあ
*大抵は*例外安全じゃないけど
0205デフォルトの名無しさん
2005/06/17(金) 02:11:30Cでブロック内部での変数定義を余り見掛けないのは、まさしくあんたみたいな技術者が多いから。
ましてCommonCの時代の人間は変数の使い回しも含めて、まさにマクロアセンブラ的に書く。
逆に、C++慣れしているプログラマはCでもブロック内で定義している。
0206デフォルトの名無しさん
2005/06/17(金) 11:50:29ブロック内定義はソースの見通しという意味でも漏れもCであっても積極的に使っているけど、
使いまわし変数の不要な文脈依存性が減って
オプティマイズもかかりやすくなるような気がするがどうなんだろう。
0208デフォルトの名無しさん
2005/06/17(金) 14:57:20クラスを使うメリットがよくわかりません。誰かわかりやすく教えてくださいお願いします
0209デフォルトの名無しさん
2005/06/17(金) 15:08:26int arr[10000];
for(i=0;i<10000;i++){
int *p=&arr[i];
}
こんなのはどうなんだろ。最適化してくれるのかな
0210デフォルトの名無しさん
2005/06/17(金) 15:18:33一番エキセントリックな最適化をさせると、おおよそ次のようなコードと同等に最適化すると思われ。
int i = 10000;
int arr[10000];
0211デフォルトの名無しさん
2005/06/17(金) 15:22:58すまん例が悪かった
int i;
int arr[10000];
for(i=0;i<10000;i++){
int *p=&arr[i];
dosomething(p);
}
とした時にループする毎にint *pをスタックにpushして使い終わったらpopして・・
とかバカ正直にしないだろうなと思って
やっぱり関数入り口でいっぺんに確保して使いまわすのかなとか
0212208
2005/06/17(金) 15:45:390213デフォルトの名無しさん
2005/06/17(金) 16:01:140214デフォルトの名無しさん
2005/06/17(金) 16:09:10ヒント:オブジェクト指向プログラミング
調べてもなおメリットが感じられないのならば、Cを使い続けろ。
0215208
2005/06/17(金) 16:13:17調べても、とかほざいてるあたりお前はただ適当に使ってるだけなんだろうな
0216デフォルトの名無しさん
2005/06/17(金) 16:19:11情報(この場合はおまいの理解)小出しにするなよ、アフォ。
何が分からないのか書かない限り答えられねーだろ。
おまいの理解が「ただ何の変数使ってるか分かりやすくなるだけ」
程度のものだったら、なおさら「オブジェクト指向」とは何たるかを勉強しろボケ。
0217デフォルトの名無しさん
2005/06/17(金) 16:20:02多くの人はデフォルトで安全をとる。それだけのことじゃん。
0219208
2005/06/17(金) 16:28:01ちゃんちゃら可笑しいぜwwwwwww結局はお前が一番理解してないから説明できないだけだろうがwwwwwカスがでしゃばんなよタコ
0220デフォルトの名無しさん
2005/06/17(金) 16:31:510221デフォルトの名無しさん
2005/06/17(金) 16:33:51コンパイラは一般的に、ブロック内変数を関数ローカルのスタックに確保する。
但し、レジスタで事が足りたり最適化で消える場合はその限りではない。
そのロジックではループ部は恐らく、
for (i = 0; i < 10000; ++i) {
dosomehing(& arr[i]);
}
と同等のコードになる。
いずれにしても、ブロックの出入りでスタック操作することはない。
>>213
10年以上制御系に携わってきた人のC++のコードの実例(抜粋)
for (char * tret = (char *) -1; tret != NULL; i++) {
tret = fgets(..., fp);
...;
if (...) {
tret = NULL;
}
}
...;
if (...) {
tret = (char *) -1;
}
...;
if (tret == NULL) {
...;
}
>208=>215なら釣りか。
0222208
2005/06/17(金) 16:40:500224208
2005/06/17(金) 16:54:09他と同様、カスであることに変わりはないんだから無理すんなwww
0225デフォルトの名無しさん
2005/06/17(金) 17:02:14http://pc8.2ch.net/test/read.cgi/tech/1118072681/l50
0226デフォルトの名無しさん
2005/06/17(金) 17:09:50>>221はとてもC++のコードには見えないなぁ。
fgets()はいいとしても、Cスタイルのキャストとか。
そもそもまともなC++コンパイラだと>>221はコンパイル通らないよね。
(forブロックの位置が違うというのはそのこと?)
というか、このソース晒しのポイントはどこにありまつか?
0227デフォルトの名無しさん
2005/06/17(金) 17:37:07いい加減余所でやってくれんかな…。
0228デフォルトの名無しさん
2005/06/17(金) 17:47:40>221のfor以下のコード全体がforブロックね。
で、ループ継続条件はそれようにbool変数でも用意すればいいのに
わざわざここまでポインタ変数使い回す辺りが気色悪いと言う話。
#char *に-1を代入するなんてねぇ。
0229デフォルトの名無しさん
2005/06/17(金) 19:55:31Cのスレからやってきました。
suffixarrayのC++Verなのだそうですが
C++が少ししか分かりません。
どなたかCに書き換えていただけませんでしょうか
vector<int> make_suffixarray(const string& str) {
vector< pair<string, int> > v;
for (int i = 0; i < str.size(); ++i)
v.push_back(pair<string, int>(str.substr(i), i));
sort(v.begin(), v.end()); // sort by first elements
vector<int> suffixarray;
for (int i = 0; i < v.size(); ++i)
suffixarray.push_back(v[i].second);
return suffixarray;
}
0230デフォルトの名無しさん
2005/06/17(金) 20:11:26むずかしいからやだ
0231デフォルトの名無しさん
2005/06/17(金) 20:16:45#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct pair { const char *s; int n; };
int cmp(const void *a, const void *b)
{
const struct pair *aa = a;
const struct pair *bb = b;
return strcmp(aa->s, bb->s);
}
size_t make_suffixarray(const char *str, int *array)
{
size_t i;
size_t len = strlen(str);
struct pair *holder = malloc(sizeof(struct pair) * len);
for (i = 0; i < len; ++i) {
holder[i].s = str + i;
holder[i].n = i;
}
qsort(holder, len, sizeof(struct pair), cmp);
for (i = 0; i < len; ++i)
array[i] = holder[i].n;
free(holder);
return len;
}
0232デフォルトの名無しさん
2005/06/17(金) 20:17:43ありがとうございます。
勉強したいと思います
0233デフォルトの名無しさん
2005/06/18(土) 01:50:440234デフォルトの名無しさん
2005/06/18(土) 01:59:180235233
2005/06/18(土) 02:10:48その場合クラス定義の中身のみ 関数の実体部のみ 両方 のどれでしょうか?
全て試したのですがどれもエラーも警告も出なかったのでどれが正しいのか分からなくなりました
0236デフォルトの名無しさん
2005/06/18(土) 06:25:27なぜ、コンパイルされた後どういうコードになってるか調べないかの〜。
IDE上だと.sファイル作らないからかの〜。
ちょっと年取りすぎたかの〜。
0237デフォルトの名無しさん
2005/06/18(土) 07:06:42読めないんだよ、きっと。
VC++だってプロジェクトの設定などで設定できるんだけどね。
>>233
inline指定はヒントにしかならないので要注意。
#確かbccだと「インラインにできない」警告が出たと思うが。
0238デフォルトの名無しさん
2005/06/18(土) 08:55:19BCCのinlineにできない警告はメンバ関数を外に書くだけでは出ない。
繰り返しとかswitchとかクラスなどを値渡ししたりとかそういうことをすると出てくるものだったはず。
0239237
2005/06/18(土) 09:18:57ヒントにしかならないから、inline化できないことがある。
ということで。
0240デフォルトの名無しさん
2005/06/18(土) 12:03:56ある特定の環境下での実際問題な話だけなら良いが、
言語自体について語るなら、それじゃ困るって事じゃねーの?
さすがに必要ならやれる人だっているだろ。
0241デフォルトの名無しさん
2005/06/18(土) 12:13:35言語自体について語るなら、inlineキーワードはただのヒントであって
実際にインライン化されるかどうかは実装系による、ということで
終了な訳だが。
0242デフォルトの名無しさん
2005/06/18(土) 12:19:10それが>>233に対する答えになるわけ無いだろ。
0243デフォルトの名無しさん
2005/06/18(土) 12:21:11インライン呼び出しされたりされなかったりするから、
全ての読み出し箇所を調べる必要がある。
0244デフォルトの名無しさん
2005/06/18(土) 12:27:02どれでも間違いじゃない。ただ、両方に書くのは冗長。
インライン関数であるかどうかが実装の詳細である
という見方をすれば、宣言に書かずに定義に書くのがいいだろう。
逆にインライン関数であることが重要なのであれば、宣言に書くことも考えられる。
後者の場合はクラス定義内で関数定義することで済ませるのが一般的。
0245デフォルトの名無しさん
2005/06/18(土) 17:40:43その inline 関数が static なデータを使っているときに、おかしな答になるので要注意
bc は、そんな inline 関数は inline にはしないのでだいじょうぶなのだが。。
vc は自分で注意する必要あり。
0246デフォルトの名無しさん
2005/06/19(日) 00:05:03引数iが0以外のときはファイルに文字を出力したいのですが、
あまりいいのが思いつきません。
bool func(int i=0){
ostream * const out = (i)? new ofstream("out.txt"):&cout;
/*ファイル開く失敗の処理がわからない*/
if (ファイル開けない) return false;
文字とかを出力したりする。
*out << .....
if (out!=&cout) delete out;//この部分が見苦しい気がする。
return true;
}
それと、
new ofstream(1)とかできるものもあるようですが、この場合
デリートしても大丈夫なのでしょうか。
お願いします。
0247デフォルトの名無しさん
2005/06/19(日) 00:15:14引数をstd::ostream&で受けるようにしたらどう?
あとファイルオープンが失敗したかどうかにはgood()がある。
0248デフォルトの名無しさん
2005/06/19(日) 01:00:500249デフォルトの名無しさん
2005/06/19(日) 02:19:30レス有り難うございます。試してみました。
bool func(const string& str=string("no string"),ostream& out=fstream("out.txt"))
{
if (out.good())
{
out <<str << endl;
}
else{cerr << "ふあいるあかない"<< endl;return false;}
return true;
}
こんな感じでよいのでしょうか。
それと!fstreamというのを見つけました。これはgood()とほぼ同じなのでしょうか。
bad()というのがあるようですが、good()と反対の機能でしょうか。
(fstream(1)としてファイルに出力する場合のみclose()してopen("out.txt")したかったの
ですが、これはうまくいきませんでした。)
0250デフォルトの名無しさん
2005/06/19(日) 04:01:54参照の配列はないけれど配列の参照はある
0251デフォルトの名無しさん
2005/06/19(日) 04:27:515×5×5の立方体型配列のうち、表面にある要素は1.0、
内側にある要素は0.0として、適当なアルゴリズムに従い
内側に熱が伝わっていくようなものです。
それで、まずC言語で
int i,j,k;
int count=0;
double a[5][5][5];
double ***s;
s= (double***)malloc(125*sizeof(double**));
for(i=0;i<5;i++)
{
s[i]=(double**)malloc(25*sizeof(double*));
for(j=0;j<5;j++)
{
s[i][j]=(double*)malloc(5*sizeof(double));
for(k=0;k<5;k++)
{
if(i==0 || j==0 || k==0 || i==4 || j==4 || k==4)
{
s[i][j][k]=a[i][j][k];
}
}
}
}
などとして、sを計算結果を一時的に溜める配列にするのは成功しました
0252251
2005/06/19(日) 04:31:54int i,j,k;
double a[5][5][5];
double ***s;
double ***s=new double **[5];
for(i=0;i<5;i++)
{
double **s=new double*[5];
for(j=0;j<5;j++)
{
double *s=new double[5];
}
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<5;k++)
{
if(i==0 || j==0 || k==0 || i==4 || j==4 || k==4)
{
s[i][j][k]=a[i][j][k];
}
}
}
}
などとしても、最初のdouble *s=new double[5];の部分で「sに代入した値は使われない」
というエラーが出てしまいます
0253251
2005/06/19(日) 04:33:56同じ形式で作ったら動かずショックでした。
2重ポインタまでは参考資料を見ながらCでもC++でも
出来たのですが、3重ポインタをC++で使う段階で困っております
どのようにして解決できるでしょうか。ご教示お願いします
0254デフォルトの名無しさん
2005/06/19(日) 05:23:59動的に確保するの?
0255デフォルトの名無しさん
2005/06/19(日) 06:35:360256デフォルトの名無しさん
2005/06/19(日) 07:59:53それじゃC++とCとでまったく別物になっているが……。
あとなぜ125個やら25個も確保しているのかわからん。
s= (double***)malloc(5*sizeof(double**)); → s = new double **[5];
s[i]=(double**)malloc(5*sizeof(double*)); → s[i] = new double *[5];
s[i][j]=(double*)malloc(5*sizeof(double)); → s[i][j] = new double[5];
0258デフォルトの名無しさん
2005/06/19(日) 13:18:02まさに今自分がハマったっぽくて、
ソースをうpしたいところなんですけど、ちょっと長いんで。。。
0259デフォルトの名無しさん
2005/06/19(日) 13:25:39ソースを詰めるいい訓練だと思って。
つーか、案外その過程で罠が見つかるかも知れんし。
0260258
2005/06/19(日) 13:50:08ハマってた問題は、
派生クラスの仮想関数は問題なく呼べるのに、
基底クラスの仮想関数を呼ぶとAccess Violation、
というものだったのですが、
基底クラスのコンストラクタの
memset(this,0,sizeof(*this));
が原因ですた。
classって謎のメンバ変数を勝手に付け加えるんですね。
自分で定義したメンバ変数はint型のが5つで20バイトのはずなのに、
sizeof(*this)が24バイトなんですもの。
C++訳わかんね。('A` )
あ、>>259さんありがとう。
0261デフォルトの名無しさん
2005/06/19(日) 13:51:49memset はいかんね。
vtable でも知れば、納得できるようにはなるだろう。
0262デフォルトの名無しさん
2005/06/19(日) 14:08:03{
for(int i=0; i<MAX_ENEMY; i++)
{
x = 100+i*20.0f //とりえあえずずらして表示;
y = 100+i*20.0f; //同上
w = 64;
h = 64;
tx = 0;
ty = 0;
//pEnemy++; のような感じで次の番号に行きたい
}
}
っていうのは
void CEnemy::Init(CEnemy* pEnemy)
{
for(int i=0; i<MAX_ENEMY; i++)
{
pEnemy->x = 100+i*50.0f;
pEnemy->y = 100+i*50.0f;
pEnemy->w = 64;
pEnemy->h = 64;
pEnemy->tx = 0;
pEnemy->ty = 0;
pEnemy->fAct = ACT;
pEnemy++;//次の番号に行きたい
}
}
こうするしかないんでしょうか? ++とかで配列の次の番地にアクセスできないんですかね?
0263デフォルトの名無しさん
2005/06/19(日) 14:11:48配列なら ++ で次の要素にアクセスできるよ。配列ならね。
0264デフォルトの名無しさん
2005/06/19(日) 14:18:550265デフォルトの名無しさん
2005/06/19(日) 14:37:34確保した個数を越えなければ別に問題はないだろうけど、クラス設計としてはなんだかなぁ……
0266デフォルトの名無しさん
2005/06/19(日) 14:39:18「配列のように」なんて曖昧な言い方されても意味がわからん。
配列を new で確保したのなら大丈夫。
0268デフォルトの名無しさん
2005/06/19(日) 14:46:28単純な話。
CEnemyが敵個体を表すクラスならば、そのメンバであるInit()はそのメンバ変数を初期化するに留めるのが普通の発想。
0269デフォルトの名無しさん
2005/06/19(日) 14:47:19・配列とそのサイズを引数で渡す
・サイズをメンバに持たせたクラスをつくる
・STLのコンテナを使う
0270デフォルトの名無しさん
2005/06/19(日) 14:47:27何がしたいのかわからないと、設計なんかできませんよ。
自分以外の人が読むことを考えて書き込みましょう。
0271262
2005/06/19(日) 15:03:00BOOL Initialize(HINSTANCE hInst,HWND hWnd,CMyChar& rMyChar,CMyWeapon& rMyWeapon, CEnemy* pEnemy)
に送り そこから pEnemy->Init();か pEnemy->Init(pEnemy); で初期化をしようとしています
全てを初期化するには・・・ 中でループを回そうと思ってるんです
そこで・・・ pEnemy->Init();の場合だと 次の要素にアクセスできない?ので困ってます
0272デフォルトの名無しさん
2005/06/19(日) 15:08:50敵複数を初期化する関数から、個別に初期化する関数を呼ぶって発想はできないんか?
もう少し突き詰めて考えてみよう。
どうやらInit()で書いていることから察するに、敵個体間には初期状態で一定の間隔を置いて配置したいのだろう?
それは、敵個体の特性か? それとも敵複数の特性か?
#或いはフィールドの特性の可能性もありそうだが。
それを敵個体の特性と位置付けてしまうと、敵の配置を変えた新しいフィールドを作るたびに設計変更になるぞ。
0273デフォルトの名無しさん
2005/06/19(日) 15:09:15外でループ回せば解決じゃないの?
0274262
2005/06/19(日) 15:18:15同じようにやりたかったので 外ではループを回したくなかったんですよ
ワンクッション置いてやってみることにします
敵個体の特性っていうのはどういったことですか?・・よく解りませんorz
0275デフォルトの名無しさん
2005/06/19(日) 15:21:160276デフォルトの名無しさん
2005/06/19(日) 15:28:45敵個体の座標というのは敵個体の特性(言い方悪かったなぁ属性というべきだったか)だろ。
敵個体の初期位置というのは敵個体の特性かどうかを考えよ、と言ってる。
多対一の対戦を行なうゲームか何かだと思うが、何が何でも敵を全体として扱うのはナンセンスだ。
大雑把に考えると、
敵全体
├敵1
├敵2
:
└敵n
と言う関係にあるだろうから、
ゲーム全体の初期化
├→自キャラの初期化
└→敵全体の初期化
├→敵1の初期化
├→敵2の初期化
:
└→敵nの初期化
となることに別に問題はなかろう。
0277262
2005/06/19(日) 15:38:31私は今アクションゲームを作ってまして、ものすごい参考になります
ありがとうございました。
0278デフォルトの名無しさん
2005/06/19(日) 18:46:05敵全体
+敵グループ1
+敵1
+敵2
+敵グループ2
+敵1
とかになるわけだなw
0279デフォルトの名無しさん
2005/06/20(月) 16:59:380280262
2005/06/23(木) 23:41:54グローバル変数で
CEnemy* pEnemy = new CEnemy[MAX_ENEMY];
という風に敵を作ってます。 それで今から敵を追加していくところなのですが
敵の種類を宣言時に持たせたいため
CEnemy* pEnemy(1) = new CEnemy[MAX_ENEMY];
↑敵の種類 (コンストラクタでCEnemyのメンバのkindに代入)
というようにしたいと思ったのですが これはできないみたいで・・
どのようにしたら解決できますでしょうか・・
0281デフォルトの名無しさん
2005/06/24(金) 00:03:23やはりそこにきたか。
[ ] による配列では各要素のコンストラクタを制御するのは不可能。
すべてデフォルトコンストラクタが使用される。
基本的な代替は以下のふたつ。
// ポインタの配列
// - いっこずつ生成するのが面倒
// - アクセスが面倒
// - delete が面倒
CEnemy* enemies[MAX_ENEMY];
enemies[0] = new CEnemy(1);
// std::vector
// - いっこずつ生成するのが面倒
// - CEnemy のコピーコンストラクタ、代入演算子を確認する必要がある
std::vector<CEnemy> enemies;
enemies.push_back(CEnemy(1));
0282262
2005/06/24(金) 00:14:47ポインタの配列でやってみます。。。しかしながら他に方法はないのかと思ってしまいますw
0283デフォルトの名無しさん
2005/06/24(金) 00:26:28ポインタの配列なら、
std::auto_ptr<CEnemy> enemies[MAX_ENEMY];
にすると、「delete が面倒」という問題は解消される。
ただし std::vector<std::auto_ptr<CEnemy> > は不正だ
ということを理解していないのなら使わないことをお勧めする。
0284デフォルトの名無しさん
2005/06/24(金) 00:28:57関係ないが、「〜の数」を MAX_〜 にするのはどこの文化だ?
いろんなところであたりまえのように見るが、激しくキモイ。
0285262
2005/06/24(金) 00:29:13#include <iostream>
using namespace std; を使ってますが理由っていうか効果が解ってませんしw
0286デフォルトの名無しさん
2005/06/24(金) 00:32:17相手を理解しようとしないでキモイと言うのは如何なものかと
0287デフォルトの名無しさん
2005/06/24(金) 00:33:490288デフォルトの名無しさん
2005/06/24(金) 00:35:140289284
2005/06/24(金) 00:41:14MAX_〜 は「最大〜」という意味なのに、「〜の数」の意味まで含むようになってるのがキモイ。
「敵の最大数」が MAX_NUM_ENEMIES じゃなくて MAX_ENEMY なのがキモイって話。
0290デフォルトの名無しさん
2005/06/24(金) 00:43:39輩のほうがよっぽど(ry
0291デフォルトの名無しさん
2005/06/24(金) 00:44:24詳しく
0292デフォルトの名無しさん
2005/06/24(金) 00:44:380293デフォルトの名無しさん
2005/06/24(金) 00:45:390294デフォルトの名無しさん
2005/06/24(金) 00:48:17もうね、そんなレベルじゃない。
俺の思想以外は全部キモイw
もう書き込まずには居られない。
0295デフォルトの名無しさん
2005/06/24(金) 00:50:40とかって強そうだな
0296デフォルトの名無しさん
2005/06/24(金) 03:14:240297デフォルトの名無しさん
2005/06/24(金) 07:42:17ソース公開する人が減るんだと言っt
0298デフォルトの名無しさん
2005/06/24(金) 09:14:420299デフォルトの名無しさん
2005/06/24(金) 13:30:34俺も。
英語弱いんだね、という印象。
0300デフォルトの名無しさん
2005/06/24(金) 14:07:380301デフォルトの名無しさん
2005/06/24(金) 19:34:580302262
2005/06/24(金) 21:23:31CEnemy* pEnemies[MAX_ENEMY];
pEnemies[0] = new CEnemy(1);
として宣言しようとすると[error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました]
が出てきます。 あと中身についてなんですが pEnemies[0] = new CEnemy(1);というのは1個だけしか生成されませんよね?
ってことは同じ種類の敵を複数出す時は
pEnemies[1] = new CEnemy(1);
pEnemies[2] = new CEnemy(1);
pEnemies[3] = new CEnemy(1);
みたいにするんですかね?・ ホントに初歩的?なところだと思うんですがよろしくお願いします
0303262
2005/06/24(金) 21:25:10delete[] pEnemies[1];
delete[] pEnemies[2];
delete[] pEnemies[3];
のように1個づつ解放しないといけないってことですか?
0304デフォルトの名無しさん
2005/06/24(金) 22:38:06MAX_ENEMYがおかしいんじゃないの?
>>303
newで割り当てているからdelete、delete[]ではない。
そう1つずつやらなくともforとかforeachとかが使える。
0305デフォルトの名無しさん
2005/06/24(金) 22:38:13ポインタ使うな。
C言語使うな。
C++使うな。
javaなりC#なりに行って帰ってくんな。
0306デフォルトの名無しさん
2005/06/24(金) 22:38:32using namespace std;
class CEnemy
{
int a;
public:
CEnemy(int x) : a(x){ cout << "construct" << endl;}
~CEnemy(){cout << "destruct" << endl;}
};
#define MAX_ENEMY 5
int main()
{
CEnemy *p = new CEnemy[MAX_ENEMY](1);
delete[] p;
return 0;
}
[実行結果]
construct
construct
construct
construct
construct
destruct
destruct
destruct
destruct
destruct
おや、コンストラクタ、デストラクタちゃんと呼ばれてるな。
gnu gcc 3.3.3 (cygwin)
0307デフォルトの名無しさん
2005/06/24(金) 22:41:25元は要素のコンストラクタにはそれぞれ別々の引数を渡したいという話だったと思うが。
0308デフォルトの名無しさん
2005/06/24(金) 22:49:590309デフォルトの名無しさん
2005/06/24(金) 23:00:25class CEnemy
{
float x,y,w,h,tx,ty;
public:
CEnemy() : x(0.0),y(0.0),w(64.0),h(64.0),ty(0.0),tx(0.0){}
void SetPos(float xpos, float ypos){ x = xpos; y = ypos;}
};
#define MAX_ENEMY 10
int main()
{
CEnemy *p = new CEnemy[MAX_ENEMY];
for(int i = 0; i < MAX_ENEMY; ++i)
{
float f = 100.0f + i * 20.0f;
p[i].SetPos(f, f);
}
//
delete[] p;
return 0;
}
0310262
2005/06/24(金) 23:19:58if(no==1){ 敵1の初期化 } とした方がいいですかね
アイテムも同じように作るつもりなので、あまり関数が複雑化するのは避けた方がいいですよね
0311デフォルトの名無しさん
2005/06/24(金) 23:43:350312デフォルトの名無しさん
2005/06/24(金) 23:55:36CEnemyから派生させたいからダメ
std::vector<boost::shared_ptr<CEnemy> >
ならおけ
0313デフォルトの名無しさん
2005/06/25(土) 00:05:03その説明じゃ、やりたいことが全然わからん。
複雑でもないと思うし、複雑化をそんなに厭う意味もない。
複雑な処理は関数化して、いつでも使いまわせるようにするのが、
構造化なりオブジェクト指向なりなわけだから。
0314262
2005/06/25(土) 00:19:28宣言は
CEnemy* pEn1 = new CEnemy[MAX_ENEMY];
CEnemy* pEn2 = new CEnemy[MAX_ENEMY];
とし初期化する関数へは
pEn1->Init(pEn1,1);
pEn2->Init(pEn2,2);
とするということです
0315デフォルトの名無しさん
2005/06/25(土) 00:26:37キモチよく一緒につかえないだろ
0316デフォルトの名無しさん
2005/06/25(土) 00:38:440317262
2005/06/25(土) 00:42:30それと ゲームを作る際におおまかな関数の作り方が載ってるサイトとかありませんかね?
私は 初期化 処理 表示に分けて
更に
初期化 - テキスト読み込み
- 画像読み込み
処理 - 移動
- 攻撃
表示 - 表示
といった感じにして 当たり判定は別個に作ってます・・
就職用作品なのでできればソースを綺麗にしたいのでよろしくお願いします
0318デフォルトの名無しさん
2005/06/25(土) 00:56:290319デフォルトの名無しさん
2005/06/25(土) 00:59:450320デフォルトの名無しさん
2005/06/25(土) 01:20:03インスタンス情報の初期化はループをまわして、全員スタンスに対して行う。
0321デフォルトの名無しさん
2005/06/26(日) 06:15:58C++でそれに似たようなものはないでしょうか?
0322デフォルトの名無しさん
2005/06/26(日) 06:43:370323デフォルトの名無しさん
2005/06/26(日) 06:47:06オライリーから出てる
C++ランゲージクイックリファレンス/C++ライブラリクイックリファレンス
0324デフォルトの名無しさん
2005/06/26(日) 07:23:030325デフォルトの名無しさん
2005/06/27(月) 01:50:21挙げられてる必読書って読む価値あるんだな〜。
あれを読まずにC++でいきなりクラスを実装できる人っているんだろうか
0326デフォルトの名無しさん
2005/06/27(月) 05:01:09半年くらい試行錯誤しながらクラスを作っていたら、
その間に身につけたノウハウが全てEffectiveC++に書かれていた。
0327デフォルトの名無しさん
2005/06/27(月) 05:10:190328デフォルトの名無しさん
2005/06/27(月) 07:16:15再利用可能なコンポーネントは美しい
とりあえずWTLのオーナーデータリストビューとかに生かしている
0329デフォルトの名無しさん
2005/06/28(火) 15:43:39共用体のメンバとして持つことは不可能なのでしょうか?
0330デフォルトの名無しさん
2005/06/28(火) 16:37:04できない。逆にできたら困る。
ただし、もしかしたらboost::variantが代わりになるかもしれない。
0331デフォルトの名無しさん
2005/06/28(火) 22:30:05やはりできませんか。。。
よく考えたら確かに2つ以上のクラスが
ある場合とかだと大問題ですね。
boost::variant調べてみます。
ありがとうございました。
0332デフォルトの名無しさん
2005/06/29(水) 00:07:34クラスを作ってる間に、Cで目的のプログラムを作れてしまいそうだ。
クラスを作ることそのものが目的で、学習のためならともかく、実用ではなかなか
使う機会がないんだが。
0333デフォルトの名無しさん
2005/06/29(水) 00:10:010334デフォルトの名無しさん
2005/06/29(水) 00:11:00クラスを作らなくてもプログラムは動くだろ。
好きにすればいい。
0335デフォルトの名無しさん
2005/06/29(水) 01:37:29別にクラスつっても、ライブラリについてるようなフル装備の
汎用的な型にする必要はないからな
そんなに構える必要は無い
どのみちJavaやC#なら、全部クラスなんだから
0336デフォルトの名無しさん
2005/06/29(水) 04:38:000337デフォルトの名無しさん
2005/06/29(水) 04:56:42クラス作る際にstd::stringやSTLコンテナみたいな気合の入った設計を
毎度毎度する必要は無いよ、という程度の意味。
0338デフォルトの名無しさん
2005/06/29(水) 07:47:45Better Cとしてもそれなりに使う価値はあるよ。
0339デフォルトの名無しさん
2005/06/29(水) 16:47:51自分でライブラリをそこそこ作り上げてからが本番な気がする。
行数とかで比較すりゃ全体的にはどうやったってC++の方が多くなるからな。
0340デフォルトの名無しさん
2005/06/29(水) 16:54:35格段に短く書けることが多いぞ
まあ簡単なプログラムなら手続き+STL利用
ぐらいで全然かまわんわなあ。
0341デフォルトの名無しさん
2005/06/29(水) 19:02:52クラスを作るのが面倒って、構造体を作るのと手間は変わらんと思うんだけど。
0342デフォルトの名無しさん
2005/06/29(水) 20:05:05それは流石に違う
0343デフォルトの名無しさん
2005/06/29(水) 20:13:15自分が理解できてないことに対する言い訳だろ。
>>342
構造体もまともに設計できていないなら兎も角、きちんと構造体を設計できるなら
クラスの設計も概ね巧くいくと思うぞ。
まぁ、継承まで考え始めれば話は別だが。
0344デフォルトの名無しさん
2005/06/29(水) 20:22:03コレクションもC++の強みだな。
この二つだけのためだけでもC++は使う価値がある。
0345デフォルトの名無しさん
2005/06/29(水) 20:24:24Cの構造体設計とクラス設計をごっちゃにするのは流石にどうかと。
構造体はただのデータの入れ物であって、ADTではないから
その演算や振る舞いを考える必要は無い。
0347デフォルトの名無しさん
2005/06/29(水) 22:15:440348デフォルトの名無しさん
2005/06/29(水) 23:24:310349デフォルトの名無しさん
2005/06/29(水) 23:53:070350デフォルトの名無しさん
2005/06/30(木) 02:37:45メンバにユーザー定義型が入った構造体でテーブル作ろうとすると、
初期化のときに該当するメンバじゃなくて構造体に代入しようとするのは
なんでですか?
メンバが組み込み型なら普通に構造体のメンバに代入してくれるのに。
例:
typder struct {
CString str;
int i;
} foo;
foo Arrayfoo[] = {
{"abc", 1}
,{"efg", 2}
}
↑
"abc"をfoo[].strに代入してるつもりなんだけど
fooにキャストとしようとして失敗する。
0351デフォルトの名無しさん
2005/06/30(木) 02:47:25そして深くは考えない。
structはデフォでメンバがpublicなクラス
(ただしコンストラクタを持たないstructはC構造体互換といえる)
ちなみにCStringはコンストラクタを持つので、C構造体スタイルの初期化には対応して無い、と。
0352デフォルトの名無しさん
2005/06/30(木) 03:00:31こんな遅い時間にレスどーもです。
fooをstructからclassにしてみてもダメでした。
要はテーブル作るときは組み込み型に限定するか、
諦めて他に代わりのデータ構造を考える、と。
あまり深く考えず、覚えてしまうことにします。ありがとうございました。
0353デフォルトの名無しさん
2005/06/30(木) 03:18:02まずC++だからtypedef struct {} foo; などと書かずに素直に struct foo {}
と書けばよろしい(Cだとしても構造体のタグ名は定義しておいたほうが
いいことが多いが)。
で、この場合は、素直にfooにコンストラクタを定義すればいいんじゃないの。
そうすれば、
foo Arrayfoo[] = { foo("abc", 1), foo("efg", 2), ... };
と書ける。
0354350
2005/06/30(木) 03:27:57なるほど、今の仕事で見てるソースではtypedefしてない人もいたから
もしやと思ってたけど、C++だとstructつけなくても構造体変数の定義ができるんですね。
>>foo Arrayfoo[] = { foo("abc", 1), foo("efg", 2), ... };
これは自分では思いつきませんでした。参考になります。
0355デフォルトの名無しさん
2005/06/30(木) 03:43:26念のため書いておくが、別にCでもtypedefは必須というわけではない。
struct foo {};
でよい。ただしこの場合、使うときにはいつも
"struct"を付ける必要があり面倒だからtypedefする人が
多いというだけだ。
C++ではstructに対するそういう差別は無い。
0356デフォルトの名無しさん
2005/06/30(木) 07:35:390357デフォルトの名無しさん
2005/06/30(木) 08:34:270358デフォルトの名無しさん
2005/07/01(金) 09:25:15クラスを作るほうがかなり面倒だ。
>>343
理解できてようが、クラスを作るのが目的ではなく、また、必要としないときにわざわざクラスを作るのは無意味だ。
0359デフォルトの名無しさん
2005/07/01(金) 10:25:17>クラスを作るほうがかなり面倒だ。
理解できてない証左だ。
0360デフォルトの名無しさん
NGNGclass と struct の機能がほとんど同じだからといって
クラスと構造体を同じように実装するとでも考えてるのか?
0361デフォルトの名無しさん
2005/07/01(金) 13:10:25メソッドパッケージとしての性格が強ければクラス、
きっちり線引きできるもんじゃないっしょ?
0362デフォルトの名無しさん
2005/07/01(金) 13:37:07struct Point { int x, y; };
みたいに単純なのは構造体にしたくなるってのもあるけど、拡張しようと思ったら結局クラスにしたくなるし。
よっぽど使い捨てにしか使わない自信があって且つpublicと書くのが面倒な時は気まぐれで構造体使うかも。
0363デフォルトの名無しさん
2005/07/01(金) 16:37:402. コンストラクタやメンバ関数を追加してみる。
3. 折角なのでアクセサ付けてメンバ変数をprivateにしてみる。
4. 「…アレ?」
0364デフォルトの名無しさん
2005/07/01(金) 17:08:360365デフォルトの名無しさん
2005/07/01(金) 17:11:47クラスなんぞつかわんでも
要するにCだけでカーネルもエディタもコンパイラも組めるから
「必要としないときに……」
と言ってしまうと、ほぼ常に「必要でない」と言えてしまう。
その方がラクかどうか、対象をより適切に見通しよくモデル化できるかどうか、
といった視点も必要だろう。
0366デフォルトの名無しさん
2005/07/01(金) 17:13:480367デフォルトの名無しさん
2005/07/01(金) 17:20:50反例を述べよ
0368!=366
2005/07/01(金) 22:59:30彫刻を掘る時、ノミではなくミシン針でやってやれないことはない。
= 無くても作れる = 必要としない
とすると、ノミ = ミシン針
ということになるが、逆に、ノミで裁縫することは不可能である。よって矛盾する。
従って、なくても作れる != 必要としない。
0369デフォルトの名無しさん
2005/07/01(金) 23:05:43それは
A) 彫刻を彫るにはノミは必要じゃない
という命題から
B) 裁縫するにはミシン針は必要じゃない
という命題は導出できないと言ってるだけで、
Aそのものを否定していることにはならない。
0370!=366 && !=368
2005/07/01(金) 23:18:31これに対し「なくても作れる」はなくてもよい事象を作るに限定したものである。
∴なくても作れる≠必要としない
0371デフォルトの名無しさん
2005/07/01(金) 23:20:58だから、反例を述べよといっておるのだ。
その「なくてもよい事例」に該当しない例を上げよ、と。
0372デフォルトの名無しさん
2005/07/01(金) 23:22:50C++じゃないと書けないわけだが
そんなんを例といわれても僕困っちゃうわけだが
0374デフォルトの名無しさん
2005/07/01(金) 23:33:00クラスが無くても作れるとしたら、そのときにクラスは必要じゃなかったんだと
思うのだが。
無くても作れるけど、必要、という状態の例って、どんなだ?
0375デフォルトの名無しさん
2005/07/01(金) 23:41:44バニラアイスクリーム作りにおけるバニラエッセンスのようなもんでないの?
なくても作れるけど、完全なバニラアイスではないよ、完全なものを作るにはどうしても必要だよ、と。
んで反例だけど、Cでプログラム書くのに、Pascalのコンパイラ環境はなくても作れるし、そもそも必要
ないってことでFA?
0376デフォルトの名無しさん
2005/07/01(金) 23:46:39LinuxカーネルはCでかかれているから不完全なのであって、
C++なら完全なものにできた、とでも言いたいのか(w
俺の主張は>>365だ。後ろの二行。
ちなみにその反例は、反例になってない気がする。
1) クラスがないと作れない、という例
2) クラスがなくても作れるが、クラスは必要、という例
を俺は問うているんだが。
0377デフォルトの名無しさん
2005/07/01(金) 23:52:29日本語理解できるか?
「無くても作れるけど、必要、という状態」の一般的な例を挙げただけで、誰もLinuxだのC++だの
固有名詞は挙げてないぞ。
後は知らん。
0378デフォルトの名無しさん
2005/07/01(金) 23:54:06もっと実際的な話をしろよ
0379デフォルトの名無しさん
2005/07/01(金) 23:56:15なるほど、そういう文意だったのは理解したが、
その例は正しくないな。
バニラエッセンスがなければ、バニラエッセンスつきのバニラアイスは
作れない
んだから。
それは「作れている」とは言えない。
0380デフォルトの名無しさん
2005/07/01(金) 23:56:47暇で暇で、むしゃくしゃしていた。どのスレでもよかった。今は反省して(ry
0381デフォルトの名無しさん
2005/07/02(土) 00:31:250382デフォルトの名無しさん
2005/07/02(土) 07:52:22→では、ありとあらゆる高級言語は「必要ない」のか?
0383デフォルトの名無しさん
2005/07/02(土) 15:16:23時間の制約があるので実質上必要。
0384デフォルトの名無しさん
2005/07/02(土) 18:00:55そういうことは実際ある程度の規模のプログラムをバイナリエディタで
組んでみてから言ってくれ。
理論的に出来る、だけなら作れないと言ってるのと同じ。
できなければ、高級言語はあんたには、「必要」なんだ。
0385デフォルトの名無しさん
2005/07/02(土) 20:02:32382は、384の言うようなことを喚起するような意図で、問題を投げかけたのだと
思われる。
0386デフォルトの名無しさん
2005/07/02(土) 20:05:05発展してきた歴史を学ぶことは必要だね。
0387デフォルトの名無しさん
2005/07/02(土) 22:19:370388デフォルトの名無しさん
2005/07/03(日) 01:52:460389デフォルトの名無しさん
2005/07/03(日) 07:17:55必須であるかのような考えには疑問を抱く。
俺の場合は、プログラムは大規模にはならず、クラスを作ることはどうでもよく、それよりもまずは、
目的の処理を実現するアルゴリズムを考えることに頭を使わなければならないことが多い。
C++をやるなら、クラス設計よりも、STLをうまく使いこなせるようになるほうが重要だと思ってる。
0390デフォルトの名無しさん
2005/07/03(日) 07:36:15> C++をやるなら、クラス設計よりも、STLをうまく使いこなせるようになるほうが重要だと思ってる。
うむ、確かにそうだな。いいこと言った。が、
> 俺の場合は、プログラムは大規模にはならず、クラスを作ることはどうでもよく、それよりもまずは、
> 目的の処理を実現するアルゴリズムを考えることに頭を使わなければならないことが多い。
まずデータ構造(クラス)を定義したほうが、アルゴリズムに頭を悩まされる負担が減るってもんだ。
とは言っても俺も
> いつもクラスをわざわざ作るのが、あたかも
> 必須であるかのような考え
ではないので、この部分も同意。
ところで>>389のこの話、やや唐突だなw
どこにレスしたんだ?
0391デフォルトの名無しさん
2005/07/03(日) 07:49:10>ところで>>389のこの話、やや唐突だなw
>どこにレスしたんだ?
>>332で書き込んでが、かなりの反響があったようで、それについて議論してる人全体が
対象ってもんで、特定の一個人へのレスではないし。
0392デフォルトの名無しさん
2005/07/03(日) 08:01:05アルゴリズムとデータ構造の決定について
どっちが先ってことはないんじゃない?
ほぼ同時に決定するって感じ
0393デフォルトの名無しさん
2005/07/03(日) 10:41:54独立・直交性が高いので,とりあえずで進んでいって後で
詰まったときにある程度の手戻りが効く.
これもある程度以上は限界があるけれど.
0394デフォルトの名無しさん
2005/07/03(日) 12:05:21クラスを使ったほうが効率がいいときにクラスを使わないのと同様に。
0395デフォルトの名無しさん
2005/07/03(日) 14:46:340396デフォルトの名無しさん
2005/07/03(日) 16:09:37使いこなせる気がしねええぇぇーー orz
0397デフォルトの名無しさん
2005/07/03(日) 16:11:530398デフォルトの名無しさん
2005/07/03(日) 16:23:15テンプレートを活用したもの。
0399デフォルトの名無しさん
2005/07/03(日) 16:26:03×汎用クラス ○クラステンプレート
ってことか?
何で関数テンプレートとクラステンプレートって
使ってる感覚はいっしょだと思うけどなぁ。
>396 がクラス使うのに慣れてないだけじゃない?
0400396
2005/07/03(日) 16:29:11×汎用クラス ○クラステンプレート
↑の変換でいいかと。
クラスは慣れてないです。
最初は使わなくてもいいですかね?
0401デフォルトの名無しさん
2005/07/03(日) 17:25:44クラスの利点を知らないのなら、使う意味は無いよ。
0402デフォルトの名無しさん
2005/07/03(日) 17:29:16使わずにどうやってなれるつもりだい?
0403デフォルトの名無しさん
2005/07/03(日) 17:31:22C++なんか生きていく上で必要ない。
忘れなさい。
0404デフォルトの名無しさん
2005/07/03(日) 17:37:09あー、ごめんなさい。
クラステンプレートは使わなくていいかな?
ってことです。言葉足りなくてスマソ。
クラスに慣れてから、ちょっとずつ
ステップアップしたほうがいいのかなーと。
0405デフォルトの名無しさん
2005/07/03(日) 17:41:32クラスとクラステンプレートとに同時に慣れる必要はないと思うよ
0406デフォルトの名無しさん
2005/07/03(日) 17:44:180407デフォルトの名無しさん
2005/07/03(日) 17:46:09難しいと感じるのであれば、ボトムアップにやればよいんじゃないかな。
Cスタイルで構造体やそれを操作する関数は使ってると思うが、そういうものを
クラスにしてみることだ。
ただの構造体よりはコンストラクタがついている方が扱いやすいし
メモリの開放が必要ならデストラクタを付けてみる。
構造体を操作する関数をメンバにしてみる。
0408デフォルトの名無しさん
2005/07/03(日) 17:56:360409デフォルトの名無しさん
2005/07/03(日) 17:57:060410デフォルトの名無しさん
2005/07/03(日) 17:59:430411デフォルトの名無しさん
2005/07/03(日) 18:01:360412デフォルトの名無しさん
2005/07/03(日) 18:04:310413デフォルトの名無しさん
2005/07/03(日) 18:12:48レスありがとうございます (ノω`)・゚・。。
STLはやぱ、使っといたほうがいいのか。。
恥ずかしついでに言っちゃいますと、
クラステンプレート
例外処理 (スローとかなんとか・・)
実行時型情報 (typeinfo・・なにそれ?)
テンプレートライブラリ (いっぱいありすぎ orz)
C++の入出力システム (cout.??? とかios::??? みたいなやつ)
ファイルの入出力 (<fstream>ヘッダの中のやつかな?)
あたりを全部すっ飛ばしちゃおうかと考えてるんですが、
↑で挙げてるやつで、これは最初にやっといたほうがいいってやつは
ありますか?
ちなみに、今の所の近場の目標は、
windowsスケルトン組んで、絵を出して色々やろうかと
思ってます。
Cは一通りやりました。
0414デフォルトの名無しさん
2005/07/03(日) 18:17:53例外処理を学べばいろいろついてくるぜ。
0415デフォルトの名無しさん
2005/07/03(日) 18:19:22STLは使うと使わないでは著しく開発効率が変わってくる。
ちょっとしたプログラム以上のものでは大概STLで提供される
コンテナやアルゴリズムを必要とするからな。
昔からコンテナライブラリみたいなものはあるが、STLはそうしたものに
比べると、革命的なほど強力で洗練されたライブラリだ。これのためだけに
C++を使う、というヤツも多い。
で、「すっとばす」と言ってるヤツだが、クラステンプレート、例外処理は
使えるようにはなっておけ。全く知らないと、そういうものを利用した
ライブラリが使えなくなる。
RTTIやiostreamはすぐには知らなくてもいいかもしれん。特に後者は
Win32で開発するならば、今後もあまり世話になることは無いかもしれない。
0416デフォルトの名無しさん
2005/07/03(日) 18:29:33なるほど、説得力ありますね。
この2ヶ月ほどC++の言語の勉強ばっかしてきて
まともにプログラムを打ってないので、
なんかもう、とにかく早くクラスを使って慣れたほうが
いいんじゃないかと思ってまして。。
ちょっとキレ気味で orz
とりあえず、例外処理を一通りやってみます。
どうもありがとー m(__)m
0417デフォルトの名無しさん
2005/07/03(日) 18:36:14実行時型情報はたしかにどうでもいい。そんな機能もあると知っているだけでいい。
入出力は<<で出力して、>>で入力ということさえ知っていればとりあえずは困らない。
例外だけはWindowsの世界へ足を入れる前にやったほうがいいな。
テンプレートと言えばSTLじゃないが、std::stringは知っておいて損はない。
演算子とlength()とc_str()を知っているだけでも全く違ってくる。
0418デフォルトの名無しさん
2005/07/03(日) 18:37:460419デフォルトの名無しさん
2005/07/03(日) 18:41:18俺はWindowsでもtypedef std::basic_string<TCHAR> tstring;で通しているが。
0420デフォルトの名無しさん
2005/07/03(日) 18:45:41幸せなヤツだな
そんなことをやっても
find_first_ofなどのメンバ関数で_tcs系の関数が使われるわけではないから
MBCSでは全然NGだし
CStringTや_bstr_tにあるMBCS<->WCSの変換機能も無いだろ
0421デフォルトの名無しさん
2005/07/03(日) 18:52:000422デフォルトの名無しさん
2005/07/03(日) 18:53:57std::stringはこの板でよく見かけますね。
char型の、文字列専用強化版みたいなものでしょうか。
文字列はwindowsプログラムでも使う予定ですし、
ヒーヒー言いながら、やってみたいと思います。ども。
いただいたレスを読み返してみると、
クラステンプレートも、作り方と使い方は知らないとダメっぽいですね。
あと、
C++の勉強を始めたら、やたらとリスト構造(自己参照構造体?)
をよく見かけるのですが、
C++使うなら理解を深めとく必要があるんでしょうか。
C++はstaticをあんま使わないらしいので、
newで確保したメモリを、リスト構造で管理することが多くなるのかな。
でも、リスト構造ちょっとややこしいよ、ママン。
0423デフォルトの名無しさん
2005/07/03(日) 18:54:430425デフォルトの名無しさん
2005/07/03(日) 19:03:11アルゴリズムはSTLのを使え。ただしマルチスレッド環境では気をつけろ
std::stringに関しては、CStringTのがWin32では良いサポートを提供
しとるから、後者を使え
ってとこかな
0426デフォルトの名無しさん
2005/07/03(日) 19:46:18能書きは要りませんので、原典だけお教え願えませんか?
0427デフォルトの名無しさん
2005/07/03(日) 20:09:38原典?規格書買えよ。
英語が読めれば↓でほとんど十分だが。
http://www.kuzbass.ru/docs/isocpp/
http://www.open-std.org/jtc1/sc22/wg21/
http://www.research.att.com/~bs/C++.html
0429419
2005/07/03(日) 22:09:37MBCSが問題になるようなときは専らstd::wstringを使う。
MBCSとWCSとの変換はATL::Cx2xを使っている。
いちいちc_str()を呼ぶのはダサいと思うが仕方ない。
0430デフォルトの名無しさん
2005/07/03(日) 22:26:24読んでても、よくわからないのですが...
0431デフォルトの名無しさん
2005/07/03(日) 23:10:35そこまでしてstd::basic_string<>にこだわる意味は全く無いと思うんだが...
GetBuffer()も無いから、無用なalloca()、またはstd::vector<>との
変換も、結構必要だろ?
0432≠429
2005/07/04(月) 00:45:31いや、私はstd::stringとバッファを組み合わせて使いたいときには
(どうせそのバッファは一時的でいいはずだから)固定char配列かnewして使う。
まぁ、GUI絡みだとCString使うけどね。
0433デフォルトの名無しさん
2005/07/04(月) 09:58:280435デフォルトの名無しさん
2005/07/06(水) 00:17:16⊂⌒( `Д´) < 参照渡しじゃなきゃヤダヤダ
`ヽ_つ ⊂ノ
ジタバタ
_, ,_
(`Д´ ∩ < char*じゃなく、std::stringじゃなきゃヤダヤダヤダ
⊂ (
ヽ∩ つ ジタバタ
〃〃
〃〃∩
⊂⌒( _, ,_) <うにコードって何?SBCSの国に産まれたかったよ・・・。
`ヽ_つ ⊂ノ
グスン・・
>>430
そのへんはスルーして問題なし(と思う)。
ていうか、俺はした。
0436デフォルトの名無しさん
2005/07/06(水) 00:29:21何が言いたいんだか(w
0437デフォルトの名無しさん
2005/07/06(水) 00:33:460438デフォルトの名無しさん
2005/07/06(水) 10:03:23A: 「あなた、いつまでも変わらないでいてね」
B: 「安心しろ。ぼくはconstだ」
…の一節が好きなのでC++使います
0439デフォルトの名無しさん
2005/07/06(水) 10:40:30B: 「うるさいな.const_castしたんだ.」
0440デフォルトの名無しさん
2005/07/06(水) 10:41:27うまいなw
0441デフォルトの名無しさん
2005/07/06(水) 14:44:31acx.cpp:124: error: cannot call member function 'void acx<Type>::PB(int, int) [with Type = float]' without object
エラー内容がオブジェクトなしではPBという関数を呼び出せないという事はわかるのですが、その原因がわかりません。
呼び出し行は
if (ii==0)PB(k,endpnt);
なのですが、エラーとなる原因は何なのでしょうか?
0442デフォルトの名無しさん
2005/07/06(水) 15:02:53>エラーとなる原因は何なのでしょうか?
オブジェクトがないのでしょう。
メンバ関数以外から呼び出したいなら、オブジェクトを指定する必要がありますね。
或いは、静的なメンバ関数からの呼び出し場合もオブジェクトを指定する必要があります。
#メンバ関数のつもりで非メンバ関数を書いている気もするが。
0443デフォルトの名無しさん
2005/07/07(木) 12:16:400444デフォルトの名無しさん
2005/07/15(金) 07:53:32そこで安心してはいけない 次はC++0xだ
0445デフォルトの名無しさん
2005/07/15(金) 12:59:500446デフォルトの名無しさん
2005/07/15(金) 19:31:00俺なんか C++++++++++++++++++++++++++++++++++++++++まで習得したぞ。
0447デフォルトの名無しさん
2005/07/15(金) 21:03:25∧∧
∧ < え >
ヽ. < | >
ノ | < | >
()| < | >
u____つ / !!? >
[_____ U  ̄∨∨
ノ
ヽr
ヽ
0448デフォルトの名無しさん
2005/07/16(土) 21:39:14>>446は C++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ == M まで習得したんだな。
0449デフォルトの名無しさん
2005/07/17(日) 20:08:420450デフォルトの名無しさん
2005/07/18(月) 16:08:48参照はint a など1つしか宣言&初期化しない時に使うと便利で
ポインタはint a[10]など配列で宣言し、Init(a);などで関数に送り
ループで配列を全部初期化する時に便利ってことで理解してもよろしいでしょうか?
また参照で送った場合はどのようにして次の要素にアクセスできますか?
(参照でポインタの pEnm++のような事を実現できるんでしょうか?)
0451デフォルトの名無しさん
2005/07/18(月) 17:50:45仮にポインタを使うと*か->しか使わず、その他のポインタ演算を全く使わないような場合なら参照。
それ以外はポインタ(あるいはイテレータ)。
> また参照で送った場合はどのようにして次の要素にアクセスできますか?
> (参照でポインタの pEnm++のような事を実現できるんでしょうか?)
int&のような場合は無理。&でポインタを取得すればできるw
そういうのはポインタ(あるいはイテレータ)の出番。
0453デフォルトの名無しさん
2005/07/19(火) 21:38:040454448
2005/07/19(火) 22:27:26C++とDは別物だとか、そういう厳密な話じゃないから気にしないで
0455デフォルトの名無しさん
2005/07/23(土) 00:50:35C-- => C#
0456デフォルトの名無しさん
2005/07/23(土) 02:40:100457デフォルトの名無しさん
2005/07/23(土) 08:54:000458デフォルトの名無しさん
2005/07/26(火) 19:31:39くてiostreamを使うことで、得られる利点てありますか?
C++ぽくみえるとかそれだけかな。
0459デフォルトの名無しさん
2005/07/26(火) 20:12:32algorithmと一緒に使いやすいようになってるとか。
0460デフォルトの名無しさん
2005/07/27(水) 03:44:05・型ごとのフォーマット指定をおぼえなくていい
・template 内の型とか、 typedef された型とかの実際の型を意識しないで済む
・実際にアクセスするデバイスを拡張しやすい
・エラーに例外を使える
現状ではこれらを覆すだけのデメリットがある。
実行速度とか、プログラムサイズとか、コンパイル速度とか。
0461デフォルトの名無しさん
2005/07/27(水) 04:33:12でも、iostream でのフォーマット指定は printf 系のフォーマット指定より16倍マンドクサイ('A`)
0462デフォルトの名無しさん
2005/07/27(水) 07:43:37そういうときは適宜使い分ければいい。
0463デフォルトの名無しさん
2005/07/27(水) 08:59:410464デフォルトの名無しさん
2005/07/27(水) 10:20:410465デフォルトの名無しさん
2005/07/27(水) 18:08:00誰かがsync_with_stdioをいつの間にか弄ってて…
0466デフォルトの名無しさん
2005/07/30(土) 00:45:110467デフォルトの名無しさん
2005/07/30(土) 07:28:02可変個引数なんてせっかくのC++の厳しい型の安全性が台無しじゃないか。
0468デフォルトの名無しさん
2005/08/10(水) 16:56:40CHoge *p = new CHoge();
とした場合コンストラクタが呼ばれ
CHoge *p = (CHoge*)mallock(sizeof(CHoge));
とした場合呼ばれないのが何故だか分かりません。
newは特別なのでしょうか?
newをオーバーライドし、すでにmallockしてある領域のアドレスを返してやったら、
これまたコンストラクタが呼ばれました。
とても基本的なことかもしれませんが、どなたかご教授お願いいたします。
0469デフォルトの名無しさん
2005/08/10(水) 17:05:12ポインタをキャストしてもコンストラクタは呼ばれません。
つーか、そういうCスタイルのキャストはできる限り使わないようにしましょう。
0470デフォルトの名無しさん
2005/08/10(水) 17:12:48C++のクラスという機能を使うのですから、C++の流儀にしたがってnewするのが正しいですよね。
ですが気になるのは
newをオーバーライドして、すでにmallocしてある領域のアドレスを返してやった場合にもコンストラクタが動作したことです。
void* operator new(size_t t){
void* p;
p = malloc(t);
return p;
}
として
CHoge* p = new CHoge();
としたところ、コンストラクタが呼ばれたのです。
これはnewという記述の魔法とも思える動作で、非常に納得がいかないのですが…。
0471デフォルトの名無しさん
2005/08/10(水) 17:18:540472デフォルトの名無しさん
2005/08/10(水) 17:22:28コンストラクタが呼び出されるのは「そのクラス用のメモリーが確保される」という動作が誘発するのではなく、
newそのものに備わっているわけですね。
つまり、newが「ポインターと返し、それがクラスであった場合コンストラクタを呼び出す」
という機能を持つ演算子であると考えればよろしいのでしょうか。
なかなか小癪な奴ですね。
(もちろん、実体を宣言したときにもコンストラクタが呼ばれることは知っています)
0473デフォルトの名無しさん
2005/08/10(水) 17:28:42考え方が逆。
処理系定義の方法(或いはオーバーロードして)確保したメモリで
コンストラクタを呼び出すようにnewが作られていると考えればよい。
同じように、デストラクタを呼び出してからメモリを解放するのがdelete。
あーそうそう、コンストラクタはクラスに限らず呼ばれるのでその積もりで。
例えばPOD型なら0で初期化されることが保証される。
0474デフォルトの名無しさん
2005/08/10(水) 17:41:35ネイティブなものでもコンストラクタ呼ばれてるんですね。
0475デフォルトの名無しさん
2005/08/10(水) 19:01:510476デフォルトの名無しさん
2005/08/11(木) 09:39:020477デフォルトの名無しさん
2005/08/11(木) 22:27:29new POD だとCと同様に不定値で
new POD() でゼロ初期化じゃなかったっけ?
0478デフォルトの名無しさん
2005/08/12(金) 04:06:550479デフォルトの名無しさん
2005/08/12(金) 23:44:368.5-7 と、8.5-9 と、8.5-5 にある value-initialize の部分ですね。
0480デフォルトの名無しさん
2005/08/22(月) 04:21:51今からガンガン使って大丈夫でしょうか?
あとで廃れてしまうなんて事はあるのでしょうか?
0481デフォルトの名無しさん
2005/08/22(月) 07:54:360482デフォルトの名無しさん
2005/08/22(月) 08:56:060483デフォルトの名無しさん
2005/08/22(月) 14:35:38ヒント:マイクロソフトの次世代OS
0484デフォルトの名無しさん
2005/08/22(月) 20:41:47boost全てが標準になるわけではない。
boost::lambdaとか標準になっても困るっしょ。
少なくともC++は当分の間は消えない。
0485デフォルトの名無しさん
2005/08/23(火) 00:53:40boost の一部は標準への取り込みを意図しているものもあります。
基本的にソフトウェアは時間で変質しないので、
今使って大丈夫なものはあとで使っても大丈夫です。
「大丈夫」の意味に依るのかもしれませんが。
将来、 boost が廃れる可能性はあります。
C++ が廃れる可能性もあります。
0486デフォルトの名無しさん
2005/08/23(火) 00:54:240487デフォルトの名無しさん
2005/08/23(火) 00:57:34Visual C++ は言語名ではありません。
とある本の名前を晒して、さっさと燃やしてしまいましょう。
0488486
2005/08/23(火) 01:20:53http://www.kohgakusha.co.jp/books/detail/4-7775-1138-3
書いてある箇所は冒頭だけど、よくみたらこの紹介文もちょっとおかしなこと言ってない?
0489デフォルトの名無しさん
2005/08/23(火) 01:38:09>C++言語を基盤としたオブジェクト指向型言語で
環境と呼んだり言語と呼んだり、なんなんだ。
0490デフォルトの名無しさん
2005/08/23(火) 01:40:13言語と開発環境の区別が曖昧だなぁ。ちょっと信用できないね。
0491デフォルトの名無しさん
2005/08/23(火) 01:49:190492デフォルトの名無しさん
2005/08/23(火) 02:24:370493デフォルトの名無しさん
2005/08/23(火) 09:01:33C++標準ライブラリと同列にヘッダが用意されるのだろうが、
当面は互換性のためにboostからもヘッダが提供されるだろうと俺は思う。
C++が廃れるとか喚いている奴がいるが、別にどんなプログラミング言語でもいつかは廃れる。
そのとき新しい言語にうまく乗り移れればそれで問題ないさ。
0494デフォルトの名無しさん
2005/08/23(火) 19:12:180495デフォルトの名無しさん
2005/08/27(土) 15:13:14{
std::string name;
long x, y;
}
という構造体を初期化したいのですが、どのように記述すればよいのでしょうか?
HOGE hoge = { "hogehoge", 0, 0 };
や
HOGE hoge = { 0 };
ではだめでした。
それともstringは構造体に使用しないほうがいいのでしょうか?
0496デフォルトの名無しさん
2005/08/27(土) 16:32:14アナクロな初期化をしたいのならstd::stringは使えない。
std::stringを使いたいなら自前でコンストラクタを書けばいい。
0498デフォルトの名無しさん
2005/08/27(土) 23:38:55そういう初期化はできる。
ところで } の後に ; がないよ。
>>496
だからそれは間違っている。
const char *からstd::stringへの暗黙の変換があるから問題ない。
0499デフォルトの名無しさん
2005/08/29(月) 04:12:55変換できるようなヘッダを読んでるから出きるのではないか?
用語として暗黙の変換というコトバはあるが、
初心者には意味が通じないのではないか?
0500デフォルトの名無しさん
2005/08/29(月) 04:35:04どうせ、暗黙の変換なんて他人に教えたこともないんだろ?
0502デフォルトの名無しさん
2005/08/29(月) 08:04:47ざんねんながら、コンパイラが原因。
VC6では対応していない。
0503デフォルトの名無しさん
2005/08/29(月) 08:48:30ありがとうございます。他の方法を考えて見ます(´・ω・`)
0504498
2005/08/29(月) 10:23:46キャスト・一時オブジェクト作成式を使わずに変換できればそれは暗黙の変換と言う。
それに少なくとも496は初心者ではないと思った。
0505496
2005/08/29(月) 13:12:48VC6のMSDN見る限り、VC6にもありそうだけど。
0506デフォルトの名無しさん
2005/08/29(月) 19:18:08double* p = malloc(10*sizeof(double));
は、C++ では
double* p = new double[10];
と書くことは分かりました。
では、C の
memcpy(dst, src, 10*sizeof(double));
は、C++ ではどのように書くのでしょうか。
0507デフォルトの名無しさん
2005/08/29(月) 19:26:10std::copy(src, src + 10, dest)
0509デフォルトの名無しさん
2005/08/29(月) 21:06:51C++ ではどのようにしたらいいですか?
0510デフォルトの名無しさん
2005/08/29(月) 21:19:19だよね?
0511デフォルトの名無しさん
2005/08/29(月) 21:20:500512デフォルトの名無しさん
2005/08/29(月) 21:26:21ディレクトリ操作は特にC++にはない。
boostという拡張ライブラリにはBoost.Filesystem てのがあるが。
標準では、Cと同じ関数で操作するのが普通。
0513デフォルトの名無しさん
2005/08/29(月) 21:40:490514デフォルトの名無しさん
2005/08/29(月) 21:42:54それはCの標準関数で無い以上、C++ではどうしたらいいかというのは答えられない。
boostのようなC++のライブラリ使えとも、Cのopendir()とかをそのまま使えとも答えられるから。
0515デフォルトの名無しさん
2005/08/29(月) 21:50:10誰からも明示的に呼べない関数作ってどうするんだろう??
LISP(scheme)やpythonってlambdaよく使うけど、何の役にたつんだYO!
そのままコードかくだけ・・・じゃないの?cみたいに。。。
なんのための無名ってあるんだ!
0516デフォルトの名無しさん
2005/08/29(月) 22:02:33そこにあるから名前がなくてもいいって感じ。
インラインであるがゆえ。
0517デフォルトの名無しさん
2005/08/29(月) 22:03:59Lisp を使いこなるようになれば分かる。
lambda ってのは、つまり、first-class object だから役に立つんだ。
環境をいっしょくたに抱え込んだ closure としてね。
0518デフォルトの名無しさん
2005/08/29(月) 22:28:08lambdaが欲しければboost::lambda。
0519デフォルトの名無しさん
2005/08/29(月) 22:39:28> VC6で動かないコードはクソ
俺、今仕事で VC6 縛りなんだが
list<int> l;
for (int i = 0; i < 10; ++i)
l.push_back(i);
set<int> s;
s.insert(l.begin(), l.end());
これが通らなくて悲しい。
0520デフォルトの名無しさん
2005/08/29(月) 23:36:20VC6でも、それが通るように書けるんだけど、契約の関係でほったらかしだからな。
0521デフォルトの名無しさん
2005/08/29(月) 23:47:40Cをやろうと思う。
cygwinから、
make
実行したら
main.c
./main.c: line 3: syntax error near unexpected token `('
./main.c: line 3: `int main(void){'
みたいなエラーがでる・・・
コードは以下のとおり
#define __RETURN__ 3
int main(void){
return __RETURN__;
}
なんだろう。。。英字使ってないから文字コード問題はないよね?
0522デフォルトの名無しさん
2005/08/30(火) 05:26:27>gcc version 3.3.3 (cygwin special)
普通にコンパイルできるけど。makefileはどうなってんの?
0523デフォルトの名無しさん
2005/08/30(火) 07:21:10つ.cpp
0525デフォルトの名無しさん
2005/08/30(火) 08:07:42ヒント:スレタイ
0526デフォルトの名無しさん
2005/08/30(火) 08:23:580527デフォルトの名無しさん
2005/08/30(火) 10:02:05関数定義をしたつもりが、変数定義扱いになってる。
だから’(’なんていらねーよと言われてる。
ではなぜ変数扱い?
とか言ってみる。
0528521
2005/08/30(火) 23:42:11ありがとうございます。
特に>>527さんの翻訳は助かりました。
変なトークンじゃない?(って
って感じでしか訳せなくて、意味わかめでした。
原因はまだ探索中、わかったら報告しますじぇ!
0529デフォルトの名無しさん
2005/09/01(木) 01:04:54C++で構造体を使うと、よろしくないですか?
0530529
2005/09/01(木) 01:18:320531デフォルトの名無しさん
2005/09/01(木) 01:51:15使ってよい。
class hoge
{
// ...
};
は
struct hoge
{
private:
// ...
};
と全く同じものだから、何ら問題はない。
0532デフォルトの名無しさん
2005/09/01(木) 02:46:02さすが^^
ご回答有難うございます
0533デフォルトの名無しさん
2005/09/01(木) 02:58:38別にそうなってるから使ってよいわけじゃなくて、
元々何の問題も無いだけだよね。
0534デフォルトの名無しさん
2005/09/02(金) 02:11:52○ と全く同じもの。何ら問題はない。
0535デフォルトの名無しさん
2005/09/02(金) 03:51:28いっしょやん
0537デフォルトの名無しさん
2005/09/02(金) 03:57:440538デフォルトの名無しさん
2005/09/02(金) 04:10:480539デフォルトの名無しさん
2005/09/02(金) 16:32:550540デフォルトの名無しさん
2005/09/02(金) 17:38:32>>535
違うやん。
0541デフォルトの名無しさん
2005/09/02(金) 18:28:390542デフォルトの名無しさん
2005/09/02(金) 18:37:360543541
2005/09/02(金) 18:49:400544デフォルトの名無しさん
2005/09/05(月) 08:29:230545デフォルトの名無しさん
2005/09/05(月) 08:54:57int 分子;
int 分母;
};
0546デフォルトの名無しさん
2005/09/05(月) 10:20:07ttp://boost.cppll.jp/HEAD/libs/rational/rational.html
0547デフォルトの名無しさん
2005/09/06(火) 03:26:18ファイルポインタすなわち FILE型構造体へのポインタを利用する関数(例えばflock)を使用したい場合
どのようにすればよいのでしょうか?
0548デフォルトの名無しさん
2005/09/06(火) 03:33:20とりあえず、標準の範囲では無理。
flock って FILE* だったか?
0549デフォルトの名無しさん
2005/09/06(火) 03:47:410550デフォルトの名無しさん
2005/09/06(火) 08:40:30とりあえず、標準の範囲では無理。
0551デフォルトの名無しさん
2005/09/06(火) 11:43:33private メンバにアクセスできないとエラーが発生してしまいます。
これは public メンバにするしかないのでしょうか?
class CHoge;
typedef int (CHoge::*HogeFunc) ( void );
class CHoge {
int A( void );
int B( void );
int C( void );
static HogeFunc func[3];
};
HogeFunc CHoge::func[3] = {
CHoge::A,// エラー
CHoge::B,// エラー
CHoge::C,// エラー
};
0552デフォルトの名無しさん
2005/09/06(火) 11:51:45まあそれはflockとかはUNIXの文化だから、実は
UNIX使えねー
なわけだけど。
0553デフォルトの名無しさん
2005/09/06(火) 13:20:02普通にコンパイルとおるけど by VC7.1
あと、メンバ関数ポインタの初期化子は、&CHoge::A と書くのが基本だ。
0554551
2005/09/06(火) 19:20:58自己解決したのですが、お馬鹿なミスでした。
確かに>>551は問題無いようです。
自分のプログラムの>>551で言うところの
HogeFunc CHoge::func[3] = {
の部分を
HogeFunc func[3] = {
としていたために発生したエラーでした。
ありがとうございました。
0555デフォルトの名無しさん
2005/09/06(火) 19:22:30std.fill()とかじゃいけなかったの?
0556デフォルトの名無しさん
2005/09/06(火) 19:37:10「FILE*で」 flock()ができるって、どこの国の話でしょうか?
0557デフォルトの名無しさん
2005/09/06(火) 19:38:33stdクラスのfill()メソッドなのか
std名前空間のfill()というグローバル関数なのかが分からないでしょ
0558デフォルトの名無しさん
2005/09/06(火) 20:01:590559デフォルトの名無しさん
2005/09/06(火) 21:29:46JAVA最高!
0560デフォルトの名無しさん
2005/09/06(火) 21:31:40D&Eには型名と同名の変数を作ったときに曖昧性が生じるから :: を使うようにしたと書いてある。
>>558
それを書いているのがD&E。
0561デフォルトの名無しさん
2005/09/06(火) 21:33:13もしくは変数と同名の型名(r
0562デフォルトの名無しさん
2005/09/06(火) 21:47:410563デフォルトの名無しさん
2005/09/07(水) 19:52:430564デフォルトの名無しさん
2005/09/07(水) 21:09:11同じ入力から、書式の等しい出力は可能。
書式文字列の使用は、標準の範囲では不可能。
0565521
2005/09/07(水) 22:27:33いまだに解決できずなやんでいます。
また、gcc や、bcc32
にて、コンパイルはできました。
make
ができません。。。。
whichしたところ、/bin/make
0566デフォルトの名無しさん
2005/09/07(水) 22:32:15今更だけど__RETURN__をRETURNにしてみたらだめか?
0567521
2005/09/07(水) 23:10:19非常に不可解なことが起こりました。
支持どおりRETURNに書き直したところ、うまくいきました。
echo $?
としたところ、3と表示されました。
_RETURN_
にしたらコンパイルエラーなんだろうなと思ったんですが、、、、
なんと_RETURN_もうまくいくようになりました。。。。
なにもしていないんですが。。。
”何かあるとすれば”cygwinのsetup.exeにて、cvsutilsパッケージを
インストールしたぐらいです。
それ以外はギコネコとcygtermしか使ってないっす。。。
めでたしなんですかね?
0568デフォルトの名無しさん
2005/09/08(木) 00:01:15いずれその辺だべ。
0569デフォルトの名無しさん
2005/09/08(木) 08:36:130570デフォルトの名無しさん
2005/09/08(木) 12:44:17>>568-569
それだとまず別のエラーでは? 自分で試してから喋ってる?
まあ、質問者自身、まったく信頼できないので、実際どんなエラー
だったか確認しようが無いが。
つか、驚くべくは、それしきをようやくdebugできたのかよ……
0571デフォルトの名無しさん
2005/09/08(木) 14:44:54こう定義されてたかも。
0572デフォルトの名無しさん
2005/09/08(木) 15:10:26>また、gcc や、bcc32
>にて、コンパイルはできました。
なので、2バイト文字とかじゃなさそうだけれど…
>make
>ができません。。。。
どのコンパイラで問題だったか確認しきれてなさそで話にもならんのでは。
うがっ!!
0573デフォルトの名無しさん
2005/09/08(木) 17:02:34実は改行されてなくてエディタ上で折り返してただけとか?
0574デフォルトの名無しさん
2005/10/19(水) 21:30:010575デフォルトの名無しさん
2005/10/24(月) 09:20:060576デフォルトの名無しさん
2005/10/24(月) 09:47:190577デフォルトの名無しさん
2005/10/24(月) 09:47:410578デフォルトの名無しさん
2005/10/24(月) 17:15:250579デフォルトの名無しさん
2005/10/26(水) 00:59:54これらはCのライブラリから持ってくるしかないんでしょうか?
0580デフォルトの名無しさん
2005/10/26(水) 02:00:55いいえ、Cから受け継いだものをそのまま使うと言うことです。
0581デフォルトの名無しさん
2005/10/26(水) 05:29:17そのまま使え、とあなたは仰ると?
0582デフォルトの名無しさん
2005/10/26(水) 05:40:06いやならシステムコール呼べ
0583デフォルトの名無しさん
2005/10/26(水) 07:18:36お得意のboostとかでなんとかしてくださいよ。
0584デフォルトの名無しさん
2005/10/26(水) 07:35:45いや、得意じゃないから。つーか、なにが気に入らないのやら。
0585デフォルトの名無しさん
2005/10/26(水) 08:54:030586デフォルトの名無しさん
2005/10/26(水) 10:40:51Boost Date-Time Library Documentation
http://boost.cppll.jp/HEAD/libs/date_time/doc/index.html
これでとりあえず我慢します。
0587デフォルトの名無しさん
2005/11/07(月) 11:52:34vector が定義されていますが、2次元以上の
動的な配列を生成するための型は定義されていません。
(もちろん、Boost には定義がありますが)
そこで、いろいろと調べてみたところ、下記のように
記述をすれば何とか2次元の動的な配列を生成できる
ことがわかりました。
vector< vector<int> > matrix(10, 100);
ただ、上記のようにして2次元配列を生成した場合、
配列の拡張をしようと思うと、
matrix.resize(99);
for( i = 10; i < 99; i++ ){
matrix[i].resize(100);
}
のように記述をする必要がありそうで、今ひとつな感じがします。
もっと、エレガントに配列の拡張ができると良いなぁ...と思いますが、
そんな夢みたいな方法ってあるのでしょうか?
# matrix.resize(99,100) と記述できれば良さそうな気はします。。。
0588デフォルトの名無しさん
2005/11/07(月) 18:32:13cppllの過去の投稿をコピペすることの意味を教えてくれ
0589デフォルトの名無しさん
2005/11/08(火) 00:56:220590デフォルトの名無しさん
2005/11/08(火) 05:32:22C++でセコセコやってるのがアホらしくなるよ
0591デフォルトの名無しさん
2005/11/08(火) 05:46:42lispで何ができんの?emacsのすくりぷティングか?
シェル上でASCIIアートか?
0592デフォルトの名無しさん
2005/11/08(火) 06:05:03その場合、デザイン的には、matrix classを組んだ方がいいんじゃない?
メンバー関数として、void resize( size_t m, size_t n ); を定義。
行列をクラスにする事による恩恵は大きい。オペレーターオーバーライドとか、
vectorを使うならコピーコンストラクタは必要だし。
0593デフォルトの名無しさん
2005/11/08(火) 23:02:400594デフォルトの名無しさん
2005/11/09(水) 08:39:090595デフォルトの名無しさん
2005/11/09(水) 13:45:27読んでいたのですが、アスペクト指向ってログ機能だけぢゃない、のですね。
(と、4月にこの本が平積みになっているときに「他に何が使えるの?」
と思っていた)
White Doc Project
http://untrod.keihanna.ne.jp/whitedog/aspect.jsp <http://untrod.keihanna.ne.
jp/whitedog/aspect.jsp>
では、Javaで作られたお絵かきツールを AspectJ を使って
ネットワーク機能に早代わり、ということができるそうです。
調べてみると、C++ の実装である AspectC++
http://www.aspectc.org/Home.1.0.html <http://www.aspectc.org/Home.1.0.html>
というのがあるそうで、プリプロセッサレベルですが、
アスペクト指向プログラミングできるそうです。
AspectC++ のほうは、まだ研究段階っぽいのですが、
使ってみた方はおられるでしょうか?
0596デフォルトの名無しさん
2005/11/12(土) 01:01:460597デフォルトの名無しさん
2005/11/12(土) 01:05:40setjmp() / longjmp() のような物だと思いなせえ。それプラスα。
0598デフォルトの名無しさん
2005/11/12(土) 01:48:270599デフォルトの名無しさん
2005/11/12(土) 03:12:170600デフォルトの名無しさん
2005/11/12(土) 03:19:27作られてない。サンデープログラマなら別に好きなようにすればいいけど。
0601デフォルトの名無しさん
2005/11/12(土) 09:11:27try 〜 catchの例外処理はエラー処理を1箇所でまとめて行うためにある。
たとえばmallocと違いnewはメモリが確保できないと例外を投げる。
そこでtry 〜 catchを使えばメモリ確保するたびにいちいちNULLチェックをする必要がなくなる。
(この例ではメモリの解放が出来ないのがまずいけど)
try
{
int *pHoge = new int[100];
double *pFoo = new double[100];
char *pBar = new char[256];
/* 〜 */
return true;
}
catch (const std::exception& e)
{
return false;
}
0602デフォルトの名無しさん
2005/11/12(土) 09:53:310603デフォルトの名無しさん
2005/11/12(土) 10:24:14try 〜 catch書くと5行ぐらいに増えるけど、
いちいちNULLチェックしたら1行で済んだよ
0604デフォルトの名無しさん
2005/11/12(土) 11:13:210605デフォルトの名無しさん
2005/11/12(土) 13:25:50そのエラー要因を後で知りたい時には、どうすりゃいいんだよ。
0606デフォルトの名無しさん
2005/11/12(土) 13:27:26catch 節に必要な処理を書け。
0607デフォルトの名無しさん
2005/11/12(土) 16:57:03おぃ。
メモリリークはどうする。
0608デフォルトの名無しさん
2005/11/12(土) 19:27:31boost::scoped_ptrでなんとかしてくれ。
0609デフォルトの名無しさん
2005/11/13(日) 01:04:440610デフォルトの名無しさん
2005/11/14(月) 23:23:170611デフォルトの名無しさん
2005/11/17(木) 19:33:49それ以降の代入とかで初めて例外が発生する気がするんだが。
MS VC++の場合。
0612デフォルトの名無しさん
2005/11/17(木) 20:11:42最適化で、newが実行される位置がコード上とはずれているのではないか?
0613デフォルトの名無しさん
2005/11/19(土) 00:14:500614デフォルトの名無しさん
2006/01/22(日) 18:10:170615デフォルトの名無しさん
2006/01/22(日) 18:43:120616デフォルトの名無しさん
2006/01/22(日) 21:41:250617デフォルトの名無しさん
2006/01/22(日) 21:47:15さらに外の catch 節で処理されるか、 terminate() する。
つまり通常の例外発生時と特に変わらない。
0618デフォルトの名無しさん
2006/01/23(月) 06:09:51初めてJavaを見た時C++のパクリだと思った
以上チラシの裏
0619デフォルトの名無しさん
2006/01/23(月) 17:18:190620デフォルトの名無しさん
2006/01/23(月) 19:59:040621デフォルトの名無しさん
2006/01/23(月) 20:07:45Javaのことはほとんど知らないんだけど、それはライブラリではなく、組み込み型なの?
前者だとしたら素晴らしいのはライブラリであって言語じゃないっす。
0622デフォルトの名無しさん
2006/01/23(月) 20:15:26叩かれそうだw
0623デフォルトの名無しさん
2006/01/23(月) 20:20:13別に叩かれてもいいじゃんぬるぽ、匿名なんだしぬるぽ。
0624デフォルトの名無しさん
2006/01/23(月) 20:21:25ガッ
0625デフォルトの名無しさん
2006/01/23(月) 22:06:15足し算できるのはデフォで贔屓されているから。
0626デフォルトの名無しさん
2006/01/24(火) 00:04:59Stringだけ特別扱いで美しさにかけるぜよ
0627デフォルトの名無しさん
2006/01/24(火) 20:45:12コンストラクタの中でエラーするようなことスナ!
0628デフォルトの名無しさん
2006/01/24(火) 20:52:27newの失敗時にNULLが欲しいのなら
new(nothrow) T;
ただ、個人的には戻り値のNULLチェックは、
忘れてしまいがちな処理の上位に入るので例外を投げる仕様のほうが好み
0629デフォルトの名無しさん
2006/01/24(火) 23:52:23nothrow で抑制できるのは
operator new から飛んでくる例外だけだったような。
0630デフォルトの名無しさん
2006/01/25(水) 00:26:38「いかなるコンストラクタからもスローしてはいけません」
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep01202000.asp
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;;
{;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;;
ヾ;;;ハ ノ .::!lリ;;r゙
`Z;i 〈.,_..,. ノ;;;;;;;;>
,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f そんなふうに考えていた時期が
~''戈ヽ `二´ r'´:::. `! 俺にもありました
「今はもう、私は C++ 標準規格の振る舞いが正しいと信じています」
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep02172000.asp
0631デフォルトの名無しさん
2006/01/25(水) 23:38:46ベクトル等の構造体同士を加減算させるために演算子のオーバーロードを
メンバ関数でやっていたのですが、ふと d3dxmath.h を見てみると、
自分では分からない記述でオーバーロードされていました。
D3DXVECTOR2 operator + ( CONST D3DXVECTOR2& ) const;
D3DXVECTOR2 operator * ( FLOAT ) const;
これらはどういった動作をするのでしょうか?
0632デフォルトの名無しさん
2006/01/25(水) 23:43:15動作を理解したところで、旨みが理解できねーから
0633デフォルトの名無しさん
2006/01/25(水) 23:48:57今はCで書いていた自前の算術ライブラリをC++に置きかえつつDX9に対応させてる状態で
その過程でオーバーロードを使っていこう、というわけですので。
数学の勉強とはまた違う話なんですが。
0634デフォルトの名無しさん
2006/01/25(水) 23:50:18変換がおかしいな・・
0635デフォルトの名無しさん
2006/01/26(木) 00:16:18ざっと候補を挙げるだけでこんなにある。
D3DXVECTOR2
operator +
CONST
&
const
operator *
FLOAT
ベクトルとベクトルの加算
ベクトルとスカラーの乗算
0636デフォルトの名無しさん
2006/01/26(木) 00:35:02現在CからC++を勉強するための良い本はプログラミング言語C++第3版くらいしかなさそうです。
(他のC++の本では絶版の物が多いようなので)
プログラミング言語C++第3版とEffective C++を二つ買って14'000円です
他にC++を勉強する良い方法は何か無いでしょうか?
0637デフォルトの名無しさん
2006/01/26(木) 00:43:19俺はC++第3版をBOOKOFFで3000円で買った。
0638デフォルトの名無しさん
2006/01/26(木) 00:48:25プログラミング言語C++第3版
Effective C++ 第2版
More Effective C++
Exceptional C++
Effective STL
C++ FAQ 第2版
C++ Coding Standards
Modern C++ Design
C++の設計と進化
これらを全部読む
0639デフォルトの名無しさん
2006/01/26(木) 00:50:18それは3'000円以上の価値のある買い物をしましたね。
私も古本屋でちょっと探してみたいと思います
0640デフォルトの名無しさん
2006/01/26(木) 00:55:01高価そうな本が並んでいますね(@_@;)
でも、レス有難うございます。参考になりました。
0641デフォルトの名無しさん
2006/01/26(木) 01:21:01「凡用的」ってなんだ?
0642デフォルトの名無しさん
2006/01/26(木) 02:16:47EffectiveC++やMoreEffectiveC++、EffectiveSTLのような「定番」を読んでC++に理解を深めつつ
JavaやC#でもいいから、オブジェクト指向について解説した本を読んで、オブジェクト指向開発の基礎を学ぶ。
で、ある程度慣れてきたらModernC++DesignやExceptionalC++、D&Eのような、ちょっと深めの本を読むといいと思うけど…
漏れはこの順番でやったってだけで、他の方に合うかはワカンネ。
0643デフォルトの名無しさん
2006/01/26(木) 15:55:52ttp://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html
0644デフォルトの名無しさん
2006/01/26(木) 18:46:42そしてそれに対するBjarneからの回答
ttp://public.research.att.com/~bs/bs_faq.html#IEEE
0645デフォルトの名無しさん
2006/01/26(木) 19:43:51しかしそういうジョークが成り立つぐらい規模が大きくなったってことでもあるしな
0646デフォルトの名無しさん
2006/01/27(金) 02:26:49タイムスリップしたかと思った。
0647デフォルトの名無しさん
2006/01/28(土) 03:44:55http://www.artima.com/cppsource/cpp0x.html
0648デフォルトの名無しさん
2006/01/28(土) 15:58:27次期C++標準
0649デフォルトの名無しさん
2006/01/30(月) 22:27:05基本的にはメンバ変数はprivateもしくはprotectにして、直接触らない。
値の変更、参照はメンバ関数を使用する。
と習ったのですが、一々メンバ関数を用意するのは面倒です。
値の変更はやむを得ないとして、メンバ変数を擬似的にリードオンリー
みたいにするアイデアないでしょうか?
0650デフォルトの名無しさん
2006/01/30(月) 22:35:56だからJavaやC#などC++を基にしてできた後の言語では、
みんな、メンバ変数へのアクセスのようだけど実際にはメンバ関数の呼び出しになる「プロパティ」という機能がある。
ちなみにprotectedなメンバ変数も少し気を付けておいた方がよいと思う。
0651デフォルトの名無しさん
2006/01/30(月) 22:40:04あるよ。 template 使って property を実装すればいい。
しかし「一々メンバ関数を用意する」という考え方自体に意味が無い。
大雑把でもクラスの役割とインターフェースをひととおり決めて、
その後にどんなメンバ変数が必要かを決めるようにしたほうがいい。
0652デフォルトの名無しさん
2006/01/31(火) 15:24:42new, delete, コンストラクタ回りを理解するために
Better C スタイルで, 以下のようなコードを書きまして…
0653デフォルトの名無しさん
2006/01/31(火) 15:28:20{
public:
char szData[4];
X();
virtual ~X();
void* operator new( size_t );
void* operator new[]( size_t );
void operator delete( void* );
void operator delete[]( void* );
};
0654& ◆D3ra0B2LiQ
2006/01/31(火) 15:29:35putchar('.');
}
X::~X() {
putchar('.');
}
void* X::operator new( size_t size ) {
printf( "\n/メモリ確保中. operator new( size=%d )/", size );
return ::malloc(size);
}
void* X::operator new[]( size_t size ) {
printf( "\n/メモリ確保中. new[]( size=%d )/", size );
return ::malloc(size);
}
void X::operator delete( void* obj ) {
printf("/メモリ開放中. delete( obj )/\n" );
::free(obj);
}
void X::operator delete[]( void* obj ) {
printf("/メモリ開放中. delete[]( obj )/\n" );
::free(obj);
}
0655デフォルトの名無しさん(653)
2006/01/31(火) 15:30:39{
public:
char szData[4];
ChildX();
~ChildX();
};
ChildX::ChildX() {
putchar('.');
}
ChildX::~ChildX() {
putchar('.');
}
0656& ◆D3ra0B2LiQ
2006/01/31(火) 15:32:15{
puts("\n");
{
X* pData = new X;
X* pDataArray = new X[10];
putchar('\n');
printf("オブジェクトのサイズ: sizeof(X* pData)=%d, sizeof(X)=%d)\n"
, sizeof(pData), sizeof(X));
printf( "オブジェクトの場所: pDataArray[0]=[%p],\n"
" pDataArray[1]=[%p],\n"
" pDataArray[9]=[%p]\n"
, &pDataArray[0], &pDataArray[1], &pDataArray[9] );
printf( "&pDataArray[9] - &pDataArray[0] = [%d]\n"
, &pDataArray[9] - &pDataArray[0]);
delete pData;
delete [] pDataArray;
}
0657653
2006/01/31(火) 15:38:56{
X* pData = new ChildX;
X* pDataArray = new ChildX[10];
putchar('\n');
printf("オブジェクトのサイズ: sizeof(X* pData)=%d, sizeof(X)=%d)\n"
, sizeof(pData), sizeof(X));
printf( "オブジェクトの場所: pDataArray[0]=[%p],\n"
" pDataArray[1]=[%p],\n"
" pDataArray[9]=[%p]\n"
, &pDataArray[0], &pDataArray[1], &pDataArray[9] );
printf("&pDataArray[9] - &pDataArray[0] = [%d]\n"
, &pDataArray[9] - &pDataArray[0]);
delete pData;
delete [] pDataArray;
}
puts("");
return 0;
}
0658653
2006/01/31(火) 15:40:140659653
2006/01/31(火) 15:40:521: /メモリ確保中. operator new( size=8 )/.
2: /メモリ確保中. new[]( size=84 )/..........
3: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
4: オブジェクトの場所: pDataArray[0]=[00431AB4],
5: pDataArray[1]=[00431ABC],
6: pDataArray[9]=[00431AFC]
7: &pDataArray[9] - &pDataArray[0] = [9]
8: ./メモリ開放中. delete( obj )/
9: ........../メモリ開放中. delete[]( obj )/
10:
11:
12: /メモリ確保中. operator new( size=12 )/..
13: /メモリ確保中. new[]( size=124 )/....................
14: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
15: オブジェクトの場所: pDataArray[0]=[00431A84],
16: pDataArray[1]=[00431A8C],
17: pDataArray[9]=[00431ACC]
18: &pDataArray[9] - &pDataArray[0] = [9]
19: ../メモリ開放中. delete( obj )/
20: ..................../メモリ開放中. delete[]( obj )/
0660653
2006/01/31(火) 15:43:511: /メモリ確保中. operator new( size=8 )/.
2: /メモリ確保中. new[]( size=84 )/..........
3: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
4: オブジェクトの場所: pDataArray[0]=[00902DA4],
5: pDataArray[1]=[00902DAC],
6: pDataArray[9]=[00902DEC]
7: &pDataArray[9] - &pDataArray[0] = [9]
8: ./メモリ開放中. delete( obj )/
9: ........../メモリ開放中. delete[]( obj )/
10:
11:
12: /メモリ確保中. operator new( size=12 )/..
13: /メモリ確保中. new[]( size=124 )/....................
14: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
15: オブジェクトの場所: pDataArray[0]=[00902DA4],
16: pDataArray[1]=[00902DAC],
17: pDataArray[9]=[00902DEC]
18: &pDataArray[9] - &pDataArray[0] = [9]
19: ../メモリ開放中. delete( obj )/
20: ........../メモリ開放中. delete[]( obj )/
0661653
2006/01/31(火) 15:44:451: /メモリ確保中. operator new( size=8 )/.
2: /メモリ確保中. new[]( size=84 )/..........
3: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
4: オブジェクトの場所: pDataArray[0]=[003D4944],
5: pDataArray[1]=[003D494C],
6: pDataArray[9]=[003D498C]
7: &pDataArray[9] - &pDataArray[0] = [9]
8: ./メモリ開放中. delete( obj )/
9: ........../メモリ開放中. delete[]( obj )/
10:
11:
12: /メモリ確保中. operator new( size=12 )/..
13: /メモリ確保中. new[]( size=124 )/....................
14: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
15: オブジェクトの場所: pDataArray[0]=[003D49BC],
16: pDataArray[1]=[003D49C4],
17: pDataArray[9]=[003D4A04]
18: &pDataArray[9] - &pDataArray[0] = [9]
19: ../メモリ開放中. delete( obj )/
20: ..[!!! ここで Windows により強制終了. !!!]
0662653
2006/01/31(火) 15:49:12その理由がいまいちよく解らないのです.
virtual ~X()
のところを
~X()
としてコンパイル実行すると上手くいくのですが,
20 行目の点が足りなくなってしまい, 困ってます.
アドバイス下さい;;
(652-662 長文失礼しました.)
0663デフォルトの名無しさん
2006/01/31(火) 15:56:36X*p=new X[10];
delete[]p;
は問題ないが
X*p=new ChildX[10];
delete[]p
は実はC++では駄目。
なぜなら、これを実現しようとすると型のサイズと要素数の二つを暗黙的に管理する必要になるので、
そんなもったいないことは貧乏くさいC++では許さないのだ。
ChildX*p = new ChildX[10];
delete[]p;
のように正しい型の配列にするか、
X**p=new X*[10];
for(int i=0;i<10;++i)p[i] = new ChildX;
for(int i=0;i<10;++i)delete p[i];
delete[]p;
のようにポインタの配列にするのがC++のルール。
0664653 (652-662)
2006/01/31(火) 16:22:59そうだったのか….
ありがとうございました.
助かります.
0665デフォルトの名無しさん
2006/02/20(月) 06:35:55で作成した後、
a[9]だけ削除したいのですが、どのようにしたらよいのでしょうか?
0666デフォルトの名無しさん
2006/02/20(月) 08:02:56意味わかんね。
4or8byte程度ほっとけ。
0667デフォルトの名無しさん
2006/02/20(月) 08:37:50reallocみたいなのはnew , delete の仲間には無い。
0668デフォルトの名無しさん
2006/02/20(月) 15:11:59要素数を動的に増減させたいなら vector 使え。
0669デフォルトの名無しさん
2006/02/22(水) 05:46:580670デフォルトの名無しさん
2006/02/22(水) 08:12:45それだけの目的なら必要はないと思うけど?
0671デフォルトの名無しさん
2006/03/10(金) 17:02:47char* s;
という変数があって、上記変数に値を代入した後
int hogehoge( const char* a )
という関数に渡したいのですがエラーになります。
どうすればいいのでしょう?
0672デフォルトの名無しさん
2006/03/10(金) 17:19:530673デフォルトの名無しさん
2006/03/14(火) 07:37:29メモリ使用量とか動作スピードとかはリストの方がエコですか?
0674デフォルトの名無しさん
2006/03/14(火) 08:52:31少なくとも、メモリ使用量はlistの方が多くなるし、頻繁な要素の入れ替えや中間への挿入削除以外は速度も遅くない。
0675デフォルトの名無しさん
2006/03/14(火) 09:55:100676デフォルトの名無しさん
2006/03/14(火) 10:15:14設計を見直す。
0677デフォルトの名無しさん
2006/03/14(火) 11:56:390678デフォルトの名無しさん
2006/03/14(火) 12:22:380679デフォルトの名無しさん
2006/03/14(火) 13:02:08http://www.vector.co.jp/
0680デフォルトの名無しさん
2006/03/14(火) 17:44:580681デフォルトの名無しさん
2006/03/14(火) 18:00:12dequeよりvectorのほうが実装が単純に出来るだろうし、実装が単純ということは速くなるだろうし。
これは実装の問題ではないが、規格ではvectorしかメモリ上での要素の連続が保障されていないというのも大きい。
0682デフォルトの名無しさん
2006/03/14(火) 18:41:090683http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 20:38:17もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0684デフォルトの名無しさん
2006/04/02(日) 05:38:59lagged_fibonacci1279 gen;
normal_distribution<> dst( 100.0, 20.0 );
variate_generator<lagged_fibonacci1279, normal_distribution<>> rand( gen, dst );
と書いたのですが、2行目と3行目で定数、及び識別子構文エラーが出てコンパイルできません。
クラス外に書いたときは問題ないのですが、クラスごとにseedなどを管理したいので
クラス内に書きたいのですが、どのように書けばよいのでしょうか?
0685デフォルトの名無しさん
2006/04/02(日) 13:29:39normal_distribution<> >
0686デフォルトの名無しさん
2006/04/03(月) 02:29:43思ってたんですけど、もうc++って言語をcと分けないと
訳がわかんなくなってきました
で、お勧めの書籍ってあります?
推薦図書のスレあんま参考になんないっす。
0687デフォルトの名無しさん
2006/04/04(火) 00:15:26憂鬱な(ry
0688デフォルトの名無しさん
2006/04/04(火) 23:05:49(オブジェクト指向ならSqueakとか)
一通りやってからC++に戻ったら、
パワーアップした自分に気がつく(はずw)
0689デフォルトの名無しさん
2006/04/05(水) 04:09:35ういっす
そうします。
0690デフォルトの名無しさん
2006/04/10(月) 21:00:530691デフォルトの名無しさん
2006/04/10(月) 21:40:57できる
0692デフォルトの名無しさん
2006/04/11(火) 14:01:49class Core{
public:
double grade() const;
protected:
double midterm,final;
std::vector<double> homework;
}
double Core::grade() const{
return ::grade(midterm,final,homework);
}
class Grad: public Core{
public:
double grade() const;
}
double Grad::grade() const{
return min(Core::grade());
}
この様に書かれている場合でも、Grad::grade()から呼び出されたCore::grade()内の
midterm,final,homeworkは全てCore::ですよね?
だとすると、Gradオブジェクトは
Core::midterm,final,homeworkを持つという事でしょうか?
Grad::midterm,final,homeworkを持つのではなく。
よろしくお願いします。
0693デフォルトの名無しさん
2006/04/11(火) 17:52:51どちらかというとmidterm, final, homeworkはCoreのメンバだけど、
GradはCoreの派生クラスだから、GradではCoreのメンバもGrad::でアクセスできるという感じ。
0694デフォルトの名無しさん
2006/04/23(日) 08:46:150695デフォルトの名無しさん
2006/05/17(水) 22:37:29エラー処理を1カ所にまとめてしまうと、
new int[100];
new double[100];
new char[256];
のどこでメモリ確保に失敗したのかを知ることはできるのでしょうか?
メモリ確保失敗が1つでも発生すればプログラムは期待通りに動かないわけですから、
成功した分を解放してから抜ける必要があるかと思いますが。
0696デフォルトの名無しさん
2006/05/17(水) 23:21:25vector<int> i(100);
vector<double> d(100);
vector<char> c(256);
これでも失敗した箇所を知ることはできないが、成功した分の解放は問題ない。
失敗した箇所を知ることによって何かできることがあるだろうか?
0697デフォルトの名無しさん
2006/05/18(木) 00:22:450699デフォルトの名無しさん
2006/05/19(金) 16:36:43boost::scoped_arrayやshared_arrayがあるしな。
0700デフォルトの名無しさん
2006/05/20(土) 20:55:420701デフォルトの名無しさん
2006/05/20(土) 21:23:59これは別にそーゆー設計が悪いってんじゃなくて単にそーゆー設計がC++と相性が悪いから。
0702デフォルトの名無しさん
2006/05/31(水) 10:43:53AのプログラムからBのプログラムを非同期で起動する。(Aはその後終了)
CのプログラムからBのプログラムを終了させる。
やってみたこと
AのプログラムはCreateProcessでBのプログラムを単純に起動してそのまま終了。
BにはサンプルによくあるコールバックのWndProcに、WM_CLOSEとかを作っておく。
Cのプログラムで、イメージ名(B実行体)をキーにプロセス一覧からプロセスIDを取る。
プロセスIDをOpenProcessに引き渡してプロセスハンドルを得る。(PROCESS_ALL_ACCESS)
そのハンドルにPostMessageでWM_CLOSEを投げてみる。
★何も起きない
・そのハンドルにTerminateを実行すると強制終了はできる。
何か根本的に間違っていたらごめんなさい。
0703デフォルトの名無しさん
2006/05/31(水) 17:15:05プロセスハンドルにPostMessageで投げる?
PostMessageはウィンドウに投げる関数だからウィンドウハンドル渡さないと駄目だろ。
0704デフォルトの名無しさん
2006/06/02(金) 08:37:300705デフォルトの名無しさん
2006/06/02(金) 09:33:45それだけの条件じゃ「問題ない」とは言い切れないなぁ。
心配している問題について正しく理解するのをお勧めする。
0706デフォルトの名無しさん
2006/06/03(土) 12:29:28クラス内にある関数をコールバック関数として登録し、そのコールバック関数内でメンバー変数を変更したいのですが
うまいやり方がわからずに悩んでおります。
現状のソースはこんな感じです。
ヘッダ
class ProcessManager {
static void m_SigChildHandler(); //コールバック関数として使用したい関数
int status; //状態
void m_Init_Application();
};
ソース
typedef void (*THREADFUNC)(int);
void ProcessManager::m_Init_Application() {
signal(SIGCHLD, (THREADFUNC)m_SigChildHandler); /* signal監視 */
}
void ProcessManager::m_SigChildHandler() {
status = 1; //状態変化したいけれどできない。
}
int main() {
ProcessManager cProcessManager;
cProcessManager.m_Init_Application();
}
0707デフォルトの名無しさん
2006/06/03(土) 12:33:32クラス内の静的(static)な関数は、クラスの中にあるということ以外、普通の関数と変わらない。
つまり静的でないメンバー変数にはアクセスできない。
0708デフォルトの名無しさん
2006/06/03(土) 12:42:25でもって、コールバックの使い方自体が間違ってる。
つうか、コールバックの意味知ってるのか?
相手関数コール時点で、「私に返事ください。お返事先はここです。」と、コールバックアドレスを教えれ。
0709デフォルトの名無しさん
2006/06/03(土) 12:46:51継承されたクラスから継承元クラスにコールバクという使い方が一般的。
0710デフォルトの名無しさん
2006/06/03(土) 12:47:05そうするとみなさんどのように実装しているのでしょうか。
コールバック関数のみクラスの外に出して、状態はグローバル変数で持つなどしなければいけないのでしょうか?
0711デフォルトの名無しさん
2006/06/03(土) 12:48:04別に間違ってないと思うぞ?
0712デフォルトの名無しさん
2006/06/03(土) 12:48:16で、signalを相手にしている706はどうするの?
0713デフォルトの名無しさん
2006/06/03(土) 12:48:40調べて、試してみます。
0714デフォルトの名無しさん
2006/06/03(土) 12:48:50statusも静的メンバー変数にしてしまえばいい。
0715706
2006/06/03(土) 12:49:58710と712は私です。
0716デフォルトの名無しさん
2006/06/03(土) 12:52:490717デフォルトの名無しさん
2006/06/03(土) 12:55:08シグナルを相手にするのはコールバックする方のクラスじゃなくって、コールバックされるのを待っている方のクラスだろ?
そっちに全部集約しておけばいいじゃん。
0718デフォルトの名無しさん
2006/06/03(土) 12:59:00どのみち実際にハンドラ呼ぶのは signal で、
そこにどうやって this ポインタ渡すんだっつー問題が
解決していない。
0719デフォルトの名無しさん
2006/06/03(土) 13:02:06監視したい子プロセスが1つしかない場合は、>>714の通り、statusをstaticにしてしまえばいい。
子プロセスが複数あり、各プロセスごとに個別のコールバックを呼び出したければ、
CProcessManagerにプロセスIDとコールバックを納めたクラスのインスタンス(やポインタ)をstd::mapで保存しておいて、
sigactionでシグナルを監視する。
sigactionはコールバック時に、シグナルを発生させた子プロセスのIDが分かるから、
IDから逆引きでプロセスのインスタンスを取得し、コールバック関数を呼び出してやればいいかと。
0720デフォルトの名無しさん
2006/06/03(土) 13:05:330721706
2006/06/03(土) 13:12:02今、色々皆さんから教わったキーワードでググっているところです。
結構ヘタレなので、理解に時間がかかっています。
0722デフォルトの名無しさん
2006/06/03(土) 13:17:53どういう事か、考えてね/
0723デフォルトの名無しさん
2006/06/03(土) 13:48:46コールバックこれオヌヌメ
0724デフォルトの名無しさん
2006/06/04(日) 13:33:28struct foo
{
int number;
std::string name;
};
のような構造体を作り
std::vector<foo> team;
のような動的配列を作り、がしがし追加していきます。
あとでnumber順にソートしたくなったとき
std::sort( team.begin(), team.end() );
では比較できないため、関数オブジェクトを作りました。
0725724
2006/06/04(日) 13:35:03{
public:
bool operator()( const foo &left, const foo &right )
{
return left.number < right.number;
}
}
そののち、
std::sort( team.begin(), team.end(), comp() ); // compの一時インスタンスを作る
するとソートされます。
分からないのは、構造体やクラスを抱えたコンテナのソートをするには、
その度に関数オブジェクトを作らないといけないのでしょうか。
intとかstd::stringならgreater<>が用意されているのは調べました。
調べた本はSTL標準講座、あとはぐぐりましたが、そこまで書いてあるものは見つけられませんでした。
0726デフォルトの名無しさん
2006/06/04(日) 13:38:07クラス自体の順序付けを定義する operator < をつけてしまえば
関数オブジェクトを渡さなくてもソートできる。そうでなければ
関数オブジェクトを渡す必要がある。
これが面倒なんで、 boost::lambda とか使って楽をしようという道もある。
0727724
2006/06/04(日) 14:44:29operator<を定義しておけばいいのですね、ありがとうございます。
いまのところ、ソートのキーは1つだけなので、それでいきます。
将来、複数のキーでソートするときはboost::lambdaを調べます。
0728702
2006/06/05(月) 08:21:54プロセスハンドルとウィンドウハンドルの違いも分からずお恥ずかしい限りです。
ということは、この方法ではメッセージを投げることはできないのですね。
FindWindowを使えば…とは思いますが、クラス名とウィンドウ名で判断するのはなんとも…。
ありがとうございました。
0729デフォルトの名無しさん
2006/06/05(月) 17:04:14例えばEnumWindowsで、各々に対してGetWindowThreadProcessIdするとか。
0730デフォルトの名無しさん
2006/08/25(金) 08:59:50C++形式で書くとわかりやすくはあるけど、Cでできなかった〜がC++にしたからできる、という状況に遭遇しない。
0731デフォルトの名無しさん
2006/08/25(金) 09:07:031からC++を勉強し直す事をお勧めする。
0732デフォルトの名無しさん
2006/08/25(金) 10:10:24>Cでできなかった〜が
具体的に何かある?
0733デフォルトの名無しさん
2006/08/25(金) 19:33:45これに何の価値も見いだせないなら、Cを使っていればいい。
0734デフォルトの名無しさん
2006/08/26(土) 18:27:32何もない
メールを使わずに郵便封筒でもいい
勤務表をエクセルでなく、手書き+時間計算をすればいい、要はコスト削減
具体的にはクラスってやつでくくるのよ、コードをパックにする(カプセル化)
カプセルにしたら、ネット上で公開されてる別のカプセルを使えるのが利点
Cなら関数のコピペでしょ、それがファイル単位になる
0735デフォルトの名無しさん
2006/08/28(月) 11:14:57じゃなくて、「Cでできない事」って何さ。
0736デフォルトの名無しさん
2006/08/28(月) 12:14:21Cでlongjmp/setjmpを使っても、例外処理と全く同等の機能を
実現する事は出来ない。
0737デフォルトの名無しさん
2006/08/28(月) 23:55:48うんむ、デザパタとかじゃなく、不可能なことてことか
ま、1本1本線引いたらGUIもできるしな〜
PGが1万人いたら何でも可能ってとこかな
0738デフォルトの名無しさん
2006/09/09(土) 00:11:00CとC++は無縁。
Cのテクニックは全て忘れろ。
Cはアセンブラの亜種とでも思っておくと丁度しっくりくる。
0739デフォルトの名無しさん
2006/09/09(土) 12:31:570740デフォルトの名無しさん
2006/09/11(月) 21:57:41C++では、インラインでCも書けると思うのがよいのかもしれない。
0741デフォルトの名無しさん
2006/09/17(日) 00:26:11そこでCの知識を全く必要としないC++の書籍を探していますが、
私の目にした多くの本はCを知っていることが前提となっていました。
なにかお勧めのものはないですか?
0742デフォルトの名無しさん
2006/09/17(日) 07:58:04Accelerated C++
0743デフォルトの名無しさん
2006/09/17(日) 19:03:520744デフォルトの名無しさん
2006/09/17(日) 19:41:40まずアセンブラをやれ
すこしかじるだけでいい
実際、C++の本にはメモリやアドレスの「定義」が載っていないので
それ無しではかならず詰まる。これは君の責任ではない
ただCはやらなくてよい
0745デフォルトの名無しさん
2006/09/17(日) 20:10:41だからC言語を知らないとC++は使えない。
なんてアホな事を言う奴の話は聞くなよ。
C++の奥義はboostの中にある。
0746デフォルトの名無しさん
2006/09/18(月) 04:42:120747デフォルトの名無しさん
2006/09/18(月) 10:35:13もしくは極めて少ない、加えて超いばらの道だよね。
やっぱCかじってから入った方がいいんでねぇの?
0748デフォルトの名無しさん
2006/09/18(月) 15:19:520749デフォルトの名無しさん
2006/09/18(月) 15:48:220750デフォルトの名無しさん
2006/09/18(月) 16:54:480751デフォルトの名無しさん
2006/09/23(土) 04:55:070752デフォルトの名無しさん
2006/10/10(火) 01:20:320753デフォルトの名無しさん
2006/10/10(火) 12:31:540754デフォルトの名無しさん
2006/10/20(金) 23:27:32オブジェクト指向の概念からかじるような本で始めた人では会話が噛み合わない
そんな偏見を持ってたり
0755デフォルトの名無しさん
2006/10/22(日) 02:38:27わざわざ数字コテにして自分の存在をアピールしても
他と同様、カスであることに変わりはないんだから無理すんなwww
0756デフォルトの名無しさん
2006/10/22(日) 15:17:29http://dictionary.goo.ne.jp/search.php?MT=%CB%DE%CD%D1
0757デフォルトの名無しさん
2006/10/22(日) 15:41:12OOP
0758デフォルトの名無しさん
2006/10/22(日) 15:48:490759デフォルトの名無しさん
2006/10/24(火) 10:16:290760デフォルトの名無しさん
2006/10/24(火) 13:30:41C++ではnamespaceに属することが推奨されるようになったが
stdio.hやiostream.hなどのライブラリをstdの名前空間に入れてしまうと
今まで作られてきたソースがみんなコンパイルエラーになってしまう。
そのため苦肉の策としてC++のヘッダうちstdに属するもののは.hをはずし
iostream.h→iostream
C言語標準のヘッダはさらに先頭にcをつけて
stdio.h→cstdio
として昔の仕様との互換性をもたせたらしい。
0761デフォルトの名無しさん
2006/10/25(水) 01:57:180762デフォルトの名無しさん
2006/10/28(土) 23:16:27俺も昨日買って来たぞ。
C++は入門したばっかだけど、読み物としても面白いな。
含蓄の部分は徐々にわかっていくのだろうと期待。
0763デフォルトの名無しさん
2006/10/29(日) 07:50:24そもそもそのようなことはできるのでしょうか?
0764デフォルトの名無しさん
2006/10/29(日) 09:01:11別の名前空間なんだよな?
継承元に名前空間の指定を付ければいいんじゃない?
これで違ってたら、ソースとエラーメッセージ晒せ。
0765デフォルトの名無しさん
2006/12/15(金) 19:45:170766デフォルトの名無しさん
2006/12/15(金) 19:50:020767デフォルトの名無しさん
2006/12/18(月) 19:15:24文字列定数の配列をクラス定義の中に埋める方法教えてくれ<(_ _)>
0768デフォルトの名無しさん
2006/12/18(月) 22:32:350769デフォルトの名無しさん
2006/12/19(火) 10:30:22class CHoge {
public:
static const char *A[];
};
const char *CHoge::A[] = { "HOGE1", "HOGE2", "HOGE3" };
こんな感じ?
0770デフォルトの名無しさん
2006/12/19(火) 19:38:210771デフォルトの名無しさん
2006/12/20(水) 01:00:520772デフォルトの名無しさん
2006/12/20(水) 03:39:250773デフォルトの名無しさん
2006/12/20(水) 04:55:47一緒です。
0774769
2006/12/20(水) 10:13:54指摘サンクス。
static const char* const A[];
と
const char* const CHoge::A[] = { "HOGE1", "HOGE2", "HOGE3" };
ってことですね。詰めが甘いな俺orz
0775デフォルトの名無しさん
2006/12/20(水) 10:24:190776デフォルトの名無しさん
2006/12/20(水) 19:00:560777デフォルトの名無しさん
2006/12/20(水) 20:12:28class CHoge {
public:
static const char** GetA() {
static const char *A[] = {"HOGE1", "HOGE2", "HOGE3"};
return A;
}
};
>>772
参照・イテレータによって多少は使う機会が減るかもしれない。
スマートポインタによって動的メモリの解放し忘れは減るかもしれない。
そういう点では楽になるかもしれないが、学ぶべきことが減っているわけではないので、
結局簡単になったとは言えないと思う。
0778デフォルトの名無しさん
2006/12/20(水) 20:26:12Cのポインタすら理解して無い人には、C++はハードル高いと思う
0779デフォルトの名無しさん
2006/12/20(水) 20:47:420780デフォルトの名無しさん
2006/12/20(水) 21:22:20別に簡単になるわけではない。
0781デフォルトの名無しさん
2006/12/20(水) 21:25:10ポインタみたいに使えるけども
仕組みを理解するのには、ポインタ理解するよりめちゃめちゃ難しい。
0782デフォルトの名無しさん
2006/12/20(水) 21:34:50聞くより手を動かしたほうぐあ
0783デフォルトの名無しさん
2006/12/20(水) 21:55:210784デフォルトの名無しさん
2006/12/20(水) 23:12:18劇重くてたいへんなことになっちゃた(T_T)
どーしよ。
0785デフォルトの名無しさん
2006/12/21(木) 00:15:10reserveを適切に使う。
(特にclass/structを格納する場合)オブジェクトのコピーをなるべく起こさせないようにする。
(メモリの割り当てに時間を取られている場合)アロケータを標準のものから高速なものへ取り替える。
0786デフォルトの名無しさん
2006/12/21(木) 18:38:450787デフォルトの名無しさん
2007/01/04(木) 19:58:390788デフォルトの名無しさん
2007/01/04(木) 21:28:43標準的方法は存在しない
0789デフォルトの名無しさん
2007/01/05(金) 02:42:17filebufのpubsetbuf()が、stdioのsetvbuf()に相当する。
char mybuffer[8192];
of.rdbuf()->pubsetbuf(mybuffer, sizeof mybuffer);
0790デフォルトの名無しさん
2007/01/06(土) 04:55:12そんだけ、コンテナ内部で色々してるって事
重いのはしゃーねー
0791デフォルトの名無しさん
2007/01/06(土) 05:52:38そんな見方じゃ C++ の魅力がほとんど無いだろ。
効率を落とさずに抽象化できるのが C++ の重要な特徴の一つだ。
どうせ >>784 は最適化かけずに比較してるんだろ。
0792デフォルトの名無しさん
2007/01/06(土) 18:59:45直接char型ポインタ引数とかに渡しても大丈夫な(ちゃんとchar型ポインタとして使える)
ようにするにはどうすればよろしいですか
0793デフォルトの名無しさん
2007/01/06(土) 19:06:00class 俺string
{
typedef char value_type;
valut_type *value;
...
operator const value_type *() const
{
return value;
}
...
};
0794793
2007/01/06(土) 19:08:010796デフォルトの名無しさん
2007/01/06(土) 20:06:27そうだけど、それだけだと printf の第一引数には使えても第二以降の引数には使えない。
第一引数は printf 関数の第一引数が const char * だと型が明示されているから変換オペレータが
呼び出されるからいいんだけど、第二以降の引数は型が明示されていないから
変換オペレータが呼び出されないから >>794 のルールを守ってないとアウト。
0798デフォルトの名無しさん
2007/01/18(木) 23:02:380799デフォルトの名無しさん
2007/01/19(金) 02:33:30STLと完全互換ではない
0800デフォルトの名無しさん
2007/01/19(金) 05:25:460801デフォルトの名無しさん
2007/01/19(金) 14:21:12void f(void)
{
const int x=10;
}
と
void f(void)
{
static const int x=10;
}
では何か違いが出ますか?
クラス内の定数は、複数のconstのインスタンスが作られないようstaticをつける様にしているのですが、
通常の関数の場合はどうなのでしょうか?
0802デフォルトの名無しさん
2007/01/19(金) 14:27:00定数式で初期化してて、アドレスや参照を取ってなければ違いは無いだろうね。
実際はコンパイラによるだろうから、アセンブリ吐かせて確認したほうがいいだろう。
0803デフォルトの名無しさん
2007/04/13(金) 09:53:01strcpy(s, NULL);
じゃいけないのでしょうか?
0804デフォルトの名無しさん
2007/04/13(金) 10:12:29スレタイ100回音読の刑に処す。
0805デフォルトの名無しさん
2007/04/13(金) 10:52:44たった数行の質問で、色々と間違いをしてるのがすごいな
0806デフォルトの名無しさん
2007/04/19(木) 13:47:150807デフォルトの名無しさん
2007/04/19(木) 19:38:190808デフォルトの名無しさん
2007/04/22(日) 18:24:01どのように取得したらよいのでしょうか?
0809デフォルトの名無しさん
2007/04/22(日) 21:32:40逆にファイル記述子を通じて読み書きするストリームバッファを
自分で作れというのが正攻法だが面倒。
最近ではBoost.Iostreamsが支援してくれるけど。
0810デフォルトの名無しさん
2007/05/25(金) 01:08:57#include <stodio.h>
int main(void)
{
printf("Hello, World!!\n");
}
(゚∀゚)=3 ムッハー!!
0811デフォルトの名無しさん
2007/05/25(金) 06:12:250812デフォルトの名無しさん
2007/05/25(金) 08:52:56みんなどのあたりからC++へ移行したの?
とりあえず入門本は理解したから、あとはポインタとかをしっかり勉強してから
C++へ移行しようかとか思ってたんだけどアドバイスください。
0813デフォルトの名無しさん
2007/05/25(金) 09:40:310814デフォルトの名無しさん
2007/05/26(土) 01:56:39ヘッダに構造体がtypedef structじゃなくてstructだけで宣言してあるソースが
たくさんあるソースを綺麗にする作業にあたった・・・逃げ出したくなった・・・orz
結構つらいなこれ
引数に
int getSub(struct RGB_LL_COLOR col)
とかあって、こんな使い方正直みたことなかった・・・
どうしてstructをtypedef structに直すとエラーが出るのかさっぱりわからんかった
今日、ちょっとだけ理解できた・・・気がするw
0815デフォルトの名無しさん
2007/05/26(土) 15:14:440816デフォルトの名無しさん
2007/05/26(土) 18:16:54どうするのが普通なんだろ?
0817デフォルトの名無しさん
2007/05/26(土) 20:16:050818デフォルトの名無しさん
2007/05/27(日) 10:29:38それだとヘッダが重複するとインクルードガードがあっても
エラーがでるやんか?
0819デフォルトの名無しさん
2007/05/27(日) 12:20:070820デフォルトの名無しさん
2007/05/27(日) 12:50:42そもそも俺がtypedefもstructもどういう命令文なのか理解できてないのが問題だな
構造体はこうやって宣言するんだぞ。以上
って入門書読んだだけだったからなーw
最初こんな↓風になってた
ヘッダ部(ここから)
構造体定義
struct RGB_LL_COLOR{
int *R;
int *G;
int *B;
}Rgb;
関数定義
int setRgbColorXXX(struct RGB_LL_COLOR *out,int a,int b);
ヘッダ部(ここまで)
このヘッダを#includeしようとすると一箇所でしか#includeできない
#includeしてるヘッダも一箇所でしか#includeできない
って状況だった
0821デフォルトの名無しさん
2007/05/27(日) 12:56:54ならtypedefを使わずともstruct RGB_LL_COLORではなく、RGB_LL_COLORと使えるぞ。
0822デフォルトの名無しさん
2007/05/27(日) 13:05:28こまかいことは気にするなw
ああ、ちなみに間違えた>>820の関数定義は内容も書いてあった
int setRgbColorXXX(struct RGB_LL_COLOR *out,int a,int b){
内容が書いてある
}
まあ、>>820を普通にこう直したんだ
ヘッダ部(ここから)
構造体定義
typedef struct{
int *R;
int *G;
int *B;
}RGB_LL_COLOR;
関数宣言
int setRgbColorXXX(RGB_LL_COLOR *out,int a,int b);
ヘッダ部(ここまで)
0823デフォルトの名無しさん
2007/05/27(日) 13:07:21ヘッダのインクルード
#include "rgb_color.h"
関数定義
int setRgbColorXXX(RGB_LL_COLOR *out,int a,int b){
内容が書いてある
}
ソース部(ここまで)
という感じにしてどこからでもヘッダを呼べるようにした
>>820の状態ではヘッダとソースでわけることもできんかった
0824デフォルトの名無しさん
2007/05/27(日) 13:15:13>>820 が駄目なのは struct ... Rgb; という変数がヘッダで定義されてるから。
>>822-823 ではその変数の定義が消えてるんだが、いいのか?
0825デフォルトの名無しさん
2007/05/27(日) 22:35:17そうそう、グローバル変数になってたから消した
0826デフォルトの名無しさん
2007/05/28(月) 00:01:52> #includeしてるヘッダも一箇所でしか#includeできない
インクルードガードかけろよ
まあヘッダでインライン関数でない関数を定義するのは論外だけどさ
0827デフォルトの名無しさん
2007/05/28(月) 02:40:59いや、だからダメだったんだって
書いてあるっしょー
0828デフォルトの名無しさん
2007/05/28(月) 02:44:10struct RGB_LL_COLOR{
int *R;
int *G;
int *B;
}Rgb;
こう↑なってたのを
struct RGB_LL_COLOR{
int *R;
int *G;
int *B;
};
こう↑やってみたりもしたけどやっぱり駄目だった希ガス
まあ、とにかく色々いじってダメだったんだ
0829デフォルトの名無しさん
2007/05/28(月) 03:37:04その変更はインクルードガードが正常に機能するでしょう。
そろそろスレ違いなんで適切な場所に移動しませんか。
0830デフォルトの名無しさん
2007/05/28(月) 11:53:070831デフォルトの名無しさん
2007/05/29(火) 14:47:450832デフォルトの名無しさん
2007/05/30(水) 00:39:14return *thisを使うのはなぜですか?
+演算子でつかっていた
return tmp;ではどうしてだめなのですか?
0833デフォルトの名無しさん
2007/05/30(水) 09:10:490834デフォルトの名無しさん
2007/05/30(水) 10:56:240835デフォルトの名無しさん
2007/05/30(水) 10:58:360836デフォルトの名無しさん
2007/05/30(水) 11:05:15Effective C++ くらい買っとこうや。
0837デフォルトの名無しさん
2007/05/30(水) 16:13:321. 値を返すより参照を返すほうが効率的だから
2. (x = y) = z;のような病的な例に対応するため
一般に(複合)代入演算子の結果は組込型だと左辺値になるはずで、それと同じ挙動を目指していると考えればいい
0838デフォルトの名無しさん
2007/05/30(水) 21:23:48一通りやった程度の経験で理解できるでしょうか?
なんか書評見ると中級者向きって書いてあってなんか難しそうなんですが・・・・
0839デフォルトの名無しさん
2007/06/01(金) 12:17:31>effectiveC++って独習C++とAccelerated C++の演習を
漏れはどっちもやったことないけどEffectiveC++は理解できたよ。
つーか、半年C++と悪戦苦闘して見つけたノウハウが全部書いてあって笑えた。
0840デフォルトの名無しさん
2007/06/06(水) 01:03:430841デフォルトの名無しさん
2007/07/04(水) 00:00:36Cの時ってDBとかファイルとかからデータもってき足りする場合は大体構造体で管理してました。
a[i].name=なんたらって感じで
これってC++ではクラスで定義するかと思うんですが、メンバ変数がいままでの構造体データに相当して、
メンバ関数を色々定義して便利に使う、という解釈でいいんでしょうか?
(ンストラクタとかデストラクタとかは自分で定義して)
後、一々書くの面倒だからこれ使えば?ってのはあったりします?>STLの様なもので。
0842デフォルトの名無しさん
2007/07/04(水) 02:39:060843841
2007/07/04(水) 19:51:08ちょw冷たいww
ってよくみると誤字脱字ひどいですな、スマソ。
Effective C++ 買ったし、読んで好きにしてやるうううううう。
0844841
2007/07/04(水) 19:51:460845841
2007/07/04(水) 21:44:40大人しくconstで定義させていただきマッスル。
自分で全定義書くのもありだし、vectorあたりでその辺省略するのもありですな・・・素晴らしい。
0846デフォルトの名無しさん
2007/07/05(木) 17:49:090847デフォルトの名無しさん
2007/07/05(木) 22:55:570848デフォルトの名無しさん
2007/07/13(金) 06:12:23俺が組むプログラムはstructで事すんじゃうんだけど
たまにわざわざクラスを使ってみたりしてる
クラスだと何がどう良いのかマジわかんない教えて
0849デフォルトの名無しさん
2007/07/13(金) 10:12:04そう思うのなら、使わなくていいんじゃない?
私が作るC++のプログラムも、1/3はクラスを使わないし使ううちの半数はstructで済むし。
0850デフォルトの名無しさん
2007/07/13(金) 10:19:362、classが使いたくなるまでは、無理して使う必要はない。
3、クラス使わないのにC++を使う理由は?
いろいろあります、好きなのをどぞ。
0851デフォルトの名無しさん
2007/07/14(土) 01:29:18レスありがとう
使いたくなるまでは使わないでみる
0852デフォルトの名無しさん
2007/07/16(月) 16:59:14いつも明示的にprivate等はつけてるので、違いは無いって思ってる。
まあ好きなほうで書けば。
0853デフォルトの名無しさん
2007/09/04(火) 13:17:370854デフォルトの名無しさん
2007/09/04(火) 23:14:060855デフォルトの名無しさん
2007/09/05(水) 01:10:55普通に渡すとでっかいもののコピーが渡されて容量を無駄に食ってしまうので
その代わりに参照を渡してやればコピーが生成されない分節約になる
0856デフォルトの名無しさん
2007/09/05(水) 01:21:38これは現段階で色々説明するのは難しいと思う
0857デフォルトの名無しさん
2007/09/05(水) 07:10:32Cだとconstなポインタを使っていたところだな。
0858デフォルトの名無しさん
2007/09/24(月) 07:44:50でっかいものって、もともと配列はコピーされないんじゃないの?
0859デフォルトの名無しさん
2007/09/24(月) 09:55:000860デフォルトの名無しさん
2007/09/24(月) 13:34:530861デフォルトの名無しさん
2007/09/26(水) 18:56:270862デフォルトの名無しさん
2007/09/26(水) 20:20:120863デフォルトの名無しさん
2007/09/26(水) 22:59:510864デフォルトの名無しさん
2007/09/27(木) 01:54:510865デフォルトの名無しさん
2007/09/28(金) 05:37:310866デフォルトの名無しさん
2007/10/06(土) 00:52:440867デフォルトの名無しさん
2007/10/06(土) 01:21:350868デフォルトの名無しさん
2007/10/06(土) 01:41:460869デフォルトの名無しさん
2007/10/12(金) 17:12:11ネットで調べてみたところ、ヘッダファイルに本体もすべて書けばいいとのことですが、
こんな方法しか解決方法はないのでしょうか?
0870デフォルトの名無しさん
2007/10/12(金) 17:14:05こちらからコンパイルして欲しいものを指定するというやり方。
0871デフォルトの名無しさん
2007/10/12(金) 18:57:37kwsk
0872デフォルトの名無しさん
2007/10/13(土) 05:30:000873デフォルトの名無しさん
2007/10/13(土) 11:48:12テンプレートの明示的実体化というのはどのようにやればよいのでしょうか?
0874デフォルトの名無しさん
2007/10/13(土) 11:55:23http://www.google.co.jp/search?q=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%20%E6%98%8E%E7%A4%BA%E7%9A%84%E5%AE%9F%E4%BD%93%E5%8C%96
0875デフォルトの名無しさん
2007/10/21(日) 17:03:59C++で参照を駆使してどうにかなりますか?
配列への参照、って可能?
0876デフォルトの名無しさん
2007/10/21(日) 18:32:04参照は実際のプログラミングではまず使わないから安心して
0877デフォルトの名無しさん
2007/10/21(日) 18:33:50こらこら嘘を教えちゃいかん
0878875
2007/10/21(日) 21:13:360879デフォルトの名無しさん
2007/11/29(木) 23:21:54みんなstd::vector。当然渡すのもvectorへの参照。
0880デフォルトの名無しさん
2007/11/29(木) 23:33:08そんなアホな
0881デフォルトの名無しさん
2007/12/01(土) 07:14:10void strhoge(void);
void wcshoge(void);
#ifdef _UNICODE
#define _tcshoge wcshoge
#else
#define _tcshoge strhoge
#endif
_tcshoge();
って書かれてたコードを
void str::hoge(void);
void wcs::hoge(void);
#ifdef _UNICODE
namespace tcs = wcs;
#else
namespace tcs = str;
#endif
tcs::hoge();
と書き換えてみたんだけどC++的にはあり?
namespace ってマニュアル読むとCのマクロ並に他の識別子を隠す危険機能みたいなのに、詳しく説明してる本とか見つからない。
namespace 名前付け規約みたいのってあります?
0882デフォルトの名無しさん
2007/12/01(土) 13:08:30名前空間の名前付け規約というようなものはない。
みな勝手に名前を付けてる。
0883デフォルトの名無しさん
2007/12/02(日) 00:16:39名前の上書き力はマクロの次ぐらいに強いのに。
オープンだからダブっても気にしないってことなのかな。
無名 namespace が絡むと途端に繊細になるし...
namespace A{ namespace{
hoge;
}}
namespace{ namespace A{
hoge; // 別物!
}}
A::hoge // 解決できない! アクセス方法は?
0884デフォルトの名無しさん
2007/12/24(月) 18:47:14名前空間をだぶらせない方法はない。
いや、あるにはあるけどそれは結局名前空間という無限再帰。
0885デフォルトの名無しさん
2007/12/29(土) 20:17:23CとしてC++をつかう状況であるならひどい。例えば・・・
あるプロジェクトのリーダがC++をよくしらないとする。
自分がレビューできないもんだから、C++特有のコード
はかかない規約をつくっちまう。
そうするとC++が適切につかわれず、コストかけてC++
を勉強したチームメンバはモチベーションがさがる。
0886デフォルトの名無しさん
2007/12/30(日) 18:31:52#define で数値を定義するときははカッコでくくれ、とか。
0887デフォルトの名無しさん
2008/01/07(月) 12:13:01括弧で括るのは当然じゃないか。
問題は、数値をdefineマクロで定義することの方だろ。
0888デフォルトの名無しさん
2008/01/07(月) 17:37:070889デフォルトの名無しさん
2008/01/07(月) 18:05:46別途、「定数値は(原則として)static const を使え」とでもしておけばよろしい。
0890デフォルトの名無しさん
2008/01/21(月) 20:14:21プロのプログラマでもあまりにレベルが低い人が多すぎます。
そんな人に限って、自分のレベルの低さを自覚していない、、、
本人は構わないかもしれませんが、その下についた新人プログラマは
たまったものではありません。(私が経験しました。)
今になって分かりました。
彼らもまた、理解できていなかったのです。
プログラミング言語の一番の習得の近道はきちんと理解している人にアドバイスをもらうこと。です。
私のC言語に取り組んだ7年間をすべてぶつけたつもりでテキストを作りました。
私の会社の後輩からは、どんなテキストよりもわかりやすかった!や、
今まで教えてくれていた先輩や、テキストたちが、ちゃんと理解できていないことがわかりました。
と、嬉しいコメントをたくさんもらいました。
そしてなにより、彼らの社内での評価がとても高いということが、私の誇りです。
興味がある方はどうか、下のサイトをみてみてください。
http://mori.eco.to/
0891デフォルトの名無しさん
2008/01/31(木) 05:58:17iteratorもしらんのか
0892デフォルトの名無しさん
2008/03/02(日) 21:26:57C++の文法を解説した本、オブジェクト指向について解説した本をいくつか読み、
そろそろ手で打ちながらより実践的に覚えていこうと、C++を使ったシューティング
ゲームプログラミングの本を片手にやろうとしているんですが、内容が難しく感じます・・・。
段階的にC++を身につけていけるような書籍をご存知ないでしょうか?
クラス図なんかを見ていると楽しいですし、規模の大きなプログラムが作り易そうな
期待が持てます。
ちょっとずつ身につけていけたらと思っています。
0893892
2008/03/02(日) 21:28:080894デフォルトの名無しさん
2008/03/02(日) 21:56:41ボスクラス(攻撃、全体攻撃)
を作成してドラクエのようなターン制戦闘ができるプログラムでも作ってみれば
全員HPと攻撃力、防御力、素早さあたりのパラメータを持つとして。
0895デフォルトの名無しさん
2008/03/02(日) 21:58:39仲間2人は攻撃しかできない戦士クラスで
もう2人は攻撃と回復ができる僧侶クラスとでも名付けて、
僧侶クラスは戦士クラスを継承したクラスとして作ってみるといい
継承やオーバーロードといったものが理解できてないと作れない
0896デフォルトの名無しさん
2008/03/02(日) 22:01:05ちゃんと基礎がわかってるなら一時間ぐらいで作れるはず
0897デフォルトの名無しさん
2008/03/02(日) 22:04:10解説書を理解していたらシューティング程度であれば難しくないはずだが…。
流し読みか?
0898892
2008/03/05(水) 00:55:36ご指摘いただいたことを目安に取り組んでみます。
0899デフォルトの名無しさん
2008/03/05(水) 06:04:050900デフォルトの名無しさん
2008/03/06(木) 20:56:32関数に__stdcallをつけるとつけないと何が違うのでしょうか?
つけるメリットは何?
0901デフォルトの名無しさん
2008/03/07(金) 00:03:12stdcallは関数呼出の方法の1つ。引数を渡すのに使ったスタックポインタを戻す役目が
呼び出された関数側にあるのが普通と違う。
呼び出された関数側でスタックを戻すと、x86ではややコードを短くできるので
16ビット時代には重宝された。今では結構どうでもいい。
(16ビットのときにはstdcallなんてなかったけど)
32ビットWindowsが__stdcallを多用している関係上、
こっちが作る関数でも__stdcallの指定を要求されることがある。
また、Windowsでは他の言語でも
stdcallのDLL関数は呼び出せるというものが多い(VBとか)というのは利点と言える。
だから、DLLで公開する関数には付けておけ。
あとはWinMainとか必要なものに付けるという感じ。
0902デフォルトの名無しさん
2008/03/07(金) 06:54:410903デフォルトの名無しさん
2008/03/07(金) 07:06:100904デフォルトの名無しさん
2008/03/08(土) 14:09:510905デフォルトの名無しさん
2008/03/08(土) 14:24:16585 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/08(土) 14:20:47
http://yutori.2ch.net/test/read.cgi/news4vip/1204952244/
1 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2008/03/08(土) 13:57:24.68 ID:oVsMTN3J0
次世代言語”D言語”を使ってプログラミングをしてみよう!
C++で挫折した君も、プログラミング初心者の君も今日からプログラマーだ!
D言語入門 http://www.geocities.jp/tor_park/Dlang/d2.html
0906デフォルトの名無しさん
2008/03/10(月) 00:07:27Test2宣言についてどうやればいいのかわかりません。
検索エンジンでクラス定義について調べたのですが参考となるものが見つからなくて…
ご教授してくださると助かります。
#include <stdio.h>
class Test1{
public:
Test2 *pT2; // ←意図的にTest2のクラスを呼び出したい
void print(){printf("test1\n");}
void test(){
pT2 = new Test2();pT2->print();delete pT2;
print();
}
};
class Test2{
public:
Test1 *pT1;
void print(){printf("test2\n");}
void test(){
pT1 = new Test1();pT1->print();delete pT1;
print();
}
};
void main(){
Test1 t1;Test2 t2;
t1.test();t2.test();
}
0907デフォルトの名無しさん
2008/03/10(月) 00:35:43これ、前方宣言という。
0908デフォルトの名無しさん
2008/03/10(月) 01:24:45ご教授ありがとうございます。
前方宣言をしてみたところ、
クラス、構造体、共用体にデフォルト コンストラクタがありませんなど、
他3つのエラーが出て困っていたのですが、”前方宣言 c++”で検索をして
同様な処理の対処方法が書いてある下記のページにたどり着きました。
ttp://archive.mag2.com/0000251805/20080129090000000.html
ありがとうございました。
0909デフォルトの名無しさん
2008/03/10(月) 01:35:35// 前方宣言
class Test2;
class Test1{public: Test2 *pT2;void print();void test();};
class Test2{public: Test1 *pT1;void print();void test();};
void Test1::print(){printf("test1\n");}
void Test1::test(){printf("Test1::test()の呼び出し :");pT2 = new Test2();pT2->print();delete pT2;}
void Test2::print(){printf("test2\n");}
void Test2::test(){printf("Test2::test()の呼び出し :");pT1 = new Test1();pT1->print();delete pT1;}
void main(){Test1 t1;Test2 t2;t1.test();t2.test();}
出力結果
Test1::test()の呼び出し :test2
Test2::test()の呼び出し :test1
お世話になりました。
0910デフォルトの名無しさん
2008/03/10(月) 14:27:03そのメルマガ、著者の知識が偏っているから要注意ね。
--
C++言語では、
struct _stFoo
{
int member1;
double member2;
};
と定義すればそのまま、
_stFoo stfoo;
と、型として変数定義することができる。
--
流石にこれはないだろw
0911デフォルトの名無しさん
2008/03/10(月) 22:23:13引用箇所の問題点がよく分からん。予約名を使ってるのが悪いのか?
0912デフォルトの名無しさん
2008/03/11(火) 22:39:53struct hoge { ... };
struct hoge hage;
としなければならないのを、
C++では、
struct hoge { ... };
hoge hage;
でもおkだよ、というのを説明してるんだろうけど、何が問題なのかはよく分からんな。
0913デフォルトの名無しさん
2008/03/12(水) 19:59:140914デフォルトの名無しさん
2008/03/12(水) 20:13:57秘書課の田中小枝子さんを区別するためにある
秘書課に田中小枝子さんが二人いた場合は
部長の愛人の田中小枝子さんと
課長の愛人の田中小枝子さんで区別しろ
0915デフォルトの名無しさん
2008/03/13(木) 10:19:20みな同一人物のヤリマンというわけですね!
0916デフォルトの名無しさん
2008/03/13(木) 10:30:11俺ライブラリ
namespace oreore{
template<class Ty>
void foo(Ty x) {
bar();
}
}
自作プログラム
namespace oreore {
void bar() {
}
}
int main() { ... }
このように既存のライブラリに機能を付け加えて、
どの関数が呼ばれるのか分かりにくくする目的がある
0917デフォルトの名無しさん
2008/03/18(火) 01:09:240918デフォルトの名無しさん
2008/03/18(火) 07:33:270919デフォルトの名無しさん
2008/03/23(日) 01:36:000920age
2008/03/23(日) 22:11:20型なのはわかるんですが。。。あとユニドライバの開発に詳しい人
いたらお金を出すので専属で俺に指導してくれませんか?
質問はメール。場合により電話
報酬は月5万円固定。
でお願いします。「俺はユニドライバにくわしいぜ!」というやつ
いたら [email protected] におねがいします。m(_ _)m
0921デフォルトの名無しさん
2008/03/25(火) 22:16:50pOemDev
0922デフォルトの名無しさん
2008/03/31(月) 12:34:240923デフォルトの名無しさん
2008/03/31(月) 15:39:160924デフォルトの名無しさん
2008/04/03(木) 09:32:35いい事いうじゃねえか。
で、やれるんだな?
今すぐ頼むぞ。
0925デフォルトの名無しさん
2008/07/07(月) 21:22:41構造体の代入についてなんですけど、
struct papa{
int number; int mama_number;
}
struct papa menber[5000];
for(i=0;i<5000;i++){
menber[i]={i,i};
}
これをC++なら実現可能ということなので、
ヒントだけでも教えてください。すいません。
0926デフォルトの名無しさん
2008/07/07(月) 21:47:13= (struct papa){i,i}
とりあえず手元のGCC4.1.2ではできたけど...
0927926
2008/07/07(月) 21:50:07メンバ変数はprivateにして、メンバ関数でアクセスが普通のやり方じゃないかな?
0928デフォルトの名無しさん
2008/07/08(火) 05:44:24それ確か//なんかと同じでgcc拡張
0929デフォルトの名無しさん
2008/07/08(火) 08:16:13C99から標準。
0930デフォルトの名無しさん
2008/07/17(木) 21:39:08どこかクラス設計の解説に長けているサイトや書籍はありませんか?
0931デフォルトの名無しさん
2008/08/11(月) 00:52:55分けて記述することは可能ですか?
Cのextern宣言みたいなものは必要でしょうか。
0932デフォルトの名無しさん
2008/08/11(月) 06:39:010933デフォルトの名無しさん
2008/08/11(月) 20:01:46classを宣言したヘッダをインクルードしておけばいいお
0934デフォルトの名無しさん
2008/08/11(月) 20:36:17ありがとうございました
0935デフォルトの名無しさん
2008/09/22(月) 13:08:26itoa()やatoi()にあたるコードはC++ではどう書くべきでしょうか
0936デフォルトの名無しさん
2008/09/22(月) 13:14:23std::istringstream is(str);
is >> a;
0937デフォルトの名無しさん
2008/09/22(月) 13:15:10というかlexical_castは内部的に>>936のようなPSEUDOコードを
使っている
0938デフォルトの名無しさん
2008/09/22(月) 13:17:40大仰にしたくなければatoi(str.c_str())でもOK。
itoa()は使わないに越したことはないからstringstreamかね。
0939デフォルトの名無しさん
2008/09/22(月) 14:42:12なるほど、stringstream系を通すと変換できるのですね。
>937
boost はまだ試していないのですが、色々便利そうです。
そのうち試してみます。
>938
折角C++なのでC++流に書いてみます。
本来ならCでもsprintf()やsnprintf()を使う場面ですが
説明しやすいためitoa()と書いてしまいました。
0940デフォルトの名無しさん
2008/09/22(月) 17:58:05coutとprintfは同時に使えないんでしょうか?
コンパイルは通りますが、実行時にprintfのところでエラーが出ます。
ヘッダを色々変えてみたり、using namespace std;をつけたり外したりしましたが駄目でした。
よろしければお願いいたします。
0941デフォルトの名無しさん
2008/09/22(月) 18:12:39一応バッファリングの問題とかがあるからね。
Boostが使える環境ならcout、そうでないならprintfの方が便利だと、俺は思う。
0942デフォルトの名無しさん
2008/09/22(月) 18:18:21処理系は?
0943デフォルトの名無しさん
2008/09/22(月) 18:20:03エラーメッセージは何て言ってる?
0944デフォルトの名無しさん
2008/09/22(月) 18:42:31混在させるとバッファリングの関係で出力に影響があるかも知らんが、
実行時エラーにはならないと思うんだ。
何かprintf()の使い方を間違っているんじゃないか?
# printf(str.c_str())していて、strの中身に%が含まれているとかw
0945デフォルトの名無しさん
2008/09/22(月) 19:29:56初心者の頃にやったなあw
最初の頃はprintf("%s",str);とか思いつかなかった。
0946940
2008/09/22(月) 20:26:06てことは私が何かポカしてる可能性が高いんですね
明日もう一度確認してみます
>>942
VC2005です
>>943>>944
今手元に無いんですが
「メモリが“read”になることができない」
「メモリが"written"になることはありませんでした」みたいなエラーです
まずい領域を参照したみたいな
でも printf("a"); でもエラー吐くんですよね
0947デフォルトの名無しさん
2008/09/22(月) 20:26:350948デフォルトの名無しさん
2008/09/22(月) 20:46:28std::sync_with_stdio()はtrueを返すよね?
0949デフォルトの名無しさん
2008/09/23(火) 05:36:17って言うか printf(変数) は危ないよ
第一引数は必ずフォーマットか文字列中に%を含まないと確実に保証できる文字列にすべき
それが問題になったソフトウェアは結構あるらしいしな
0950940
2008/09/23(火) 15:44:15別の場所で配列に値を入れるところで、変なアドレスに値を入れていたみたなんですが
どういうわけかprintfの部分でエラーが出るようになっていたようです
そもそも最小構成で試してみたら全く問題ありませんでした
お騒がせして申し訳ありません
レス数が950を超えています。1000を超えると書き込みができなくなります。